diff options
65 files changed, 645 insertions, 429 deletions
@@ -122,12 +122,22 @@ dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release 8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release 8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release 77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release +77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release 8835e0e3c0d3a48244c287bc05811dfc2fba43ec 2.7.0-start 43c7ee846b7eed80786acbbf35d03bd016a3e85d DRTVWR-59_2.7.0-beta1 43c7ee846b7eed80786acbbf35d03bd016a3e85d 2.7.0-beta1 -77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release 54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start 0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1 0c4d0c24278074f219e5a32e72b449e78301d11b 2.7.1-beta1 9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start +e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1 +e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1 6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start +6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start +be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1 +be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1 +a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release +be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1 +be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1 +a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release +19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start diff --git a/BuildParams b/BuildParams index f34b262913..88d2c02780 100644 --- a/BuildParams +++ b/BuildParams @@ -69,29 +69,9 @@ viewer-pre-release.viewer_channel = "Second Life Release" viewer-pre-release.login_channel = "Second Life Release" viewer-pre-release.build_debug_release_separately = true viewer-pre-release.build_viewer_update_version_manager = true -#viewer-pre-release.release-viewer.jira = DRTVWR-13 -viewer-pre-release.release-viewer.jira = DRTVWR-46 +#viewer-pre-release.release-viewer.jira = DRTVWR-46 -# ======================================= -# brad -# ======================================== -debug-halting.email = cg@lindenlab.com -debug-halting.build_server = false -debug-halting.build_server_tests = false -debug-halting.build_Darwin = false -debug-halting.build_Linux = false -debug-halting.build_CYGWIN_Debug = false -debug-halting.build_CYGWIN_RelWithDebInfo = false - -# ======================================== -# brad -# ======================================== - -brad-parabuild.email = brad@lindenlab.com -brad-parabuild.build_server = false -brad-parabuild.build_server_tests = false - # ======================================== # mesh-development # ======================================== @@ -133,73 +113,31 @@ viewer-mesh.email = shining@lists.lindenlab.com # CG # ======================================== -cg_viewer-development_lenny.collect_metrics = true cg_viewer-development_lenny.show_changes_since = 4b140ce7839d cg_viewer-development_lenny.email = cg@lindenlab.com -# ======================================== -# gooey -# ======================================== - -#gooey.email = james@lindenlab.com -gooey.build_Debug = false -gooey.build_RelWithDebInfo = false -gooey.build_server = false -gooey.build_server_tests = false -gooey.viewer_channel = "Second Life Alpha" -gooey.login_channel = "Second Life Alpha" -gooey.viewer_grid = agni -gooey.build_viewer_update_version_manager = false - -# ======================================== -# Search Project -# ======================================== - -search_project-viewer.build_debug_release_separately = true -search_project-viewer.viewer_channel = "Second Life Project Viewer - Search" -search_project-viewer.login_channel = "Second Life Project Viewer - Search" - -# ======================================== -# palange -# ======================================== - -palange_viewer-2-0.email = palange@lindenlab.com -palange_viewer-2-0.build_server = false -palange_viewer-2-0.build_server_tests = false -palange_viewer-2-0.build_CYGWIN_Debug = false - -# ======================================== -# media -# ======================================== - -media.email = skolb@lindenlab.com -media.build_server = false -media.build_server_tests = false -media.viewer_channel = "Second Life Alpha" -media.login_channel = "Second Life Alpha" -media.viewer_grid = agni -media.build_viewer_update_version_manager = false - # ================ # oz # ================ oz_viewer-devreview.build_debug_release_separately = true +oz_viewer-devreview.codeticket_add_context = false + oz_project-1.build_debug_release_separately = true +oz_project-1.codeticket_add_context = false oz_project-2.build_debug_release_separately = true -oz-project-3.build_debug_release_separately = true +oz_project-2.codeticket_add_context = false +oz_project-3.build_debug_release_separately = true +oz_project-3.codeticket_add_context = false +oz_project-4.build_debug_release_separately = true +oz_project-4.codeticket_add_context = false + oz_viewer-beta-review.build_debug_release_separately = true +oz_viewer-beta-review.codeticket_add_context = false + oz_viewer-poreview.build_debug_release_separately = true oz_viewer-poreview.codeticket_add_context = false -# ======================================== -# enus -# ======================================== - -viewer-tut-teamcity.email = enus@lindenlab.com -viewer-tut-teamcity.build_server = false -viewer-tut-teamcity.build_server_tests = false - # ================================================================= # asset delivery 2010 projects # ================================================================= @@ -217,23 +155,4 @@ viewer-asset-delivery-metrics.email = monty@lindenlab.com viewer-asset-delivery-metrics.build_server = false viewer-asset-delivery-metrics.build_server_tests = false -#============================================================================== -# autobuild viewers -#============================================================================== -viewer-autobuild2010.build_debug_release_separately = true -viewer-autobuild2010.viewer_channel = "Project Viewer - VS2010" -viewer-autobuild2010.login_channel = "Project Viewer - VS2010" -viewer-autobuild2010.viewer_grid = agni -viewer-autobuild2010.build_link_parallel = false - -#======================================== -# VS2010 -#======================================== -viewer-vs2010.viewer_channel = "Project Viewer - VS2010" -viewer-vs2010.login_channel = "Project Viewer - VS2010" -viewer-vs2010.viewer_grid = agni -viewer-vs2010.build_debug_release_separately = true -viewer-vs2010.build_viewer_update_version_manager = false -viewer-vs2010.build_link_parallel = false - # eof diff --git a/autobuild.xml b/autobuild.xml index 63701dae79..d1a7107319 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1907,11 +1907,8 @@ <map> <key>build</key> <map> - <key>arguments</key> + <key>filters</key> <array> - <string>|</string> - <string>grep</string> - <string>-v</string> <string>setenv</string> </array> <key>command</key> @@ -1964,11 +1961,8 @@ <map> <key>build</key> <map> - <key>arguments</key> + <key>filters</key> <array> - <string>|</string> - <string>grep</string> - <string>-v</string> <string>setenv</string> </array> <key>command</key> @@ -2023,11 +2017,8 @@ <map> <key>build</key> <map> - <key>arguments</key> + <key>filters</key> <array> - <string>|</string> - <string>grep</string> - <string>-v</string> <string>setenv</string> </array> <key>command</key> diff --git a/doc/contributions.txt b/doc/contributions.txt index dd47322bac..ab1c7ea1ef 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -158,6 +158,7 @@ Ann Congrejo CT-193 Ansariel Hiller STORM-1101 + VWR-25480 Ardy Lay STORM-859 VWR-19499 @@ -443,10 +444,17 @@ Jonathan Yap STORM-1236 STORM-1259 STORM-787 + VWR-25480 + STORM-1334 STORM-1313 STORM-899 STORM-1273 + STORM-457 STORM-1396 + STORM-1292 + STORM-1392 + STORM-1302 + STORM-1326 Kage Pixel VWR-11 Ken March @@ -911,6 +919,7 @@ WolfPup Lowenhar STORM-825 STORM-859 STORM-1098 + STORM-1393 VWR-20741 VWR-20933 Zai Lynch diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index cfafbf0470..69720bb903 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 7; -const S32 LL_VERSION_PATCH = 4; +const S32 LL_VERSION_PATCH = 6; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp index ca84fa8bb8..8c752fbe30 100644 --- a/indra/llmessage/lliosocket.cpp +++ b/indra/llmessage/lliosocket.cpp @@ -191,7 +191,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port) port = PORT_EPHEMERAL; } rv->mPort = port; - rv->setOptions(); + rv->setNonBlocking(); return rv; } @@ -206,7 +206,7 @@ LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool) } rv = ptr_t(new LLSocket(socket, pool)); rv->mPort = PORT_EPHEMERAL; - rv->setOptions(); + rv->setNonBlocking(); return rv; } @@ -227,10 +227,10 @@ bool LLSocket::blockingConnect(const LLHost& host) { return false; } - apr_socket_timeout_set(mSocket, 1000); + setBlocking(1000); ll_debug_socket("Blocking connect", mSocket); if(ll_apr_warn_status(apr_socket_connect(mSocket, sa))) return false; - setOptions(); + setNonBlocking(); return true; } @@ -258,11 +258,27 @@ LLSocket::~LLSocket() } } -void LLSocket::setOptions() +// See http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html#ss13.4 +// for an explanation of how to get non-blocking sockets and timeouts with +// consistent behavior across platforms. + +void LLSocket::setBlocking(S32 timeout) +{ + LLMemType m1(LLMemType::MTYPE_IO_TCP); + // set up the socket options + ll_apr_warn_status(apr_socket_timeout_set(mSocket, timeout)); + ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 0)); + ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE)); + ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE)); + +} + +void LLSocket::setNonBlocking() { LLMemType m1(LLMemType::MTYPE_IO_TCP); // set up the socket options ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0)); + ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 1)); ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE)); ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE)); diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h index 6806e5084a..e0f6c1e34d 100644 --- a/indra/llmessage/lliosocket.h +++ b/indra/llmessage/lliosocket.h @@ -153,9 +153,16 @@ protected: LLSocket(apr_socket_t* socket, apr_pool_t* pool); /** - * @brief Set default socket options. + * @brief Set default socket options, with SO_NONBLOCK = 0 and a timeout in us. + * @param timeout Number of microseconds to wait on this socket. Any + * negative number means block-forever. TIMEOUT OF 0 IS NON-PORTABLE. */ - void setOptions(); + void setBlocking(S32 timeout); + + /** + * @brief Set default socket options, with SO_NONBLOCK = 1 and timeout = 0. + */ + void setNonBlocking(); public: /** diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index e51ef8cfe7..bdc103b917 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -403,7 +403,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns) } else { - LL_INFOS("ShaderLoading") << log << LL_ENDL; + LL_DEBUGS("ShaderLoading") << log << LL_ENDL; } } } @@ -462,8 +462,15 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade GLcharARB* text[1024]; GLuint count = 0; - //set version to 1.20 - text[count++] = strdup("#version 120\n"); + if (gGLManager.mGLVersion < 3.f) + { + //set version to 1.20 + text[count++] = strdup("#version 120\n"); + } + else + { //set version to 1.30 + text[count++] = strdup("#version 130\n"); + } //copy preprocessor definitions into buffer for (std::map<std::string,std::string>::iterator iter = mDefinitions.begin(); iter != mDefinitions.end(); ++iter) @@ -515,17 +522,43 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade text[count++] = strdup("varying float vary_texture_index;\n"); text[count++] = strdup("vec4 diffuseLookup(vec2 texcoord)\n"); text[count++] = strdup("{\n"); - text[count++] = strdup("\tswitch (int(vary_texture_index+0.25))\n"); - text[count++] = strdup("\t{\n"); - //switch body - for (S32 i = 0; i < texture_index_channels; ++i) - { - std::string case_str = llformat("\t\tcase %d: return texture2D(tex%d, texcoord);\n", i, i); - text[count++] = strdup(case_str.c_str()); + + if (gGLManager.mGLVersion >= 3.f) + { + text[count++] = strdup("\tswitch (int(vary_texture_index+0.25))\n"); + text[count++] = strdup("\t{\n"); + + //switch body + for (S32 i = 0; i < texture_index_channels; ++i) + { + std::string case_str = llformat("\t\tcase %d: return texture2D(tex%d, texcoord);\n", i, i); + text[count++] = strdup(case_str.c_str()); + } + + text[count++] = strdup("\t}\n"); } + else + { + //switches aren't supported, make block that looks like: + /* + int ti = int(vary_texture_index+0.25); + if (ti == 0) return texture2D(tex0, texcoord); + if (ti == 1) return texture2D(tex1, texcoord); + . + . + . + if (ti == N) return texture2D(texN, texcoord); + */ + + text[count++] = strdup("int ti = int(vary_texture_index+0.25);\n"); + for (S32 i = 0; i < texture_index_channels; ++i) + { + std::string if_str = llformat("if (ti == %d) return texture2D(tex%d, texcoord);\n", i, i); + text[count++] = strdup(if_str.c_str()); + } + } - text[count++] = strdup("\t}\n"); text[count++] = strdup("\treturn vec4(0,0,0,0);\n"); text[count++] = strdup("}\n"); } diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index 06bad1f371..04040200d0 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -132,6 +132,9 @@ void LLConsole::setFontSize(S32 size_index) void LLConsole::draw() { + // Units in pixels + static const F32 padding_horizontal = 10; + static const F32 padding_vertical = 3; LLGLSUIDefault gls_ui; // skip lines added more than mLinePersistTime ago @@ -176,11 +179,9 @@ void LLConsole::draw() // draw remaining lines F32 y_pos = 0.f; - LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square"); + LLUIImagePtr imagep = LLUI::getUIImage("transparent"); -// F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f); F32 console_opacity = llclamp(LLUI::sSettingGroups["config"]->getF32("ConsoleBackgroundOpacity"), 0.f, 1.f); -// LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground"); LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground"); color.mV[VALPHA] *= console_opacity; @@ -188,8 +189,8 @@ void LLConsole::draw() for(paragraph_it = mParagraphs.rbegin(); paragraph_it != mParagraphs.rend(); paragraph_it++) { - S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + 8); - S32 target_width = llfloor( (*paragraph_it).mMaxWidth +15); + S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + padding_vertical); + S32 target_width = llfloor( (*paragraph_it).mMaxWidth + padding_horizontal); y_pos += ((*paragraph_it).mLines.size()) * line_height; imagep->drawSolid(-14, (S32)(y_pos + line_height - target_height), target_width, target_height, color); @@ -234,7 +235,7 @@ void LLConsole::draw() y_off += line_height; } } - y_pos += 8; + y_pos += padding_vertical; } } diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index b6d1ce61e5..2c581cf8d6 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -62,11 +62,15 @@ list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES}) add_library (llvfs ${llvfs_SOURCE_FILES}) -target_link_libraries(llvfs +set(vfs_BOOST_LIBRARIES ${BOOST_FILESYSTEM_LIBRARY} ${BOOST_SYSTEM_LIBRARY} ) +target_link_libraries(llvfs + ${vfs_BOOST_LIBRARIES} + ) + if (DARWIN) include(CMakeFindFrameworks) find_library(CARBON_LIBRARY Carbon) @@ -76,15 +80,21 @@ endif (DARWIN) # Add tests if (LL_TESTS) - include(LLAddBuildTest) - # UNIT TESTS - SET(llvfs_TEST_SOURCE_FILES - # none so far - ) - LL_ADD_PROJECT_UNIT_TESTS(llvfs "${llvfs_TEST_SOURCE_FILES}") - - # INTEGRATION TESTS - set(test_libs llmath llcommon llvfs ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES}) - # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests. - LL_ADD_INTEGRATION_TEST(lldir "" "${test_libs}") + include(LLAddBuildTest) + # UNIT TESTS + SET(llvfs_TEST_SOURCE_FILES + lldiriterator.cpp + ) + + set_source_files_properties(lldiriterator.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${vfs_BOOST_LIBRARIES}" + ) + LL_ADD_PROJECT_UNIT_TESTS(llvfs "${llvfs_TEST_SOURCE_FILES}") + + # INTEGRATION TESTS + set(test_libs llmath llcommon llvfs ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES}) + + # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests. + LL_ADD_INTEGRATION_TEST(lldir "" "${test_libs}") endif (LL_TESTS) diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp index 041436ed92..25550321f0 100644 --- a/indra/llvfs/lldiriterator.cpp +++ b/indra/llvfs/lldiriterator.cpp @@ -121,6 +121,14 @@ bool LLDirIterator::Impl::next(std::string &fname) return found; } +/** +Converts the incoming glob into a regex. This involves +converting incoming glob expressions to regex equivilents and +at the same time, escaping any regex meaningful characters which +do not have glob meaning, i.e. + .()+|^$ +in the input. +*/ std::string glob_to_regex(const std::string& glob) { std::string regex; @@ -135,9 +143,6 @@ std::string glob_to_regex(const std::string& glob) switch (c) { - case '.': - regex+="\\."; - break; case '*': if (glob.begin() == i) { @@ -170,8 +175,16 @@ std::string glob_to_regex(const std::string& glob) case '!': regex+= square_brace_open ? '^' : c; break; + case '.': // This collection have different regex meaning + case '^': // and so need escaping. + case '(': + case ')': + case '+': + case '|': + case '$': + regex += '\\'; default: - regex+=c; + regex += c; break; } diff --git a/indra/llvfs/tests/lldiriterator_test.cpp b/indra/llvfs/tests/lldiriterator_test.cpp new file mode 100644 index 0000000000..505d86faa7 --- /dev/null +++ b/indra/llvfs/tests/lldiriterator_test.cpp @@ -0,0 +1,65 @@ +/** + * @file lldiriterator_test.cpp + * @date 2011-06 + * @brief LLDirIterator test cases. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only., + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "lltut.h" +#include "../lldiriterator.h" + + +namespace tut +{ + + struct LLDirIteratorFixture + { + LLDirIteratorFixture() + { + } + }; + typedef test_group<LLDirIteratorFixture> LLDirIteratorTest_factory; + typedef LLDirIteratorTest_factory::object LLDirIteratorTest_t; + LLDirIteratorTest_factory tf("LLDirIterator"); + + /* + CHOP-662 was originally introduced to deal with crashes deleting files from + a directory (VWR-25500). However, this introduced a crash looking for + old chat logs as the glob_to_regex function in lldiriterator wasn't escaping lots of regexp characters + */ + void test_chop_662(void) + { + // Check a selection of bad group names from the crash reports + LLDirIterator iter(".","+bad-group-name]+??-??.*"); + LLDirIterator iter1(".","))--@---bad-group-name2((??-??.*\\.txt"); + LLDirIterator iter2(".","__^v--x)Cuide d sua vida(x--v^__??-??.*"); + } + + template<> template<> + void LLDirIteratorTest_t::test<1>() + { + test_chop_662(); + } + +} diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 76fecdf05e..594285b92b 100755..100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5576,7 +5576,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <real>1</real> + <real>0</real> </map> <key>MeshImportUseSLM</key> <map> diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index cbbdcb2983..955f19c82c 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -773,6 +773,10 @@ bool LLAvatarActions::canOfferTeleport(const LLUUID& id) // static bool LLAvatarActions::canOfferTeleport(const uuid_vec_t& ids) { + // We can't send more than 250 lures in a single message, so disable this + // button when there are too many id's selected. + if(ids.size() > 250) return false; + bool result = true; for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 01d19c5ba0..79e6c7b66b 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -386,6 +386,7 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b { bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status); + gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(voice_status); if (voice_status) { LLFirstUse::speak(true); @@ -570,7 +571,7 @@ BOOL LLBottomTray::postBuild() // it takes some time between logging in to world and connecting to voice channel. getChild<LLButton>("speak_btn")->setEnabled(false); getChild<LLButton>("speak_flyout_btn")->setEnabled(false); - + gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(false); // Registering Chat Bar to receive Voice client status change notifications. LLVoiceClient::getInstance()->addObserver(this); diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index b6d67899f8..216cc66ef8 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -62,7 +62,8 @@ void LLDebugView::init() LLRect r; LLRect rect = getLocalRect(); - r.set(10, rect.getHeight() - 100, rect.getWidth()/2, 100); + // Rectangle to draw debug data in (full height, 3/4 width) + r.set(10, rect.getHeight() - 100, ((rect.getWidth()*3)/4), 100); LLConsole::Params cp; cp.name("debug console"); cp.max_lines(20); diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index c95b046707..c6743ca13b 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -55,6 +55,7 @@ #include "llrender.h" #include "llsdutil.h" #include "llsdutil_math.h" +#include "lltrans.h" ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs @@ -457,7 +458,7 @@ void LLFloaterAuction::onClickSellToAnyone(void* data) LLSD args; args["LAND_SIZE"] = llformat("%d", area); args["SALE_PRICE"] = llformat("%d", sale_price); - args["NAME"] = "Anyone"; + args["NAME"] = LLTrans::getString("Anyone"); LLNotification::Params params("ConfirmLandSaleChange"); // Re-use existing dialog params.substitutions(args) diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 8558a1277c..3434841d09 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -41,6 +41,7 @@ #include "llviewerparcelmgr.h" #include "lluictrlfactory.h" #include "llviewerwindow.h" +#include "lltrans.h" class LLAvatarName; @@ -451,7 +452,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata) // Do a confirmation S32 sale_price = self->getChild<LLUICtrl>("price")->getValue(); S32 area = parcel->getArea(); - std::string authorizedBuyerName = "Anyone"; + std::string authorizedBuyerName = LLTrans::getString("Anyone"); bool sell_to_anyone = true; if ("user" == self->getChild<LLUICtrl>("sell_to")->getValue().asString()) { diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 0d798afdcc..33b7777d2e 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -424,8 +424,7 @@ void LLFloaterTools::refresh() // Refresh object and prim count labels LLLocale locale(LLLocale::USER_LOCALE); -#if 0 - if (gMeshRepo.meshRezEnabled()) + if (!gMeshRepo.meshRezEnabled()) { std::string obj_count_string; LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount()); @@ -449,7 +448,6 @@ void LLFloaterTools::refresh() getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost); } else -#endif { // Get the number of objects selected std::string root_object_count_string; diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index f8a4ce7ad0..b3910982d1 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -1527,17 +1527,24 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) mCompletingRegionName = ""; } - // if match found, highlight it and go - if (!match.isUndefined()) + if (num_results > 0) { - list->selectByValue(match); + // if match found, highlight it and go + if (!match.isUndefined()) + { + list->selectByValue(match); + } + // else select first found item + else + { + list->selectFirstItem(); + } getChild<LLUICtrl>("search_results")->setFocus(TRUE); onCommitSearchResult(); } - - // if we found nothing, say "none" - if (num_results == 0) + else { + // if we found nothing, say "none" list->setCommentText(LLTrans::getString("worldmap_results_none_found")); list->operateOnAll(LLCtrlListInterface::OP_DESELECT); } diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index efc4e23838..ebb5912ace 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -230,7 +230,7 @@ std::string LLLogChat::makeLogFileName(std::string filename) std::string LLLogChat::cleanFileName(std::string filename) { - std::string invalidChars = "\"\'\\/?*:.<>|"; + std::string invalidChars = "\"\'\\/?*:.<>|[]{}~"; // Cannot match glob or illegal filename chars std::string::size_type position = filename.find_first_of(invalidChars); while (position != filename.npos) { diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 6e0722bcf9..6e0722bcf9 100755..100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 11dc496311..957b6d5f94 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -268,6 +268,9 @@ bool LLNearbyChatScreenChannel::createPoolToast() toast->setOnFadeCallback(boost::bind(&LLNearbyChatScreenChannel::onToastFade, this, _1)); + // If the toast gets somehow prematurely destroyed, deactivate it to prevent crash (STORM-1352). + toast->setOnToastDestroyedCallback(boost::bind(&LLNearbyChatScreenChannel::onToastDestroyed, this, _1, false)); + LL_DEBUGS("NearbyChat") << "Creating and pooling toast" << llendl; m_toast_pool.push_back(toast->getHandle()); return true; @@ -369,8 +372,10 @@ void LLNearbyChatScreenChannel::arrangeToasts() } } -int sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second) +static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second) { + if (!first.get() || !second.get()) return false; // STORM-1352 + F32 v1 = first.get()->getTimeLeftToLive(); F32 v2 = second.get()->getTimeLeftToLive(); return v1 > v2; @@ -396,7 +401,11 @@ void LLNearbyChatScreenChannel::showToastsBottom() for(toast_vec_t::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it) { LLToast* toast = it->get(); - if (!toast) continue; + if (!toast) + { + llwarns << "NULL found in the active chat toasts list!" << llendl; + continue; + } S32 toast_top = bottom + toast->getRect().getHeight() + margin; @@ -472,7 +481,8 @@ void LLNearbyChatHandler::initChannel() -void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) +void LLNearbyChatHandler::processChat(const LLChat& chat_msg, // WARNING - not really const, see hack below changing chat_msg.mText + const LLSD &args) { if(chat_msg.mMuted == TRUE) return; @@ -480,7 +490,17 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) if(chat_msg.mText.empty()) return;//don't process empty messages + // Handle irc styled messages for toast panel + // HACK ALERT - changes mText, stripping out IRC style "/me" prefixes LLChat& tmp_chat = const_cast<LLChat&>(chat_msg); + std::string original_message = tmp_chat.mText; // Save un-modified version of chat text + if (tmp_chat.mChatStyle == CHAT_STYLE_IRC) + { + if(!tmp_chat.mFromName.empty()) + tmp_chat.mText = tmp_chat.mFromName + tmp_chat.mText.substr(3); + else + tmp_chat.mText = tmp_chat.mText.substr(3); + } LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); { @@ -531,7 +551,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) LLViewerChat::getChatColor(chat_msg,txt_color); - LLFloaterScriptDebug::addScriptLine(chat_msg.mText, + LLFloaterScriptDebug::addScriptLine(original_message, // Send full message with "/me" style prefix chat_msg.mFromName, txt_color, chat_msg.mFromID); @@ -562,15 +582,6 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) || !mChannel->getShowToasts() ) // to prevent toasts in Busy mode return;//no need in toast if chat is visible or if bubble chat is enabled - // Handle irc styled messages for toast panel - if (tmp_chat.mChatStyle == CHAT_STYLE_IRC) - { - if(!tmp_chat.mFromName.empty()) - tmp_chat.mText = tmp_chat.mFromName + tmp_chat.mText.substr(3); - else - tmp_chat.mText = tmp_chat.mText.substr(3); - } - // arrange a channel on a screen if(!mChannel->getVisible()) { diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index d0810d0772..27f341b4f6 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -34,7 +34,6 @@ #include "llmd5.h" #include "llsecondlifeurls.h" #include "v4color.h" -#include "llversionviewer.h" #include "llappviewer.h" #include "llbutton.h" @@ -748,20 +747,12 @@ void LLPanelLogin::loadLoginPage() LLVersionInfo::getShortVersion().c_str(), LLVersionInfo::getBuild()); - char* curl_channel ; + char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0); char* curl_version = curl_escape(version.c_str(), 0); - if(strcmp(LLVersionInfo::getChannel().c_str(), LL_CHANNEL)) - { - curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0); - } - else //if LL_CHANNEL, direct it to "Second Life Beta Viewer". - { - curl_channel = curl_escape("Second Life Beta Viewer", 0); - } oStr << "&channel=" << curl_channel; oStr << "&version=" << curl_version; - + curl_free(curl_channel); curl_free(curl_version); diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 9f3ee6ac5d..4974dde282 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -401,15 +401,14 @@ struct LLSaveNotecardInfo bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) { - if(!gAssetStorage) + LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor"); + + if(!editor) { - llwarns << "Not connected to an asset storage system." << llendl; + llwarns << "Cannot get handle to the notecard editor." << llendl; return false; } - - LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor"); - if(!editor->isPristine()) { // We need to update the asset information @@ -436,8 +435,15 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) // save it out to database if (item) { - std::string agent_url = gAgent.getRegion()->getCapability("UpdateNotecardAgentInventory"); - std::string task_url = gAgent.getRegion()->getCapability("UpdateNotecardTaskInventory"); + const LLViewerRegion* region = gAgent.getRegion(); + if (!region) + { + llwarns << "Not connected to a region, cannot save notecard." << llendl; + return false; + } + std::string agent_url = region->getCapability("UpdateNotecardAgentInventory"); + std::string task_url = region->getCapability("UpdateNotecardTaskInventory"); + if (mObjectUUID.isNull() && !agent_url.empty()) { // Saving into agent inventory @@ -472,6 +478,11 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) (void*)info, FALSE); } + else // !gAssetStorage + { + llwarns << "Not connected to an asset storage system." << llendl; + return false; + } } } return true; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 9ec4d33036..c38c8bad80 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -639,6 +639,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) if (click_action == CLICK_ACTION_NONE // not doing 1-click action && gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled && !gAgent.getFlying() // don't auto-navigate while flying until that works + && gAgentAvatarp && !gAgentAvatarp->isSitting() && !mBlockClickToWalk // another behavior hasn't cancelled click to walk && !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index c3665f8128..f6b01e92cb 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1501,7 +1501,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); LLSD args; args["MESSAGE"] = log_message; - LLNotificationsUtil::add("SystemMessage", args); + LLNotificationsUtil::add("SystemMessageTip", args); } break; @@ -1675,7 +1675,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); LLSD args; args["MESSAGE"] = log_message; - LLNotificationsUtil::add("SystemMessage", args); + LLNotificationsUtil::add("SystemMessageTip", args); } // we will want to open this item when it comes back. @@ -1726,7 +1726,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const LLSD args; args["MESSAGE"] = log_message; - LLNotificationsUtil::add("SystemMessage", args); + LLNotificationsUtil::add("SystemMessageTip", args); } if (busy && (!mFromGroup && !mFromObject)) @@ -6264,6 +6264,18 @@ void send_group_notice(const LLUUID& group_id, bool handle_lure_callback(const LLSD& notification, const LLSD& response) { + static const unsigned OFFER_RECIPIENT_LIMIT = 250; + if(notification["payload"]["ids"].size() > OFFER_RECIPIENT_LIMIT) + { + // More than OFFER_RECIPIENT_LIMIT targets will overload the message + // producing an llerror. + LLSD args; + args["OFFERS"] = notification["payload"]["ids"].size(); + args["LIMIT"] = static_cast<int>(OFFER_RECIPIENT_LIMIT); + LLNotificationsUtil::add("TooManyTeleportOffers", args); + return false; + } + std::string text = response["message"].asString(); LLSLURL slurl; LLAgentUI::buildSLURL(slurl); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index e3ed2d0649..da4d0548d0 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1288,7 +1288,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarEyesProgram.mFeatures.calculatesAtmospherics = true; gDeferredAvatarEyesProgram.mFeatures.hasGamma = true; gDeferredAvatarEyesProgram.mFeatures.hasTransport = true; - gDeferredAvatarEyesProgram.mFeatures.isFullbright = true; gDeferredAvatarEyesProgram.mFeatures.disableTextureIndex = true; gDeferredAvatarEyesProgram.mShaderFiles.clear(); gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/avatarEyesV.glsl", GL_VERTEX_SHADER_ARB)); diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index bbb19a63f1..f0b5b50feb 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -137,10 +137,6 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) LLVOCacheEntry::~LLVOCacheEntry() { - if(mBuffer != mDP.getBuffer()) - { - delete[] mBuffer ; //just in case - } mDP.freeBuffer(); } diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 6ee6822e2f..cd2bbad620 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -195,12 +195,13 @@ static LLVivoxVoiceClientFriendsObserver *friendslist_listener = NULL; class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder { public: - LLVivoxVoiceClientCapResponder(void){}; + LLVivoxVoiceClientCapResponder(LLVivoxVoiceClient::state requesting_state) : mRequestingState(requesting_state) {}; virtual void error(U32 status, const std::string& reason); // called with bad status codes virtual void result(const LLSD& content); private: + LLVivoxVoiceClient::state mRequestingState; // state }; void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason) @@ -208,6 +209,7 @@ void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason LL_WARNS("Voice") << "LLVivoxVoiceClientCapResponder::error(" << status << ": " << reason << ")" << LL_ENDL; + LLVivoxVoiceClient::getInstance()->sessionTerminate(); } void LLVivoxVoiceClientCapResponder::result(const LLSD& content) @@ -216,12 +218,12 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content) LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest response:" << ll_pretty_print_sd(content) << LL_ENDL; + std::string uri; + std::string credentials; + if ( content.has("voice_credentials") ) { LLSD voice_credentials = content["voice_credentials"]; - std::string uri; - std::string credentials; - if ( voice_credentials.has("channel_uri") ) { uri = voice_credentials["channel_uri"].asString(); @@ -231,7 +233,12 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content) credentials = voice_credentials["channel_credentials"].asString(); } - + } + + // set the spatial channel. If no voice credentials or uri are + // available, then we simply drop out of voice spatially. + if(LLVivoxVoiceClient::getInstance()->parcelVoiceInfoReceived(mRequestingState)) + { LLVivoxVoiceClient::getInstance()->setSpatialChannel(uri, credentials); } } @@ -551,18 +558,27 @@ void LLVivoxVoiceClient::userAuthorized(const std::string& user_id, const LLUUID void LLVivoxVoiceClient::requestVoiceAccountProvision(S32 retries) { - if ( gAgent.getRegion() && mVoiceEnabled ) + LLViewerRegion *region = gAgent.getRegion(); + + if ( region && mVoiceEnabled ) { std::string url = - gAgent.getRegion()->getCapability( - "ProvisionVoiceAccountRequest"); - - if ( url == "" ) return; - + region->getCapability("ProvisionVoiceAccountRequest"); + + if ( url.empty() ) + { + // we've not received the capability yet, so return. + // the password will remain empty, so we'll remain in + // stateIdle + return; + } + LLHTTPClient::post( - url, - LLSD(), - new LLVivoxVoiceAccountProvisionResponder(retries)); + url, + LLSD(), + new LLVivoxVoiceAccountProvisionResponder(retries)); + + setState(stateConnectorStart); } } @@ -673,7 +689,8 @@ std::string LLVivoxVoiceClient::state2string(LLVivoxVoiceClient::state inState) CASE(stateVoiceFontsWait); CASE(stateVoiceFontsReceived); CASE(stateCreatingSessionGroup); - CASE(stateNoChannel); + CASE(stateNoChannel); + CASE(stateRetrievingParcelVoiceInfo); CASE(stateJoiningSession); CASE(stateSessionJoined); CASE(stateRunning); @@ -741,42 +758,6 @@ void LLVivoxVoiceClient::stateMachine() } } - // Check for parcel boundary crossing - { - LLViewerRegion *region = gAgent.getRegion(); - LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - - if(region && parcel) - { - S32 parcelLocalID = parcel->getLocalID(); - std::string regionName = region->getName(); - std::string capURI = region->getCapability("ParcelVoiceInfoRequest"); - -// LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL; - - // The region name starts out empty and gets filled in later. - // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes. - // If either is empty, wait for the next time around. - if(!regionName.empty()) - { - if(!capURI.empty()) - { - if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName)) - { - // We have changed parcels. Initiate a parcel channel lookup. - mCurrentParcelLocalID = parcelLocalID; - mCurrentRegionName = regionName; - - parcelChanged(); - } - } - else - { - LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL; - } - } - } - } switch(getState()) { @@ -1026,22 +1007,9 @@ void LLVivoxVoiceClient::stateMachine() } else if(!mAccountName.empty()) { - LLViewerRegion *region = gAgent.getRegion(); - - if(region) + if ( mAccountPassword.empty() ) { - if ( region->getCapability("ProvisionVoiceAccountRequest") != "" ) - { - if ( mAccountPassword.empty() ) - { - requestVoiceAccountProvision(); - } - setState(stateConnectorStart); - } - else - { - LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL; - } + requestVoiceAccountProvision(); } } break; @@ -1382,11 +1350,7 @@ void LLVivoxVoiceClient::stateMachine() setState(stateCreatingSessionGroup); sessionGroupCreateSendMessage(); #else - // Not using session groups -- skip the stateCreatingSessionGroup state. - setState(stateNoChannel); - - // Initial kick-off of channel lookup logic - parcelChanged(); + setState(stateNoChannel); #endif break; @@ -1399,19 +1363,29 @@ void LLVivoxVoiceClient::stateMachine() } else if(!mMainSessionGroupHandle.empty()) { - setState(stateNoChannel); - // Start looped recording (needed for "panic button" anti-griefing tool) recordingLoopStart(); - - // Initial kick-off of channel lookup logic - parcelChanged(); + setState(stateNoChannel); } break; + + //MARK: stateRetrievingParcelVoiceInfo + case stateRetrievingParcelVoiceInfo: + // wait until parcel voice info is received. + if(mSessionTerminateRequested || !mVoiceEnabled) + { + // if a terminate request has been received, + // bail and go to the stateSessionTerminated + // state. If the cap request is still pending, + // the responder will check to see if we've moved + // to a new session and won't change any state. + setState(stateSessionTerminated); + } + break; + //MARK: stateNoChannel case stateNoChannel: - LL_DEBUGS("Voice") << "State No Channel" << LL_ENDL; mSpatialJoiningNum = 0; // Do this here as well as inside sendPositionalUpdate(). @@ -1432,6 +1406,16 @@ void LLVivoxVoiceClient::stateMachine() { setState(stateCaptureBufferPaused); } + else if(checkParcelChanged() || (mNextAudioSession == NULL)) + { + // the parcel is changed, or we have no pending audio sessions, + // so try to request the parcel voice info + // if we have the cap, we move to the appropriate state + if(requestParcelVoiceInfo()) + { + setState(stateRetrievingParcelVoiceInfo); + } + } else if(sessionNeedsRelog(mNextAudioSession)) { requestRelog(); @@ -1466,32 +1450,28 @@ void LLVivoxVoiceClient::stateMachine() notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINING); setState(stateJoiningSession); } - else if(!mSpatialSessionURI.empty()) - { - // If we're not headed elsewhere and have a spatial URI, return to spatial. - switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials); - } break; - + //MARK: stateJoiningSession case stateJoiningSession: // waiting for session handle - - // If this is true we have problem with connection to voice server (EXT-4313). - // See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM. - if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM) + + // If this is true we have problem with connection to voice server (EXT-4313). + // See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM. + if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM) { - // Notify observers to let them know there is problem with voice - notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED); - llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl; + // Notify observers to let them know there is problem with voice + notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED); + llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl; } - - // Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for - // example for p2p many times while waiting for response, so it can't be used to detect errors - if(mAudioSession && mAudioSession->mIsSpatial) + + // Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for + // example for p2p many times while waiting for response, so it can't be used to detect errors + if(mAudioSession && mAudioSession->mIsSpatial) { - mSpatialJoiningNum++; + + mSpatialJoiningNum++; } - + // joinedAudioSession() will transition from here to stateSessionJoined. if(!mVoiceEnabled) { @@ -1511,12 +1491,13 @@ void LLVivoxVoiceClient::stateMachine() } } } - break; - + break; + //MARK: stateSessionJoined case stateSessionJoined: // session handle received - mSpatialJoiningNum = 0; + + mSpatialJoiningNum = 0; // It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4 // before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck. // For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined. @@ -1553,7 +1534,7 @@ void LLVivoxVoiceClient::stateMachine() sessionMediaDisconnectSendMessage(mAudioSession); setState(stateSessionTerminated); } - } + } break; //MARK: stateRunning @@ -1565,6 +1546,7 @@ void LLVivoxVoiceClient::stateMachine() } else { + if(!inSpatialChannel()) { // When in a non-spatial channel, never send positional updates. @@ -1572,8 +1554,22 @@ void LLVivoxVoiceClient::stateMachine() } else { + if(checkParcelChanged()) + { + // if the parcel has changed, attempted to request the + // cap for the parcel voice info. If we can't request it + // then we don't have the cap URL so we do nothing and will + // recheck next time around + if(requestParcelVoiceInfo()) + { + // we did get the cap, and we made the request, + // so go wait for the response. + setState(stateRetrievingParcelVoiceInfo); + } + } // Do the calculation that enforces the listener<->speaker tether (and also updates the real camera position) enforceTether(); + } // Do notifications for expiring Voice Fonts. @@ -3840,7 +3836,7 @@ void LLVivoxVoiceClient::participantUpdatedEvent( // also initialize voice moderate_mode depend on Agent's participant. See EXT-6937. // *TODO: remove once a way to request the current voice channel moderation mode is implemented. - if (gAgentID == participant->mAvatarID) + if (gAgent.getID() == participant->mAvatarID) { speaker_manager->initVoiceModerateMode(); } @@ -4073,7 +4069,7 @@ void LLVivoxVoiceClient::messageEvent( } LL_DEBUGS("Voice") << "adding message, name " << session->mName << " session " << session->mIMSessionID << ", target " << session->mCallerID << LL_ENDL; - gIMMgr->addMessage(session->mIMSessionID, + LLIMMgr::getInstance()->addMessage(session->mIMSessionID, session->mCallerID, session->mName.c_str(), message.c_str(), @@ -4447,24 +4443,91 @@ LLVivoxVoiceClient::participantState* LLVivoxVoiceClient::findParticipantByID(co } -void LLVivoxVoiceClient::parcelChanged() + +// Check for parcel boundary crossing +bool LLVivoxVoiceClient::checkParcelChanged(bool update) { - if(getState() >= stateNoChannel) + LLViewerRegion *region = gAgent.getRegion(); + LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + + if(region && parcel) { - // If the user is logged in, start a channel lookup. - LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL; + S32 parcelLocalID = parcel->getLocalID(); + std::string regionName = region->getName(); + + // LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL; + + // The region name starts out empty and gets filled in later. + // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes. + // If either is empty, wait for the next time around. + if(!regionName.empty()) + { + if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName)) + { + // We have changed parcels. Initiate a parcel channel lookup. + if (update) + { + mCurrentParcelLocalID = parcelLocalID; + mCurrentRegionName = regionName; + } + return true; + } + } + } + return false; +} + +bool LLVivoxVoiceClient::parcelVoiceInfoReceived(state requesting_state) +{ + // pop back to the state we were in when the parcel changed and we managed to + // do the request. + if(getState() == stateRetrievingParcelVoiceInfo) + { + setState(requesting_state); + return true; + } + else + { + // we've dropped out of stateRetrievingParcelVoiceInfo + // before we received the cap result, due to a terminate + // or transition to a non-voice channel. Don't switch channels. + return false; + } +} + - std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest"); +bool LLVivoxVoiceClient::requestParcelVoiceInfo() +{ + LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL; + + // grab the cap for parcel voice info from the region. + LLViewerRegion * region = gAgent.getRegion(); + if (region == NULL) + { + return false; + } + // grab the cap. + std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest"); + if (!url.empty()) + { + // if we've already retrieved the cap from the region, go ahead and make the request, + // and return true so we can go into the state that waits for the response. + checkParcelChanged(true); LLSD data; + LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL; + LLHTTPClient::post( - url, - data, - new LLVivoxVoiceClientCapResponder); + url, + data, + new LLVivoxVoiceClientCapResponder(getState())); + return true; } - else + else { - // The transition to stateNoChannel needs to kick this off again. - LL_INFOS("Voice") << "not logged in yet, deferring" << LL_ENDL; + + // we don't have the cap yet, so return false so the caller can try again later. + LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest cap not yet available, deferring" << LL_ENDL; + return false; } } @@ -4488,6 +4551,7 @@ void LLVivoxVoiceClient::switchChannel( case stateJoinSessionFailed: case stateJoinSessionFailedWaiting: case stateNoChannel: + case stateRetrievingParcelVoiceInfo: // Always switch to the new URI from these states. needsSwitch = true; break; @@ -4560,13 +4624,10 @@ void LLVivoxVoiceClient::switchChannel( mNextAudioSession->mIsP2P = is_p2p; } - if(getState() <= stateNoChannel) - { - // We're already set up to join a channel, just needed to fill in the session URI - } - else + if(getState() >= stateRetrievingParcelVoiceInfo) { - // State machine will come around and rejoin if uri/handle is not empty. + // If we're already in a channel, or if we're joining one, terminate + // so we can rejoin with the new session data. sessionTerminate(); } } @@ -6267,13 +6328,13 @@ void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string { session->mTextInvitePending = false; - // We don't need to call gIMMgr->addP2PSession() here. The first incoming message will create the panel. + // We don't need to call LLIMMgr::getInstance()->addP2PSession() here. The first incoming message will create the panel. } if(session->mVoiceInvitePending) { session->mVoiceInvitePending = false; - gIMMgr->inviteToSession( + LLIMMgr::getInstance()->inviteToSession( session->mIMSessionID, session->mName, session->mCallerID, diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index 471545de56..1142a1a49c 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -380,7 +380,8 @@ protected: stateVoiceFontsWait, // Awaiting the list of voice fonts stateVoiceFontsReceived, // List of voice fonts received stateCreatingSessionGroup, // Creating the main session group - stateNoChannel, // + stateNoChannel, // Need to join a channel + stateRetrievingParcelVoiceInfo, // waiting for parcel voice info request to return with spatial credentials stateJoiningSession, // waiting for session handle stateSessionJoined, // session handle received stateRunning, // in session, steady state @@ -620,6 +621,8 @@ protected: void sessionMediaDisconnectSendMessage(sessionState *session); void sessionTextDisconnectSendMessage(sessionState *session); + + // Pokes the state machine to leave the audio session next time around. void sessionTerminate(); @@ -629,6 +632,12 @@ protected: // Does the actual work to get out of the audio session void leaveAudioSession(); + // notifies the voice client that we've received parcel voice info + bool parcelVoiceInfoReceived(state requesting_state); + + friend class LLVivoxVoiceClientCapResponder; + + void lookupName(const LLUUID &id); void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name); void avatarNameResolved(const LLUUID &id, const std::string &name); @@ -733,9 +742,11 @@ private: bool mCaptureDeviceDirty; bool mRenderDeviceDirty; + + bool checkParcelChanged(bool update = false); // This should be called when the code detects we have changed parcels. // It initiates the call to the server that gets the parcel channel. - void parcelChanged(); + bool requestParcelVoiceInfo(); void switchChannel(std::string uri = std::string(), bool spatial = true, bool no_reconnect = false, bool is_p2p = false, std::string hash = ""); void joinSession(sessionState *session); diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml index 925492b2d7..66a128cd13 100644 --- a/indra/newview/skins/default/xui/da/panel_people.xml +++ b/indra/newview/skins/default/xui/da/panel_people.xml @@ -66,16 +66,16 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Verd <layout_panel name="view_profile_btn_lp"> <button label="Profil" name="view_profile_btn" tool_tip="Vis billeder, grupper og anden beboer information"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Åben session med privat besked (IM)"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Kald" name="call_btn" tool_tip="Opkald til denne beboer"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Del" name="share_btn" tool_tip="Del en genstand fra beholdning"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleportér" name="teleport_btn" tool_tip="Tilbyd teleport"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml index f1e42232c8..f0fa4386d2 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -219,38 +219,38 @@ werden. <text name="objects_available"> [COUNT] von [MAX] ([AVAILABLE] verfügbar) </text> - <text name="Primitives parcel supports:" width="200"> + <text name="Primitives parcel supports:"> Von Parzelle unterstützte Prims: </text> - <text left="204" name="object_contrib_text" width="152"> + <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> Prims auf Parzelle: </text> - <text left="204" name="total_objects_text" width="48"> + <text name="total_objects_text"> [COUNT] </text> - <text left="14" name="Owned by parcel owner:" width="200"> + <text name="Owned by parcel owner:" width="200"> Im Eigentum des Parzellenbesitzers: </text> - <text left="204" left_delta="200" name="owner_objects_text" width="48"> + <text left_delta="204" name="owner_objects_text"> [COUNT] </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/> - <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Set to group:"> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner"/> + <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOwner..." tool_tip="Objekte an ihre Eigentümer zurückgeben."/> + <text name="Set to group:"> Der Gruppe zugeordnet: </text> - <text left="204" name="group_objects_text" width="48"> + <text name="group_objects_text"> [COUNT] </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/> - <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Owned by others:" width="128"> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup"/> + <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnGroup..." tool_tip="Objekte an ihre Eigentümer zurückgeben."/> + <text name="Owned by others:"> Im Eigentum anderer: </text> - <text left="204" name="other_objects_text" width="48"> + <text name="other_objects_text"> [COUNT] </text> <button label="Anzeigen" label_selected="Anzeigen" name="ShowOther"/> diff --git a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml index fd65987aa9..9be22f3ccb 100644 --- a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml @@ -9,7 +9,7 @@ </text> <check_box label="Bearbeiten" name="next_owner_modify"/> <check_box label="Kopieren" name="next_owner_copy"/> - <check_box label="Verkaufen/Weggeben" left_delta="80" name="next_owner_transfer"/> + <check_box label="Verkaufen/Weggeben" name="next_owner_transfer"/> </panel> <button label="OK" label_selected="OK" name="ok"/> <button label="Abbrechen" label_selected="Abbrechen" name="cancel"/> diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml index c014b8e040..ae68c71a80 100644 --- a/indra/newview/skins/default/xui/de/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml @@ -4,7 +4,7 @@ unbekannt </floater.string> <radio_group label="Fototyp" name="snapshot_type_radio"> - <radio_item label="Email" name="postcard"/> + <radio_item label="E-Mail" name="postcard"/> <radio_item label="Mein Inventar ([AMOUNT] L$)" name="texture"/> <radio_item label="Auf meinem Computer speichern" name="local"/> </radio_group> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index 258e67a138..338b609343 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -64,9 +64,9 @@ <radio_item label="Fläche auswählen" name="radio select face"/> </radio_group> <check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/> - <button label="Link" name="link_btn"/> - <button label="Verknüpfung auflösen" name="unlink_btn"/> - <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt"> + <button label="Link" name="link_btn" width="30"/> + <button label="Verknüpfung auflösen" name="unlink_btn" width="126"/> + <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt" left_pad="0"> þ: [COUNT] </text> <check_box label="" name="checkbox uniform"/> diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml index 004792bbf5..63a832a165 100644 --- a/indra/newview/skins/default/xui/de/panel_people.xml +++ b/indra/newview/skins/default/xui/de/panel_people.xml @@ -66,16 +66,16 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte]. <layout_panel name="view_profile_btn_lp"> <button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Teilen" name="share_btn" tool_tip="Inventarobjekt teilen"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index b874074c79..9175ea0bae 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -60,7 +60,7 @@ m </text> <slider label="Max. Partikelzahl:" name="MaxParticleCount"/> - <slider label="Max. Anzahl an voll dargestellten Avataren:" name="MaxNumberAvatarDrawn"/> + <slider label="Max. Anzahl an voll dargestellten Avataren:" label_width="230" name="MaxNumberAvatarDrawn" width="315"/> <slider label="Post-Processing-Qualität:" name="RenderPostProcess"/> <text name="MeshDetailText"> Darstellungsgrad: diff --git a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml index 990193574e..fa659040ea 100644 --- a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml +++ b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="LLScrollingPanelParamBase"> - <slider label="[BESCHR]" name="param slider"/> + <slider label="[DESC]" name="param slider"/> </panel> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index ec190ab656..89a0c4c287 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -330,13 +330,13 @@ increment="1" initial_value="75" label="Image quality" - label_width="100" + label_width="124" layout="topleft" left_delta="0" max_val="100" name="image_quality_slider" top_pad="5" - width="205" /> + width="228" /> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 7441b2cd9c..8b8f70b940 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -279,7 +279,7 @@ layout="topleft" left_pad="2" name="unlink_btn" - width="50"> + width="105"> <button.commit_callback function="BuildTool.UnlinkObjects"/> </button> diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 3ead67ca57..a7d1aa963c 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -135,6 +135,14 @@ name="login_panel_holder" width="1024"/> + <debug_view follows="all" + left="0" + top="0" + mouse_opaque="false" + height="500" + name="DebugView" + width="1024"/> + <panel follows="all" height="500" left="0" @@ -154,13 +162,6 @@ top="0" width="1024"/> </panel> - <debug_view follows="all" - left="0" - top="0" - mouse_opaque="false" - height="500" - name="DebugView" - width="1024"/> </layout_panel> </layout_stack> <panel mouse_opaque="false" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 81046e99a0..a0d0c8625e 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -232,6 +232,16 @@ function="SideTray.PanelPeopleTab" parameter="nearby_panel" /> </menu_item_call> + <menu_item_check + label="Nearby Voice" + name="Nearby Voice"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="voice_controls" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="voice_controls" /> + </menu_item_check> </menu> <menu create_jump_keys="true" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 09105c1d28..db1cee5d08 100755..100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -3698,6 +3698,19 @@ Join me in [REGION] <notification icon="alertmodal.tga" + name="TooManyTeleportOffers" + type="alertmodal"> +You attempted to make [OFFERS] teleport offers +which exceeds the limit of [LIMIT]. + <tag>group</tag> + <tag>fail</tag> + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + + <notification + icon="alertmodal.tga" name="OfferTeleportFromGod" type="alertmodal"> God summon Resident to your location? diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml index bbeb592e96..9e70706603 100644 --- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -52,7 +52,7 @@ multi_select="true" name="list_attachments" top="0" - width="311"> + width="311"/> </accordion_tab> <accordion_tab layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml index 9bd60b935f..bfc503f05b 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml @@ -104,12 +104,12 @@ top_pad="15" left="10" name="show_text" - width="40"> + width="62"> Show: </text> <combo_box height="23" - left="50" + left="72" width="140" top_delta="-5" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index 9f98019c94..a0096adc01 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -14,9 +14,7 @@ background_visible="true" bg_alpha_color="DkGray2" bg_opaque_color="DkGray2" - no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]." - no_matched_tabs_text.v_pad="10" - no_visible_tabs_text.value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]" + follows="all" height="400" layout="topleft" @@ -24,6 +22,13 @@ name="outfits_accordion" top="0" width="309"> + <no_matched_tabs_text + name="no_matched_outfits_msg" + value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]." + v_pad="10"/> + <no_visible_tabs_text + name="no_outfits_msg" + value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"/> </accordion> <panel background_visible="true" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 775805ad2e..cc4522f944 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -110,8 +110,9 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M <layout_panel height="142" layout="topleft" + min_dim="100" mouse_opaque="false" - user_resize="false" + user_resize="true" visibility_control="NearbyListShowMap" width="313"> <net_map @@ -128,9 +129,9 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M <layout_panel height="213" layout="topleft" - min_height="100" + min_dim="100" mouse_opaque="false" - user_resize="false" + user_resize="true" width="313"> <avatar_list allow_select="true" @@ -621,7 +622,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="23" layout="bottomleft" left_pad="3" - name="chat_btn_lp" + name="im_btn_lp" user_resize="false" auto_resize="true" width="41"> @@ -642,7 +643,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="23" layout="bottomleft" left_pad="3" - name="chat_btn_lp" + name="call_btn_lp" user_resize="false" auto_resize="true" width="52"> @@ -663,7 +664,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="23" layout="bottomleft" left_pad="3" - name="chat_btn_lp" + name="share_btn_lp" user_resize="false" auto_resize="true" width="66"> @@ -684,7 +685,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="23" layout="bottomleft" left_pad="3" - name="chat_btn_lp" + name="teleport_btn_lp" user_resize="false" auto_resize="true" width="77"> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 71f48c833d..143a989d32 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2250,6 +2250,9 @@ Returns a string with the requested data about the region <string name="IMMainland">mainland</string> <string name="IMTeen">teen</string> + <!-- floater about land --> + <string name="Anyone">anyone</string> + <!-- floater region info --> <!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* --> <string name="RegionInfoError">error</string> diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml index 2f92cb55eb..43bbf0b70f 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml @@ -18,7 +18,7 @@ <text name="balance_amount"> [AMT] L$ </text> - <text name="currency_action" width="50"> + <text name="currency_action"> Quiero comprar </text> <text name="currency_label"> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index 9d29bc40bf..78f18b745c 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -65,7 +65,7 @@ </radio_group> <check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/> <button label="Enlazar" name="link_btn"/> - <button label="Desenlazar" name="unlink_btn"/> + <button label="Desenlazar" name="unlink_btn" width="95"/> <text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto"> þ: [COUNT] </text> diff --git a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml index e8e95c3bac..293c9ef1d9 100644 --- a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> <panel name="navigation_panel"> - <pull_button name="back_btn" tool_tip="Volver a lo localización anterior"/> + <pull_button name="back_btn" tool_tip="Volver a la localización anterior"/> <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/> <button name="home_btn" tool_tip="Teleportar a mi Base"/> <location_input label="Localización" name="location_combo"/> diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml index 01149e412d..a9d38dca25 100644 --- a/indra/newview/skins/default/xui/es/panel_people.xml +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -66,16 +66,16 @@ <layout_panel name="view_profile_btn_lp"> <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml index e6e4c13203..d47a6d718a 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml @@ -39,6 +39,6 @@ <text name="floater_opacity"> Opacidad de la ventana: </text> - <slider label="Activo:" name="active"/> - <slider label="Inactivo:" name="inactive"/> + <slider label="Activa:" name="active"/> + <slider label="Inactiva:" name="inactive"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index fa7806a75a..75d175b262 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -12,7 +12,7 @@ <slider label="Ambiental" name="Wind Volume"/> <slider label="Efectos de sonido" name="SFX Volume"/> <slider label="Música en streaming" name="Music Volume"/> - <check_box label="Activados" name="enable_music"/> + <check_box label="Activada" name="enable_music"/> <slider label="Multimedia" name="Media Volume"/> <check_box label="Activados" name="enable_media"/> <slider label="Chat de voz" name="Voice Volume"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 3731b6b57c..b759eed738 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -3628,6 +3628,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="LocationCtrlComboBtnTooltip"> Historial de mis localizaciones </string> + <string name="LocationCtrlForSaleTooltip"> + Comprar este terreno + </string> <string name="LocationCtrlAdultIconTooltip"> Región Adulta </string> diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml index 166f04b3e4..b24c340708 100644 --- a/indra/newview/skins/default/xui/fr/panel_people.xml +++ b/indra/newview/skins/default/xui/fr/panel_people.xml @@ -66,16 +66,16 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:// <layout_panel name="view_profile_btn_lp"> <button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Appel" name="call_btn" tool_tip="Appeler ce résident"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Partager" name="share_btn" tool_tip="Partager un article de l'inventaire"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml index b24a4055f7..f903ae6e2c 100644 --- a/indra/newview/skins/default/xui/it/panel_people.xml +++ b/indra/newview/skins/default/xui/it/panel_people.xml @@ -66,16 +66,16 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa <layout_panel name="view_profile_btn_lp"> <button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell'inventario"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index b29f744a68..f7d77d351e 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -74,8 +74,8 @@ 両側を延ばす </text> <check_box initial_value="true" label="テクスチャを引き延ばす" name="checkbox stretch textures"/> - <check_box initial_value="true" label="グリッドにスナップ" left_delta="27" name="checkbox snap to grid"/> - <combo_box left_delta="60" name="combobox grid mode" tool_tip="オブジェクトの配置に使うグリッドルーラを選択します" width="76"> + <check_box initial_value="true" label="グリッドにスナップ" name="checkbox snap to grid"/> + <combo_box name="combobox grid mode" tool_tip="オブジェクトの配置に使うグリッドルーラを選択します" > <combo_box.item label="インワールドグリッド" name="World"/> <combo_box.item label="ローカルグリッド" name="Local"/> <combo_box.item label="リファレンスグリッド" name="Reference"/> @@ -137,7 +137,7 @@ <text name="object_cost" tool_tip="[prims] / [physics complexity] として現在選択されているオブジェクトのコスト"> 料金: [COST] / [PHYSICS] </text> - <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30"> + <tab_container name="Object Info Tabs" > <panel label="一般" name="General"> <panel.string name="text deed continued"> 譲渡 @@ -379,22 +379,22 @@ オブジェクトの特徴を編集: </text> <check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心にオブジェクトの屈曲を有効にします(クライアント側のみ)"/> - <spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/> - <spinner label="重力" label_width="72" name="FlexGravity" width="135"/> - <spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/> - <spinner label="風" label_width="72" name="FlexWind" width="135"/> - <spinner label="緊張" label_width="72" name="FlexTension" width="135"/> - <spinner label="X 軸方向の力" label_width="72" name="FlexForceX" width="135"/> - <spinner label="Y 軸方向の力" label_width="72" name="FlexForceY" width="135"/> - <spinner label="Z 軸方向の力" label_width="72" name="FlexForceZ" width="135"/> + <spinner label="柔軟性" name="FlexNumSections" /> + <spinner label="重力" name="FlexGravity" /> + <spinner label="ドラッグ" name="FlexFriction" /> + <spinner label="風" name="FlexWind" /> + <spinner label="緊張" name="FlexTension" /> + <spinner label="X 軸方向の力" name="FlexForceX" /> + <spinner label="Y 軸方向の力" name="FlexForceY" /> + <spinner label="Z 軸方向の力" name="FlexForceZ" /> <check_box label="光" name="Light Checkbox Ctrl" tool_tip="オブジェクトが発光します"/> - <color_swatch label="" left_delta="74" name="colorswatch" tool_tip="クリックしてカラーピッカーを開きます"/> + <color_swatch label="" name="colorswatch" tool_tip="クリックしてカラーピッカーを開きます"/> <texture_picker label="" name="light texture control" tool_tip="クリックで投影画を選択します(遅延レンダリング有効時のみ)"/> - <spinner label="輝度" label_width="72" name="Light Intensity" width="135"/> + <spinner label="輝度" name="Light Intensity" /> <spinner label="FOV" name="Light FOV"/> - <spinner label="半径" label_width="72" name="Light Radius" width="135"/> + <spinner label="半径" name="Light Radius" /> <spinner label="焦点" name="Light Focus"/> - <spinner label="弱まる" label_width="72" name="Light Falloff" width="135"/> + <spinner label="弱まる" name="Light Falloff" /> <spinner label="環境" name="Light Ambiance"/> <text name="label physicsshapetype"> 実像の種類: @@ -496,18 +496,18 @@ </panel> </panel> <panel label="中身" name="Contents"> - <button label="新しいスクリプト" label_selected="新規スクリプト" name="button new script" width="120"/> - <button label="権限" left_delta="130" name="button permissions" width="80"/> + <button label="新しいスクリプト" label_selected="新規スクリプト" name="button new script" /> + <button label="権限" name="button permissions" /> </panel> </tab_container> <panel name="land info panel"> <text name="label_parcel_info"> 区画情報 </text> - <text name="label_area_price" width="200"> + <text name="label_area_price" > 価格: [AREA] 平方メートル L$ [PRICE] </text> - <text name="label_area" width="200"> + <text name="label_area" > 面積: [AREA] 平方メートル </text> <button label="土地情報" label_selected="土地情報" name="button about land"/> diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml index c7f71c6de0..1c90f7327e 100644 --- a/indra/newview/skins/default/xui/ja/panel_people.xml +++ b/indra/newview/skins/default/xui/ja/panel_people.xml @@ -66,16 +66,16 @@ <layout_panel name="view_profile_btn_lp"> <button label="プロフィール" name="view_profile_btn" tool_tip="写真、グループ、その他住人情報を表示"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開きます"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="コール" name="call_btn" tool_tip="この住人にコールする"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="共有" name="share_btn" tool_tip="「持ち物」のアイテムを共有する"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="テレポート" name="teleport_btn" tool_tip="テレポートを送ります"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index a6691fb764..ff22221aab 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -3821,7 +3821,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ アドホックコンファレンス </string> <string name="conference-title-incoming"> - [AGENT_NAME]とコンファレンスする + [AGENT_NAME] とコンファレンスする </string> <string name="inventory_item_offered-im"> 持ち物アイテムを送りました diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml index da9f84cb2e..ef52e2148b 100644 --- a/indra/newview/skins/default/xui/pl/panel_people.xml +++ b/indra/newview/skins/default/xui/pl/panel_people.xml @@ -66,16 +66,16 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Świata]. <layout_panel name="view_profile_btn_lp"> <button label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Otwórz wiadomości IM"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Dzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Udostępnij" name="share_btn" tool_tip="Udostępnij obiekt z Szafy"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleport"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml index aece30738b..f3af15b991 100644 --- a/indra/newview/skins/default/xui/pt/panel_people.xml +++ b/indra/newview/skins/default/xui/pt/panel_people.xml @@ -66,16 +66,16 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa- <layout_panel name="view_profile_btn_lp"> <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Ligar" name="call_btn" tool_tip="Ligar para este residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml index 8da75e334e..4c6d6c76be 100644 --- a/indra/newview/skins/default/xui/zh/panel_people.xml +++ b/indra/newview/skins/default/xui/zh/panel_people.xml @@ -66,16 +66,16 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M <layout_panel name="view_profile_btn_lp"> <button label="檔案" name="view_profile_btn" tool_tip="Show picture, groups, and other Residents information"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="開啟即時訊息會話"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="通話" name="call_btn" tool_tip="Call this Resident"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="分享" name="share_btn" tool_tip="分享一個收納區物品"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="瞬間傳送" name="teleport_btn" tool_tip="Offer teleport"/> </layout_panel> </layout_stack> diff --git a/scripts/gpu_table_tester b/scripts/gpu_table_tester index 52b1c8f31d..52b1c8f31d 100755..100644 --- a/scripts/gpu_table_tester +++ b/scripts/gpu_table_tester |