diff options
130 files changed, 1650 insertions, 1822 deletions
@@ -213,7 +213,11 @@ e440cd1dfbd128d7d5467019e497f7f803640ad6 3.2.0-beta1 9bcc2b7176634254e501e3fb4c5b56c1f637852e 3.2.0-beta2 2a13d30ee50ccfed50268238e36bb90d738ccc9e DRTVWR-98_3.2.0-beta3 2a13d30ee50ccfed50268238e36bb90d738ccc9e 3.2.0-beta3 +3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release +3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start +3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release +3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release 40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start 3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release 3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release @@ -221,3 +225,6 @@ c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start 9e390d76807fa70d356b8716fb83b8ce42a629ef 3.2.1-beta1 523df3e67378541498d516d52af4402176a26bac DRTVWR-102_3.2.2-beta1 523df3e67378541498d516d52af4402176a26bac 3.2.2-beta1 +80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start +a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release +a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release diff --git a/BuildParams b/BuildParams index 5068edb21f..3f5d6f8c6b 100755 --- a/BuildParams +++ b/BuildParams @@ -136,14 +136,6 @@ viewer-mesh.login_channel = "Project Viewer - Mesh" viewer-mesh.viewer_grid = aditi viewer-mesh.email = shining@lists.lindenlab.com - -# ======================================== -# CG -# ======================================== - -cg_viewer-development_lenny.show_changes_since = 4b140ce7839d -cg_viewer-development_lenny.email = cg@lindenlab.com - # ================ # oz # ================ @@ -151,20 +143,29 @@ cg_viewer-development_lenny.email = cg@lindenlab.com oz_viewer-devreview.build_debug_release_separately = true oz_viewer-devreview.codeticket_add_context = false oz_viewer-devreview.build_enforce_coding_policy = true +oz_viewer-devreview.email = oz@lindenlab.com oz_project-1.build_debug_release_separately = true oz_project-1.codeticket_add_context = false +oz_project-1.email = oz@lindenlab.com oz_project-2.build_debug_release_separately = true oz_project-2.codeticket_add_context = false +oz_project-2.email = oz@lindenlab.com oz_project-3.build_debug_release_separately = true oz_project-3.codeticket_add_context = false +oz_project-3.email = oz@lindenlab.com oz_project-4.build_debug_release_separately = true oz_project-4.codeticket_add_context = false +oz_project-4.email = oz@lindenlab.com +oz_project-5.build_debug_release_separately = true +oz_project-5.codeticket_add_context = false +oz_project-5.email = oz@lindenlab.com oz_viewer-beta-review.build_debug_release_separately = true oz_viewer-beta-review.codeticket_add_context = false oz_viewer-beta-review.viewer_channel = "Second Life Beta Viewer" oz_viewer-beta-review.login_channel = "Second Life Beta Viewer" +oz_viewer-beta-review.email = oz@lindenlab.com # ================================================================= # asset delivery 2010 projects diff --git a/doc/contributions.txt b/doc/contributions.txt index 2b39e15e2a..8d30c21f90 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -170,6 +170,7 @@ Ansariel Hiller STORM-1101 VWR-25480 VWR-26150 + STORM-1685 Aralara Rajal Ardy Lay STORM-859 @@ -583,9 +584,11 @@ Jonathan Yap STORM-910 STORM-1642 STORM-1105 + STORM-1679 STORM-1222 STORM-1659 STORM-1674 + STORM-1685 Kadah Coba STORM-1060 Jondan Lundquist @@ -1114,6 +1117,7 @@ Tofu Buzzard CTS-411 STORM-546 VWR-24509 + STORM-1684 Tony Kembia Torben Trautman TouchaHoney Perhaps diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index d1042d6e86..4b1bf49d07 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -1,4 +1,3 @@ - # -*- cmake -*- # cmake_minimum_required should appear before any @@ -70,6 +69,9 @@ if (VIEWER) add_subdirectory(${LIBS_OPEN_PREFIX}llxuixml) add_subdirectory(${LIBS_OPEN_PREFIX}viewer_components) + # Legacy C++ tests. Build always, run if LL_TESTS is true. + add_subdirectory(${VIEWER_PREFIX}test) + # viewer media plugins add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins) diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index fc1c1449da..b50405421d 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 3; const S32 LL_VERSION_MINOR = 2; -const S32 LL_VERSION_PATCH = 2; +const S32 LL_VERSION_PATCH = 4; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp index 6fa90933a4..0e29873bb0 100644 --- a/indra/llui/llsdparam.cpp +++ b/indra/llui/llsdparam.cpp @@ -36,6 +36,8 @@ static LLInitParam::Parser::parser_write_func_map_t sWriteFuncs; static LLInitParam::Parser::parser_inspect_func_map_t sInspectFuncs; static const LLSD NO_VALUE_MARKER; +LLFastTimer::DeclareTimer FTM_SD_PARAM_ADAPTOR("LLSD to LLInitParam conversion"); + // // LLParamSDParser // diff --git a/indra/llui/llsdparam.h b/indra/llui/llsdparam.h index c1cfa98399..3dfc6d020e 100644 --- a/indra/llui/llsdparam.h +++ b/indra/llui/llsdparam.h @@ -91,6 +91,8 @@ private: LLSD* mCurWriteSD; }; + +extern LLFastTimer::DeclareTimer FTM_SD_PARAM_ADAPTOR; template<typename T> class LLSDParamAdapter : public T { @@ -98,8 +100,11 @@ public: LLSDParamAdapter() {} LLSDParamAdapter(const LLSD& sd) { + LLFastTimer _(FTM_SD_PARAM_ADAPTOR); LLParamSDParser parser; - parser.readSD(sd, *this); + // don't spam for implicit parsing of LLSD, as we want to allow arbitrary freeform data and ignore most of it + bool parse_silently = true; + parser.readSD(sd, *this, parse_silently); } operator LLSD() const diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index 42b779bd28..fd9b3d9a6d 100644 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -33,28 +33,28 @@ #include "llurlregistry.h" // global state for the callback functions -void (*LLUrlAction::sOpenURLCallback) (const std::string& url) = NULL; -void (*LLUrlAction::sOpenURLInternalCallback) (const std::string& url) = NULL; -void (*LLUrlAction::sOpenURLExternalCallback) (const std::string& url) = NULL; -bool (*LLUrlAction::sExecuteSLURLCallback) (const std::string& url) = NULL; +LLUrlAction::url_callback_t LLUrlAction::sOpenURLCallback; +LLUrlAction::url_callback_t LLUrlAction::sOpenURLInternalCallback; +LLUrlAction::url_callback_t LLUrlAction::sOpenURLExternalCallback; +LLUrlAction::execute_url_callback_t LLUrlAction::sExecuteSLURLCallback; -void LLUrlAction::setOpenURLCallback(void (*cb) (const std::string& url)) +void LLUrlAction::setOpenURLCallback(url_callback_t cb) { sOpenURLCallback = cb; } -void LLUrlAction::setOpenURLInternalCallback(void (*cb) (const std::string& url)) +void LLUrlAction::setOpenURLInternalCallback(url_callback_t cb) { sOpenURLInternalCallback = cb; } -void LLUrlAction::setOpenURLExternalCallback(void (*cb) (const std::string& url)) +void LLUrlAction::setOpenURLExternalCallback(url_callback_t cb) { sOpenURLExternalCallback = cb; } -void LLUrlAction::setExecuteSLURLCallback(bool (*cb) (const std::string& url)) +void LLUrlAction::setExecuteSLURLCallback(execute_url_callback_t cb) { sExecuteSLURLCallback = cb; } @@ -63,7 +63,7 @@ void LLUrlAction::openURL(std::string url) { if (sOpenURLCallback) { - (*sOpenURLCallback)(url); + sOpenURLCallback(url); } } @@ -71,7 +71,7 @@ void LLUrlAction::openURLInternal(std::string url) { if (sOpenURLInternalCallback) { - (*sOpenURLInternalCallback)(url); + sOpenURLInternalCallback(url); } } @@ -79,7 +79,7 @@ void LLUrlAction::openURLExternal(std::string url) { if (sOpenURLExternalCallback) { - (*sOpenURLExternalCallback)(url); + sOpenURLExternalCallback(url); } } @@ -87,18 +87,18 @@ void LLUrlAction::executeSLURL(std::string url) { if (sExecuteSLURLCallback) { - (*sExecuteSLURLCallback)(url); + sExecuteSLURLCallback(url); } } void LLUrlAction::clickAction(std::string url) { // Try to handle as SLURL first, then http Url - if ( (sExecuteSLURLCallback) && !(*sExecuteSLURLCallback)(url) ) + if ( (sExecuteSLURLCallback) && !sExecuteSLURLCallback(url) ) { if (sOpenURLCallback) { - (*sOpenURLCallback)(url); + sOpenURLCallback(url); } } } diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index 0132dbaaf0..c34960b826 100644 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -29,6 +29,7 @@ #define LL_LLURLACTION_H #include <string> +#include <boost/function.hpp> /// /// The LLUrlAction class provides a number of static functions that @@ -77,17 +78,21 @@ public: static void showProfile(std::string url); /// specify the callbacks to enable this class's functionality - static void setOpenURLCallback(void (*cb) (const std::string& url)); - static void setOpenURLInternalCallback(void (*cb) (const std::string& url)); - static void setOpenURLExternalCallback(void (*cb) (const std::string& url)); - static void setExecuteSLURLCallback(bool (*cb) (const std::string& url)); + typedef boost::function<void (const std::string&)> url_callback_t; + typedef boost::function<bool(const std::string& url)> execute_url_callback_t; + + static void setOpenURLCallback(url_callback_t cb); + static void setOpenURLInternalCallback(url_callback_t cb); + static void setOpenURLExternalCallback(url_callback_t cb); + static void setExecuteSLURLCallback(execute_url_callback_t cb); private: // callbacks for operations we can perform on Urls - static void (*sOpenURLCallback) (const std::string& url); - static void (*sOpenURLInternalCallback) (const std::string& url); - static void (*sOpenURLExternalCallback) (const std::string& url); - static bool (*sExecuteSLURLCallback) (const std::string& url); + static url_callback_t sOpenURLCallback; + static url_callback_t sOpenURLInternalCallback; + static url_callback_t sOpenURLExternalCallback; + + static execute_url_callback_t sExecuteSLURLCallback; }; #endif diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index e41aa9820f..da2222ad51 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -63,6 +63,9 @@ extern BOOL gDebugWindowProc; const S32 MAX_NUM_RESOLUTIONS = 200; +const S32 MIN_WINDOW_WIDTH = 1024; +const S32 MIN_WINDOW_HEIGHT = 768; + // static variable for ATI mouse cursor crash work-around: static bool ATIbug = false; @@ -1843,11 +1846,15 @@ void LLWindowSDL::gatherInput() break; case SDL_VIDEORESIZE: // *FIX: handle this? + { llinfos << "Handling a resize event: " << event.resize.w << "x" << event.resize.h << llendl; + S32 width = llmax(event.resize.w, MIN_WINDOW_WIDTH); + S32 height = llmax(event.resize.h, MIN_WINDOW_HEIGHT); + // *FIX: I'm not sure this is necessary! - mWindow = SDL_SetVideoMode(event.resize.w, event.resize.h, 32, mSDLFlags); + mWindow = SDL_SetVideoMode(width, height, 32, mSDLFlags); if (!mWindow) { // *FIX: More informative dialog? @@ -1861,9 +1868,9 @@ void LLWindowSDL::gatherInput() break; } - mCallbacks->handleResize(this, event.resize.w, event.resize.h ); + mCallbacks->handleResize(this, width, height); break; - + } case SDL_ACTIVEEVENT: if (event.active.state & SDL_APPINPUTFOCUS) { diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index ff9cf3199e..ba05f6288b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -207,7 +207,6 @@ set(viewer_SOURCE_FILES llfloaterland.cpp llfloaterlandholdings.cpp llfloatermap.cpp - llfloatermediabrowser.cpp llfloatermediasettings.cpp llfloatermemleak.cpp llfloatermodelpreview.cpp @@ -781,7 +780,6 @@ set(viewer_HEADER_FILES llfloaterland.h llfloaterlandholdings.h llfloatermap.h - llfloatermediabrowser.h llfloatermediasettings.h llfloatermemleak.h llfloatermodelpreview.h diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 02ca7cbb3a..8a6114f0d5 100755 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -115,6 +115,7 @@ Var COMMANDLINE ; command line passed to this installer, set in .onInit Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
Var SKIP_DIALOGS ; set from command line in .onInit. autoinstall
; GUI and the defaults.
+Var DO_UNINSTALL_V2 ; If non-null, path to a previous Viewer 2 installation that will be uninstalled.
;;; Function definitions should go before file includes, because calls to
;;; DLLs like LangDLL trigger an implicit file include, so if that call is at
@@ -311,6 +312,29 @@ FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Function CheckWillUninstallV2
+;
+; If we are being called through auto-update, we need to uninstall any
+; existing V2 installation. Otherwise, we wind up with
+; SecondLifeViewer2 and SecondLifeViewer installations existing side
+; by side no indication which to use.
+; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckWillUninstallV2
+
+ StrCpy $DO_UNINSTALL_V2 ""
+
+ StrCmp $SKIP_DIALOGS "true" 0 CHECKV2_DONE
+ StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" CHECKV2_DONE ; don't uninstall our own install dir.
+ IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" CHECKV2_FOUND CHECKV2_DONE
+
+CHECKV2_FOUND:
+ StrCpy $DO_UNINSTALL_V2 "true"
+
+CHECKV2_DONE:
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Save user files to temp location
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function PreserveUserFiles
@@ -334,7 +358,7 @@ Push $2 ExpandEnvStrings $2 $2
CreateDirectory "$TEMP\SecondLifeSettingsBackup\$0"
- CopyFiles "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\$0"
+ CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\$0"
CONTINUE:
IntOp $0 $0 + 1
@@ -350,7 +374,7 @@ Push $0 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
StrCmp $0 "" +2
CreateDirectory "$TEMP\SecondLifeSettingsBackup\AllUsers\"
- CopyFiles "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\AllUsers\"
+ CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\AllUsers\"
Pop $0
FunctionEnd
@@ -377,7 +401,7 @@ Push $2 ExpandEnvStrings $2 $2
CreateDirectory "$2\Application Data\SecondLife\"
- CopyFiles "$TEMP\SecondLifeSettingsBackup\$0\*" "$2\Application Data\SecondLife\"
+ CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\$0\*" "$2\Application Data\SecondLife\"
CONTINUE:
IntOp $0 $0 + 1
@@ -393,11 +417,53 @@ Push $0 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
StrCmp $0 "" +2
CreateDirectory "$2\Application Data\SecondLife\"
- CopyFiles "$TEMP\SecondLifeSettingsBackup\AllUsers\*" "$2\Application Data\SecondLife\"
+ CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\AllUsers\*" "$2\Application Data\SecondLife\"
+Pop $0
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Remove temp dirs
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function RemoveTempUserFiles
+
+Push $0
+Push $1
+Push $2
+
+ StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+
+ LOOP:
+ EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
+ StrCmp $1 "" DONE ; no more users
+
+ ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
+ StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
+
+ ; Required since ProfileImagePath is of type REG_EXPAND_SZ
+ ExpandEnvStrings $2 $2
+
+ RMDir /r "$TEMP\SecondLifeSettingsBackup\$0\*"
+
+ CONTINUE:
+ IntOp $0 $0 + 1
+ Goto LOOP
+ DONE:
+
+Pop $2
+Pop $1
+Pop $0
+
+; Copy files in Documents and Settings\All Users\SecondLife
+Push $0
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+ StrCmp $0 "" +2
+ RMDir /r "$TEMP\SecondLifeSettingsBackup\AllUsers\*"
Pop $0
FunctionEnd
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Clobber user files - TEST ONLY
; This is here for testing, generally not desirable to call it.
@@ -864,9 +930,12 @@ Call CheckIfAdministrator ; Make sure the user can install/uninstall Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version
Call CloseSecondLife ; Make sure we're not running
Call CheckNetworkConnection ; ping secondlife.com
+Call CheckWillUninstallV2 ; See if a V2 install exists and will be removed.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Call PreserveUserFiles
+StrCmp $DO_UNINSTALL_V2 "" PRESERVE_DONE
+ Call PreserveUserFiles
+PRESERVE_DONE:
;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers.
;Call RemoveCacheFiles ; Installing over removes potentially corrupted
@@ -951,17 +1020,15 @@ WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" ; write out uninstaller
WriteUninstaller "$INSTDIR\uninst.exe"
-; Remove existing "Second Life Viewer 2" install if any.
-StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" SLV2_DONE ; unless that's the install directory
-IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" SLV2_FOUND SLV2_DONE
-
-SLV2_FOUND:
-ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
-Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" ; with _? option above, uninst.exe will be left behind.
-RMDir "$PROGRAMFILES\SecondLifeViewer2" ; will remove only if empty.
+; Uninstall existing "Second Life Viewer 2" install if needed.
+StrCmp $DO_UNINSTALL_V2 "" REMOVE_SLV2_DONE
+ ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
+ Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" ; with _? option above, uninst.exe will be left behind.
+ RMDir "$PROGRAMFILES\SecondLifeViewer2" ; will remove only if empty.
-SLV2_DONE:
-Call RestoreUserFiles
+ Call RestoreUserFiles
+ Call RemoveTempUserFiles
+REMOVE_SLV2_DONE:
; end of default section
SectionEnd
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index f8b204eca0..37bf856662 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1101,20 +1101,11 @@ F32 LLAgent::clampPitchToLimits(F32 angle) LLVector3 skyward = getReferenceUpVector(); - F32 look_down_limit; - F32 look_up_limit = 10.f * DEG_TO_RAD; + const F32 look_down_limit = 179.f * DEG_TO_RAD;; + const F32 look_up_limit = 1.f * DEG_TO_RAD; F32 angle_from_skyward = acos( mFrameAgent.getAtAxis() * skyward ); - if (isAgentAvatarValid() && gAgentAvatarp->isSitting()) - { - look_down_limit = 130.f * DEG_TO_RAD; - } - else - { - look_down_limit = 170.f * DEG_TO_RAD; - } - // clamp pitch to limits if ((angle >= 0.f) && (angle_from_skyward + angle > look_down_limit)) { diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index c937f604fc..8bf4d94059 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -847,9 +847,9 @@ bool LLAppViewer::init() LLWeb::initClass(); // do this after LLUI // Provide the text fields with callbacks for opening Urls - LLUrlAction::setOpenURLCallback(&LLWeb::loadURL); - LLUrlAction::setOpenURLInternalCallback(&LLWeb::loadURLInternal); - LLUrlAction::setOpenURLExternalCallback(&LLWeb::loadURLExternal); + LLUrlAction::setOpenURLCallback(boost::bind(&LLWeb::loadURL, _1, LLStringUtil::null, LLStringUtil::null)); + LLUrlAction::setOpenURLInternalCallback(boost::bind(&LLWeb::loadURLInternal, _1, LLStringUtil::null, LLStringUtil::null)); + LLUrlAction::setOpenURLExternalCallback(boost::bind(&LLWeb::loadURLExternal, _1, true, LLStringUtil::null)); LLUrlAction::setExecuteSLURLCallback(&LLURLDispatcher::dispatchFromTextEditor); // Let code in llui access the viewer help floater diff --git a/indra/newview/llfloaterhelpbrowser.h b/indra/newview/llfloaterhelpbrowser.h index 80b0ecc06b..bf4f544a14 100644 --- a/indra/newview/llfloaterhelpbrowser.h +++ b/indra/newview/llfloaterhelpbrowser.h @@ -1,5 +1,5 @@ /** - * @file llfloatermediabrowser.h + * @file llfloaterhelpbrowser.h * @brief HTML Help floater - uses embedded web browser control * * $LicenseInfo:firstyear=2006&license=viewerlgpl$ diff --git a/indra/newview/llfloatermediabrowser.cpp b/indra/newview/llfloatermediabrowser.cpp deleted file mode 100644 index 7a670dd90c..0000000000 --- a/indra/newview/llfloatermediabrowser.cpp +++ /dev/null @@ -1,462 +0,0 @@ -/** - * @file llfloatermediabrowser.cpp - * @brief media browser floater - uses embedded media browser control - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 "llviewerprecompiledheaders.h" - -#include "llfloatermediabrowser.h" - -#include "llfloaterreg.h" -#include "llparcel.h" -#include "llpluginclassmedia.h" -#include "lluictrlfactory.h" -#include "llmediactrl.h" -#include "llviewerwindow.h" -#include "llviewercontrol.h" -#include "llviewerparcelmgr.h" -#include "llweb.h" -#include "llui.h" -#include "roles_constants.h" - -#include "llurlhistory.h" -#include "llmediactrl.h" -#include "llviewermedia.h" -#include "llviewerparcelmedia.h" -#include "llcombobox.h" -#include "llwindow.h" -#include "lllayoutstack.h" -#include "llcheckboxctrl.h" - -#include "llnotifications.h" - -// TEMP -#include "llsdutil.h" - -LLFloaterMediaBrowser::LLFloaterMediaBrowser(const LLSD& key) - : LLFloater(key) -{ -} - -//static -void LLFloaterMediaBrowser::create(const std::string &url, const std::string& target, const std::string& uuid) -{ - lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl; - - std::string tag = target; - - if(target.empty() || target == "_blank") - { - if(!uuid.empty()) - { - tag = uuid; - } - else - { - // create a unique tag for this instance - LLUUID id; - id.generate(); - tag = id.asString(); - } - } - - S32 browser_window_limit = gSavedSettings.getS32("MediaBrowserWindowLimit"); - - if(LLFloaterReg::findInstance("media_browser", tag) != NULL) - { - // There's already a media browser for this tag, so we won't be opening a new window. - } - else if(browser_window_limit != 0) - { - // showInstance will open a new window. Figure out how many media browsers are already open, - // and close the least recently opened one if this will put us over the limit. - - LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList("media_browser"); - lldebugs << "total instance count is " << instances.size() << llendl; - - for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++) - { - lldebugs << " " << (*iter)->getKey() << llendl; - } - - if(instances.size() >= (size_t)browser_window_limit) - { - // Destroy the least recently opened instance - (*instances.begin())->closeFloater(); - } - } - - LLFloaterMediaBrowser *browser = dynamic_cast<LLFloaterMediaBrowser*> (LLFloaterReg::showInstance("media_browser", tag)); - llassert(browser); - if(browser) - { - browser->mUUID = uuid; - - // tell the browser instance to load the specified URL - browser->openMedia(url, target); - LLViewerMedia::proxyWindowOpened(target, uuid); - } -} - -//static -void LLFloaterMediaBrowser::closeRequest(const std::string &uuid) -{ - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser"); - lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl; - for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) - { - LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter); - lldebugs << " " << i->mUUID << llendl; - if (i && i->mUUID == uuid) - { - i->closeFloater(false); - return; - } - } -} - -//static -void LLFloaterMediaBrowser::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height) -{ - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser"); - lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl; - for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) - { - LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter); - lldebugs << " " << i->mUUID << llendl; - if (i && i->mUUID == uuid) - { - i->geometryChanged(x, y, width, height); - return; - } -} -} - -void LLFloaterMediaBrowser::geometryChanged(S32 x, S32 y, S32 width, S32 height) -{ - // Make sure the layout of the browser control is updated, so this calculation is correct. - LLLayoutStack::updateClass(); - - // TODO: need to adjust size and constrain position to make sure floaters aren't moved outside the window view, etc. - LLCoordWindow window_size; - getWindow()->getSize(&window_size); - - // Adjust width and height for the size of the chrome on the Media Browser window. - width += getRect().getWidth() - mBrowser->getRect().getWidth(); - height += getRect().getHeight() - mBrowser->getRect().getHeight(); - - LLRect geom; - geom.setOriginAndSize(x, window_size.mY - (y + height), width, height); - - lldebugs << "geometry change: " << geom << llendl; - - handleReshape(geom,false); -} - - -void LLFloaterMediaBrowser::draw() -{ - getChildView("go")->setEnabled(!mAddressCombo->getValue().asString().empty()); - LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - if(parcel) - { - getChildView("parcel_owner_controls")->setVisible( LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_MEDIA)); - getChildView("assign")->setEnabled(!mAddressCombo->getValue().asString().empty()); - } - bool show_time_controls = false; - bool media_playing = false; - if(mBrowser) - { - LLPluginClassMedia* media_plugin = mBrowser->getMediaPlugin(); - if(media_plugin) - { - show_time_controls = media_plugin->pluginSupportsMediaTime(); - media_playing = media_plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING; - } - } - getChildView("rewind")->setVisible( show_time_controls); - getChildView("play")->setVisible( show_time_controls && ! media_playing); - getChildView("pause")->setVisible( show_time_controls && media_playing); - getChildView("stop")->setVisible( show_time_controls); - getChildView("seek")->setVisible( show_time_controls); - - getChildView("play")->setEnabled(! media_playing); - getChildView("stop")->setEnabled(media_playing); - - getChildView("back")->setEnabled(mBrowser->canNavigateBack()); - getChildView("forward")->setEnabled(mBrowser->canNavigateForward()); - - LLFloater::draw(); -} - -BOOL LLFloaterMediaBrowser::postBuild() -{ - mBrowser = getChild<LLMediaCtrl>("browser"); - mBrowser->addObserver(this); - - mAddressCombo = getChild<LLComboBox>("address"); - mAddressCombo->setCommitCallback(onEnterAddress, this); - mAddressCombo->sortByName(); - - childSetAction("back", onClickBack, this); - childSetAction("forward", onClickForward, this); - childSetAction("reload", onClickRefresh, this); - childSetAction("rewind", onClickRewind, this); - childSetAction("play", onClickPlay, this); - childSetAction("stop", onClickStop, this); - childSetAction("pause", onClickPlay, this); - childSetAction("seek", onClickSeek, this); - childSetAction("go", onClickGo, this); - childSetAction("close", onClickClose, this); - childSetAction("open_browser", onClickOpenWebBrowser, this); - childSetAction("assign", onClickAssign, this); - - buildURLHistory(); - - return TRUE; -} - -void LLFloaterMediaBrowser::buildURLHistory() -{ - LLCtrlListInterface* url_list = childGetListInterface("address"); - if (url_list) - { - url_list->operateOnAll(LLCtrlListInterface::OP_DELETE); - } - - // Get all of the entries in the "browser" collection - LLSD browser_history = LLURLHistory::getURLHistory("browser"); - - LLSD::array_iterator iter_history = - browser_history.beginArray(); - LLSD::array_iterator end_history = - browser_history.endArray(); - for(; iter_history != end_history; ++iter_history) - { - std::string url = (*iter_history).asString(); - if(! url.empty()) - url_list->addSimpleElement(url); - } - - // initialize URL history in the plugin - if(mBrowser && mBrowser->getMediaPlugin()) - { - mBrowser->getMediaPlugin()->initializeUrlHistory(browser_history); - } -} - -std::string LLFloaterMediaBrowser::getSupportURL() -{ - return getString("support_page_url"); -} - -//virtual -void LLFloaterMediaBrowser::onClose(bool app_quitting) -{ - LLViewerMedia::proxyWindowClosed(mUUID); - //setVisible(FALSE); - destroy(); -} - -void LLFloaterMediaBrowser::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) -{ - if(event == MEDIA_EVENT_LOCATION_CHANGED) - { - setCurrentURL(self->getLocation()); - } - else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE) - { - // This is the event these flags are sent with. - getChildView("back")->setEnabled(self->getHistoryBackAvailable()); - getChildView("forward")->setEnabled(self->getHistoryForwardAvailable()); - } - else if(event == MEDIA_EVENT_CLOSE_REQUEST) - { - // The browser instance wants its window closed. - closeFloater(); - } - else if(event == MEDIA_EVENT_GEOMETRY_CHANGE) - { - geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight()); - } -} - -void LLFloaterMediaBrowser::setCurrentURL(const std::string& url) -{ - mCurrentURL = url; - - mAddressCombo->remove(mCurrentURL); - mAddressCombo->add(mCurrentURL); - mAddressCombo->selectByValue(mCurrentURL); - - // Serialize url history - LLURLHistory::removeURL("browser", mCurrentURL); - LLURLHistory::addURL("browser", mCurrentURL); - - getChildView("back")->setEnabled(mBrowser->canNavigateBack()); - getChildView("forward")->setEnabled(mBrowser->canNavigateForward()); - getChildView("reload")->setEnabled(TRUE); -} - -//static -void LLFloaterMediaBrowser::onEnterAddress(LLUICtrl* ctrl, void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString()); -} - -//static -void LLFloaterMediaBrowser::onClickRefresh(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - if( self->mBrowser->getMediaPlugin() && self->mBrowser->getMediaPlugin()->pluginSupportsMediaBrowser()) - { - bool ignore_cache = true; - self->mBrowser->getMediaPlugin()->browse_reload( ignore_cache ); - } - else - { - self->mBrowser->navigateTo(self->mCurrentURL); - } -} - -//static -void LLFloaterMediaBrowser::onClickForward(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - self->mBrowser->navigateForward(); -} - -//static -void LLFloaterMediaBrowser::onClickBack(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - self->mBrowser->navigateBack(); -} - -//static -void LLFloaterMediaBrowser::onClickGo(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString()); -} - -//static -void LLFloaterMediaBrowser::onClickClose(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - self->closeFloater(); -} - -//static -void LLFloaterMediaBrowser::onClickOpenWebBrowser(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - std::string url = self->mCurrentURL.empty() ? - self->mBrowser->getHomePageUrl() : - self->mCurrentURL; - LLWeb::loadURLExternal(url); -} - -void LLFloaterMediaBrowser::onClickAssign(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - if (!parcel) - { - return; - } - std::string media_url = self->mAddressCombo->getValue().asString(); - LLStringUtil::trim(media_url); - - if(parcel->getMediaType() != "text/html") - { - parcel->setMediaURL(media_url); - parcel->setMediaCurrentURL(media_url); - parcel->setMediaType(std::string("text/html")); - LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel, true ); - LLViewerParcelMedia::sendMediaNavigateMessage(media_url); - LLViewerParcelMedia::stop(); - // LLViewerParcelMedia::update( parcel ); - } - LLViewerParcelMedia::sendMediaNavigateMessage(media_url); -} -//static -void LLFloaterMediaBrowser::onClickRewind(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - if(self->mBrowser->getMediaPlugin()) - self->mBrowser->getMediaPlugin()->start(-2.0f); -} -//static -void LLFloaterMediaBrowser::onClickPlay(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - LLPluginClassMedia* plugin = self->mBrowser->getMediaPlugin(); - if(plugin) - { - if(plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING) - { - plugin->pause(); - } - else - { - plugin->start(); - } - } -} -//static -void LLFloaterMediaBrowser::onClickStop(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - if(self->mBrowser->getMediaPlugin()) - self->mBrowser->getMediaPlugin()->stop(); -} -//static -void LLFloaterMediaBrowser::onClickSeek(void* user_data) -{ - LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - - if(self->mBrowser->getMediaPlugin()) - self->mBrowser->getMediaPlugin()->start(2.0f); -} -void LLFloaterMediaBrowser::openMedia(const std::string& media_url, const std::string& target) -{ - mBrowser->setHomePageUrl(media_url); - mBrowser->setTarget(target); - mBrowser->navigateTo(media_url); - setCurrentURL(media_url); -} - - diff --git a/indra/newview/llfloatermediabrowser.h b/indra/newview/llfloatermediabrowser.h deleted file mode 100644 index 152d221a01..0000000000 --- a/indra/newview/llfloatermediabrowser.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @file llfloatermediabrowser.h - * @brief media browser floater - uses embedded media browser control - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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$ - */ - -#ifndef LL_LLFLOATERMEDIABROWSER_H -#define LL_LLFLOATERMEDIABROWSER_H - -#include "llfloater.h" -#include "llmediactrl.h" - - -class LLComboBox; -class LLMediaCtrl; -class LLNotification; - -class LLFloaterMediaBrowser : - public LLFloater, - public LLViewerMediaObserver -{ -public: - LOG_CLASS(LLFloaterMediaBrowser); - LLFloaterMediaBrowser(const LLSD& key); - - static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null); - - static void closeRequest(const std::string &uuid); - static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height); - void geometryChanged(S32 x, S32 y, S32 width, S32 height); - - /*virtual*/ BOOL postBuild(); - /*virtual*/ void onClose(bool app_quitting); - /*virtual*/ void draw(); - - // inherited from LLViewerMediaObserver - /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); - - void openMedia(const std::string& media_url, const std::string& target); - void buildURLHistory(); - std::string getSupportURL(); - void setCurrentURL(const std::string& url); - - static void onEnterAddress(LLUICtrl* ctrl, void* user_data); - static void onClickRefresh(void* user_data); - static void onClickBack(void* user_data); - static void onClickForward(void* user_data); - static void onClickGo(void* user_data); - static void onClickClose(void* user_data); - static void onClickOpenWebBrowser(void* user_data); - static void onClickAssign(void* user_data); - static void onClickRewind(void* user_data); - static void onClickPlay(void* user_data); - static void onClickStop(void* user_data); - static void onClickSeek(void* user_data); - -private: - LLMediaCtrl* mBrowser; - LLComboBox* mAddressCombo; - std::string mCurrentURL; - boost::shared_ptr<LLNotification> mCurNotification; - std::string mUUID; -}; - -#endif // LL_LLFLOATERMEDIABROWSER_H - diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 881f087d7b..4f683076a8 100644..100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -496,6 +496,11 @@ BOOL LLFloaterModelPreview::postBuild() { validate_url = "http://secondlife.com/my/account/mesh.php"; } + else if (current_grid == "damballah") + { + // Staging grid has its own naming scheme. + validate_url = "http://secondlife-staging.com/my/account/mesh.php"; + } else { validate_url = llformat("http://secondlife.%s.lindenlab.com/my/account/mesh.php",current_grid.c_str()); @@ -744,6 +749,11 @@ void LLFloaterModelPreview::draw() if (!mModelPreview->mLoading) { + if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_MATERIALS ) + { + childSetTextArg("status", "[STATUS]", getString("status_material_mismatch")); + } + else if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_PARSING ) { childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING))); @@ -3304,7 +3314,7 @@ void LLModelPreview::rebuildUploadData() F32 max_scale = 0.f; //reorder materials to match mBaseModel - for (U32 i = 0; i < LLModel::NUM_LODS; i++) + for (U32 i = 0; i < LLModel::NUM_LODS-1; i++) { if (mBaseModel.size() == mModel[i].size()) { @@ -3316,6 +3326,7 @@ void LLModelPreview::rebuildUploadData() if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) ) { + setLoadState( LLModelLoader::ERROR_MATERIALS ); mFMP->childDisable( "calculate_btn" ); } } @@ -4351,11 +4362,6 @@ void LLModelPreview::updateStatusMessages() { skinAndRigOk = false; } - else - if ( !isLegacyRigValid() ) - { - mFMP->childDisable("calculate_btn"); - } } if(upload_ok && mModelLoader) @@ -5071,6 +5077,8 @@ BOOL LLModelPreview::render() if (!mModel[mPreviewLOD].empty()) { + mFMP->childEnable("reset_btn"); + bool regen = mVertexBuffer[mPreviewLOD].empty(); if (!regen) { @@ -5083,7 +5091,7 @@ BOOL LLModelPreview::render() } //make sure material lists all match - for (U32 i = 0; i < LLModel::NUM_LODS; i++) + for (U32 i = 0; i < LLModel::NUM_LODS-1; i++) { if (mBaseModel.size() == mModel[i].size()) { @@ -5568,6 +5576,7 @@ void LLFloaterModelPreview::onReset(void* user_data) assert_main_thread(); LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data; + fmp->childDisable("reset_btn"); LLModelPreview* mp = fmp->mModelPreview; std::string filename = mp->mLODFile[3]; diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 47de99ce25..64324854a5 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -70,7 +70,8 @@ public: GENERATING_VERTEX_BUFFERS, GENERATING_LOD, DONE, - ERROR_PARSING //basically loading failed + ERROR_PARSING, //basically loading failed + ERROR_MATERIALS, } eLoadState; U32 mState; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 18c3f76826..acbec531b6 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1128,19 +1128,78 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open) { // Make sure the floater is not minimized (STORM-438). if (active_inv_floaterp && active_inv_floaterp->isMinimized()) + { active_inv_floaterp->setMinimized(FALSE); + } + } + else if (auto_open) + { + floater_inventory->openFloater(); - return res; + res = sidepanel_inventory->getActivePanel(); } + + return res; +} + +//static +void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id) +{ + LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open); + + if (active_panel) + { + LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL; - // C. If no panels are open and we don't want to force open a panel, then just abort out. - if (!auto_open) return NULL; - - // D. Open the inventory side panel floater and use that. - floater_inventory->openFloater(); - return sidepanel_inventory->getActivePanel(); + LLViewerInventoryItem * item = gInventory.getItem(obj_id); + LLViewerInventoryCategory * cat = gInventory.getCategory(obj_id); + + bool in_inbox = false; + bool in_outbox = false; + + LLViewerInventoryCategory * parent_cat = NULL; + + if (item) + { + parent_cat = gInventory.getCategory(item->getParentUUID()); + } + else if (cat) + { + parent_cat = gInventory.getCategory(cat->getParentUUID()); + } + + if (parent_cat) + { + in_inbox = (LLFolderType::FT_INBOX == parent_cat->getPreferredType()); + in_outbox = (LLFolderType::FT_OUTBOX == parent_cat->getPreferredType()); + } + + if (in_inbox || in_outbox) + { + LLSidepanelInventory * sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); + LLInventoryPanel * inventory_panel = NULL; + + if (in_inbox) + { + sidepanel_inventory->openInbox(); + inventory_panel = sidepanel_inventory->getInboxPanel(); + } + else + { + sidepanel_inventory->openOutbox(); + inventory_panel = sidepanel_inventory->getOutboxPanel(); + } - return NULL; + if (inventory_panel) + { + inventory_panel->setSelection(obj_id, TAKE_FOCUS_YES); + } + } + else + { + active_panel->setSelection(obj_id, TAKE_FOCUS_YES); + } + } } void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type) diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 8635ebc5c8..2a24327115 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -175,6 +175,8 @@ public: // Find whichever inventory panel is active / on top. // "Auto_open" determines if we open an inventory panel if none are open. static LLInventoryPanel *getActiveInventoryPanel(BOOL auto_open = TRUE); + + static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id); protected: void openStartFolderOrMyInventory(); // open the first level of inventory diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 58ba0219cc..74fa5d350a 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -57,7 +57,6 @@ #include "llcheckboxctrl.h" #include "llnotifications.h" #include "lllineeditor.h" -#include "llfloatermediabrowser.h" #include "llfloaterwebcontent.h" #include "llwindowshade.h" @@ -1082,26 +1081,6 @@ void LLMediaCtrl::onPopup(const LLSD& notification, const LLSD& response) { if (response["open"]) { - // name of default floater to open - std::string floater_name = "media_browser"; - - // look for parent floater name - if ( gFloaterView ) - { - if ( gFloaterView->getParentFloater(this) ) - { - floater_name = gFloaterView->getParentFloater(this)->getInstanceName(); - } - else - { - lldebugs << "No gFloaterView->getParentFloater(this) for onPopuup()" << llendl; - }; - } - else - { - lldebugs << "No gFloaterView for onPopuup()" << llendl; - }; - LLWeb::loadURL(notification["payload"]["url"], notification["payload"]["target"], notification["payload"]["uuid"]); } else diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index fc264db5af..146bcbe47b 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -54,7 +54,6 @@ #include "llworldmapmessage.h" #include "llappviewer.h" #include "llviewercontrol.h" -#include "llfloatermediabrowser.h" #include "llweb.h" #include "llhints.h" diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index df89adb8da..678e4f2843 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -189,16 +189,16 @@ void LLInboxFolderViewFolder::draw() void LLInboxFolderViewFolder::selectItem() { - LLFolderViewFolder::selectItem(); - deFreshify(); + + LLFolderViewFolder::selectItem(); } void LLInboxFolderViewFolder::toggleOpen() { - LLFolderViewFolder::toggleOpen(); - deFreshify(); + + LLFolderViewFolder::toggleOpen(); } void LLInboxFolderViewFolder::computeFreshness() @@ -270,7 +270,9 @@ BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask) { - return TRUE; + deFreshify(); + + return LLFolderViewItem::handleDoubleClick(x, y, mask); } // virtual @@ -290,9 +292,9 @@ void LLInboxFolderViewItem::draw() void LLInboxFolderViewItem::selectItem() { - LLFolderViewItem::selectItem(); - deFreshify(); + + LLFolderViewItem::selectItem(); } void LLInboxFolderViewItem::computeFreshness() diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 04e78e04e3..50dc66ed7c 100755 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -134,7 +134,10 @@ public: LLFloater* picks_floater = LLFloaterReg::showInstance("picks"); LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks"); - picks->createNewPick(); + if (picks) + { + picks->createNewPick(); + } } void editPick(LLPickData* pick_info) @@ -147,7 +150,7 @@ public: params["snapshot_id"] = pick_info->snapshot_id; params["pick_name"] = pick_info->name; params["pick_desc"] = pick_info->desc; - LLFloaterSidePanelContainer::showPanel("my_profile", params); + LLFloaterSidePanelContainer::showPanel("picks", params); } /*virtual*/ void processProperties(void* data, EAvatarProcessorType type) @@ -251,7 +254,10 @@ public: LLFloater* picks_floater = LLFloaterReg::showInstance("picks"); LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks"); - picks->createNewClassified(); + if (picks) + { + picks->createNewClassified(); + } } void openClassified(LLAvatarClassifiedInfo* c_info) @@ -269,7 +275,7 @@ public: params["classified_name"] = c_info->name; params["classified_desc"] = c_info->description; params["from_search"] = true; - LLFloaterSidePanelContainer::showPanel("people", "panel_profile_view", params); + LLFloaterSidePanelContainer::showPanel("picks", params); } else if (mRequestVerb == "edit") { diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 91f8035556..9d069c3996 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -450,6 +450,24 @@ void LLSidepanelInventory::enableOutbox(bool enabled) } } +void LLSidepanelInventory::openInbox() +{ + if (mInboxEnabled) + { + getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true); + onToggleInboxBtn(); + } +} + +void LLSidepanelInventory::openOutbox() +{ + if (mOutboxEnabled) + { + getChild<LLButton>(OUTBOX_BUTTON_NAME)->setToggleState(true); + onToggleOutboxBtn(); + } +} + void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id) { // Trigger a load of the entire inbox so we always know the contents and their creation dates for sorting diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 4e34926a4b..2c6f807013 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -58,6 +58,9 @@ public: /*virtual*/ void onOpen(const LLSD& key); LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any. + LLInventoryPanel* getInboxPanel() const { return mInventoryPanelInbox; } + LLInventoryPanel* getOutboxPanel() const { return mInventoryPanelOutbox; } + LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; } BOOL isMainInventoryPanelActive() const; @@ -77,6 +80,9 @@ public: void enableInbox(bool enabled); void enableOutbox(bool enabled); + void openInbox(); + void openOutbox(); + bool isInboxEnabled() const { return mInboxEnabled; } bool isOutboxEnabled() const { return mOutboxEnabled; } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 9d8d1be0f5..66187f6b42 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2034,7 +2034,7 @@ bool idle_startup() show_debug_menus(); // Debug menu visiblity and First Use trigger // If we've got a startup URL, dispatch it - LLStartUp::dispatchURL(); + //LLStartUp::dispatchURL(); // Retrieve information about the land data // (just accessing this the first time will fetch it, @@ -2694,12 +2694,12 @@ void LLStartUp::cleanupNameCache() bool LLStartUp::dispatchURL() { // ok, if we've gotten this far and have a startup URL - if (!getStartSLURL().isValid()) + if (!getStartSLURL().isValid()) { return false; } - if(getStartSLURL().getType() != LLSLURL::APP) - { + if(getStartSLURL().getType() != LLSLURL::APP) + { // If we started with a location, but we're already // at that location, don't pop dialogs open. diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 74c4f6d2dc..273bf822bc 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -64,7 +64,6 @@ #include "llfloatergroups.h" #include "llfloaterhardwaresettings.h" #include "llfloaterhelpbrowser.h" -#include "llfloatermediabrowser.h" #include "llfloaterwebcontent.h" #include "llfloatermediasettings.h" #include "llfloaterhud.h" @@ -226,7 +225,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>); LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>); - LLFloaterReg::add("media_browser", "floater_media_browser.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaBrowser>); LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>); LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>); LLFloaterReg::add("message_tos", "floater_tos.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 2858330597..67c8a4b902 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -69,7 +69,6 @@ #include "llwindow.h" -#include "llfloatermediabrowser.h" // for handling window close requests and geometry change requests in media browser windows. #include "llfloaterwebcontent.h" // for handling window close requests and geometry change requests in media browser windows. #include <boost/bind.hpp> // for SkinFolder listener @@ -3374,7 +3373,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla { // This close request is directed at another instance pass_through = false; - LLFloaterMediaBrowser::closeRequest(uuid); LLFloaterWebContent::closeRequest(uuid); } } @@ -3394,7 +3392,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla { // This request is directed at another instance pass_through = false; - LLFloaterMediaBrowser::geometryChanged(uuid, plugin->getGeometryX(), plugin->getGeometryY(), plugin->getGeometryWidth(), plugin->getGeometryHeight()); LLFloaterWebContent::geometryChanged(uuid, plugin->getGeometryX(), plugin->getGeometryY(), plugin->getGeometryWidth(), plugin->getGeometryHeight()); } } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 22d95563d8..6d45e48d23 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7701,7 +7701,14 @@ class LLWorldEnvSettings : public view_listener_t } else { - LLEnvManagerNew::instance().setUseDayCycle(LLEnvManagerNew::instance().getDayCycleName()); + LLEnvManagerNew &envmgr = LLEnvManagerNew::instance(); + // reset all environmental settings to track the region defaults, make this reset 'sticky' like the other sun settings. + bool use_fixed_sky = false; + bool use_region_settings = true; + envmgr.setUserPrefs(envmgr.getWaterPresetName(), + envmgr.getSkyPresetName(), + envmgr.getDayCycleName(), + use_fixed_sky, use_region_settings); } return true; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 7cae19a1d2..dca5cdd06d 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1256,14 +1256,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam const BOOL auto_open = gSavedSettings.getBOOL("ShowInInventory") && // don't open if showininventory is false !from_name.empty(); // don't open if it's not from anyone. - LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open); - if(active_panel) - { - LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL; - LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus(); - active_panel->setSelection(obj_id, TAKE_FOCUS_NO); - gFocusMgr.setKeyboardFocus(focus_ctrl); - } + LLInventoryPanel::openInventoryPanelAndSetSelection(auto_open, obj_id); } } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d81e67bfe2..46e4fc3b02 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3219,7 +3219,7 @@ F32 LLViewerObject::getLinksetPhysicsCost() return mLinksetPhysicsCost; } -F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes) +F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const { return 0.f; } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 53e951e483..be5b9819b1 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -340,7 +340,7 @@ public: virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE); - virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL); + virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL, F32* unscaled_value = NULL) const; virtual U32 getTriangleCount(); virtual U32 getHighLODTriangleCount(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index bdab250b49..6af800f1d7 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -8335,7 +8335,7 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d void LLVOAvatar::idleUpdateRenderCost() { static const U32 ARC_BODY_PART_COST = 200; - static const U32 ARC_LIMIT = 2048; + static const U32 ARC_LIMIT = 20000; static std::set<LLUUID> all_textures; diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index b2f35892d0..d2d48dc68f 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -34,7 +34,6 @@ #include "llagent.h" #include "llappviewer.h" -#include "llfloatermediabrowser.h" #include "llfloaterwebcontent.h" #include "llfloaterreg.h" #include "lllogininstance.h" @@ -78,32 +77,15 @@ void LLWeb::initClass() } -// static -void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid) -{ - loadWebURL(url, target, uuid); - //if(target == "_internal") - //{ - // // Force load in the internal browser, as if with a blank target. - // loadURLInternal(url, "", uuid); - //} - //else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external")) - //{ - // loadURLExternal(url); - //} - //else - //{ - // loadURLInternal(url, target, uuid); - //} -} + // static -void LLWeb::loadWebURL(const std::string& url, const std::string& target, const std::string& uuid) +void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid) { if(target == "_internal") { // Force load in the internal browser, as if with a blank target. - loadWebURLInternal(url, "", uuid); + loadURLInternal(url, "", uuid); } else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external")) { @@ -111,19 +93,13 @@ void LLWeb::loadWebURL(const std::string& url, const std::string& target, const } else { - loadWebURLInternal(url, target, uuid); + loadURLInternal(url, target, uuid); } } // static -void LLWeb::loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid) -{ - LLFloaterMediaBrowser::create(url, target, uuid); -} - -// static // Explicitly open a Web URL using the Web content floater -void LLWeb::loadWebURLInternal(const std::string &url, const std::string& target, const std::string& uuid) +void LLWeb::loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid) { LLFloaterWebContent::Params p; p.url(url).target(target).id(uuid); diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h index 376abc0ece..0b95f664d6 100644 --- a/indra/newview/llweb.h +++ b/indra/newview/llweb.h @@ -42,23 +42,15 @@ class LLWeb public: static void initClass(); - /// Load the given url in the user's preferred web browser - static void loadURL(const std::string& url, const std::string& target, const std::string& uuid = LLStringUtil::null); - static void loadURL(const std::string& url) { loadURL(url, LLStringUtil::null); } - /// Load the given url in the user's preferred web browser - static void loadURL(const char* url, const std::string& target = LLStringUtil::null) { loadURL( ll_safe_string(url), target); } - /// Load the given url in the Second Life internal web browser - static void loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null); - static void loadURLInternal(const std::string &url) { loadURLInternal(url, LLStringUtil::null, LLStringUtil::null);} /// Load the given url in the operating system's web browser, async if we want to return immediately /// before browser has spawned static void loadURLExternal(const std::string& url) {loadURLExternal(url, LLStringUtil::null);} static void loadURLExternal(const std::string& url, const std::string& uuid); static void loadURLExternal(const std::string& url, bool async, const std::string& uuid = LLStringUtil::null); - // Explicitly open a Web URL using the Web content floater vs. the more general media browser - static void loadWebURL(const std::string& url, const std::string& target, const std::string& uuid); - static void loadWebURLInternal(const std::string &url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null); + static void loadURL(const std::string& url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null); + // load content using built-in browser + static void loadURLInternal(const std::string &url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null); /// Returns escaped url (eg, " " to "%20") - used by all loadURL methods static std::string escapeURL(const std::string& url); diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp index 66d0d698ba..8307d32336 100644 --- a/indra/newview/llworldmapmessage.cpp +++ b/indra/newview/llworldmapmessage.cpp @@ -210,15 +210,14 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**) } // Handle the SLURL callback if any - if(LLWorldMapMessage::getInstance()->mSLURLCallback != NULL) + url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback; + if(callback != NULL) { U64 handle = to_region_handle(x_world, y_world); // Check if we reached the requested region if ((LLStringUtil::compareInsensitive(LLWorldMapMessage::getInstance()->mSLURLRegionName, name)==0) || (LLWorldMapMessage::getInstance()->mSLURLRegionHandle == handle)) { - url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback; - LLWorldMapMessage::getInstance()->mSLURLCallback = NULL; LLWorldMapMessage::getInstance()->mSLURLRegionName.clear(); LLWorldMapMessage::getInstance()->mSLURLRegionHandle = 0; diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index fbaf4f0a8a..eebc5ddc72 100755 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -6,6 +6,7 @@ <string name="status_idle"></string> <string name="status_parse_error">Error: Dae parsing issue - see log for details.</string> + <string name="status_material_mismatch">Error: Material of model is not a subset of reference model.</string> <string name="status_reading_file">Loading...</string> <string name="status_generating_meshes">Generating Meshes...</string> <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string> @@ -789,7 +790,7 @@ <check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/> --> </panel> - <!-- ==== STEP 2: Analyse ==== --> + <!-- ==== STEP 2: Analyze ==== --> <view_border bevel_style="none" follows="top|left" @@ -818,7 +819,7 @@ name="method_label" text_color="White" top_pad="0"> - Step 2: Analyse + Step 2: Analyze </text> <text follows="top|left" diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 4314c8a9e2..56d79f62c7 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -468,7 +468,7 @@ left="3" top_pad="7" mouse_opaque="true" - name="region_icon" + name="location_icon" width="16" /> <search_editor follows="top|right" diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 80e310a873..8ac1ac9e09 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -167,13 +167,6 @@ function="Floater.Show" parameter="message_critical" /> </menu_item_call> - <menu_item_call - label="Media Browser Test" - name="Web Browser Test"> - <menu_item_call.on_click - function="Advanced.WebBrowserTest" - parameter="http://join.secondlife.com/"/> - </menu_item_call> <menu_item_call label="Web Content Floater Debug Test" name="Web Content Floater Debug Test"> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 263d961be1..575e3673c6 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -533,6 +533,14 @@ function="World.EnvSettings" parameter="midnight" /> </menu_item_call> + <menu_item_separator/> + <menu_item_call + label="Use Region Settings" + name="Use Region Settings"> + <menu_item_call.on_click + function="World.EnvSettings" + parameter="region" /> + </menu_item_call> </menu> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml index f47e9874b4..0e29ed0d0b 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml @@ -22,6 +22,7 @@ draw_border="false" height="24" left="25" + bottom="1" name="speaker" visible="false" width="20" /> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml index 8dfdf95e80..77011139bf 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml @@ -22,6 +22,7 @@ draw_border="false" height="24" left="25" + bottom="1" name="speaker" visible="false" width="20" /> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml index cef698e577..8b56a8f0f6 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml @@ -22,6 +22,7 @@ draw_border="false" height="24" left="25" + bottom="1" name="speaker" visible="false" width="20" /> diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml index 2fcbb00aed..a9d38dca25 100644 --- a/indra/newview/skins/default/xui/es/panel_people.xml +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -76,7 +76,7 @@ <button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/> </layout_panel> <layout_panel name="teleport_btn_lp"> - <button label="Teleportarte" name="teleport_btn" tool_tip="Ofrecer teleporte"/> + <button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/> </layout_panel> </layout_stack> <layout_stack name="bottom_bar_ls1"> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 83747b85c0..4cae6ce5e8 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -3841,6 +3841,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="inventory_item_offered-im"> Ofrecido el item del inventario </string> + <string name="share_alert"> + Arrastra los ítems desde el invenbtario hasta aquí + </string> <string name="no_session_message"> (La sesión de MI no existe) </string> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml index 3123a4c6fe..b122db9502 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml @@ -20,7 +20,7 @@ <check_box label="Inclure la date et l'heure pour chaque ligne du journal de chat" name="show_timestamps_check_im"/> <check_box label="Inclure la date dans le nom du fichier journal" name="logfile_name_datestamp"/> <text name="log_path_desc"> - Emplacement : + Emplacement des journaux : </text> <line_editor left="308" name="log_path_string" right="-20"/> <button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index deaec2e14f..37eb6bbeb0 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -17,9 +17,9 @@ <check_box label="Activé" name="enable_media"/> <slider label="Chat vocal" name="Voice Volume"/> <check_box label="Activé" name="enable_voice_check"/> - <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média" value="true"/> - <check_box label="Lecture du média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous" value="true"/> - <check_box label="Lire les sons des gestes" name="gesture_audio_play_btn" tool_tip="Cochez cette case pour entendre les sons associés aux gestes." value="true"/> + <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cocher pour autoriser la lecture automatique du média." value="true"/> + <check_box label="Lire le média attaché aux autres avatars" name="media_show_on_others_btn" tool_tip="Décocher pour masquer le média attaché aux autres avatars près de vous." value="true"/> + <check_box label="Lire les sons des gestes" name="gesture_audio_play_btn" tool_tip="Cocher cette case pour entendre les sons associés aux gestes." value="true"/> <text name="voice_chat_settings"> Paramètres du chat vocal </text> diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml index cb4a74e142..733c3f9a22 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Débugger" name="Debug"> +<panel label="Débogage" name="Debug"> <text name="region_text_lbl"> Région : </text> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index daa31c980a..f9f3366f63 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -4837,7 +4837,7 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles Parler </string> <string name="Command_View_Label"> - Vue + Affichage </string> <string name="Command_Voice_Label"> Chat près de vous diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml index 488d2cda17..3c278fce52 100644 --- a/indra/newview/skins/default/xui/ru/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml @@ -141,16 +141,16 @@ </panel> <panel label="СОГЛАШЕНИЕ" name="land_covenant_panel"> <panel.string name="can_resell"> - Приобретенная в этом регионе земля может быть перепродана. + Купленная в этом регионе земля может быть перепродана. </panel.string> <panel.string name="can_not_resell"> - Приобретенная в этом регионе земля не может быть перепродана. + Купленная в этом регионе земля не может быть перепродана. </panel.string> <panel.string name="can_change"> - Приобретенная в этом регионе земля может быть объединена или разделена. + Купленная в этом регионе земля может быть объединена или разделена. </panel.string> <panel.string name="can_not_change"> - Приобретенная в этом регионе земля не может быть объединена или разделена. + Купленная в этом регионе земля не может быть объединена или разделена. </panel.string> <text name="estate_section_lbl"> Землевладение: @@ -270,7 +270,7 @@ <name_list name="owner list"> <name_list.columns label="Тип" name="type"/> <name_list.columns label="Название" name="name"/> - <name_list.columns label="Количество" name="count"/> + <name_list.columns label="Кол-во" name="count"/> <name_list.columns label="Последний объект" name="mostrecent"/> </name_list> </panel> @@ -286,10 +286,10 @@ Этот параметр недоступен, потому что вы не можете изменять его на этом участке. </panel.string> <panel.string name="mature_check_mature"> - Moderate-контент + Умеренный контент </panel.string> <panel.string name="mature_check_adult"> - Содержимое для взрослых + Контент для взрослых </panel.string> <panel.string name="mature_check_mature_tooltip"> Информация или содержимое вашего участка расценивается как moderate. @@ -366,7 +366,7 @@ <combo_box.item label="Аренда" name="item13"/> <combo_box.item label="Другое" name="item12"/> </combo_box> - <check_box label="Moderate-контент" name="MatureCheck" tool_tip=" "/> + <check_box label="Умеренный контент" name="MatureCheck" tool_tip=" "/> <text name="Snapshot:"> Снимок: </text> @@ -374,7 +374,7 @@ <text name="allow_label5"> Позволить жителям с других участков: </text> - <check_box label="Видеть аватары" name="SeeAvatarsCheck" tool_tip="Жители с других участков могут видеть жителей этого участка и общаться с ними в чате (вы также сможете видеть жителей с других участков и общаться с ними)."/> + <check_box label="Видны аватары" name="SeeAvatarsCheck" tool_tip="Жители с других участков могут видеть жителей этого участка и общаться с ними в чате (вы также сможете видеть жителей с других участков и общаться с ними)."/> <text name="landing_point"> В точку телепортации: [LANDING] </text> @@ -395,7 +395,7 @@ </text> <combo_box name="media type" tool_tip="Укажите, чем является ссылка – видео, веб-страница или другое медиа"/> <text name="at URL:"> - Домашняя страница: + Дом. страница: </text> <button label="Задать" name="set_media_url"/> <text name="Description:"> @@ -403,7 +403,7 @@ </text> <line_editor name="url_description" tool_tip="Текст, показываемый рядом с кнопкой проигрывания/загрузки"/> <text name="Media texture:"> - Заменяемая текстура: + Замена текстуры: </text> <texture_picker name="media texture" tool_tip="Щелкните для выбора изображения"/> <text name="replace_texture_help"> @@ -416,7 +416,7 @@ <spinner name="media_size_width" tool_tip="Размер отображения веб-медиа, по умолчанию – 0."/> <spinner name="media_size_height" tool_tip="Размер отображения веб-медиа, по умолчанию – 0."/> <text name="pixels"> - пикселей + пикс. </text> <text name="Options:"> Опции: @@ -425,7 +425,7 @@ </panel> <panel label="ЗВУК" name="land_audio_panel"> <text name="MusicURL:"> - URL-адрес для музыки: + URL музыки: </text> <text name="Sound:"> Звук: @@ -448,18 +448,18 @@ (Определено на землевладении) </panel.string> <panel.string name="allow_public_access"> - Разрешить публичный доступ ([MATURITY]) (Примечание. Снятие приведет к созданию линий запрета) + Разрешить общий доступ ([MATURITY]) (Снятие приведет к созданию линий запрета) </panel.string> <panel.string name="estate_override"> - Часть этих параметров установлены на уровне землевладения + Часть этих параметров установлена на уровне землевладения </panel.string> <text name="Limit access to this parcel to:"> Доступ на этот участок </text> <text name="Only Allow"> - Ограничить жителям доступ проверкой: + Разрешить доступ только жителям, у которых: </text> - <check_box label="Информация об оплате в файле [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Банить нераспознанных жителей."/> + <check_box label="Записана информация об оплате [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Банить нераспознанных жителей."/> <check_box label="Проверка возраста [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Банить жителей, не прошедших проверку возраста. Более подробная информация находится здесь: [SUPPORT_SITE]."/> <check_box label="Разрешить доступ группе: [GROUP]" name="GroupCheck" tool_tip="Группа устанавливается на основной вкладке."/> <check_box label="Продать доступ:" name="PassCheck" tool_tip="Разрешить временный доступ к участку."/> diff --git a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml index a497c14cac..ccf13cf02a 100644 --- a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml @@ -24,7 +24,7 @@ <button label="√ Все" name="check_all"/> <button label="Очистить" label_selected="Нет" name="check_none"/> <text name="newperms"> - Новые разрешения на использование контента + Новые разрешения на контент </text> <text name="GroupLabel"> Группа: diff --git a/indra/newview/skins/default/xui/ru/floater_buy_currency.xml b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml index 197a2a3327..7690ff2a6c 100644 --- a/indra/newview/skins/default/xui/ru/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml @@ -60,7 +60,7 @@ <button label="Приобрести" name="buy_btn"/> <button label="Отмена" name="cancel_btn"/> <text name="info_cannot_buy"> - Невозможно приобрести + Нельзя купить </text> <button label="Продолжить в Интернете" name="error_web"/> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_color_picker.xml b/indra/newview/skins/default/xui/ru/floater_color_picker.xml index d6e737d584..b7034bef0b 100644 --- a/indra/newview/skins/default/xui/ru/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/ru/floater_color_picker.xml @@ -13,7 +13,7 @@ Оттенок: </text> <text name="s_val_text"> - Насыщенность: + Насыщен.: </text> <text name="l_val_text"> Яркость: diff --git a/indra/newview/skins/default/xui/ru/floater_destinations.xml b/indra/newview/skins/default/xui/ru/floater_destinations.xml index e769812beb..5ba0841564 100644 --- a/indra/newview/skins/default/xui/ru/floater_destinations.xml +++ b/indra/newview/skins/default/xui/ru/floater_destinations.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Destinations" title="МЕСТА"/> +<floater name="Destinations" title="ПУНКТЫ"/>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml index 1adc8173c6..61d708c567 100644 --- a/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml +++ b/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml @@ -16,25 +16,25 @@ -Выбор настройки- </string> <text name="label"> - Название настройки: + Имя настройки: </text> <text name="note"> Примечание. Если изменить имя настройки, будет создана новая настройка, а изменения в существующей не будут сохранены. </text> <text name="hint_item1"> - - Чтобы изменить определенные настройки неба и времени, выберите соответствующую вкладку. + - Для изменения настроек неба и времени выберите соответствующую вкладку. </text> <text name="hint_item2"> - - Чтобы задать время переходов, вабирайте и перетаскивайте вкладки. + - Чтобы задать время переходов, перетаскивайте вкладки. </text> <text name="hint_item3"> - - Используйте скребок для предварительного просмотра суточного цикла. + - Скребок служит для просмотра суточного цикла. </text> <panel name="day_cycle_slider_panel"> <multi_slider initial_value="0" name="WLTimeSlider"/> <multi_slider initial_value="0" name="WLDayCycleKeys"/> - <button label="Добавить отметку" label_selected="Добавить отметку" name="WLAddKey"/> - <button label="Удалить отметку" label_selected="Удалить отметку" name="WLDeleteKey"/> + <button label="+ отметку" label_selected="+ отметку" name="WLAddKey"/> + <button label="- отметку" label_selected="- отметку" name="WLDeleteKey"/> <text name="WL12am"> 12 ночи </text> @@ -91,14 +91,14 @@ </text> </panel> <text name="WLCurKeyPresetText"> - Настройка неба: + Небо: </text> - <combo_box label="Стандартная" name="WLSkyPresets"/> + <combo_box label="Стандарт" name="WLSkyPresets"/> <text name="WLCurKeyTimeText"> Время: </text> <time name="time" value="6:00"/> - <check_box label="Установить в качестве нового суточного цикла" name="make_default_cb"/> + <check_box label="Установить как новый суточный цикл" name="make_default_cb"/> <button label="Сохранить" name="save"/> <button label="Отмена" name="cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml index aa60cb6337..354120ea72 100644 --- a/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml +++ b/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml @@ -19,7 +19,7 @@ Чтобы изменить настройку, задайте ее параметры с помощью элементов управления и нажмите кнопку «Сохранить». </text> <text name="label"> - Название настройки: + Имя настройки: </text> <text name="note"> Примечание. Если изменить имя настройки, будет создана новая настройка, а изменения в существующей не будут сохранены. @@ -58,7 +58,7 @@ <text name="SunGlowText"> Сияние солнца </text> - <slider label="Отчетливость" name="WLGlowB"/> + <slider label="Фокус" name="WLGlowB"/> <slider label="Размер" name="WLGlowR"/> <text name="WLStarText"> Яркость звезд @@ -102,7 +102,7 @@ </text> <time name="WLDayTime" value="6:00"/> <text name="WLEastAngleText"> - Смещение относительно востока + Смещение отн. востока </text> </panel> <panel label="ОБЛАКА" name="Clouds"> @@ -122,7 +122,7 @@ Размеры </text> <text name="WLCloudDetailText"> - Детализация (положение/плотность) + Детали (положение/плотность) </text> <slider label="X" name="WLCloudDetailX"/> <slider label="Y" name="WLCloudDetailY"/> diff --git a/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml index 3befe4b038..f6def86380 100644 --- a/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml +++ b/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml @@ -19,7 +19,7 @@ Чтобы изменить настройку, задайте ее параметры с помощью элементов управления и нажмите кнопку «Сохранить». </text> <text name="label"> - Название настройки: + Имя настройки: </text> <text name="note"> Примечание. Если изменить имя настройки, будет создана новая настройка, а изменения в существующей не будут сохранены. diff --git a/indra/newview/skins/default/xui/ru/floater_god_tools.xml b/indra/newview/skins/default/xui/ru/floater_god_tools.xml index ec64a5c7af..81329475aa 100644 --- a/indra/newview/skins/default/xui/ru/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_god_tools.xml @@ -72,10 +72,10 @@ </panel> <panel label="Запрос" name="request"> <text name="Destination:"> - Место назначения: + Пункт назначения: </text> <combo_box name="destination"> - <combo_box.item label="назначенное" name="item1"/> + <combo_box.item label="назначенный" name="item1"/> <combo_box.item label="текущий регион" name="item2"/> </combo_box> <text name="Request:"> diff --git a/indra/newview/skins/default/xui/ru/floater_image_preview.xml b/indra/newview/skins/default/xui/ru/floater_image_preview.xml index ae7c77ea0e..dbc4c32b98 100644 --- a/indra/newview/skins/default/xui/ru/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/ru/floater_image_preview.xml @@ -23,7 +23,7 @@ </combo_box> <text name="bad_image_text"> Невозможно прочитать изображение. -Попробуйте сохранить изображение как 24-разрядный TGA-файл (Targa). +Попробуйте сохранить изображение как 24-битный TGA-файл (Targa). </text> <check_box label="Использовать сжатие без потерь" name="lossless_check"/> <button label="Отмена" name="cancel_btn"/> diff --git a/indra/newview/skins/default/xui/ru/floater_joystick.xml b/indra/newview/skins/default/xui/ru/floater_joystick.xml index cc93152225..66568563da 100644 --- a/indra/newview/skins/default/xui/ru/floater_joystick.xml +++ b/indra/newview/skins/default/xui/ru/floater_joystick.xml @@ -3,7 +3,7 @@ <floater.string name="NoDevice"> устройство не выбрано </floater.string> - <check_box label="Включить джойстик:" name="enable_joystick"/> + <check_box label="Вкл. джойстик:" name="enable_joystick"/> <spinner label="Наложение по X" name="JoystickAxis1"/> <spinner label="Наложение по Y" name="JoystickAxis2"/> <spinner label="Наложение по Z" name="JoystickAxis0"/> diff --git a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml index 48f7dd969f..c420006a03 100644 --- a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml @@ -106,7 +106,7 @@ Возможная причина: слишком много физических объектов </floater.string> <floater.string name="server_scripts_cause_msg"> - Возможная причина: слишком мало физических объектов + Возможная причина: слишком много скриптовых объектов </floater.string> <floater.string name="server_net_cause_msg"> Возможная причина: слишком большой сетевой трафик diff --git a/indra/newview/skins/default/xui/ru/floater_land_holdings.xml b/indra/newview/skins/default/xui/ru/floater_land_holdings.xml index c88c88988b..17d347867d 100644 --- a/indra/newview/skins/default/xui/ru/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/ru/floater_land_holdings.xml @@ -9,7 +9,7 @@ <scroll_list.columns label="Тип" name="type"/> <scroll_list.columns label="Площадь" name="area"/> </scroll_list> - <button label="Телепортация" label_selected="Телепортация" name="Teleport" tool_tip="Телепортироваться в центр этой земли."/> + <button label="Телепорт" label_selected="Телепорт" name="Teleport" tool_tip="Телепортироваться в центр этой земли."/> <button label="Карта" label_selected="Карта" name="Show on Map" tool_tip="Показать эту землю на карте мира."/> <text name="contrib_label"> Ваши вложения в группы: diff --git a/indra/newview/skins/default/xui/ru/floater_model_wizard.xml b/indra/newview/skins/default/xui/ru/floater_model_wizard.xml index 204f752cd9..ef2fe8e5a5 100644 --- a/indra/newview/skins/default/xui/ru/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/ru/floater_model_wizard.xml @@ -13,7 +13,7 @@ </panel> <panel name="content"> <text name="advanced_users_text"> - Пользователям, работающим в расширенном режиме: если вы умеете создавать трехмерные графические объекты, то, возможно, захотите воспользоваться средством Advanced Uploader, которое предоставляет расширенные возможности передачи объектов. + Пользователям в расширенном режиме: если вы умеете создавать трехмерные графические объекты, то, возможно, захотите воспользоваться средством Advanced Uploader, которое предоставляет расширенные возможности передачи объектов. </text> <button label="Перейти в расширенный режим" name="switch_to_advanced"/> <text name="Cache location"> @@ -78,17 +78,17 @@ <panel name="physics_panel"> <panel name="header_panel"> <text name="header_text"> - Настроить физические параметры + Настроить физику </text> </panel> <text name="description"> Мы создадим форму для внешнего каркаса модели. Настройте уровень детализации формы в соответствии с целями, для которых предназначена модель. </text> <panel name="content"> - <button label="Пересчитать физические данные" name="recalculate_physics_btn"/> + <button label="Пересчитать физику" name="recalculate_physics_btn"/> <button label="Пересчет..." name="recalculating_physics_btn"/> <text name="lod_label"> - Просмотр физических данных + Просмотр физики </text> <combo_box name="preview_lod_combo2" tool_tip="Уровень детализации при предварительном просмотре"> <combo_item name="high"> diff --git a/indra/newview/skins/default/xui/ru/floater_select_key.xml b/indra/newview/skins/default/xui/ru/floater_select_key.xml index 84cc4a3ef3..99c2b9a2c4 100644 --- a/indra/newview/skins/default/xui/ru/floater_select_key.xml +++ b/indra/newview/skins/default/xui/ru/floater_select_key.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container"> <text name="Save item as:"> - Нажмите кнопку для установки триггера включения разговора. + Нажмите клавишу для включения/выключения речи. </text> <button label="Отмена" label_selected="Отмена" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_snapshot.xml b/indra/newview/skins/default/xui/ru/floater_snapshot.xml index a3b40a4f1c..f85d602be7 100644 --- a/indra/newview/skins/default/xui/ru/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/ru/floater_snapshot.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Snapshot" title="ПРОСМОТР СНИМКА"> <floater.string name="unknown"> - неизвестен + неизвестно </floater.string> <radio_group label="Тип снимка" name="snapshot_type_radio"> <radio_item label="Электронная почта" name="postcard"/> diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml index 660eca51c6..eb9083f7fc 100644 --- a/indra/newview/skins/default/xui/ru/floater_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_tools.xml @@ -1,28 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="toolbox floater" short_title="ИНСТРУМЕНТЫ ДЛЯ СТРОИТЕЛЬСТВА"> <floater.string name="status_rotate"> - Перемещайте цветные полосы для вращения объекта + Перетягивайте цветные полосы для вращения объекта </floater.string> <floater.string name="status_scale"> - Щелкните и переместите для растяжения выбранной стороны + Щелкните и перетащите для растяжения выбранной стороны </floater.string> <floater.string name="status_move"> - Переместите для перемещения, переместите с одновременным нажатием клавиши Shift для копирования + Перемещение: перетащить, копирование: перетащить при нажатой клавише Shift </floater.string> <floater.string name="status_modifyland"> Щелкните и удерживайте для изменения земли </floater.string> <floater.string name="status_camera"> - Щелкните и переместите для перемещения камеры + Щелкните и перетащите для перемещения камеры </floater.string> <floater.string name="status_grab"> - Переместите для перемещения, нажмите клавишу Ctrl для подъема, нажмите клавиши Ctrl+Shift для вращения + Перемещение: перетащить, подъем: нажать Ctrl, вращение: нажать Ctrl+Shift </floater.string> <floater.string name="status_place"> Щелкните для создания </floater.string> <floater.string name="status_selectland"> - Щелкните и переместите для выделения земли + Щелкните и перетащите для выделения земли </floater.string> <floater.string name="status_selectcount"> Выбрано объектов: [OBJ_COUNT], влияние на землю [LAND_IMPACT] @@ -30,13 +30,13 @@ <floater.string name="status_remaining_capacity"> Остаток емкости [LAND_CAPACITY]. </floater.string> - <button name="button focus" tool_tip="Отчетливость"/> + <button name="button focus" tool_tip="Фокус"/> <button name="button move" tool_tip="Переместить"/> <button name="button edit" tool_tip="Изменить"/> <button name="button create" tool_tip="Создать"/> <button name="button land" tool_tip="Земля"/> <text name="text status"> - Переместите для перемещения, переместите с одновременным нажатием клавиши Shift для копирования + Перемещение: перетащить, копирование: перетащить при нажатой клавише Shift </text> <radio_group name="focus_radio_group"> <radio_item label="Увеличение" name="radio zoom"/> @@ -52,14 +52,14 @@ <radio_group name="edit_radio_group"> <radio_item label="Переместить" name="radio position"/> <radio_item label="Вращение (Ctrl)" name="radio rotate"/> - <radio_item label="Растягивание (Ctrl+Shift)" name="radio stretch"/> + <radio_item label="Растяжка (Ctrl+Shift)" name="radio stretch"/> <radio_item label="Выбор грани" name="radio select face"/> </radio_group> <check_box label="Редактировать объединенные" name="checkbox edit linked parts"/> <button label="Объединить" name="link_btn"/> <button label="Разъединить" name="unlink_btn"/> - <text label="Растягивать в обе стороны" name="checkbox uniform label"> - Растягивать в обе стороны + <text label="Растяжка обеих сторон" name="checkbox uniform label"> + Растяжка обеих сторон </text> <check_box initial_value="истина" label="Растягивать текстуры" name="checkbox stretch textures"/> <check_box initial_value="истина" label="Привязка" name="checkbox snap to grid"/> @@ -79,9 +79,9 @@ <button name="ToolRing" tool_tip="Кольцо"/> <button name="ToolTree" tool_tip="Дерево"/> <button name="ToolGrass" tool_tip="Трава"/> - <check_box label="Оставить инструмент выбранным" name="checkbox sticky"/> - <check_box label="Копировать выделенное" name="checkbox copy selection"/> - <check_box initial_value="истина" label="Центрировать копию" name="checkbox copy centers"/> + <check_box label="Держать инструмент" name="checkbox sticky"/> + <check_box label="Копировать выдел." name="checkbox copy selection"/> + <check_box initial_value="истина" label="Центрир. копию" name="checkbox copy centers"/> <check_box label="Повернуть копию" name="checkbox copy rotates"/> <radio_group name="land_radio_group"> <radio_item label="Выбрать землю" name="radio select land"/> @@ -105,7 +105,7 @@ <slider_bar initial_value="0.00" name="slider force"/> <button label="Применить" label_selected="Применить" name="button apply to selection" tool_tip="Изменить выбранную землю"/> <text name="selection_empty"> - Ничего не выбрано. + Не выбрано. </text> <text name="remaining_capacity"> [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Дополнительная информация] @@ -168,7 +168,7 @@ <check_box label="Поделиться" name="checkbox share with group" tool_tip="Позволить всем участникам выбранной группы получить установленные вам права на этот объект. Для включения ролевых ограничений необходимо произвести сделку."/> <button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="В результате сделки объект передается группе, при этом права на него будут соответствовать правам следующего владельца. Переданный группе объект может передаваться должностным лицом группы."/> <text name="label click action"> - Действие по щелчку: + По щелчку: </text> <combo_box name="clickaction"> <combo_box.item label="Коснуться (по умолчанию)" name="Touch/grab(default)"/> @@ -185,7 +185,7 @@ <combo_box.item label="Оригинал" name="Original"/> </combo_box> <spinner label="Цена: L$" name="Edit Cost"/> - <check_box label="Показать в результатах поиска" name="search_check" tool_tip="Показывать объект в результатах поиска"/> + <check_box label="Показать в поиске" name="search_check" tool_tip="Показывать объект в результатах поиска"/> <panel name="perms_build"> <text name="perm_modify"> Этот объект можно изменять @@ -349,9 +349,9 @@ <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"/> + <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 name="colorswatch" tool_tip="Щелкните для выбора цвета"/> <texture_picker label="" name="light texture control" tool_tip="Щелкните для выбора проецируемого изображения (действует только с включенной отложенной отрисовкой)"/> @@ -362,7 +362,7 @@ <spinner label="Ослабление" name="Light Falloff"/> <spinner label="Окружение" name="Light Ambiance"/> <text name="label physicsshapetype"> - Тип физической формы: + Тип физич. формы: </text> <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Выберите тип физической формы"/> <combo_box name="material"> @@ -394,7 +394,7 @@ <text name="glow label"> Свечение </text> - <check_box label="Собственная яркость" name="checkbox fullbright"/> + <check_box label="Собств. яркость" name="checkbox fullbright"/> <text name="tex gen"> Наложение </text> @@ -476,7 +476,7 @@ Площадь: [AREA] м² </text> <button label="О земле" label_selected="О земле" name="button about land"/> - <check_box label="Показать владельцев" name="checkbox show owners" tool_tip="Цвет участка в зависимости от типа владения: зеленый = ваша земля голубой = земля вашей группы красный = чужая земля желтый = для продажи фиолетовый = для аукциона серый = общая"/> + <check_box label="Показать владельцев" name="checkbox show owners" tool_tip="Цвет участка в зависимости от типа владения: зеленый = ваша земля; голубой = земля вашей группы; красный = чужая земля; желтый = для продажи; фиолетовый = для аукциона; серый = общая"/> <text name="label_parcel_modify"> Изменение участка </text> diff --git a/indra/newview/skins/default/xui/ru/floater_toybox.xml b/indra/newview/skins/default/xui/ru/floater_toybox.xml index eb03e8c8bf..8d7431d393 100644 --- a/indra/newview/skins/default/xui/ru/floater_toybox.xml +++ b/indra/newview/skins/default/xui/ru/floater_toybox.xml @@ -6,5 +6,5 @@ <text name="toybox label 2"> Кнопки будут отображены в исходном виде или в виде значков, в зависимости от настроек каждой панели инструментов. </text> - <button label="Восстановить умолчания" label_selected="Восстановить умолчания" name="btn_restore_defaults"/> + <button label="Вернуть стандартные" label_selected="Вернуть стандартные" name="btn_restore_defaults"/> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_controls.xml b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml index 6520a4342c..c1fb858d48 100644 --- a/indra/newview/skins/default/xui/ru/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_voice_controls" title="УПРАВЛЕНИЕ ГОЛОСОМ"> <string name="title_nearby"> - Голоса собеседников + Настройки голоса </string> <string name="title_group"> Звонок группе [GROUP] diff --git a/indra/newview/skins/default/xui/ru/floater_windlight_options.xml b/indra/newview/skins/default/xui/ru/floater_windlight_options.xml index 6667e6b19a..bbb37aaaa0 100644 --- a/indra/newview/skins/default/xui/ru/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/ru/floater_windlight_options.xml @@ -98,7 +98,7 @@ <text name="SunGlowText"> Сияние солнца </text> - <slider label="Отчетливость" name="WLGlowB"/> + <slider label="Фокус" name="WLGlowB"/> <slider label="Размер" name="WLGlowR"/> <text name="SceneGammaText"> Гамма-коррекция сцены diff --git a/indra/newview/skins/default/xui/ru/floater_world_map.xml b/indra/newview/skins/default/xui/ru/floater_world_map.xml index 5fa45bd5e5..ef8dfe22ae 100644 --- a/indra/newview/skins/default/xui/ru/floater_world_map.xml +++ b/indra/newview/skins/default/xui/ru/floater_world_map.xml @@ -37,7 +37,7 @@ </text> <check_box initial_value="истина" name="events_mature_chk"/> <text name="events_mature_label"> - Умеренный + Умеренные </text> <text name="events_adult_label"> Для взрослых @@ -62,7 +62,7 @@ Место: </text> <button label="Телепортация" name="Teleport" tool_tip="Телепортация в выбранное место"/> - <button label="Копировать URL-адрес SL" name="copy_slurl" tool_tip="Копировать текущее место в виде URL-адреса SL для использования в Интернете."/> + <button label="Копировать URL SL" name="copy_slurl" tool_tip="Копировать текущее место в виде URL-адреса SL для использования в интернете."/> <button label="Показать выбранное" name="Show Destination" tool_tip="Центрировать карту на выбранном месте"/> </panel> <panel name="layout_panel_5"> diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_other.xml b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml index 72063737eb..fb1c24448b 100644 --- a/indra/newview/skins/default/xui/ru/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml @@ -4,7 +4,7 @@ <menu_item_call label="Смотреть профиль" name="Profile..."/> <menu_item_call label="В друзья" name="Add Friend"/> <menu_item_call label="IM" name="Send IM..."/> - <menu_item_call label="Позвонить" name="Call"/> + <menu_item_call label="Звонок" name="Call"/> <menu_item_call label="Пригласить в группу" name="Invite..."/> <menu_item_call label="Заблокировать" name="Avatar Mute"/> <menu_item_call label="Пожаловаться" name="abuse"/> diff --git a/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml index 78b1768761..d0b68cefbd 100644 --- a/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="menu_gesture_gear"> - <menu_item_call label="Добавить/удалить из избранного" name="activate"/> + <menu_item_call label="Добавить в избранное/удалить" name="activate"/> <menu_item_call label="Копировать" name="copy_gesture"/> <menu_item_call label="Вставить" name="paste"/> <menu_item_call label="Копировать UUID" name="copy_uuid"/> diff --git a/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml index d500f0fac6..9fc0b6d44e 100644 --- a/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml @@ -8,7 +8,7 @@ <menu_item_call label="Показать фильтры" name="show_filters"/> <menu_item_call label="Сбросить фильтры" name="reset_filters"/> <menu_item_call label="Закрыть все папки" name="close_folders"/> - <menu_item_call label="Очистить Lost and Found" name="empty_lostnfound"/> + <menu_item_call label="Очистить бюро находок" name="empty_lostnfound"/> <menu_item_call label="Сохранить текстуру как" name="Save Texture As"/> <menu_item_call label="Поделиться" name="Share"/> <menu_item_call label="Найти оригинал" name="Find Original"/> diff --git a/indra/newview/skins/default/xui/ru/menu_landmark.xml b/indra/newview/skins/default/xui/ru/menu_landmark.xml index 11d6e37e81..24b60f9d86 100644 --- a/indra/newview/skins/default/xui/ru/menu_landmark.xml +++ b/indra/newview/skins/default/xui/ru/menu_landmark.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="landmark_overflow_menu"> - <menu_item_call label="Копировать URL-адрес SL" name="copy"/> + <menu_item_call label="Копировать URL SL" name="copy"/> <menu_item_call label="Удалить" name="delete"/> <menu_item_call label="Создать подборку" name="pick"/> <menu_item_call label="Добавить в любимые" name="add_to_favbar"/> diff --git a/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml index b7949b30d9..5ae5e7dfbc 100644 --- a/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml +++ b/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="model_menu_gear_default"> <menu_item_check label="Показать грани" name="show_edges"/> - <menu_item_check label="Показать физические параметры" name="show_physics"/> + <menu_item_check label="Показать физику" name="show_physics"/> <menu_item_check label="Показать текстуры" name="show_textures"/> <menu_item_check label="Показать вес кожи" name="show_skin_weight"/> <menu_item_check label="Показать положение сочленений" name="show_joint_positions"/> diff --git a/indra/newview/skins/default/xui/ru/menu_participant_list.xml b/indra/newview/skins/default/xui/ru/menu_participant_list.xml index 8bbf2d52bf..932ad5bacf 100644 --- a/indra/newview/skins/default/xui/ru/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/ru/menu_participant_list.xml @@ -5,7 +5,7 @@ <menu_item_call label="Открыть профиль" name="View Profile"/> <menu_item_call label="Добавить в друзья" name="Add Friend"/> <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Позвонить" name="Call"/> + <menu_item_call label="Звонок" name="Call"/> <menu_item_call label="Поделиться" name="Share"/> <menu_item_call label="Заплатить" name="Pay"/> <menu_item_check label="Показывать значки участников" name="View Icons"/> diff --git a/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml index a838dd5c42..b1ebd4af83 100644 --- a/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml @@ -8,7 +8,7 @@ <menu_item_call label="Восстановить вещь" name="restore_item"/> <menu_item_call label="Вырезать" name="cut"/> <menu_item_call label="Копировать закладку" name="copy_landmark"/> - <menu_item_call label="Копировать URL-адрес SL" name="copy_slurl"/> + <menu_item_call label="Копировать URL SL" name="copy_slurl"/> <menu_item_call label="Вставить" name="paste"/> <menu_item_call label="Переименовать" name="rename"/> <menu_item_call label="Удалить" name="delete"/> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index 322a27003f..b9f403c04b 100644 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -54,7 +54,7 @@ <menu_item_check label="Владельцы земли" name="Land Owners"/> <menu_item_check label="Координаты" name="Coordinates"/> <menu_item_check label="Свойства участка" name="Parcel Properties"/> - <menu_item_check label="Дополнительное меню" name="Show Advanced Menu"/> + <menu_item_check label="Меню «Дополнительно»" name="Show Advanced Menu"/> </menu> <menu_item_call label="Телепортироваться домой" name="Teleport Home"/> <menu_item_call label="Установить дом здесь" name="Set Home to Here"/> @@ -203,7 +203,7 @@ <menu_item_check label="Поиск" name="Search"/> <menu_item_call label="Освободить клавиши" name="Release Keys"/> <menu_item_call label="Сбросить размер интерфейса" name="Set UI Size to Default"/> - <menu_item_check label="Показать дополнительное меню – устаревшее сочетание клавиш" name="Show Advanced Menu - legacy shortcut"/> + <menu_item_check label="Показать меню «Дополнительно» - старое сочетание клавиш" name="Show Advanced Menu - legacy shortcut"/> <menu_item_call label="Закрыть окно" name="Close Window"/> <menu_item_call label="Закрыть все окна" name="Close All Windows"/> <menu_item_call label="Сохранить снимок на диске" name="Snapshot to Disk"/> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 87ae9d06dd..d43d907164 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -724,13 +724,13 @@ Телепортация сейчас заблокирована. Повторите попытку позже. Если все равно не удается телепортироваться, выйдите из программы и войдите снова, чтобы устранить проблему. </notification> <notification name="nolandmark_tport"> - Системе не удалось определить место назначения закладки. + Системе не удалось определить пункт назначения закладки. </notification> <notification name="timeout_tport"> Системе не удалось выполнить подключение телепорта. Повторите попытку позже. </notification> <notification name="noaccess_tport"> - У вас нет доступа к точке назначения этого телепорта. + У вас нет доступа в пункт назначения этого телепорта. </notification> <notification name="missing_attach_tport"> Ваши присоединения еще не доставлены. Подождите несколько секунд либо выйдите из программы и войдите снова, прежде чем повторить попытку телепортации. @@ -745,7 +745,7 @@ Системе не удалось своевременно выполнить ваше пересечение границы. Повторите попытку через несколько минут. </notification> <notification name="no_host"> - Не удалось найти точку назначения телепорта. Возможно, место назначения временно недоступно или уже не существует. Повторите попытку через несколько минут. + Не удалось найти точку назначения телепорта. Возможно, пункт назначения временно недоступен или уже не существует. Повторите попытку через несколько минут. </notification> <notification name="no_inventory_host"> Система инвентаря сейчас недоступна. @@ -2381,7 +2381,7 @@ http://secondlife.com/download. Не найден регион назначения. </notification> <notification name="NotAllowedInDest"> - Вам не разрешен доступ к месту назначения. + Вам не разрешен доступ в пункт назначения. </notification> <notification name="RegionParcelBan"> Нельзя пересечь границу региона по пути на забаненный участок. Выберите другой путь. @@ -2390,7 +2390,7 @@ http://secondlife.com/download. Вы перенаправлены на телехаб. </notification> <notification name="CouldntTPCloser"> - Не удалось телепортироваться ближе к месту назначения. + Не удалось телепортироваться ближе к пункту назначения. </notification> <notification name="TPCancelled"> Телепортация отменена. @@ -2904,7 +2904,7 @@ http://secondlife.com/download. При скрытии кнопки «Говорить» голосовая функция отключается. </notification> <notification label="Исследование мира" name="HintDestinationGuide"> - Путеводитель по местам назначения содержит тысячи новых мест, в которых вы можете побывать. Выберите место и нажмите кнопку «Телепортация», чтобы начать исследование. + Путеводитель по пунктам назначения содержит тысячи новых мест, в которых вы можете побывать. Выберите место и нажмите кнопку «Телепортация», чтобы начать исследование. </notification> <notification label="Боковая панель" name="HintSidePanel"> Быстрый доступ к вашему инвентарю, костюмам, профилю и многому другому открывается на боковой панели. diff --git a/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml index 38789c1c5e..7cde4099ef 100644 --- a/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml +++ b/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml @@ -2,8 +2,8 @@ <panel name="edit_alpha_panel"> <scroll_container name="avatar_alpha_color_panel_scroll"> <panel name="avatar_alpha_color_panel"> - <texture_picker label="Альфа нижних частей тела" name="Lower Alpha" tool_tip="Щелкните для выбора изображения"/> - <texture_picker label="Альфа верхних частей тела" name="Upper Alpha" tool_tip="Щелкните для выбора изображения"/> + <texture_picker label="Альфа низа" name="Lower Alpha" tool_tip="Щелкните для выбора изображения"/> + <texture_picker label="Альфа верха" name="Upper Alpha" tool_tip="Щелкните для выбора изображения"/> <texture_picker label="Альфа головы" name="Head Alpha" tool_tip="Щелкните для выбора изображения"/> <texture_picker label="Альфа глаз" name="Eye Alpha" tool_tip="Щелкните для выбора изображения"/> <texture_picker label="Альфа волос" name="Hair Alpha" tool_tip="Щелкните для выбора изображения"/> diff --git a/indra/newview/skins/default/xui/ru/panel_edit_shape.xml b/indra/newview/skins/default/xui/ru/panel_edit_shape.xml index b185ce1d45..312ad593a1 100644 --- a/indra/newview/skins/default/xui/ru/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/ru/panel_edit_shape.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shape_panel"> <string name="meters"> - метров + м </string> <string name="feet"> футов diff --git a/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml index f1cba0d3be..2a23cdb800 100644 --- a/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml @@ -17,7 +17,7 @@ <button label="Заплатить" name="pay_btn"/> </layout_panel> <layout_panel name="call_btn_panel"> - <button label="Позвонить" name="call_btn"/> + <button label="Звонок" name="call_btn"/> </layout_panel> <layout_panel name="end_call_btn_panel"> <button label="Завершить звонок" name="end_call_btn"/> diff --git a/indra/newview/skins/default/xui/ru/panel_landmarks.xml b/indra/newview/skins/default/xui/ru/panel_landmarks.xml index 66c5b3b574..7d684cd479 100644 --- a/indra/newview/skins/default/xui/ru/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/ru/panel_landmarks.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Landmarks"> <accordion name="landmarks_accordion"> - <accordion_tab name="tab_favorites" title="Панель «Избранное»"/> + <accordion_tab name="tab_favorites" title="Избранное"/> <accordion_tab name="tab_landmarks" title="Мои закладки"/> <accordion_tab name="tab_inventory" title="Мой инвентарь"/> <accordion_tab name="tab_library" title="Библиотека"/> diff --git a/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml index d9890acff2..5e3de180f9 100644 --- a/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml @@ -12,7 +12,7 @@ <layout_panel name="favorites_layout_panel"> <favorites_bar name="favorite" tool_tip="Перетаскивайте сюда закладки, чтобы было удобнее переходить в любимые места в Second Life!"> <label name="favorites_bar_label" tool_tip="Перетаскивайте сюда закладки, чтобы было удобнее переходить в любимые места в Second Life!"> - Панель «Избранное» + Избранное </label> <more_button name=">>" tool_tip="Показать больше избранного"> Больше ▼ diff --git a/indra/newview/skins/default/xui/ru/panel_notes.xml b/indra/newview/skins/default/xui/ru/panel_notes.xml index f88b4f13c3..aa74383349 100644 --- a/indra/newview/skins/default/xui/ru/panel_notes.xml +++ b/indra/newview/skins/default/xui/ru/panel_notes.xml @@ -21,7 +21,7 @@ <button label="IM" name="im" tool_tip="Начать сеанс IM"/> </layout_panel> <layout_panel name="call_btn_lp"> - <button label="Позвонить" name="call" tool_tip="Позвонить этому жителю"/> + <button label="Звонок" name="call" tool_tip="Позвонить этому жителю"/> </layout_panel> <layout_panel name="show_on_map_btn_lp"> <button label="Карта" name="show_on_map_btn" tool_tip="Показать жителя на карте"/> diff --git a/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml b/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml index 0657e6ff40..91c03342a7 100644 --- a/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml @@ -2,7 +2,7 @@ <!-- Side tray Outfit Edit panel --> <panel name="outfit_edit"> <string name="No Outfit" value="Нет костюма"/> - <string name="unsaved_changes" value="Не сохраненные изменения"/> + <string name="unsaved_changes" value="Несохраненные изменения"/> <string name="now_editing" value="Сейчас редактируется"/> <panel.string name="not_available"> (нет) @@ -35,7 +35,7 @@ </layout_stack> </layout_panel> <layout_panel name="add_wearables_panel"> - <button label="Вещь, которая носится" name="plus_btn"/> + <button label="Носимая вещь" name="plus_btn"/> </layout_panel> </layout_stack> <panel name="no_add_wearables_button_bar"> diff --git a/indra/newview/skins/default/xui/ru/panel_people.xml b/indra/newview/skins/default/xui/ru/panel_people.xml index e8a25d5349..607921f2d6 100644 --- a/indra/newview/skins/default/xui/ru/panel_people.xml +++ b/indra/newview/skins/default/xui/ru/panel_people.xml @@ -64,13 +64,13 @@ <panel name="button_bar"> <layout_stack name="bottom_bar_ls"> <layout_panel name="view_profile_btn_lp"> - <button label="Профиль" name="view_profile_btn" tool_tip="Показывает изображение, группы и прочую информацию о жителе"/> + <button label="Профиль" name="view_profile_btn" tool_tip="Показать изображение, группы и прочую информацию о жителе"/> </layout_panel> <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Начать сеанс IM"/> </layout_panel> <layout_panel name="call_btn_lp"> - <button label="Позвонить" name="call_btn" tool_tip="Позвонить этому жителю"/> + <button label="Звонок" name="call_btn" tool_tip="Позвонить этому жителю"/> </layout_panel> <layout_panel name="share_btn_lp"> <button label="Поделиться" name="share_btn" tool_tip="Поделиться объектом из инвентаря"/> @@ -81,13 +81,13 @@ </layout_stack> <layout_stack name="bottom_bar_ls1"> <layout_panel name="group_info_btn_lp"> - <button label="Профиль группы" name="group_info_btn" tool_tip="Показывает информацию о группе"/> + <button label="Профиль группы" name="group_info_btn" tool_tip="Показать информацию о группе"/> </layout_panel> <layout_panel name="chat_btn_lp"> - <button label="Групповой чат" name="chat_btn" tool_tip="Открывает сеанс чата"/> + <button label="Групповой чат" name="chat_btn" tool_tip="Открыть сеанс чата"/> </layout_panel> <layout_panel name="group_call_btn_lp"> - <button label="Звонок группе" name="group_call_btn" tool_tip="Звонок этой группе"/> + <button label="Звонок группе" name="group_call_btn" tool_tip="Позвонить этой группе"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml index fb368b8b5e..a3ee5b7815 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml @@ -30,7 +30,7 @@ <spinner label="Время отображения всплывающих реплик:" name="nearby_toasts_lifetime"/> <spinner label="Время затухания всплывающих реплик:" name="nearby_toasts_fadingtime"/> <text name="translate_chb_label"> - Использовать машинный перевод во время общения + Использовать машинный перевод при общении </text> <text name="translate_language_text"> Переводить чат на: diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_move.xml b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml index 878a729113..a6e9b00f2a 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml @@ -5,12 +5,12 @@ <text name="heading2"> Автоматическая установка позиции для: </text> - <check_box label="создания/редактирования" name="edit_camera_movement" tool_tip="Производить автоматическое позиционирование камеры при входе в режим редактирования и выходе из него"/> - <check_box label="внешности" name="appearance_camera_movement" tool_tip="Производить автоматическое позиционирование камеры в режиме изменения внешности"/> + <check_box label="создания/редактирования" name="edit_camera_movement" tool_tip="Автоматическое позиционирование камеры при входе в режим редактирования и выходе из него"/> + <check_box label="внешности" name="appearance_camera_movement" tool_tip="Автоматическое позиционирование камеры в режиме редактирования"/> <text name="keyboard_lbl"> Клавиатура: </text> - <check_box label="Клавиши стрелок всегда перемещают меня" name="arrow_keys_move_avatar_check"/> + <check_box label="Клавиши со стрелками всегда перемещают меня" name="arrow_keys_move_avatar_check"/> <check_box label="Бег после двойного нажатия клавиши" name="tap_tap_hold_to_run"/> <text name="mouse_lbl"> Мышь: diff --git a/indra/newview/skins/default/xui/ru/panel_profile.xml b/indra/newview/skins/default/xui/ru/panel_profile.xml index 79c060c050..fab57d678c 100644 --- a/indra/newview/skins/default/xui/ru/panel_profile.xml +++ b/indra/newview/skins/default/xui/ru/panel_profile.xml @@ -53,10 +53,10 @@ <button label="IM" name="im" tool_tip="Начать сеанс IM"/> </layout_panel> <layout_panel name="call_btn_lp"> - <button label="Позвонить" name="call" tool_tip="Позвонить этому жителю"/> + <button label="Звонок" name="call" tool_tip="Позвонить этому жителю"/> </layout_panel> <layout_panel name="chat_btn_lp"> - <button label="Телепортироваться" name="teleport" tool_tip="Предложить телепортацию"/> + <button label="Телепортация" name="teleport" tool_tip="Предложить телепортацию"/> </layout_panel> <layout_panel name="overflow_btn_lp"> <menu_button label="▼" name="overflow_btn" tool_tip="Заплатить жителю или поделиться с ним вещами"/> diff --git a/indra/newview/skins/default/xui/ru/panel_region_estate.xml b/indra/newview/skins/default/xui/ru/panel_region_estate.xml index d957274026..27ec10b323 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_estate.xml @@ -18,16 +18,16 @@ <check_box label="Глобальное время" name="use_global_time_check"/> <check_box label="Фиксированное" name="fixed_sun_check"/> <slider label="Фаза" name="sun_hour_slider"/> - <check_box label="Разрешить публичный доступ" name="externally_visible_check"/> + <check_box label="Разрешить общий доступ" name="externally_visible_check"/> <text name="Only Allow"> - Ограничить доступ проверкой: + Разрешить доступ только аккаунтам с подтверждением: </text> <check_box label="Информации об оплате в файле" name="limit_payment" tool_tip="Банить нераспознанных жителей"/> <check_box label="Проверка возраста" name="limit_age_verified" tool_tip="Банить жителей, не прошедших проверку возраста. Более подробная информация находится здесь: [SUPPORT_SITE]."/> <check_box label="Разрешить голосовое общение" name="voice_chat_check"/> <check_box label="Разрешить прямой телепорт" name="allow_direct_teleport"/> <button label="Применить" name="apply_btn"/> - <button label="Отправить сообщение в землевладение..." name="message_estate_btn"/> + <button label="Сообщение в землевладение..." name="message_estate_btn"/> <button label="Выкинуть жителя с землевладения..." name="kick_user_from_estate_btn"/> <text name="estate_manager_label"> Менеджеры землевладения: diff --git a/indra/newview/skins/default/xui/ru/panel_region_general.xml b/indra/newview/skins/default/xui/ru/panel_region_general.xml index 97bfbbeeea..8559be6c9e 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_general.xml @@ -31,10 +31,10 @@ <text label="Дозволенность" name="access_text"> Категория: </text> - <icons_combo_box label="Умеренная" name="access_combo"> + <icons_combo_box label="Умеренный" name="access_combo"> <icons_combo_box.item label="Для взрослых" name="Adult" value="42"/> - <icons_combo_box.item label="Умеренная" name="Mature" value="21"/> - <icons_combo_box.item label="Общая" name="PG" value="13"/> + <icons_combo_box.item label="Умеренный" name="Mature" value="21"/> + <icons_combo_box.item label="Общий" name="PG" value="13"/> </icons_combo_box> <button label="Применить" name="apply_btn"/> <button label="Телепортировать домой одного жителя..." name="kick_btn"/> diff --git a/indra/newview/skins/default/xui/ru/panel_region_terrain.xml b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml index 08258b5034..af25565226 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml @@ -7,13 +7,13 @@ неизвестен </text> <spinner label="Уровень воды" name="water_height_spin"/> - <spinner label="Верхняя точка ландшафта" name="terrain_raise_spin"/> - <spinner label="Нижняя точка ландшафта" name="terrain_lower_spin"/> + <spinner label="Верх. точка ландшафта" name="terrain_raise_spin"/> + <spinner label="Ниж. точка ландшафта" name="terrain_lower_spin"/> <text name="detail_texture_text"> - Текстуры ландшафта (требования: 512x512, 24-разрядные, TGA) + Текстуры ландшафта (требования: 512x512, 24-битные, TGA) </text> <text name="height_text_lbl"> - 1 (Нижняя) + 1 (Низ) </text> <text name="height_text_lbl2"> 2 @@ -22,7 +22,7 @@ 3 </text> <text name="height_text_lbl4"> - 4 (Верхняя) + 4 (Верх) </text> <text name="height_text_lbl5"> Диапазон высот текстур @@ -31,7 +31,7 @@ Эти значения определяют степень смешивания наложенных текстур. </text> <text name="height_text_lbl11"> - Измеряются в метрах. Значение «Нижняя» – это МАКСИМАЛЬНАЯ высота текстуры №1, а значение «Верхняя» – это МИНИМАЛЬНАЯ высота текстуры №4. + Измеряются в метрах. Значение «Низ» – это МАКСИМАЛЬНАЯ высота текстуры №1, а значение «Верх» – это МИНИМАЛЬНАЯ высота текстуры №4. </text> <text name="height_text_lbl6"> Северо-запад @@ -39,20 +39,20 @@ <text name="height_text_lbl7"> Северо-восток </text> - <spinner label="Нижняя" name="height_start_spin_1"/> - <spinner label="Нижняя" name="height_start_spin_3"/> - <spinner label="Верхняя" name="height_range_spin_1"/> - <spinner label="Верхняя" name="height_range_spin_3"/> + <spinner label="Низ" name="height_start_spin_1"/> + <spinner label="Низ" name="height_start_spin_3"/> + <spinner label="Верх" name="height_range_spin_1"/> + <spinner label="Верх" name="height_range_spin_3"/> <text name="height_text_lbl8"> Юго-запад </text> <text name="height_text_lbl9"> Юго-восток </text> - <spinner label="Нижняя" name="height_start_spin_0"/> - <spinner label="Нижняя" name="height_start_spin_2"/> - <spinner label="Верхняя" name="height_range_spin_0"/> - <spinner label="Верхняя" name="height_range_spin_2"/> + <spinner label="Низ" name="height_start_spin_0"/> + <spinner label="Низ" name="height_start_spin_2"/> + <spinner label="Верх" name="height_range_spin_0"/> + <spinner label="Верх" name="height_range_spin_2"/> <button label="Загрузить ландшафт RAW..." name="download_raw_btn" tool_tip="Доступно только землевладельцам, не менеджерам"/> <button label="Передать ландшафт RAW..." name="upload_raw_btn" tool_tip="Доступно только землевладельцам, не менеджерам"/> <button label="Зафиксировать пределы" name="bake_terrain_btn" tool_tip="Установить высоту ландшафта по средней точке между верхней и нижней точками"/> diff --git a/indra/newview/skins/default/xui/ru/panel_region_texture.xml b/indra/newview/skins/default/xui/ru/panel_region_texture.xml index 369beb1e9b..c4b35a536d 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_texture.xml @@ -7,10 +7,10 @@ неизвестен </text> <text name="detail_texture_text"> - Текстуры ландшафта (требования: 512x512, 24-разрядные TGA-файлы) + Текстуры ландшафта (требования: 512x512, 24-битные TGA-файлы) </text> <text name="height_text_lbl"> - 1 (нижняя) + 1 (низ) </text> <text name="height_text_lbl2"> 2 @@ -19,7 +19,7 @@ 3 </text> <text name="height_text_lbl4"> - 4 (верхняя) + 4 (верх) </text> <text name="height_text_lbl5"> Диапазон высот текстур @@ -30,25 +30,25 @@ <text name="height_text_lbl7"> Северо-восток </text> - <spinner label="Низко" name="height_start_spin_1"/> - <spinner label="Низко" name="height_start_spin_3"/> - <spinner label="Высоко" name="height_range_spin_1"/> - <spinner label="Высоко" name="height_range_spin_3"/> + <spinner label="Низ" name="height_start_spin_1"/> + <spinner label="Низ" name="height_start_spin_3"/> + <spinner label="Верх" name="height_range_spin_1"/> + <spinner label="Верх" name="height_range_spin_3"/> <text name="height_text_lbl8"> Юго-запад </text> <text name="height_text_lbl9"> Юго-восток </text> - <spinner label="Низко" name="height_start_spin_0"/> - <spinner label="Низко" name="height_start_spin_2"/> - <spinner label="Высоко" name="height_range_spin_0"/> - <spinner label="Высоко" name="height_range_spin_2"/> + <spinner label="Низ" name="height_start_spin_0"/> + <spinner label="Низ" name="height_start_spin_2"/> + <spinner label="Верх" name="height_range_spin_0"/> + <spinner label="Верх" name="height_range_spin_2"/> <text name="height_text_lbl10"> Эти значения отображают диапазон перекрытия вышеуказанных текстур. </text> <text name="height_text_lbl11"> - Измеряется в метрах, НИЖНЕЕ значение – это МАКСИМАЛЬНАЯ высота текстуры №1, ВЕРХНЕЕ значение – это МИНИМАЛЬНАЯ высота текстуры №4. + Измеряется в метрах, значение «Низ» – это МАКСИМАЛЬНАЯ высота текстуры №1, значение «Верх» – это МИНИМАЛЬНАЯ высота текстуры №4. </text> <button label="Применить" name="apply_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index df657b39c6..7fef5797a9 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -872,7 +872,7 @@ support@secondlife.com. Новое сопоставление элементов управления </string> <string name="AnimateYourAvatar"> - Анимация аватара + Анимировать ваш аватар </string> <string name="AttachToYourAvatar"> Прикрепить к аватару @@ -899,10 +899,10 @@ support@secondlife.com. Нет подключения </string> <string name="SIM_ACCESS_PG"> - Общая + Общий </string> <string name="SIM_ACCESS_MATURE"> - Умеренная + Умеренный </string> <string name="SIM_ACCESS_ADULT"> Для взрослых @@ -1073,7 +1073,7 @@ support@secondlife.com. Тату не надето </string> <string name="physics_not_worn"> - Физические данные не учитываются + Физика не учитывается </string> <string name="invalid_not_worn"> ошибка @@ -1124,7 +1124,7 @@ support@secondlife.com. Создать тату </string> <string name="create_new_physics"> - Создать физические данные + Создать физику </string> <string name="create_new_invalid"> ошибка @@ -1437,7 +1437,7 @@ support@secondlife.com. Резина </string> <string name="Light"> - Освещение + Светлый </string> <string name="KBShift"> SHIFT @@ -1617,7 +1617,7 @@ support@secondlife.com. Есть информация о платежах </string> <string name="PaymentInfoOnFile"> - Есть информация в файле о платежах + Есть зарегистрир. информация о платежах </string> <string name="NoPaymentInfoOnFile"> Нет информации о платежах @@ -2340,13 +2340,13 @@ support@secondlife.com. Не удается получить описание формата пикселей </string> <string name="MBTrueColorWindow"> - Для работы [APP_NAME] необходим режим True Color (32 разряда). -Задайте в настройках дисплея 32-разрядный режим цвета. + Для работы [APP_NAME] необходим режим True Color (32 бита). +Задайте в настройках дисплея 32-битный режим цвета. </string> <string name="MBAlpha"> - Не удается запустить [APP_NAME] из-за отсутствия доступа к 8-разрядному альфа-каналу. Обычно эта проблема возникает из-за неполадок с драйвером видеокарты. + Не удается запустить [APP_NAME] из-за отсутствия доступа к 8-битному альфа-каналу. Обычно эта проблема возникает из-за неполадок с драйвером видеокарты. Установите новые драйверы видеокарты. -Также задайте для монитора 32-разрядный режим True Color (Панель управления > Экран > Параметры). +Также задайте для монитора 32-битный режим True Color (Панель управления > Экран > Параметры). Если это сообщение продолжает отображаться, обратитесь на сайт [SUPPORT_SITE]. </string> <string name="MBPixelFmtSetErr"> @@ -2363,7 +2363,7 @@ support@secondlife.com. Если это сообщение продолжает отображаться, обратитесь на сайт [SUPPORT_SITE]. </string> <string name="5 O'Clock Shadow"> - Легкие сумерки + Жидкие </string> <string name="All White"> Полностью белые @@ -2381,10 +2381,10 @@ support@secondlife.com. Прикреплено </string> <string name="Attached Earlobes"> - Примыкающие мочки + Приросшие мочки </string> <string name="Back Fringe"> - Черная челка + Затылок </string> <string name="Baggy"> С мешками @@ -2417,7 +2417,7 @@ support@secondlife.com. Большая голова </string> <string name="Big Pectorals"> - Большие грудные мышцы + Выпуклая грудь </string> <string name="Big Spikes"> Большие «шипы» @@ -2603,7 +2603,7 @@ support@secondlife.com. Кустистые брови </string> <string name="Bushy Hair"> - Вьющиеся волосы + Пышные </string> <string name="Butt Size"> Размер зада @@ -2636,7 +2636,7 @@ support@secondlife.com. Ямка на подбородке </string> <string name="Chin Curtains"> - Борода в стиле Линкольна + Шкиперская бородка </string> <string name="Chin Depth"> Толщина подбородка @@ -2654,10 +2654,10 @@ support@secondlife.com. Переход от подбородка к шее </string> <string name="Clear"> - Очистить + Чистый </string> <string name="Cleft"> - Щелкой + Ямка </string> <string name="Close Set Eyes"> Близко посаженные @@ -2711,7 +2711,7 @@ support@secondlife.com. Темнее </string> <string name="Deep"> - Глубокий + Глубоко </string> <string name="Default Heels"> Стандартные каблуки @@ -2726,7 +2726,7 @@ support@secondlife.com. Вниз </string> <string name="Duffle Bag"> - Сумка из плотной ткани + Больше </string> <string name="Ear Angle"> Оттопыренность ушей @@ -2756,7 +2756,7 @@ support@secondlife.com. Открытость глаз </string> <string name="Eye Pop"> - Взмах ресницами + Вытаращить глаз </string> <string name="Eye Size"> Размер глаз @@ -2774,7 +2774,7 @@ support@secondlife.com. Высота бровей </string> <string name="Eyebrow Points"> - Точки бровей + Кончики бровей </string> <string name="Eyebrow Size"> Размер бровей @@ -2792,10 +2792,10 @@ support@secondlife.com. Выпученные глаза </string> <string name="Face Shear"> - Овал лица + Перекос лица </string> <string name="Facial Definition"> - Описание лица + Черты лица </string> <string name="Far Set Eyes"> Широко расставленные глаза @@ -2816,7 +2816,7 @@ support@secondlife.com. С манжетами </string> <string name="Flat"> - Плоский + Плоские </string> <string name="Flat Butt"> Плоский зад @@ -2903,7 +2903,7 @@ support@secondlife.com. Размер кисти </string> <string name="Handlebars"> - Рули + Длинные усы </string> <string name="Head Length"> Длина головы @@ -2924,10 +2924,10 @@ support@secondlife.com. Форма каблука </string> <string name="Height"> - Высота + Рост </string> <string name="High"> - высокий + Высокие </string> <string name="High Heels"> Высокий каблук @@ -2939,7 +2939,7 @@ support@secondlife.com. Высокая платформа </string> <string name="High and Tight"> - Высокое и плотное + Высокий и плотный </string> <string name="Higher"> Выше @@ -2951,13 +2951,13 @@ support@secondlife.com. Ширина бедер </string> <string name="In"> - Внутри + Внутрь </string> <string name="In Shdw Color"> Цвет внутренних теней </string> <string name="In Shdw Opacity"> - Прозрачность внутренних теней + Прозрачность внутр. теней </string> <string name="Inner Eye Corner"> Внутренние уголки глаз @@ -2990,13 +2990,13 @@ support@secondlife.com. Щеки </string> <string name="Knee Angle"> - Угол коленей + Угол колен </string> <string name="Knock Kneed"> - Ровность ног + Колченогие </string> <string name="Large"> - Большие + Больше </string> <string name="Large Hands"> Большие кисти @@ -3029,7 +3029,7 @@ support@secondlife.com. Меньше притяжения </string> <string name="Less Love"> - Меньше любви + Меньше </string> <string name="Less Muscles"> Меньше мышц @@ -3044,7 +3044,7 @@ support@secondlife.com. Меньше округлости </string> <string name="Less Saddle"> - Меньше седлообразности + Меньше </string> <string name="Less Square"> Меньше угловатости @@ -3053,16 +3053,16 @@ support@secondlife.com. Меньше объема </string> <string name="Less soul"> - Меньше энергичности + Меньше </string> <string name="Lighter"> Светлее </string> <string name="Lip Cleft"> - Зазор между губ + Ямка между губ </string> <string name="Lip Cleft Depth"> - Глубина зазора + Глубина ямки </string> <string name="Lip Fullness"> Полнота губ @@ -3128,28 +3128,28 @@ support@secondlife.com. Отложения на талии </string> <string name="Low"> - Низкое + Низкие </string> <string name="Low Heels"> Низкий каблук </string> <string name="Low Jaw"> - Низкая челюсть + Челюсть низко </string> <string name="Low Platforms"> Низкая платформа </string> <string name="Low and Loose"> - Низкое и свободное + Низкий и свободный </string> <string name="Lower"> Ниже </string> <string name="Lower Bridge"> - Ниже переносицу + Спинка носа </string> <string name="Lower Cheeks"> - Ниже щеки + Щеки ниже </string> <string name="Male"> Мужчина @@ -3185,7 +3185,7 @@ support@secondlife.com. Больше помады </string> <string name="More Love"> - Больше любви + Больше </string> <string name="More Lower Lip"> Больше нижняя губа @@ -3194,7 +3194,7 @@ support@secondlife.com. Больше мышц </string> <string name="More Muscular"> - Более мускулистое + Больше мышц </string> <string name="More Rosy"> Больше румянца @@ -3203,7 +3203,7 @@ support@secondlife.com. Больше округлости </string> <string name="More Saddle"> - Более седлообразно + Больше </string> <string name="More Sloped"> Более наклонный @@ -3218,10 +3218,10 @@ support@secondlife.com. Более вертикальный </string> <string name="More Volume"> - Больший объем + Больше объема </string> <string name="More soul"> - Больше духа + Больше </string> <string name="Moustache"> Усы @@ -3251,7 +3251,7 @@ support@secondlife.com. Узко </string> <string name="Narrow Back"> - Узкая спина + Узко сзади </string> <string name="Narrow Front"> Узкий перед @@ -3260,7 +3260,7 @@ support@secondlife.com. Узкие губы </string> <string name="Natural"> - Естественно + Естественный </string> <string name="Neck Length"> Длина шеи @@ -3356,13 +3356,13 @@ support@secondlife.com. Оранжевый </string> <string name="Out"> - Снаружи + Наружу </string> <string name="Out Shdw Color"> Цвет внешних теней </string> <string name="Out Shdw Opacity"> - Прозрачность внешних теней + Прозрачность внеш. теней </string> <string name="Outer Eye Corner"> Внешние уголки глаз @@ -3377,7 +3377,7 @@ support@secondlife.com. Глубокий прикус </string> <string name="Package"> - Пакет + Гульфик </string> <string name="Painted Nails"> Покрашенные @@ -3386,7 +3386,7 @@ support@secondlife.com. Бледный </string> <string name="Pants Crotch"> - Мотня + Шаг </string> <string name="Pants Fit"> Облегающие брюки @@ -3404,13 +3404,13 @@ support@secondlife.com. Пробор </string> <string name="Part Bangs"> - Челки с пробором + Челка с пробором </string> <string name="Pectorals"> Грудные мышцы </string> <string name="Pigment"> - Пигмент + Пигментация </string> <string name="Pigtails"> Хвосты по бокам @@ -3428,7 +3428,7 @@ support@secondlife.com. Ширина платформы </string> <string name="Pointy"> - Острый + Острые </string> <string name="Pointy Heels"> Острый каблук @@ -3440,13 +3440,13 @@ support@secondlife.com. Пышная юбка </string> <string name="Pop Left Eye"> - Хлопнуть левым глазом + Левый глаз </string> <string name="Pop Right Eye"> - Хлопнуть правым глазом + Правый глаз </string> <string name="Puffy"> - Припухшие + Пухлые </string> <string name="Puffy Eyelids"> Припухлость век @@ -3473,13 +3473,13 @@ support@secondlife.com. Румянец </string> <string name="Ruddy"> - Румяное + Румяный </string> <string name="Rumpled Hair"> Взъерошенные </string> <string name="Saddle Bags"> - Седельные сумки + Галифе </string> <string name="Scrawny Leg"> Сухопарая нога @@ -3488,25 +3488,25 @@ support@secondlife.com. Разделить </string> <string name="Shallow"> - Мелкий + Мелко </string> <string name="Shear Back"> - Очертание спины + Скос сзади </string> <string name="Shear Face"> - Овал лица + Перекос лица </string> <string name="Shear Front"> - Очертание спереди + Скос спереди </string> <string name="Shear Left Up"> - Очертание левой верхней части + Скос влево вверх </string> <string name="Shear Right Up"> - Очертание правой верхней части + Скос вправо вверх </string> <string name="Sheared Back"> - Уменьшенная спина + Уменьшено сзади </string> <string name="Sheared Front"> Уменьшено спереди @@ -3533,7 +3533,7 @@ support@secondlife.com. Высота обуви </string> <string name="Short"> - Короче + Ниже </string> <string name="Short Arms"> Короткие руки @@ -3608,7 +3608,7 @@ support@secondlife.com. Разрез: справа </string> <string name="Small"> - Маленький + Меньше </string> <string name="Small Hands"> Маленькие кисти @@ -3620,13 +3620,13 @@ support@secondlife.com. Гладко </string> <string name="Smooth Hair"> - Приглаженные волосы + Приглаженные </string> <string name="Socks Length"> Длина носков </string> <string name="Soulpatch"> - Бородка под губой + Эспаньолка </string> <string name="Sparse"> Жидкие @@ -3662,13 +3662,13 @@ support@secondlife.com. Зачесанные вперед </string> <string name="Tall"> - Высокие + Выше </string> <string name="Taper Back"> - Градуировка сзади + Конус сзади </string> <string name="Taper Front"> - Градуировка спереди + Конус спереди </string> <string name="Thick Heels"> Широкий каблук @@ -3737,16 +3737,16 @@ support@secondlife.com. Неестественный </string> <string name="Upper Bridge"> - Переносицу выше + Переносица </string> <string name="Upper Cheeks"> Щеки выше </string> <string name="Upper Chin Cleft"> - Ямку на подбородке выше + Ямка на подбородке выше </string> <string name="Upper Eyelid Fold"> - Складку века выше + Складка верхнего века </string> <string name="Upturned"> Вверх @@ -3758,7 +3758,7 @@ support@secondlife.com. Высота талии </string> <string name="Well-Fed"> - Упитанное + Упитанные </string> <string name="White Hair"> Белые волосы @@ -3767,7 +3767,7 @@ support@secondlife.com. Широко </string> <string name="Wide Back"> - Широкая спина + Широко сзади </string> <string name="Wide Front"> Широкий перед @@ -4252,7 +4252,7 @@ support@secondlife.com. Женщина – ух ты! </string> <string name="/bow"> - /поклон + /поклониться </string> <string name="/clap"> /хлопнуть @@ -4794,7 +4794,7 @@ support@secondlife.com. Компас </string> <string name="Command_Destinations_Label"> - Места + Пункты </string> <string name="Command_Gestures_Label"> Жесты @@ -4845,16 +4845,16 @@ support@secondlife.com. Вид </string> <string name="Command_Voice_Label"> - Голоса собеседников + Настройки голоса </string> <string name="Command_AboutLand_Tooltip"> Информация о посещаемой вами земле </string> <string name="Command_Appearance_Tooltip"> - Сменить аватар + Изменить аватар </string> <string name="Command_Avatar_Tooltip"> - Выберите весь аватар + Выбор аватара </string> <string name="Command_Build_Tooltip"> Построение объектов и формирование ландшафта @@ -4917,7 +4917,7 @@ support@secondlife.com. Изменение угла камеры </string> <string name="Command_Voice_Tooltip"> - Люди около вас с оспособностью говорить + Громкость звонков и голосов окружающих вас людей </string> <string name="Retain%"> Остаток% diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml index 998890b85c..993ec42958 100644 --- a/indra/newview/skins/default/xui/tr/floater_about.xml +++ b/indra/newview/skins/default/xui/tr/floater_about.xml @@ -46,16 +46,16 @@ Ses Sunucusu Sürümü: [VOICE_VERSION] </panel> <panel label="Katkıda Bulunanlar" name="credits_panel"> <text name="linden_intro"> - Second Life, Lindens'lar tarafından geliştirilmiştir: + Second Life, Linden'lar tarafından geliştirilmiştir: </text> <text name="contrib_intro"> - açık kaynak kod katkısında bulunanlar: + Açık kaynak kod katkısında bulunanlar: </text> <text_editor name="contrib_names"> Geçici Ad çalıştırma sırasında değiştirilir </text_editor> <text name="trans_intro"> - çevirileri yapanlar: + Çevirileri yapanlar: </text> <text_editor name="trans_names"> Geçici Ad çalıştırma sırasında değiştirilir diff --git a/indra/newview/skins/default/xui/tr/floater_about_land.xml b/indra/newview/skins/default/xui/tr/floater_about_land.xml index c44722f4ba..e0350964b5 100644 --- a/indra/newview/skins/default/xui/tr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/tr/floater_about_land.xml @@ -102,7 +102,7 @@ <text name="For Sale: Price L$[PRICE]."> Fiyat: L$[PRICE] (L$[PRICE_PER_SQM]/m²) </text> - <button label="Arazi Sat" name="Sell Land..."/> + <button label="Araziyi Sat" name="Sell Land..."/> <text name="For sale to"> Şu Alıcıya Satılık: [BUYER] </text> @@ -307,7 +307,7 @@ Sadece büyük parseller aramada görünür. İtme Yok (Bölge Geçersiz Kılma) </panel.string> <panel.string name="see_avs_text"> - Bu parseldeki sakinleri gör ve onlarla sohbet et + Parseldeki sakinleri gör ve onlarla sohbet et </panel.string> <text name="allow_label"> Sakinlere şunun için izin ver: @@ -336,7 +336,7 @@ Sadece büyük parseller aramada görünür. <check_box label="İtme Yok" name="PushRestrictCheck" tool_tip="Komut dosyalarının itmesini önler Bu seçeneğin işaretlenmesi arazinizdeki bozucu davranışları önlemeye yardımcı olabilir."/> <check_box label="Konumu Arama sonuçlarında göster (L$30/hafta)" name="ShowDirectoryCheck" tool_tip="Arama sonuçlarında bu parsel görünsün"/> <combo_box name="land category with adult"> - <combo_box.item label="Herhangi Bir Kategori" name="item0"/> + <combo_box.item label="Herh. Bir Kategori" name="item0"/> <combo_box.item label="Linden Konumu" name="item1"/> <combo_box.item label="Yetişkin" name="item2"/> <combo_box.item label="Sanat ve Kültür" name="item3"/> @@ -352,7 +352,7 @@ Sadece büyük parseller aramada görünür. <combo_box.item label="Diğer" name="item12"/> </combo_box> <combo_box name="land category"> - <combo_box.item label="Herhangi Bir Kategori" name="item0"/> + <combo_box.item label="Herh. Bir Kategori" name="item0"/> <combo_box.item label="Linden Konumu" name="item1"/> <combo_box.item label="Sanat ve Kültür" name="item3"/> <combo_box.item label="İş" name="item4"/> @@ -372,7 +372,7 @@ Sadece büyük parseller aramada görünür. </text> <texture_picker name="snapshot_ctrl" tool_tip="Bir resim seçmek için tıklayın"/> <text name="allow_label5"> - Diğer parsellerdeki Sakinlere şunun için izin verin: + Diğer parsel Sakinlerine şunun için izin verin: </text> <check_box label="Avatarları Gör" name="SeeAvatarsCheck" tool_tip="Diğer parsellerdeki sakinlerin bu parseldeki sakinleri görmesine ve onlarla sohbet etmesine, sizin de onları görüp, onlarla sohbet etmenize imkan tanır."/> <text name="landing_point"> @@ -419,7 +419,7 @@ Sadece büyük parseller aramada görünür. piksel </text> <text name="Options:"> - Seçenekler: + Seçenklr.: </text> <check_box label="Döngü" name="media_loop" tool_tip="Ortamı döngüsel olarak oynat. Ortamın oynatılması bittiğinde baştan tekrar başlayacaktır."/> </panel> @@ -448,7 +448,7 @@ Sadece büyük parseller aramada görünür. (Gayrimenkul tarafından tanımlanır) </panel.string> <panel.string name="allow_public_access"> - Kamusal Erişime İzin Ver ([MATURITY]) (Not: Bunun işaretinin kaldırılması yasaklama çizgileri oluşturacaktır) + Kamusal Erişime İzin Ver ([MATURITY]) (Not: İşaret kaldırılırsa yasaklama çizgileri oluşur) </panel.string> <panel.string name="estate_override"> Bu seçeneklerden biri veya daha fazlası gayrimenkul düzeyinde ayarlanır @@ -462,7 +462,7 @@ Sadece büyük parseller aramada görünür. <check_box label="Dosyadaki ödeme bilgileri [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Tanınmayan Sakinleri Yasakla."/> <check_box label="Yaş doğrulama [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Yaşını doğrulamayan Sakinleri yasakla Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/> <check_box label="Grup Erişimine İzin Ver: [GROUP]" name="GroupCheck" tool_tip="Genel sekmesinde grup ayarla."/> - <check_box label="Geçiş haklarını şuna sat:" name="PassCheck" tool_tip="Bu parsele geçici erişim verir"/> + <check_box label="Geçiş haklr. şuna sat:" name="PassCheck" tool_tip="Bu parsele geçici erişim verir"/> <combo_box name="pass_combo"> <combo_box.item label="Herkes" name="Anyone"/> <combo_box.item label="Grup" name="Group"/> diff --git a/indra/newview/skins/default/xui/tr/floater_buy_land.xml b/indra/newview/skins/default/xui/tr/floater_buy_land.xml index 4d43157f99..7b43af2ea4 100644 --- a/indra/newview/skins/default/xui/tr/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/tr/floater_buy_land.xml @@ -53,7 +53,7 @@ Daha küçük bir alan seçmeyi deneyin. Arazi alma bilgileri çekilirken hata oluştu. </floater.string> <floater.string name="buying_will"> - Bu arazinin satın alınması sonucu: + Arazinin satın alınması sonucu: </floater.string> <floater.string name="buying_for_group"> Bu arazinin grup için satın alınması sonucu: @@ -185,7 +185,7 @@ Daha küçük bir alan seçmeyi deneyin. nesnelerle satılır </text> <text name="info_action"> - Bu arazinin satın alınması sonucu: + Arazinin satın alınması sonucu: </text> <text name="error_message"> Bir şeyler yolunda değil. diff --git a/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml index e2e87ddf1e..4be1068dcc 100644 --- a/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml +++ b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml @@ -22,10 +22,10 @@ Not: Ön ayarınızın adını değiştirirseniz, yeni bir ön ayar oluşturursunuz ve mevcut ön ayar değişmez. </text> <text name="hint_item1"> - - Belirli gökyüzü ayarlarını ve zamanı düzenlemek için bir sekmeye tıklayın. + - Birine tıklayarak gökyüzü ayarlarını/zamanı düzenleyin. </text> <text name="hint_item2"> - - Geçiş sürelerini ayarlamak için sekmelere tıklayın ve bunları sürükleyin. + - Sekmelere tıklayıp sürükleyerek geçiş sürlrn. ayarlayın. </text> <text name="hint_item3"> - Gün döngünüzü önizlemek için fırçayı kullanın. diff --git a/indra/newview/skins/default/xui/tr/floater_environment_settings.xml b/indra/newview/skins/default/xui/tr/floater_environment_settings.xml index 943e1e810d..e702da7e1b 100644 --- a/indra/newview/skins/default/xui/tr/floater_environment_settings.xml +++ b/indra/newview/skins/default/xui/tr/floater_environment_settings.xml @@ -18,7 +18,7 @@ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/> </combo_box> <text name="sky_dayc_settings_title"> - Gökyüzü / Gün Döngüsü + Gökyüzü/Gün Dön. </text> <radio_group name="sky_dayc_settings_radio_group"> <radio_item label="Sabit gökyüzü" name="my_sky_settings"/> diff --git a/indra/newview/skins/default/xui/tr/floater_god_tools.xml b/indra/newview/skins/default/xui/tr/floater_god_tools.xml index ce7f7badcc..26e5ebd18b 100644 --- a/indra/newview/skins/default/xui/tr/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_god_tools.xml @@ -67,7 +67,7 @@ <button label="Hedefin *Herhangi Bir* Arazideki Komut Dosyalı Nesnelerini Sil" label_selected="Hedefin *Herhangi Bir* Arazideki Komut Dosyalı Nesnelerini Sil" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Bu bölgede hedefe ait olan tüm komut dosyalı nesneleri silin. (kopya yok) nesneler geri döndürülür."/> <button label="Hedefin *TÜM* Nesnelerini Sil" label_selected="Hedefin *TÜM* Nesnelerini Sil" name="Delete *ALL* Of Target's Objects" tool_tip="Bu bölgede hedefe ait olan tüm nesneleri silin. (kopya yok) nesneler geri döndürülür."/> <button label="En Çok Çarpışanlar" label_selected="En Çok Çarpışanlar" name="Get Top Colliders" tool_tip="En dar fazda geri aramaları yaşayan nesnelerin listesini alır"/> - <button label="En Çok Komut Dosyası Çalıştıranlar" label_selected="En Çok Komut Dosyası Çalıştıranlar" name="Get Top Scripts" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesini alır"/> + <button label="En Çok Komut Dsy. Çalştr." label_selected="En Çok Komut Dsy. Çalştr." name="Get Top Scripts" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesini alır"/> <button label="Komut dosyaları özeti" label_selected="Komut dosyaları özeti" name="Scripts digest" tool_tip="Tüm komut dosyalarının ve her birinin ne kadar kullanıldığının listesini alır"/> </panel> <panel label="Talep" name="request"> diff --git a/indra/newview/skins/default/xui/tr/floater_joystick.xml b/indra/newview/skins/default/xui/tr/floater_joystick.xml index 31d819743c..4a27aac3c1 100644 --- a/indra/newview/skins/default/xui/tr/floater_joystick.xml +++ b/indra/newview/skins/default/xui/tr/floater_joystick.xml @@ -3,10 +3,10 @@ <floater.string name="NoDevice"> cihaz tespit edilmedi </floater.string> - <check_box label="Oyun Çubuğunu Etkinleştir:" name="enable_joystick"/> - <spinner label="X Eksen Haritalama" name="JoystickAxis1"/> - <spinner label="Y Eksen Haritalama" name="JoystickAxis2"/> - <spinner label="Z Eksen Haritalama" name="JoystickAxis0"/> + <check_box label="Oyun Çub. Etkşt:" name="enable_joystick"/> + <spinner label="X Eks. Haritalama" name="JoystickAxis1"/> + <spinner label="Y Eks. Haritalama" name="JoystickAxis2"/> + <spinner label="Z Eks. Haritalama" name="JoystickAxis0"/> <spinner label="Eğim Haritalama" name="JoystickAxis4"/> <spinner label="Düşey Sapma Haritalama" name="JoystickAxis5"/> <spinner label="Tilt Haritalama" name="JoystickAxis3"/> diff --git a/indra/newview/skins/default/xui/tr/floater_preferences.xml b/indra/newview/skins/default/xui/tr/floater_preferences.xml index a0be9dc53f..edb3c19b81 100644 --- a/indra/newview/skins/default/xui/tr/floater_preferences.xml +++ b/indra/newview/skins/default/xui/tr/floater_preferences.xml @@ -7,7 +7,7 @@ <panel label="Grafikler" name="display"/> <panel label="Ses ve Ortamlar" name="audio"/> <panel label="Sohbet" name="chat"/> - <panel label="Hareketler ve Görünümler" name="move"/> + <panel label="Hareket ve Görünümler" name="move"/> <panel label="Bildirimler" name="msgs"/> <panel label="Renkler" name="colors"/> <panel label="Gizlilik" name="im"/> diff --git a/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml index fa9fd37e6c..dc6f66f657 100644 --- a/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml @@ -65,7 +65,7 @@ <check_box label="tüm animasyonlar bitinceye kadar" name="wait_anim_check"/> <check_box label="saniye olarak zaman:" name="wait_time_check"/> <text name="help_label"> - Bekleme adımlar eklemediğiniz sürece tüm adımlar aynı anda gerçekleşir. + Bekleme adımları eklemediğiniz sürece tüm adımlar aynı anda gerçekleşir. </text> <check_box label="Etkin" name="active_check" tool_tip="Etkin mimikleri tetiklemek için tetikleme fazları için sohbet gerçekleştirebilir veya kısayol tuşlarına basabilirsiniz. Bir anahtar bağlama ihtilafı olduğunda mimikler genellikle inaktif hale geçer."/> <button label="Önizleme" name="preview_btn"/> diff --git a/indra/newview/skins/default/xui/tr/floater_report_abuse.xml b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml index ae4c3cc75e..c5765883c4 100644 --- a/indra/newview/skins/default/xui/tr/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml @@ -81,7 +81,7 @@ Özet: </text> <text name="dscr_title"> - Ayrıntılar: + Ayrıntl: </text> <text name="bug_aviso"> Mümkün olduğunca spesifik olun diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml index cd5e6b7fac..d4ee9995dd 100644 --- a/indra/newview/skins/default/xui/tr/floater_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_tools.xml @@ -55,7 +55,7 @@ <radio_item label="Uzat (Ctrl+Shift)" name="radio stretch"/> <radio_item label="Yüzü Seç" name="radio select face"/> </radio_group> - <check_box label="Bağlantılı olanları düzenle" name="checkbox edit linked parts"/> + <check_box label="Bağlantılıları düzenle" name="checkbox edit linked parts"/> <button label="Bağla" name="link_btn"/> <button label="Bağlantıyı Kopar" name="unlink_btn"/> <text label="Her İki Tarafı Uzat" name="checkbox uniform label"> @@ -81,7 +81,7 @@ <button name="ToolGrass" tool_tip="Çimen"/> <check_box label="Seçili Aracı tut" name="checkbox sticky"/> <check_box label="Seçimi kopyala" name="checkbox copy selection"/> - <check_box initial_value="true" label="Kopyayı Merkeze Al" name="checkbox copy centers"/> + <check_box initial_value="true" label="Kopyayı Merkezle" name="checkbox copy centers"/> <check_box label="Kopyayı Döndür" name="checkbox copy rotates"/> <radio_group name="land_radio_group"> <radio_item label="Araziyi Seç" name="radio select land"/> @@ -376,7 +376,7 @@ </combo_box> <spinner label="Yerçekimi" name="Physics Gravity"/> <spinner label="Sürtünme" name="Physics Friction"/> - <spinner label="100 kg/m^3 cinsinden yoğunluk" name="Physics Density"/> + <spinner label="100 kg/m3 cinsinden yoğunluk" name="Physics Density"/> <spinner label="Restitüsyon" name="Physics Restitution"/> </panel> <panel label="Doku" name="Texture"> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index efeed833a5..75294e38d5 100644 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -93,7 +93,7 @@ <menu_item_call label="Arazi Aracı" name="Land"/> </menu> <menu_item_call label="Bağla" name="Link"/> - <menu_item_call label="Bağlantıyı Kopar" name="Unlink"/> + <menu_item_call label="Bağlnty. Kopar" name="Unlink"/> <menu_item_check label="Bağlantılı Parçaları Düzenle" name="Edit Linked Parts"/> <menu label="Bağlantılı Parçaları Seç" name="Select Linked Parts"> <menu_item_call label="Sonraki Parçayı Seç" name="Select Next Part"/> @@ -118,7 +118,7 @@ <menu_item_call label="Komut Dosyalarını Çalışıyor Olarak Ayarla" name="Set Scripts to Running"/> <menu_item_call label="Komut Dosyalarını Çalışmıyor Olarak Ayarla" name="Set Scripts to Not Running"/> </menu> - <menu label="Seçenekler" name="Options"> + <menu label="Seçenklr." name="Options"> <menu_item_check label="Gelişmiş İzinleri Göster" name="DebugPermissions"/> <menu_item_check label="Sadece Nesnelerimi Seç" name="Select Only My Objects"/> <menu_item_check label="Sadece Hareket Ettirilebilir Nesneleri Seç" name="Select Only Movable Objects"/> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index a268c103a6..b62ff01ab9 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -2270,7 +2270,7 @@ Daha küçük bir arazi parçası seçmeyi deneyin. [NAME] [DATE] <form name="form"> - <button name="Details" text="Ayrıntılar"/> + <button name="Details" text="Ayrıntl"/> <button name="Cancel" text="İptal"/> </form> </notification> diff --git a/indra/newview/skins/default/xui/tr/panel_people.xml b/indra/newview/skins/default/xui/tr/panel_people.xml index 7d42e3ab79..1a1e53bac2 100644 --- a/indra/newview/skins/default/xui/tr/panel_people.xml +++ b/indra/newview/skins/default/xui/tr/panel_people.xml @@ -24,7 +24,7 @@ Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/worldmap Dünya <tab_container name="tabs"> <panel label="YAKIN" name="nearby_panel"> <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Seçenekler"/> + <menu_button name="nearby_view_sort_btn" tool_tip="Seçenklr."/> <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaş listene ekle"/> </panel> </panel> @@ -49,14 +49,14 @@ Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/worldmap Dünya </panel> <panel label="GRUPLARIM" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Seçenekler"/> + <menu_button name="groups_viewsort_btn" tool_tip="Seçenklr."/> <button name="plus_btn" tool_tip="Gruba katıl/yeni grup oluştur"/> <button name="activate_btn" tool_tip="Seçilen grubu etkinleştir"/> </panel> </panel> <panel label="SON" name="recent_panel"> <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Seçenekler"/> + <menu_button name="recent_viewsort_btn" tool_tip="Seçenklr."/> <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaş listene ekle"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml index 787efa32f4..770cdc6efd 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml @@ -6,11 +6,11 @@ <text name="Cache:"> Önbellek: </text> - <spinner label="Önbellek büyüklüğü (64 - 9984 MB)" name="cachesizespinner"/> + <spinner label="Önbellek boyutu (64-9984 MB)" name="cachesizespinner"/> <text name="text_box5"> MB </text> - <button label="Önbelleği Temizle" label_selected="Önbelleği Temizle" name="clear_cache"/> + <button label="Önbelleği Sil" label_selected="Önbelleği Sil" name="clear_cache"/> <text name="Cache location"> Önbellek konumu: </text> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml index 9c9e960715..f7f0698a31 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml @@ -16,9 +16,9 @@ Aİ'leri şurada göster: </text> <text name="requires_restart_label"> - (yeniden başlatma gerektirir) + (tekrar başlatma gerekir) </text> - <radio_group name="chat_window" tool_tip="Anlık İletilerinizi ayrı gezdiricilerde veya birden çok sekmeye sahip tek bir gezdiricide gösterin (Yeniden başlatma gerektirir)"> + <radio_group name="chat_window" tool_tip="Anlık İletileri ayrı gezdiricilerde veya çoklu sekmelere sahip tek bir gezdiricide gösterin (tekrar başlatma gerekir)"> <radio_item label="Ayrı Pencereler" name="radio" value="0"/> <radio_item label="Sekmeler" name="radio2" value="1"/> </radio_group> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml index fbfc07c4b8..4a48b1588c 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml @@ -22,7 +22,7 @@ (Yeniden başlatma gerekir) </text> <text name="maturity_desired_prompt"> - Seviyelendirdiğim şu içeriğe erişim istiyorum: + Seviyelndrl. içeriğe erişim istiyorum:: </text> <combo_box name="maturity_desired_combobox"> <combo_box.item label="Genel, Orta, Yetişkin" name="Desired_Adult"/> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml index ba31640e9c..ddb83ffc69 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml @@ -51,7 +51,7 @@ <combo_box.item label="Tüm avatarlar ve nesneler" name="3"/> <combo_box.item label="Her şey" name="4"/> </combo_box> - <slider label="Avatarın Fiziksel Özellikleri:" name="AvatarPhysicsDetail"/> + <slider label="Avatar Fzk. Özlk.:" name="AvatarPhysicsDetail"/> <text name="AvatarPhysicsDetailText"> Düşük </text> @@ -60,7 +60,7 @@ m </text> <slider label="Maks. parçacık sayısı:" name="MaxParticleCount"/> - <slider label="Düşük grafik özellikli olmayan maks. avatar sayısı:" name="MaxNumberAvatarDrawn"/> + <slider label="Düşük gr. özl. olmayan mks. avatar:" name="MaxNumberAvatarDrawn"/> <slider label="Son işleme kalitesi:" name="RenderPostProcess"/> <text name="MeshDetailText"> Örgü detayı: diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml index e76616f667..9111594979 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml @@ -11,7 +11,7 @@ <check_box label="Çevrimiçi olduğumu sadece arkadaşlar ve gruplar bilsin" name="online_visibility"/> <check_box label="Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin" name="voice_call_friends_only_check"/> <check_box label="Aramaları sonlandırırken mikrofonu kapat" name="auto_disengage_mic_check"/> - <check_box label="Oturum Açarken Favori Yer İmlerimi Göster ('Buradan başla' açılır menüsünden)" name="favorites_on_login_check"/> + <check_box label="Oturum Açarken Favori Yer İmlerimi Göster ('Buradan başla' menüsünden)" name="favorites_on_login_check"/> <text name="Logs:"> Sohbet Günlükleri: </text> diff --git a/indra/newview/skins/default/xui/tr/panel_region_debug.xml b/indra/newview/skins/default/xui/tr/panel_region_debug.xml index f16c666e86..6e15e0f6f6 100644 --- a/indra/newview/skins/default/xui/tr/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/tr/panel_region_debug.xml @@ -21,14 +21,14 @@ </line_editor> <button label="Seç" name="choose_avatar_btn"/> <text name="options_text_lbl"> - Seçenekler: + Seçenklr.: </text> <check_box label="Komut dosyaları ile" name="return_scripts" tool_tip="Sadece komut dosyaları olan nesneler iade edilsin"/> <check_box label="Başkasına ait arazi üzerinde" name="return_other_land" tool_tip="Sadece başkasına ait arazi üzerinde olan nesneler iade edilsin"/> <check_box label="Bu gayrimenkulu oluşturan bölgelerin tümünde" name="return_estate_wide" tool_tip="Bu gayrimenkulu oluşturan bölgelerin tümündeki nesneler iade edilsin"/> <button label="İade Et" name="return_btn"/> <button label="En Çok Çarpışanlar..." name="top_colliders_btn" tool_tip="En çok potansiyel çarpışma yaşayan nesnelerin listesi"/> - <button label="En Çok Komut Dosyası Çalıştıranlar..." name="top_scripts_btn" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesi"/> + <button label="En Çok Komut Dsy. Çalştr...." name="top_scripts_btn" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesi"/> <button label="Bölgeyi Yeniden Başlat" name="restart_btn" tool_tip="2 dakikalık bir geri sayımdan sonra bölgeyi yeniden başlat"/> <button label="Yeniden Başlatmayı Ertele" name="cancel_restart_btn" tool_tip="Bölgenin yeniden başlatılmasını 1 saat ertele"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_region_environment.xml b/indra/newview/skins/default/xui/tr/panel_region_environment.xml index 851cd23f30..058ea91b70 100644 --- a/indra/newview/skins/default/xui/tr/panel_region_environment.xml +++ b/indra/newview/skins/default/xui/tr/panel_region_environment.xml @@ -15,7 +15,7 @@ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/> </combo_box> <text name="sky_dayc_settings_title"> - Gökyüzü / Gün Döngüsü + Gökyüzü/Gün Dön. </text> <radio_group name="sky_dayc_settings_radio_group"> <radio_item label="Sabit gökyüzü" name="my_sky_settings"/> diff --git a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml index 874d27abfb..3226ee008e 100644 --- a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml @@ -7,7 +7,7 @@ bilinmiyor </text> <spinner label="Su Yüksekliği" name="water_height_spin"/> - <spinner label="Yüzey Yükseltme Limiti" name="terrain_raise_spin"/> + <spinner label="Yüzey Yükslt. Limiti" name="terrain_raise_spin"/> <spinner label="Yüzey Alçatma Limiti" name="terrain_lower_spin"/> <text name="detail_texture_text"> Yüzey Dokuları (512x512, 24 bit .tga dosyalar gerektirir) diff --git a/indra/newview/skins/default/xui/tr/role_actions.xml b/indra/newview/skins/default/xui/tr/role_actions.xml index 18f7d6dca2..655ac64172 100644 --- a/indra/newview/skins/default/xui/tr/role_actions.xml +++ b/indra/newview/skins/default/xui/tr/role_actions.xml @@ -44,7 +44,7 @@ <action_set description="Bu Yeteneklere, grubun sahip olduğu parsellere erişime izin verme veya buralara erişimi yasaklama ve Second Life Sakinlerini dondurma veya parselden dışarı çıkarma da dahildir." name="Parcel Access"> <action description="Parselin Erişim listelerini yönet" longdescription="Parselin Erişim listelerini Arazi Hakkında > Erişim sekmesinden yönetin." name="land manage allowed" value="29"/> <action description="Parselin Yasaklama listelerini yönet" longdescription="Parselin Yasaklama listelerini Arazi Hakkında > Erişim sekmesinden yönetin." name="land manage banned" value="30"/> - <action description="Parselin 'Geçiş haklarını şuna sat' ayarlarını değiştir" longdescription="Parselin 'Geçiş haklarını şuna sat' ayarlarını Arazi Hakkında > Erişim sekmesinden değiştirin." name="land manage passes" value="31"/> + <action description="Parselin 'Geçiş haklr. şuna sat' ayarlarını değiştir" longdescription="Parselin 'Geçiş haklr. şuna sat' ayarlarını Arazi Hakkında > Erişim sekmesinden değiştirin." name="land manage passes" value="31"/> <action description="Parsel üzerindeki Second Life Sakinlerini dışarı çıkar veya dondur" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, grubun sahip olduğu bir parsel üzerinde olmasını istemedikleri bir Second Life sakininin üzerini sağ tıklatıp 'Dışarı Çıkar' veya 'Dondur'u seçebilirler." name="land admin" value="32"/> </action_set> <action_set description="Bu Yeteneklere üyelerin nesneleri iade etmelerine, Linden bitkilerini yerleştirmelerine ve bu bitkilerin yerlerini değiştirmelerine izin veren güçler de dahildir. Bu özellik, Üyelerin çöpleri temizlemeleri ve bahçe düzenlemesi yapmaları için kullanışlıdır; fakat dikkatle kullanılmalıdır, çünkü nesneleri iade etmenin geri alınma imkanı yoktur." name="Parcel Content"> diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml index 28eeef02d3..2fa6281f05 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml @@ -118,6 +118,6 @@ <button label="Aç" name="open_btn"/> <button label="Öde" name="pay_btn"/> <button label="Satın Al" name="buy_btn"/> - <button label="Ayrıntılar" name="details_btn"/> + <button label="Ayrıntl" name="details_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index a17d78486d..bf331dc3cf 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -2160,7 +2160,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Aşağı </string> <string name="Any Category"> - Herhangi Bir Kategori + Herh. Bir Kategori </string> <string name="Shopping"> Alışveriş @@ -2190,7 +2190,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Kişisel </string> <string name="None"> - Hiçbiri + Renksiz </string> <string name="Linden Location"> Linden Konumu @@ -2390,7 +2390,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Arka Perçem </string> <string name="Baggy"> - Lüleler + Torbalı </string> <string name="Bangs"> Kahküller @@ -2480,7 +2480,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Geniş </string> <string name="Brow Size"> - Kaş Büyüklüğü + Alın Genişliği </string> <string name="Bug Eyes"> Patlak Gözlü @@ -2777,7 +2777,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Kaş Yüksekliği </string> <string name="Eyebrow Points"> - Kaş Noktaları + Kaş Yapısı </string> <string name="Eyebrow Size"> Kaş Büyüklüğü @@ -2846,13 +2846,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Ön Perçem </string> <string name="Full Back"> - Saçlar Arkada + Arkası Düz </string> <string name="Full Eyeliner"> Çift Taraflı Göz Kalemi </string> <string name="Full Front"> - Saçlar Önde + Önü Düz </string> <string name="Full Hair Sides"> Saçlar Yanda @@ -2936,13 +2936,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Yüksek Topuklar </string> <string name="High Jaw"> - Yüksek Çene Ucu + Ayrık </string> <string name="High Platforms"> - Yüksek Topuklu Ayakkabılar + Yüksek Topuklu </string> <string name="High and Tight"> - Tepede Bırakılmış Saç + Düşük </string> <string name="Higher"> Daha Yüksek @@ -2954,7 +2954,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Kalça Genişliği </string> <string name="In"> - İç + İçeri </string> <string name="In Shdw Color"> İç Gölge Rengi @@ -2978,19 +2978,19 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Ceket Kırışıklıkları </string> <string name="Jaw Angle"> - Çene Ucu Açısı + Çenenin Boyuna Uzaklığı </string> <string name="Jaw Jut"> - Çene Ucu Çıkıntısı + Alt Çene Uzunluğu </string> <string name="Jaw Shape"> - Çene Ucu Şekli + Çene Kemiği Genişliği </string> <string name="Join"> - Birleştir + Birleşik </string> <string name="Jowls"> - Gıdıklar + Avurtlar </string> <string name="Knee Angle"> Diz Açısı @@ -3029,7 +3029,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Daha Az Dolgun </string> <string name="Less Gravity"> - Daha Az Yerçekimi + Dik Göğüs </string> <string name="Less Love"> Daha İnce Bel @@ -3047,7 +3047,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Daha Az Yuvarlak </string> <string name="Less Saddle"> - Daha Dar Kalça + Basensiz </string> <string name="Less Square"> Daha Az Küt @@ -3098,7 +3098,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Uzun Kafa </string> <string name="Long Hips"> - Geniş Kalçalar + Yüksek kalça </string> <string name="Long Legs"> Uzun Bacaklar @@ -3107,7 +3107,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Uzun Boyun </string> <string name="Long Pigtails"> - Uzun Saç Örgüleri + Yandan Uzun Kuyruk </string> <string name="Long Ponytail"> Uzun Atkuyruğu @@ -3137,13 +3137,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Alçak Topuklar </string> <string name="Low Jaw"> - Düşük Çene Ucu + Bitişik </string> <string name="Low Platforms"> Alçak Topuklu </string> <string name="Low and Loose"> - Serbest At Kuyruğu + Yüksek </string> <string name="Lower"> Daha Alçak @@ -3182,7 +3182,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Daha Dolgun </string> <string name="More Gravity"> - Daha Çok Yerçekimi + Sarkık Göğüs </string> <string name="More Lipstick"> Daha Çok Ruj @@ -3191,7 +3191,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Daha Kalın Bel </string> <string name="More Lower Lip"> - Daha Çok Alt Dudak + Daha Dolgun Alt Dudak </string> <string name="More Muscles"> Daha Çok Kas @@ -3206,7 +3206,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Daha Yuvarlak </string> <string name="More Saddle"> - Daha Geniş Kalça + Basenli </string> <string name="More Sloped"> Daha Eğimli @@ -3215,7 +3215,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Daha Küt </string> <string name="More Upper Lip"> - Daha Çok Üst Dudak + Daha Dolgun Üst Dudak </string> <string name="More Vertical"> Daha Dikey @@ -3260,7 +3260,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Önü Dar </string> <string name="Narrow Lips"> - İnce Dudaklar + Küçük Dudaklar </string> <string name="Natural"> Doğal @@ -3359,7 +3359,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Turuncu </string> <string name="Out"> - Dış + Dışarı </string> <string name="Out Shdw Color"> Dış Gölge Rengi @@ -3377,7 +3377,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Dış Gölge </string> <string name="Overbite"> - Üst Dişler Önde + Öne Doğru </string> <string name="Package"> Apış Arası Şişkinliği @@ -3416,7 +3416,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Pigment </string> <string name="Pigtails"> - Saç Örgüleri + Yan Kuyruklar </string> <string name="Pink"> Pembe @@ -3431,7 +3431,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Topuk Genişliği </string> <string name="Pointy"> - Sivri + Dar </string> <string name="Pointy Heels"> Sivri Topuklar @@ -3482,25 +3482,25 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Dağınık Saç </string> <string name="Saddle Bags"> - Kalça Kalınlığı + Basen Genişliği </string> <string name="Scrawny Leg"> Sıska Bacak </string> <string name="Separate"> - Ayrı + Ayrık </string> <string name="Shallow"> Sığ </string> <string name="Shear Back"> - Arkayı Dikey Kaydır + Arka Dolgunluğu </string> <string name="Shear Face"> Yüzü Dikey Kaydır </string> <string name="Shear Front"> - Önü Dikey Kaydır + Ön Dolgunluğu </string> <string name="Shear Left Up"> Solu Yukarı Kaydır @@ -3509,10 +3509,10 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Sağı Yukarı Kaydır </string> <string name="Sheared Back"> - Arkası Dikey Kaydırılmış + Arkası Dolgun </string> <string name="Sheared Front"> - Önü Dikey Kaydırılmış + Önü Dolgun </string> <string name="Shift Left"> Sola Kaydır @@ -3548,7 +3548,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Kısa Boyun </string> <string name="Short Pigtails"> - Kısa Atkuyrukları + Yandan Kısa Kuyruk </string> <string name="Short Ponytail"> Kısa Atkuyruğu @@ -3560,7 +3560,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Kısa Gövde </string> <string name="Short hips"> - Dar kalçalar + Düşük kalça </string> <string name="Shoulders"> Omuzlar @@ -3638,7 +3638,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Dikleştirilmiş Saç </string> <string name="Square"> - Kare + Geniş </string> <string name="Square Toe"> Küt Burunlu @@ -3680,7 +3680,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Kalın Boyun </string> <string name="Thick Toe"> - Kalın kabu Burnu + Kalın Ayak Ucu </string> <string name="Thin"> İnce @@ -3695,7 +3695,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. İnce Burun </string> <string name="Tight Chin"> - Dar Çene + Çift Çene </string> <string name="Tight Cuffs"> Dar Paçalar @@ -3710,7 +3710,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Dar Etek </string> <string name="Tight Sleeves"> - Dar Kollar + Dar Kollu </string> <string name="Toe Shape"> Ayakkabu Burnu Şekli @@ -3728,13 +3728,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Sıska Gövde </string> <string name="Unattached"> - Bağımsız + Ayrık </string> <string name="Uncreased"> Buruşuk olmayan </string> <string name="Underbite"> - Alt Dişler Önde + Geriye Doğru </string> <string name="Unnatural"> Doğal Olmayan @@ -3770,7 +3770,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Geniş </string> <string name="Wide Back"> - Geniş Sırt + Geniş Arka </string> <string name="Wide Front"> Geniş Ön diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt index e9eb3c1884..328ab4ca51 100644 --- a/indra/test/CMakeLists.txt +++ b/indra/test/CMakeLists.txt @@ -4,7 +4,6 @@ project (test) include(00-Common) include(LLCommon) -include(LLDatabase) include(LLInventory) include(LLMath) include(LLMessage) @@ -32,7 +31,7 @@ include_directories( set(test_SOURCE_FILES io.cpp -# llapp_tut.cpp # Temporarily removed until thread issues can be solved + llapp_tut.cpp llblowfish_tut.cpp llbuffer_tut.cpp lldoubledispatch_tut.cpp @@ -53,8 +52,6 @@ set(test_SOURCE_FILES llservicebuilder_tut.cpp llstreamtools_tut.cpp lltemplatemessagebuilder_tut.cpp - lltimestampcache_tut.cpp - lltranscode_tut.cpp lltut.cpp lluuidhashmap_tut.cpp message_tut.cpp @@ -76,12 +73,6 @@ if (NOT WINDOWS) ) endif (NOT WINDOWS) -if (NOT DARWIN) - list(APPEND test_SOURCE_FILES - lldatabase_tut.cpp - ) -endif (NOT DARWIN) - set_source_files_properties(${test_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) @@ -100,7 +91,6 @@ target_link_libraries(test ${LLCOMMON_LIBRARIES} ${EXPAT_LIBRARIES} ${GOOGLEMOCK_LIBRARIES} - ${APRICONV_LIBRARIES} ${PTHREAD_LIBRARY} ${WINDOWS_LIBRARIES} ${BOOST_PROGRAM_OPTIONS_LIBRARY} @@ -119,38 +109,28 @@ endif (WINDOWS) get_target_property(TEST_EXE test LOCATION) -SET_TEST_PATH(LD_LIBRARY_PATH) -LL_TEST_COMMAND(command "${LD_LIBRARY_PATH}" - "${TEST_EXE}" "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt" "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt") +SET_TEST_PATH(DYLD_LIBRARY_PATH) + +LL_TEST_COMMAND(command + "${DYLD_LIBRARY_PATH}" + "${TEST_EXE}" + "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt" + "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt") + ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt COMMAND ${command} DEPENDS test WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "C++ unit tests" - ) + ) set(test_results ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt) -if (EXISTS /etc/debian_version_FAIL) - # The Python tests have all kinds of wacky non-portable assumptions - # built in. - - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/test.py - --mode=static - --output=${CMAKE_CURRENT_BINARY_DIR}/py_test_results.txt - --touch=${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt - --mode=static - DEPENDS test.py - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Python unit tests" - ) - - list(APPEND test_results ${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt) -endif (EXISTS /etc/debian_version_FAIL) - -add_custom_target(tests_ok ALL DEPENDS ${test_results}) +# This should cause the test executable to be built, but not +# run if LL_TESTS is disabled. This will hopefully keep the +# tests up to date with any code changes changes even if +# developers choose to disable LL_TESTS. +if (LL_TESTS) + add_custom_target(tests_ok ALL DEPENDS ${test_results}) +endif (LL_TESTS) diff --git a/indra/test/io.cpp b/indra/test/io.cpp index c06c1b153b..ce747f667d 100644 --- a/indra/test/io.cpp +++ b/indra/test/io.cpp @@ -909,7 +909,7 @@ namespace tut pipe_and_pump_fitness() { - LLFrameTimer::updateFrameTime(); + LLFrameTimer::updateFrameTime(); apr_pool_create(&mPool, NULL); mPump = new LLPumpIO(mPool); mSocket = LLSocket::create( diff --git a/indra/test/llapp_tut.cpp b/indra/test/llapp_tut.cpp new file mode 100644 index 0000000000..aa5c0672e6 --- /dev/null +++ b/indra/test/llapp_tut.cpp @@ -0,0 +1,162 @@ +/** + * @file llapp_tut.cpp + * @author Phoenix + * @date 2006-09-12 + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2006-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 <tut/tut.hpp> + +#include "linden_common.h" +#include "llapp.h" +#include "lltut.h" + + +namespace tut +{ + struct application + { + class LLTestApp : public LLApp + { + public: + virtual bool init() { return true; } + virtual bool cleanup() { return true; } + virtual bool mainLoop() { return true; } + }; + LLTestApp* mApp; + application() + { + mApp = new LLTestApp; + } + ~application() + { + delete mApp; + } + }; + + typedef test_group<application> application_t; + typedef application_t::object application_object_t; + tut::application_t tut_application("application"); + + template<> template<> + void application_object_t::test<1>() + { + LLSD defaults; + defaults["template"] = "../../../scripts/messages/message_template.msg"; + defaults["configdir"] = "."; + defaults["datadir"] = "data"; + mApp->setOptionData(LLApp::PRIORITY_DEFAULT, defaults); + + LLSD datadir_sd = mApp->getOption("datadir"); + ensure_equals("data type", datadir_sd.type(), LLSD::TypeString); + ensure_equals( + "data value", datadir_sd.asString(), std::string("data")); + } + + template<> template<> + void application_object_t::test<2>() + { + const int ARGC = 13; + const char* ARGV[ARGC] = + { + "", // argv[0] is usually the application name + "-crashcount", + "2", + "-space", + "spaceserver.grid.lindenlab.com", + "-db_host", + "localhost", + "--allowlslhttprequests", + "-asset-uri", + "http://test.lindenlab.com/assets", + "-data", + "127.0.0.1", + "--smtp" + }; + bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV)); + ensure("command line parsed", ok); + ensure_equals( + "crashcount", mApp->getOption("crashcount").asInteger(), 2); + ensure_equals( + "space", + mApp->getOption("space").asString(), + std::string("spaceserver.grid.lindenlab.com")); + ensure_equals( + "db_host", + mApp->getOption("db_host").asString(), + std::string("localhost")); + ensure("allowlshlttprequests", mApp->getOption("smtp")); + ensure_equals( + "asset-uri", + mApp->getOption("asset-uri").asString(), + std::string("http://test.lindenlab.com/assets")); + ensure_equals( + "data", + mApp->getOption("data").asString(), + std::string("127.0.0.1")); + ensure("smtp", mApp->getOption("smtp")); + } + + template<> template<> + void application_object_t::test<3>() + { + const int ARGC = 4; + const char* ARGV[ARGC] = + { + "", // argv[0] is usually the application name + "crashcount", + "2", + "--space" + }; + bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV)); + ensure("command line parse failure", !ok); + } + + template<> template<> + void application_object_t::test<4>() + { + const int ARGC = 4; + const char* ARGV[ARGC] = + { + "", // argv[0] is usually the application name + "--crashcount", + "2", + "space" + }; + bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV)); + ensure("command line parse failure", !ok); + } + + + template<> template<> + void application_object_t::test<5>() + { + LLSD options; + options["boolean-test"] = true; + mApp->setOptionData(LLApp::PRIORITY_GENERAL_CONFIGURATION, options); + ensure("bool set", mApp->getOption("boolean-test").asBoolean()); + options["boolean-test"] = false; + mApp->setOptionData(LLApp::PRIORITY_RUNTIME_OVERRIDE, options); + ensure("bool unset", !mApp->getOption("boolean-test").asBoolean()); + } +} diff --git a/indra/test/llevents_tut.cpp b/indra/test/llevents_tut.cpp index 57e22bbb56..4699bb1827 100644 --- a/indra/test/llevents_tut.cpp +++ b/indra/test/llevents_tut.cpp @@ -54,686 +54,730 @@ using boost::assign::list_of; +#ifdef LL_LINUX +#define CATCH_MISSED_LINUX_EXCEPTION(exception, threw) \ +catch (const std::runtime_error& ex) \ +{ \ + /* This clause is needed on Linux, on the viewer side, because the */ \ + /* exception isn't caught by the clause above. Warn the user... */ \ + std::cerr << "Failed to catch " << typeid(ex).name() << std::endl; \ + /* But if the expected exception was thrown, allow the test to */ \ + /* succeed anyway. Not sure how else to handle this odd case. */ \ + /* This approach is also used in llsdmessage_test.cpp. */ \ + if (std::string(typeid(ex).name()) == typeid(exception).name()) \ + { \ + threw = ex.what(); \ + /*std::cout << ex.what() << std::endl;*/ \ + } \ + else \ + { \ + /* We don't even recognize this exception. Let it propagate */ \ + /* out to TUT to fail the test. */ \ + throw; \ + } \ +} \ +catch (...) \ +{ \ + std::cerr << "Utterly failed to catch expected exception " << #exception << "!" << \ + std::endl; \ + /* This indicates a problem in the test that should be addressed. */ \ + throw; \ +} + +#else // LL_LINUX +#define CATCH_MISSED_LINUX_EXCEPTION(exception, threw) \ + /* Not needed on other platforms */ +#endif // LL_LINUX + template<typename T> -T make(const T& value) { return value; } +T make(const T& value) +{ + return value; +} /***************************************************************************** -* tut test group -*****************************************************************************/ + * tut test group + *****************************************************************************/ namespace tut { - struct events_data - { - events_data(): - pumps(LLEventPumps::instance()), - listener0("first"), - listener1("second") - {} - LLEventPumps& pumps; - Listener listener0; - Listener listener1; - - void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got) - { - ensure_equals(STRINGIZE(listener << ' ' << desc), - listener.getLastEvent().asInteger(), got); - } - }; - typedef test_group<events_data> events_group; - typedef events_group::object events_object; - tut::events_group evgr("events"); - - template<> template<> - void events_object::test<1>() - { - set_test_name("basic operations"); - // Now there's a static constructor in llevents.cpp that registers on - // the "mainloop" pump to call LLEventPumps::flush(). - // Actually -- having to modify this to track the statically- - // constructed pumps in other TUT modules in this giant monolithic test - // executable isn't such a hot idea. -// ensure_equals("initial pump", pumps.mPumpMap.size(), 1); - size_t initial_pumps(pumps.mPumpMap.size()); - LLEventPump& per_frame(pumps.obtain("per-frame")); - ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps+1); - // Verify that per_frame was instantiated as an LLEventStream. - ensure("LLEventStream leaf class", dynamic_cast<LLEventStream*>(&per_frame)); - ensure("enabled", per_frame.enabled()); - // Trivial test, but posting an event to an EventPump with no - // listeners should not blow up. The test is relevant because defining - // a boost::signal with a non-void return signature, using the default - // combiner, blows up if there are no listeners. This is because the - // default combiner is defined to return the value returned by the - // last listener, which is meaningless if there were no listeners. - per_frame.post(0); - LLBoundListener connection = listener0.listenTo(per_frame); - ensure("connected", connection.connected()); - ensure("not blocked", ! connection.blocked()); - per_frame.post(1); - check_listener("received", listener0, 1); - { // block the connection - LLEventPump::Blocker block(connection); - ensure("blocked", connection.blocked()); - per_frame.post(2); - check_listener("not updated", listener0, 1); - } // unblock - ensure("unblocked", ! connection.blocked()); - per_frame.post(3); - check_listener("unblocked", listener0, 3); - LLBoundListener sameConnection = per_frame.getListener(listener0.getName()); - ensure("still connected", sameConnection.connected()); - ensure("still not blocked", ! sameConnection.blocked()); - { // block it again - LLEventPump::Blocker block(sameConnection); - ensure("re-blocked", sameConnection.blocked()); - per_frame.post(4); - check_listener("re-blocked", listener0, 3); - } // unblock - bool threw = false; - try - { - // NOTE: boost::bind() saves its arguments by VALUE! If you pass - // an object instance rather than a pointer, you'll end up binding - // to an internal copy of that instance! Use boost::ref() to - // capture a reference instead. - per_frame.listen(listener0.getName(), // note bug, dup name - boost::bind(&Listener::call, boost::ref(listener1), _1)); - } - catch (const LLEventPump::DupListenerName& e) - { - threw = true; - ensure_equals(e.what(), - std::string("DupListenerName: " - "Attempt to register duplicate listener name '") + - listener0.getName() + - "' on " + typeid(per_frame).name() + " '" + per_frame.getName() + "'"); - } - ensure("threw DupListenerName", threw); - // do it right this time - listener1.listenTo(per_frame); - per_frame.post(5); - check_listener("got", listener0, 5); - check_listener("got", listener1, 5); - per_frame.enable(false); - per_frame.post(6); - check_listener("didn't get", listener0, 5); - check_listener("didn't get", listener1, 5); - per_frame.enable(); - per_frame.post(7); - check_listener("got", listener0, 7); - check_listener("got", listener1, 7); - per_frame.stopListening(listener0.getName()); - ensure("disconnected 0", ! connection.connected()); - ensure("disconnected 1", ! sameConnection.connected()); - per_frame.post(8); - check_listener("disconnected", listener0, 7); - check_listener("still connected", listener1, 8); - per_frame.stopListening(listener1.getName()); - per_frame.post(9); - check_listener("disconnected", listener1, 8); - } - - template<> template<> - void events_object::test<2>() - { - set_test_name("callstop() returning true"); - LLEventPump& per_frame(pumps.obtain("per-frame")); - listener0.reset(0); - listener1.reset(0); - LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop); - LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call, - // after listener0 - make<LLEventPump::NameList>(list_of(listener0.getName()))); - ensure("enabled", per_frame.enabled()); - ensure("connected 0", bound0.connected()); - ensure("unblocked 0", ! bound0.blocked()); - ensure("connected 1", bound1.connected()); - ensure("unblocked 1", ! bound1.blocked()); - per_frame.post(1); - check_listener("got", listener0, 1); - // Because listener0.callstop() returns true, control never reaches listener1.call(). - check_listener("got", listener1, 0); - } - - bool chainEvents(Listener& someListener, const LLSD& event) - { - // Make this call so we can watch for side effects for test purposes. - someListener.call(event); - // This function represents a recursive event chain -- or some other - // scenario in which an event handler raises additional events. - int value = event.asInteger(); - if (value) - { - LLEventPumps::instance().obtain("login").post(value - 1); - } - return false; - } - - template<> template<> - void events_object::test<3>() - { - set_test_name("LLEventQueue delayed action"); - // This access is NOT legal usage: we can do it only because we're - // hacking private for test purposes. Normally we'd either compile in - // a particular name, or (later) edit a config file. - pumps.mQueueNames.insert("login"); - LLEventPump& login(pumps.obtain("login")); - // The "mainloop" pump is special: posting on that implicitly calls - // LLEventPumps::flush(), which in turn should flush our "login" - // LLEventQueue. - LLEventPump& mainloop(pumps.obtain("mainloop")); - ensure("LLEventQueue leaf class", dynamic_cast<LLEventQueue*>(&login)); - listener0.listenTo(login); - listener0.reset(0); - login.post(1); - check_listener("waiting for queued event", listener0, 0); - mainloop.post(LLSD()); - check_listener("got queued event", listener0, 1); - login.stopListening(listener0.getName()); - // Verify that when an event handler posts a new event on the same - // LLEventQueue, it doesn't get processed in the same flush() call -- - // it waits until the next flush() call. - listener0.reset(17); - login.listen("chainEvents", boost::bind(chainEvents, boost::ref(listener0), _1)); - login.post(1); - check_listener("chainEvents(1) not yet called", listener0, 17); - mainloop.post(LLSD()); - check_listener("chainEvents(1) called", listener0, 1); - mainloop.post(LLSD()); - check_listener("chainEvents(0) called", listener0, 0); - mainloop.post(LLSD()); - check_listener("chainEvents(-1) not called", listener0, 0); - login.stopListening("chainEvents"); - } - - template<> template<> - void events_object::test<4>() - { - set_test_name("explicitly-instantiated LLEventStream"); - // Explicitly instantiate an LLEventStream, and verify that it - // self-registers with LLEventPumps - size_t registered = pumps.mPumpMap.size(); - size_t owned = pumps.mOurPumps.size(); - LLEventPump* localInstance; - { - LLEventStream myEventStream("stream"); - localInstance = &myEventStream; - LLEventPump& stream(pumps.obtain("stream")); - ensure("found named LLEventStream instance", &stream == localInstance); - ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1); - ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned); - } // destroy myEventStream -- should unregister - ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered); - ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned); - LLEventPump& stream(pumps.obtain("stream")); - ensure("new LLEventStream instance", &stream != localInstance); - ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1); - ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1); - } - - template<> template<> - void events_object::test<5>() - { - set_test_name("stopListening()"); - LLEventPump& login(pumps.obtain("login")); - listener0.listenTo(login); - login.stopListening(listener0.getName()); - // should not throw because stopListening() should have removed name - listener0.listenTo(login, &Listener::callstop); - LLBoundListener wrong = login.getListener("bogus"); - ensure("bogus connection disconnected", ! wrong.connected()); - ensure("bogus connection blocked", wrong.blocked()); - } - - template<> template<> - void events_object::test<6>() - { - set_test_name("chaining LLEventPump instances"); - LLEventPump& upstream(pumps.obtain("upstream")); - // One potentially-useful construct is to chain LLEventPumps together. - // Among other things, this allows you to turn subsets of listeners on - // and off in groups. - LLEventPump& filter0(pumps.obtain("filter0")); - LLEventPump& filter1(pumps.obtain("filter1")); - upstream.listen(filter0.getName(), - boost::bind(&LLEventPump::post, boost::ref(filter0), _1)); - upstream.listen(filter1.getName(), - boost::bind(&LLEventPump::post, boost::ref(filter1), _1)); - listener0.listenTo(filter0); - listener1.listenTo(filter1); - listener0.reset(0); - listener1.reset(0); - upstream.post(1); - check_listener("got unfiltered", listener0, 1); - check_listener("got unfiltered", listener1, 1); - filter0.enable(false); - upstream.post(2); - check_listener("didn't get filtered", listener0, 1); - check_listener("got filtered", listener1, 2); - } - - template<> template<> - void events_object::test<7>() - { - set_test_name("listener dependency order"); - typedef LLEventPump::NameList NameList; - typedef Collect::StringList StringList; - LLEventPump& button(pumps.obtain("button")); - Collect collector; - button.listen("Mary", - boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), - // state that "Mary" must come after "checked" - make<NameList>(list_of("checked"))); - button.listen("checked", - boost::bind(&Collect::add, boost::ref(collector), "checked", _1), - // "checked" must come after "spot" - make<NameList>(list_of("spot"))); - button.listen("spot", - boost::bind(&Collect::add, boost::ref(collector), "spot", _1)); - button.post(1); - ensure_equals(collector.result, make<StringList>(list_of("spot")("checked")("Mary"))); - collector.clear(); - button.stopListening("Mary"); - button.listen("Mary", - boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), - LLEventPump::empty, // no after dependencies - // now "Mary" must come before "spot" - make<NameList>(list_of("spot"))); - button.post(2); - ensure_equals(collector.result, make<StringList>(list_of("Mary")("spot")("checked"))); - collector.clear(); - button.stopListening("spot"); - std::string threw; - try - { - button.listen("spot", - boost::bind(&Collect::add, boost::ref(collector), "spot", _1), - // after "Mary" and "checked" -- whoops! - make<NameList>(list_of("Mary")("checked"))); - } - catch (const LLEventPump::Cycle& e) - { - threw = e.what(); -// std::cout << "Caught: " << e.what() << '\n'; - } - // Obviously the specific wording of the exception text can - // change; go ahead and change the test to match. - // Establish that it contains: - // - the name and runtime type of the LLEventPump - ensure_contains("LLEventPump type", threw, typeid(button).name()); - ensure_contains("LLEventPump name", threw, "'button'"); - // - the name of the new listener that caused the problem - ensure_contains("new listener name", threw, "'spot'"); - // - a synopsis of the problematic dependencies. - ensure_contains("cyclic dependencies", threw, - "\"Mary\" -> before (\"spot\")"); - ensure_contains("cyclic dependencies", threw, - "after (\"spot\") -> \"checked\""); - ensure_contains("cyclic dependencies", threw, - "after (\"Mary\", \"checked\") -> \"spot\""); - button.listen("yellow", - boost::bind(&Collect::add, boost::ref(collector), "yellow", _1), - make<NameList>(list_of("checked"))); - button.listen("shoelaces", - boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1), - make<NameList>(list_of("checked"))); - button.post(3); - ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces"))); - collector.clear(); - threw.clear(); - try - { - button.listen("of", - boost::bind(&Collect::add, boost::ref(collector), "of", _1), - make<NameList>(list_of("shoelaces")), - make<NameList>(list_of("yellow"))); - } - catch (const LLEventPump::OrderChange& e) - { - threw = e.what(); -// std::cout << "Caught: " << e.what() << '\n'; - } - // Same remarks about the specific wording of the exception. Just - // ensure that it contains enough information to clarify the - // problem and what must be done to resolve it. - ensure_contains("LLEventPump type", threw, typeid(button).name()); - ensure_contains("LLEventPump name", threw, "'button'"); - ensure_contains("new listener name", threw, "'of'"); - ensure_contains("prev listener name", threw, "'yellow'"); - ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces"); - ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow"); - button.post(4); - ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces"))); - } - - template<> template<> - void events_object::test<8>() - { - set_test_name("tweaked and untweaked LLEventPump instance names"); - { // nested scope - // Hand-instantiate an LLEventStream... - LLEventStream bob("bob"); - bool threw = false; - try - { - // then another with a duplicate name. - LLEventStream bob2("bob"); - } - catch (const LLEventPump::DupPumpName& /*e*/) - { - threw = true; -// std::cout << "Caught: " << e.what() << '\n'; - } - ensure("Caught DupPumpName", threw); - } // delete first 'bob' - LLEventStream bob("bob"); // should work, previous one unregistered - LLEventStream bob1("bob", true); // allowed to tweak name - ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1"); - std::vector< boost::shared_ptr<LLEventStream> > streams; - for (int i = 2; i <= 10; ++i) - { - streams.push_back(boost::shared_ptr<LLEventStream>(new LLEventStream("bob", true))); - } - ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10"); - } - - // Define a function that accepts an LLListenerOrPumpName - void eventSource(const LLListenerOrPumpName& listener) - { - // Pretend that some time has elapsed. Call listener immediately. - listener(17); - } - - template<> template<> - void events_object::test<9>() - { - set_test_name("LLListenerOrPumpName"); - // Passing a boost::bind() expression to LLListenerOrPumpName - listener0.reset(0); - eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1)); - check_listener("got by listener", listener0, 17); - // Passing a string LLEventPump name to LLListenerOrPumpName - listener0.reset(0); - LLEventStream random("random"); - listener0.listenTo(random); - eventSource("random"); - check_listener("got by pump name", listener0, 17); - bool threw = false; - try - { - LLListenerOrPumpName empty; - empty(17); - } - catch (const LLListenerOrPumpName::Empty&) - { - threw = true; - } - ensure("threw Empty", threw); - } - - class TempListener: public Listener - { - public: - TempListener(const std::string& name, bool& liveFlag): - Listener(name), - mLiveFlag(liveFlag) - { - mLiveFlag = true; - } - - virtual ~TempListener() - { - mLiveFlag = false; - } - - private: - bool& mLiveFlag; - }; - - template<> template<> - void events_object::test<10>() - { - set_test_name("listen(boost::bind(...TempListener...))"); - // listen() can't do anything about a plain TempListener instance: - // it's not managed with shared_ptr, nor is it an LLEventTrackable subclass - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - { - TempListener tempListener("temp", live); - ensure("TempListener constructed", live); - connection = heaptest.listen(tempListener.getName(), - boost::bind(&Listener::call, - boost::ref(tempListener), - _1)); - heaptest.post(1); - check_listener("received", tempListener, 1); - } // presumably this will make newListener go away? - // verify that - ensure("TempListener destroyed", ! live); - // This is the case against which we can't defend. Don't even try to - // post to heaptest -- that would engage Undefined Behavior. - // Cautiously inspect connection... - ensure("misleadingly connected", connection.connected()); - // then disconnect by hand. - heaptest.stopListening("temp"); - } - - template<> template<> - void events_object::test<11>() - { - set_test_name("listen(boost::bind(...weak_ptr...))"); - // listen() detecting weak_ptr<TempListener> in boost::bind() object - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - ensure("default state", ! connection.connected()); - { - boost::shared_ptr<TempListener> newListener(new TempListener("heap", live)); - newListener->reset(); - ensure("TempListener constructed", live); - connection = heaptest.listen(newListener->getName(), - boost::bind(&Listener::call, weaken(newListener), _1)); - ensure("new connection", connection.connected()); - heaptest.post(1); - check_listener("received", *newListener, 1); - } // presumably this will make newListener go away? - // verify that - ensure("TempListener destroyed", ! live); - ensure("implicit disconnect", ! connection.connected()); - // now just make sure we don't blow up trying to access a freed object! - heaptest.post(2); - } - - template<> template<> - void events_object::test<12>() - { - set_test_name("listen(boost::bind(...shared_ptr...))"); -/*==========================================================================*| - // DISABLED because I've made this case produce a compile error. - // Following the error leads the disappointed dev to a comment - // instructing her to use the weaken() function to bind a weak_ptr<T> - // instead of binding a shared_ptr<T>, and explaining why. I know of - // no way to use TUT to code a repeatable test in which the expected - // outcome is a compile error. The interested reader is invited to - // uncomment this block and build to see for herself. - - // listen() detecting shared_ptr<TempListener> in boost::bind() object - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - std::string listenerName("heap"); - ensure("default state", ! connection.connected()); - { - boost::shared_ptr<TempListener> newListener(new TempListener(listenerName, live)); - ensure_equals("use_count", newListener.use_count(), 1); - newListener->reset(); - ensure("TempListener constructed", live); - connection = heaptest.listen(newListener->getName(), - boost::bind(&Listener::call, newListener, _1)); - ensure("new connection", connection.connected()); - ensure_equals("use_count", newListener.use_count(), 2); - heaptest.post(1); - check_listener("received", *newListener, 1); - } // this should make newListener go away... - // Unfortunately, the fact that we've bound a shared_ptr by value into - // our LLEventPump means that copy will keep the referenced object alive. - ensure("TempListener still alive", live); - ensure("still connected", connection.connected()); - // disconnecting explicitly should delete the TempListener... - heaptest.stopListening(listenerName); +struct events_data +{ + events_data() : + pumps(LLEventPumps::instance()), + listener0("first"), + listener1("second") + { + } + LLEventPumps& pumps; + Listener listener0; + Listener listener1; + + void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got) + { + ensure_equals(STRINGIZE(listener << ' ' << desc), + listener.getLastEvent().asInteger(), got); + } +}; +typedef test_group<events_data> events_group; +typedef events_group::object events_object; +tut::events_group evgr("events"); + +template<> template<> +void events_object::test<1>() +{ + set_test_name("basic operations"); + // Now there's a static constructor in llevents.cpp that registers on + // the "mainloop" pump to call LLEventPumps::flush(). + // Actually -- having to modify this to track the statically- + // constructed pumps in other TUT modules in this giant monolithic test + // executable isn't such a hot idea. + // ensure_equals("initial pump", pumps.mPumpMap.size(), 1); + size_t initial_pumps(pumps.mPumpMap.size()); + LLEventPump& per_frame(pumps.obtain("per-frame")); + ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps + 1); + // Verify that per_frame was instantiated as an LLEventStream. + ensure("LLEventStream leaf class", dynamic_cast<LLEventStream*> (&per_frame)); + ensure("enabled", per_frame.enabled()); + // Trivial test, but posting an event to an EventPump with no + // listeners should not blow up. The test is relevant because defining + // a boost::signal with a non-void return signature, using the default + // combiner, blows up if there are no listeners. This is because the + // default combiner is defined to return the value returned by the + // last listener, which is meaningless if there were no listeners. + per_frame.post(0); + LLBoundListener connection = listener0.listenTo(per_frame); + ensure("connected", connection.connected()); + ensure("not blocked", !connection.blocked()); + per_frame.post(1); + check_listener("received", listener0, 1); + { // block the connection + LLEventPump::Blocker block(connection); + ensure("blocked", connection.blocked()); + per_frame.post(2); + check_listener("not updated", listener0, 1); + } // unblock + ensure("unblocked", !connection.blocked()); + per_frame.post(3); + check_listener("unblocked", listener0, 3); + LLBoundListener sameConnection = per_frame.getListener(listener0.getName()); + ensure("still connected", sameConnection.connected()); + ensure("still not blocked", !sameConnection.blocked()); + { // block it again + LLEventPump::Blocker block(sameConnection); + ensure("re-blocked", sameConnection.blocked()); + per_frame.post(4); + check_listener("re-blocked", listener0, 3); + } // unblock + std::string threw; + try + { + // NOTE: boost::bind() saves its arguments by VALUE! If you pass + // an object instance rather than a pointer, you'll end up binding + // to an internal copy of that instance! Use boost::ref() to + // capture a reference instead. + per_frame.listen(listener0.getName(), // note bug, dup name + boost::bind(&Listener::call, boost::ref(listener1), _1)); + } + catch (const LLEventPump::DupListenerName& e) + { + threw = e.what(); + } + CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::DupListenerName, threw) + ensure_equals(threw, + std::string("DupListenerName: " + "Attempt to register duplicate listener name '") + + listener0.getName() + "' on " + typeid(per_frame).name() + + " '" + per_frame.getName() + "'"); + // do it right this time + listener1.listenTo(per_frame); + per_frame.post(5); + check_listener("got", listener0, 5); + check_listener("got", listener1, 5); + per_frame.enable(false); + per_frame.post(6); + check_listener("didn't get", listener0, 5); + check_listener("didn't get", listener1, 5); + per_frame.enable(); + per_frame.post(7); + check_listener("got", listener0, 7); + check_listener("got", listener1, 7); + per_frame.stopListening(listener0.getName()); + ensure("disconnected 0", ! connection.connected()); + ensure("disconnected 1", ! sameConnection.connected()); + per_frame.post(8); + check_listener("disconnected", listener0, 7); + check_listener("still connected", listener1, 8); + per_frame.stopListening(listener1.getName()); + per_frame.post(9); + check_listener("disconnected", listener1, 8); +} + +template<> template<> +void events_object::test<2>() +{ + set_test_name("callstop() returning true"); + LLEventPump& per_frame(pumps.obtain("per-frame")); + listener0.reset(0); + listener1.reset(0); + LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop); + LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call, + // after listener0 + make<LLEventPump::NameList>(list_of(listener0.getName()))); + ensure("enabled", per_frame.enabled()); + ensure("connected 0", bound0.connected()); + ensure("unblocked 0", !bound0.blocked()); + ensure("connected 1", bound1.connected()); + ensure("unblocked 1", !bound1.blocked()); + per_frame.post(1); + check_listener("got", listener0, 1); + // Because listener0.callstop() returns true, control never reaches listener1.call(). + check_listener("got", listener1, 0); +} + +bool chainEvents(Listener& someListener, const LLSD& event) +{ + // Make this call so we can watch for side effects for test purposes. + someListener.call(event); + // This function represents a recursive event chain -- or some other + // scenario in which an event handler raises additional events. + int value = event.asInteger(); + if (value) + { + LLEventPumps::instance().obtain("login").post(value - 1); + } + return false; +} + +template<> template<> +void events_object::test<3>() +{ + set_test_name("LLEventQueue delayed action"); + // This access is NOT legal usage: we can do it only because we're + // hacking private for test purposes. Normally we'd either compile in + // a particular name, or (later) edit a config file. + pumps.mQueueNames.insert("login"); + LLEventPump& login(pumps.obtain("login")); + // The "mainloop" pump is special: posting on that implicitly calls + // LLEventPumps::flush(), which in turn should flush our "login" + // LLEventQueue. + LLEventPump& mainloop(pumps.obtain("mainloop")); + ensure("LLEventQueue leaf class", dynamic_cast<LLEventQueue*> (&login)); + listener0.listenTo(login); + listener0.reset(0); + login.post(1); + check_listener("waiting for queued event", listener0, 0); + mainloop.post(LLSD()); + check_listener("got queued event", listener0, 1); + login.stopListening(listener0.getName()); + // Verify that when an event handler posts a new event on the same + // LLEventQueue, it doesn't get processed in the same flush() call -- + // it waits until the next flush() call. + listener0.reset(17); + login.listen("chainEvents", boost::bind(chainEvents, boost::ref(listener0), _1)); + login.post(1); + check_listener("chainEvents(1) not yet called", listener0, 17); + mainloop.post(LLSD()); + check_listener("chainEvents(1) called", listener0, 1); + mainloop.post(LLSD()); + check_listener("chainEvents(0) called", listener0, 0); + mainloop.post(LLSD()); + check_listener("chainEvents(-1) not called", listener0, 0); + login.stopListening("chainEvents"); +} + +template<> template<> +void events_object::test<4>() +{ + set_test_name("explicitly-instantiated LLEventStream"); + // Explicitly instantiate an LLEventStream, and verify that it + // self-registers with LLEventPumps + size_t registered = pumps.mPumpMap.size(); + size_t owned = pumps.mOurPumps.size(); + LLEventPump* localInstance; + { + LLEventStream myEventStream("stream"); + localInstance = &myEventStream; + LLEventPump& stream(pumps.obtain("stream")); + ensure("found named LLEventStream instance", &stream == localInstance); + ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1); + ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned); + } // destroy myEventStream -- should unregister + ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered); + ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned); + LLEventPump& stream(pumps.obtain("stream")); + ensure("new LLEventStream instance", &stream != localInstance); + ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1); + ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1); +} + +template<> template<> +void events_object::test<5>() +{ + set_test_name("stopListening()"); + LLEventPump& login(pumps.obtain("login")); + listener0.listenTo(login); + login.stopListening(listener0.getName()); + // should not throw because stopListening() should have removed name + listener0.listenTo(login, &Listener::callstop); + LLBoundListener wrong = login.getListener("bogus"); + ensure("bogus connection disconnected", !wrong.connected()); + ensure("bogus connection blocked", wrong.blocked()); +} + +template<> template<> +void events_object::test<6>() +{ + set_test_name("chaining LLEventPump instances"); + LLEventPump& upstream(pumps.obtain("upstream")); + // One potentially-useful construct is to chain LLEventPumps together. + // Among other things, this allows you to turn subsets of listeners on + // and off in groups. + LLEventPump& filter0(pumps.obtain("filter0")); + LLEventPump& filter1(pumps.obtain("filter1")); + upstream.listen(filter0.getName(), boost::bind(&LLEventPump::post, boost::ref(filter0), _1)); + upstream.listen(filter1.getName(), boost::bind(&LLEventPump::post, boost::ref(filter1), _1)); + listener0.listenTo(filter0); + listener1.listenTo(filter1); + listener0.reset(0); + listener1.reset(0); + upstream.post(1); + check_listener("got unfiltered", listener0, 1); + check_listener("got unfiltered", listener1, 1); + filter0.enable(false); + upstream.post(2); + check_listener("didn't get filtered", listener0, 1); + check_listener("got filtered", listener1, 2); +} + +template<> template<> +void events_object::test<7>() +{ + set_test_name("listener dependency order"); + typedef LLEventPump::NameList NameList; + typedef Collect::StringList StringList; + LLEventPump& button(pumps.obtain("button")); + Collect collector; + button.listen("Mary", + boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), + // state that "Mary" must come after "checked" + make<NameList> (list_of("checked"))); + button.listen("checked", + boost::bind(&Collect::add, boost::ref(collector), "checked", _1), + // "checked" must come after "spot" + make<NameList> (list_of("spot"))); + button.listen("spot", + boost::bind(&Collect::add, boost::ref(collector), "spot", _1)); + button.post(1); + ensure_equals(collector.result, make<StringList>(list_of("spot")("checked")("Mary"))); + collector.clear(); + button.stopListening("Mary"); + button.listen("Mary", + boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), + LLEventPump::empty, // no after dependencies + // now "Mary" must come before "spot" + make<NameList>(list_of("spot"))); + button.post(2); + ensure_equals(collector.result, make<StringList>(list_of("Mary")("spot")("checked"))); + collector.clear(); + button.stopListening("spot"); + std::string threw; + try + { + button.listen("spot", + boost::bind(&Collect::add, boost::ref(collector), "spot", _1), + // after "Mary" and "checked" -- whoops! + make<NameList>(list_of("Mary")("checked"))); + } + catch (const LLEventPump::Cycle& e) + { + threw = e.what(); + // std::cout << "Caught: " << e.what() << '\n'; + } + CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::Cycle, threw) + // Obviously the specific wording of the exception text can + // change; go ahead and change the test to match. + // Establish that it contains: + // - the name and runtime type of the LLEventPump + ensure_contains("LLEventPump type", threw, typeid(button).name()); + ensure_contains("LLEventPump name", threw, "'button'"); + // - the name of the new listener that caused the problem + ensure_contains("new listener name", threw, "'spot'"); + // - a synopsis of the problematic dependencies. + ensure_contains("cyclic dependencies", threw, + "\"Mary\" -> before (\"spot\")"); + ensure_contains("cyclic dependencies", threw, + "after (\"spot\") -> \"checked\""); + ensure_contains("cyclic dependencies", threw, + "after (\"Mary\", \"checked\") -> \"spot\""); + button.listen("yellow", + boost::bind(&Collect::add, boost::ref(collector), "yellow", _1), + make<NameList>(list_of("checked"))); + button.listen("shoelaces", + boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1), + make<NameList>(list_of("checked"))); + button.post(3); + ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces"))); + collector.clear(); + threw.clear(); + try + { + button.listen("of", + boost::bind(&Collect::add, boost::ref(collector), "of", _1), + make<NameList>(list_of("shoelaces")), + make<NameList>(list_of("yellow"))); + } + catch (const LLEventPump::OrderChange& e) + { + threw = e.what(); + // std::cout << "Caught: " << e.what() << '\n'; + } + CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::OrderChange, threw) + // Same remarks about the specific wording of the exception. Just + // ensure that it contains enough information to clarify the + // problem and what must be done to resolve it. + ensure_contains("LLEventPump type", threw, typeid(button).name()); + ensure_contains("LLEventPump name", threw, "'button'"); + ensure_contains("new listener name", threw, "'of'"); + ensure_contains("prev listener name", threw, "'yellow'"); + // std::cout << "Thrown Exception: " << threw << std::endl; + ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces"); + ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow"); + button.post(4); + ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces"))); +} + +template<> template<> +void events_object::test<8>() +{ + set_test_name("tweaked and untweaked LLEventPump instance names"); + { // nested scope + // Hand-instantiate an LLEventStream... + LLEventStream bob("bob"); + std::string threw; + try + { + // then another with a duplicate name. + LLEventStream bob2("bob"); + } + catch (const LLEventPump::DupPumpName& e) + { + threw = e.what(); + // std::cout << "Caught: " << e.what() << '\n'; + } + CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::DupPumpName, threw) + ensure("Caught DupPumpName", !threw.empty()); + } // delete first 'bob' + LLEventStream bob("bob"); // should work, previous one unregistered + LLEventStream bob1("bob", true);// allowed to tweak name + ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1"); + std::vector<boost::shared_ptr<LLEventStream> > streams; + for (int i = 2; i <= 10; ++i) + { + streams.push_back(boost::shared_ptr<LLEventStream>(new LLEventStream("bob", true))); + } + ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10"); +} + +// Define a function that accepts an LLListenerOrPumpName +void eventSource(const LLListenerOrPumpName& listener) +{ + // Pretend that some time has elapsed. Call listener immediately. + listener(17); +} + +template<> template<> +void events_object::test<9>() +{ + set_test_name("LLListenerOrPumpName"); + // Passing a boost::bind() expression to LLListenerOrPumpName + listener0.reset(0); + eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1)); + check_listener("got by listener", listener0, 17); + // Passing a string LLEventPump name to LLListenerOrPumpName + listener0.reset(0); + LLEventStream random("random"); + listener0.listenTo(random); + eventSource("random"); + check_listener("got by pump name", listener0, 17); + std::string threw; + try + { + LLListenerOrPumpName empty; + empty(17); + } + catch (const LLListenerOrPumpName::Empty& e) + { + threw = e.what(); + } + CATCH_MISSED_LINUX_EXCEPTION(LLListenerOrPumpName::Empty, threw) + + ensure("threw Empty", !threw.empty()); +} + +class TempListener: public Listener +{ +public: + TempListener(const std::string& name, bool& liveFlag) : + Listener(name), mLiveFlag(liveFlag) + { + mLiveFlag = true; + } + + virtual ~TempListener() + { + mLiveFlag = false; + } + +private: + bool& mLiveFlag; +}; + +template<> template<> +void events_object::test<10>() +{ + set_test_name("listen(boost::bind(...TempListener...))"); + // listen() can't do anything about a plain TempListener instance: + // it's not managed with shared_ptr, nor is it an LLEventTrackable subclass + bool live = false; + LLEventPump& heaptest(pumps.obtain("heaptest")); + LLBoundListener connection; + { + TempListener tempListener("temp", live); + ensure("TempListener constructed", live); + connection = heaptest.listen(tempListener.getName(), + boost::bind(&Listener::call, + boost::ref(tempListener), + _1)); + heaptest.post(1); + check_listener("received", tempListener, 1); + } // presumably this will make newListener go away? + // verify that + ensure("TempListener destroyed", !live); + // This is the case against which we can't defend. Don't even try to + // post to heaptest -- that would engage Undefined Behavior. + // Cautiously inspect connection... + ensure("misleadingly connected", connection.connected()); + // then disconnect by hand. + heaptest.stopListening("temp"); +} + +template<> template<> +void events_object::test<11>() +{ + set_test_name("listen(boost::bind(...weak_ptr...))"); + // listen() detecting weak_ptr<TempListener> in boost::bind() object + bool live = false; + LLEventPump& heaptest(pumps.obtain("heaptest")); + LLBoundListener connection; + ensure("default state", !connection.connected()); + { + boost::shared_ptr<TempListener> newListener(new TempListener("heap", live)); + newListener->reset(); + ensure("TempListener constructed", live); + connection = heaptest.listen(newListener->getName(), + boost::bind(&Listener::call, + weaken(newListener), + _1)); + ensure("new connection", connection.connected()); + heaptest.post(1); + check_listener("received", *newListener, 1); + } // presumably this will make newListener go away? + // verify that + ensure("TempListener destroyed", !live); + ensure("implicit disconnect", !connection.connected()); + // now just make sure we don't blow up trying to access a freed object! + heaptest.post(2); +} + +template<> template<> +void events_object::test<12>() +{ + set_test_name("listen(boost::bind(...shared_ptr...))"); + /*==========================================================================*| + // DISABLED because I've made this case produce a compile error. + // Following the error leads the disappointed dev to a comment + // instructing her to use the weaken() function to bind a weak_ptr<T> + // instead of binding a shared_ptr<T>, and explaining why. I know of + // no way to use TUT to code a repeatable test in which the expected + // outcome is a compile error. The interested reader is invited to + // uncomment this block and build to see for herself. + + // listen() detecting shared_ptr<TempListener> in boost::bind() object + bool live = false; + LLEventPump& heaptest(pumps.obtain("heaptest")); + LLBoundListener connection; + std::string listenerName("heap"); + ensure("default state", !connection.connected()); + { + boost::shared_ptr<TempListener> newListener(new TempListener(listenerName, live)); + ensure_equals("use_count", newListener.use_count(), 1); + newListener->reset(); + ensure("TempListener constructed", live); + connection = heaptest.listen(newListener->getName(), + boost::bind(&Listener::call, newListener, _1)); + ensure("new connection", connection.connected()); + ensure_equals("use_count", newListener.use_count(), 2); + heaptest.post(1); + check_listener("received", *newListener, 1); + } // this should make newListener go away... + // Unfortunately, the fact that we've bound a shared_ptr by value into + // our LLEventPump means that copy will keep the referenced object alive. + ensure("TempListener still alive", live); + ensure("still connected", connection.connected()); + // disconnecting explicitly should delete the TempListener... + heaptest.stopListening(listenerName); #if 0 // however, in my experience, it does not. I don't know why not. - // Ah: on 2009-02-19, Frank Mori Hess, author of the Boost.Signals2 - // library, stated on the boost-users mailing list: - // http://www.nabble.com/Re%3A--signals2--review--The-review-of-the-signals2-library-(formerly-thread_safe_signals)-begins-today%2C-Nov-1st-p22102367.html - // "It will get destroyed eventually. The signal cleans up its slot - // list little by little during connect/invoke. It doesn't immediately - // remove disconnected slots from the slot list since other threads - // might be using the same slot list concurrently. It might be - // possible to make it immediately reset the shared_ptr owning the - // slot though, leaving an empty shared_ptr in the slot list, since - // that wouldn't invalidate any iterators." - ensure("TempListener destroyed", ! live); - ensure("implicit disconnect", ! connection.connected()); + // Ah: on 2009-02-19, Frank Mori Hess, author of the Boost.Signals2 + // library, stated on the boost-users mailing list: + // http://www.nabble.com/Re%3A--signals2--review--The-review-of-the-signals2-library-(formerly-thread_safe_signals)-begins-today%2C-Nov-1st-p22102367.html + // "It will get destroyed eventually. The signal cleans up its slot + // list little by little during connect/invoke. It doesn't immediately + // remove disconnected slots from the slot list since other threads + // might be using the same slot list concurrently. It might be + // possible to make it immediately reset the shared_ptr owning the + // slot though, leaving an empty shared_ptr in the slot list, since + // that wouldn't invalidate any iterators." + ensure("TempListener destroyed", ! live); + ensure("implicit disconnect", ! connection.connected()); #endif // 0 - // now just make sure we don't blow up trying to access a freed object! - heaptest.post(2); + // now just make sure we don't blow up trying to access a freed object! + heaptest.post(2); |*==========================================================================*/ - } - - class TempTrackableListener: public TempListener, public LLEventTrackable - { - public: - TempTrackableListener(const std::string& name, bool& liveFlag): - TempListener(name, liveFlag) - {} - }; - - template<> template<> - void events_object::test<13>() - { - set_test_name("listen(boost::bind(...TempTrackableListener ref...))"); - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - { - TempTrackableListener tempListener("temp", live); - ensure("TempTrackableListener constructed", live); - connection = heaptest.listen(tempListener.getName(), - boost::bind(&TempTrackableListener::call, - boost::ref(tempListener), _1)); - heaptest.post(1); - check_listener("received", tempListener, 1); - } // presumably this will make tempListener go away? - // verify that - ensure("TempTrackableListener destroyed", ! live); - ensure("implicit disconnect", ! connection.connected()); - // now just make sure we don't blow up trying to access a freed object! - heaptest.post(2); - } - - template<> template<> - void events_object::test<14>() - { - set_test_name("listen(boost::bind(...TempTrackableListener pointer...))"); - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - { - TempTrackableListener* newListener(new TempTrackableListener("temp", live)); - ensure("TempTrackableListener constructed", live); - connection = heaptest.listen(newListener->getName(), - boost::bind(&TempTrackableListener::call, - newListener, _1)); - heaptest.post(1); - check_listener("received", *newListener, 1); - // explicitly destroy newListener - delete newListener; - } - // verify that - ensure("TempTrackableListener destroyed", ! live); - ensure("implicit disconnect", ! connection.connected()); - // now just make sure we don't blow up trying to access a freed object! - heaptest.post(2); - } - - template<> template<> - void events_object::test<15>() - { - // This test ensures that using an LLListenerWrapper subclass doesn't - // block Boost.Signals2 from recognizing a bound LLEventTrackable - // subclass. - set_test_name("listen(llwrap<LLLogListener>(boost::bind(...TempTrackableListener ref...)))"); - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - { - TempTrackableListener tempListener("temp", live); - ensure("TempTrackableListener constructed", live); - connection = heaptest.listen(tempListener.getName(), - llwrap<LLLogListener>( - boost::bind(&TempTrackableListener::call, - boost::ref(tempListener), _1))); - heaptest.post(1); - check_listener("received", tempListener, 1); - } // presumably this will make tempListener go away? - // verify that - ensure("TempTrackableListener destroyed", ! live); - ensure("implicit disconnect", ! connection.connected()); - // now just make sure we don't blow up trying to access a freed object! - heaptest.post(2); - } - - class TempSharedListener: public TempListener, - public boost::enable_shared_from_this<TempSharedListener> - { - public: - TempSharedListener(const std::string& name, bool& liveFlag): - TempListener(name, liveFlag) - {} - }; - - template<> template<> - void events_object::test<16>() - { - set_test_name("listen(boost::bind(...TempSharedListener ref...))"); +} + +class TempTrackableListener: public TempListener, public LLEventTrackable +{ +public: +TempTrackableListener(const std::string& name, bool& liveFlag): + TempListener(name, liveFlag) +{} +}; + +template<> template<> +void events_object::test<13>() +{ +set_test_name("listen(boost::bind(...TempTrackableListener ref...))"); +bool live = false; +LLEventPump& heaptest(pumps.obtain("heaptest")); +LLBoundListener connection; +{ + TempTrackableListener tempListener("temp", live); + ensure("TempTrackableListener constructed", live); + connection = heaptest.listen(tempListener.getName(), + boost::bind(&TempTrackableListener::call, + boost::ref(tempListener), _1)); + heaptest.post(1); + check_listener("received", tempListener, 1); +} // presumably this will make tempListener go away? +// verify that +ensure("TempTrackableListener destroyed", ! live); +ensure("implicit disconnect", ! connection.connected()); +// now just make sure we don't blow up trying to access a freed object! +heaptest.post(2); +} + +template<> template<> +void events_object::test<14>() +{ +set_test_name("listen(boost::bind(...TempTrackableListener pointer...))"); +bool live = false; +LLEventPump& heaptest(pumps.obtain("heaptest")); +LLBoundListener connection; +{ + TempTrackableListener* newListener(new TempTrackableListener("temp", live)); + ensure("TempTrackableListener constructed", live); + connection = heaptest.listen(newListener->getName(), + boost::bind(&TempTrackableListener::call, + newListener, _1)); + heaptest.post(1); + check_listener("received", *newListener, 1); + // explicitly destroy newListener + delete newListener; +} +// verify that +ensure("TempTrackableListener destroyed", ! live); +ensure("implicit disconnect", ! connection.connected()); +// now just make sure we don't blow up trying to access a freed object! +heaptest.post(2); +} + +template<> template<> +void events_object::test<15>() +{ +// This test ensures that using an LLListenerWrapper subclass doesn't +// block Boost.Signals2 from recognizing a bound LLEventTrackable +// subclass. +set_test_name("listen(llwrap<LLLogListener>(boost::bind(...TempTrackableListener ref...)))"); +bool live = false; +LLEventPump& heaptest(pumps.obtain("heaptest")); +LLBoundListener connection; +{ + TempTrackableListener tempListener("temp", live); + ensure("TempTrackableListener constructed", live); + connection = heaptest.listen(tempListener.getName(), + llwrap<LLLogListener>( + boost::bind(&TempTrackableListener::call, + boost::ref(tempListener), _1))); + heaptest.post(1); + check_listener("received", tempListener, 1); +} // presumably this will make tempListener go away? +// verify that +ensure("TempTrackableListener destroyed", ! live); +ensure("implicit disconnect", ! connection.connected()); +// now just make sure we don't blow up trying to access a freed object! +heaptest.post(2); +} + +class TempSharedListener: public TempListener, +public boost::enable_shared_from_this<TempSharedListener> +{ +public: +TempSharedListener(const std::string& name, bool& liveFlag): + TempListener(name, liveFlag) +{} +}; + +template<> template<> +void events_object::test<16>() +{ + set_test_name("listen(boost::bind(...TempSharedListener ref...))"); #if 0 - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - { - // We MUST have at least one shared_ptr to an - // enable_shared_from_this subclass object before - // shared_from_this() can work. - boost::shared_ptr<TempSharedListener> - tempListener(new TempSharedListener("temp", live)); - ensure("TempSharedListener constructed", live); - // However, we're not passing either the shared_ptr or its - // corresponding weak_ptr -- instead, we're passing a reference to - // the TempSharedListener. +bool live = false; +LLEventPump& heaptest(pumps.obtain("heaptest")); +LLBoundListener connection; +{ + // We MUST have at least one shared_ptr to an + // enable_shared_from_this subclass object before + // shared_from_this() can work. + boost::shared_ptr<TempSharedListener> + tempListener(new TempSharedListener("temp", live)); + ensure("TempSharedListener constructed", live); + // However, we're not passing either the shared_ptr or its + // corresponding weak_ptr -- instead, we're passing a reference to + // the TempSharedListener. /*==========================================================================*| - std::cout << "Capturing const ref" << std::endl; - const boost::enable_shared_from_this<TempSharedListener>& cref(*tempListener); - std::cout << "Capturing const ptr" << std::endl; - const boost::enable_shared_from_this<TempSharedListener>* cp(&cref); - std::cout << "Capturing non-const ptr" << std::endl; - boost::enable_shared_from_this<TempSharedListener>* p(const_cast<boost::enable_shared_from_this<TempSharedListener>*>(cp)); - std::cout << "Capturing shared_from_this()" << std::endl; - boost::shared_ptr<TempSharedListener> sp(p->shared_from_this()); - std::cout << "Capturing weak_ptr" << std::endl; - boost::weak_ptr<TempSharedListener> wp(weaken(sp)); - std::cout << "Binding weak_ptr" << std::endl; + std::cout << "Capturing const ref" << std::endl; + const boost::enable_shared_from_this<TempSharedListener>& cref(*tempListener); + std::cout << "Capturing const ptr" << std::endl; + const boost::enable_shared_from_this<TempSharedListener>* cp(&cref); + std::cout << "Capturing non-const ptr" << std::endl; + boost::enable_shared_from_this<TempSharedListener>* p(const_cast<boost::enable_shared_from_this<TempSharedListener>*>(cp)); + std::cout << "Capturing shared_from_this()" << std::endl; + boost::shared_ptr<TempSharedListener> sp(p->shared_from_this()); + std::cout << "Capturing weak_ptr" << std::endl; + boost::weak_ptr<TempSharedListener> wp(weaken(sp)); + std::cout << "Binding weak_ptr" << std::endl; |*==========================================================================*/ - connection = heaptest.listen(tempListener->getName(), - boost::bind(&TempSharedListener::call, *tempListener, _1)); - heaptest.post(1); - check_listener("received", *tempListener, 1); - } // presumably this will make tempListener go away? - // verify that - ensure("TempSharedListener destroyed", ! live); - ensure("implicit disconnect", ! connection.connected()); - // now just make sure we don't blow up trying to access a freed object! - heaptest.post(2); + connection = heaptest.listen(tempListener->getName(), + boost::bind(&TempSharedListener::call, *tempListener, _1)); + heaptest.post(1); + check_listener("received", *tempListener, 1); +} // presumably this will make tempListener go away? +// verify that +ensure("TempSharedListener destroyed", ! live); +ensure("implicit disconnect", ! connection.connected()); +// now just make sure we don't blow up trying to access a freed object! +heaptest.post(2); #endif // 0 - } +} } // namespace tut diff --git a/indra/test/llhttpclient_tut.cpp b/indra/test/llhttpclient_tut.cpp index 03759001ae..4b4046632c 100644 --- a/indra/test/llhttpclient_tut.cpp +++ b/indra/test/llhttpclient_tut.cpp @@ -40,6 +40,7 @@ #include "llhttpclient.h" #include "llformat.h" #include "llpipeutil.h" +#include "llproxy.h" #include "llpumpio.h" #include "llsdhttpserver.h" @@ -85,9 +86,10 @@ namespace tut HTTPClientTestData() { apr_pool_create(&mPool, NULL); + LLCurl::initClass(false); mServerPump = new LLPumpIO(mPool); mClientPump = new LLPumpIO(mPool); - + LLHTTPClient::setPump(*mClientPump); } @@ -95,6 +97,7 @@ namespace tut { delete mServerPump; delete mClientPump; + LLProxy::cleanupClass(); apr_pool_destroy(mPool); } diff --git a/indra/test/llsd_new_tut.cpp b/indra/test/llsd_new_tut.cpp index dd93b36f04..b2fa54a688 100644 --- a/indra/test/llsd_new_tut.cpp +++ b/indra/test/llsd_new_tut.cpp @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2006&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2006-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 @@ -32,6 +32,19 @@ #include "llsdtraits.h" #include "llstring.h" +#if LL_WINDOWS +#include <float.h> +namespace +{ + int fpclassify(double x) + { + return _fpclass(x); + } +} +#else +using std::fpclassify; +#endif + namespace tut { class SDCleanupCheck @@ -218,19 +231,16 @@ namespace tut } else { -// TODO: Fix on windows.... -#ifndef LL_WINDOWS -# if !defined(fpclassify) && __GNUC__ >= 3 -# define FPCLASSIFY_NAMESPACE std:: -# else -# define FPCLASSIFY_NAMESPACE -# endif - int left = FPCLASSIFY_NAMESPACE fpclassify(v.asReal()); - int right = FPCLASSIFY_NAMESPACE fpclassify(eReal); + int left = fpclassify(v.asReal()); + int right = fpclassify(eReal); ensure_equals(s+" to real", left, right); - ensure_equals(s+" to string", v.asString(), eString); -#endif + // ensure_equals(s+" to string", v.asString(), eString); + // I've commented this check out, since there doesn't + // seem to be uniform string representation for NaN on + // all platforms. For example, on my Ubuntu 8.10 laptop + // with libc 2.11.1, sqrt(-1.0) will return '-nan', not + // 'nan'. } } @@ -742,6 +752,42 @@ namespace tut LLSD w = v; w = "nice day"; } + + { + SDAllocationCheck check("shared values test for threaded work", 9); + + //U32 start_llsd_count = LLSD::outstandingCount(); + + LLSD m = LLSD::emptyMap(); + + m["one"] = 1; + m["two"] = 2; + m["one_copy"] = m["one"]; // 3 (m, "one" and "two") + + m["undef_one"] = LLSD(); + m["undef_two"] = LLSD(); + m["undef_one_copy"] = m["undef_one"]; + + { // Ensure first_array gets freed to avoid counting it + LLSD first_array = LLSD::emptyArray(); + first_array.append(1.0f); + first_array.append(2.0f); + first_array.append(3.0f); // 7 + + m["array"] = first_array; + m["array_clone"] = first_array; + m["array_copy"] = m["array"]; // 7 + } + + m["string_one"] = "string one value"; + m["string_two"] = "string two value"; + m["string_one_copy"] = m["string_one"]; // 9 + + //U32 llsd_object_count = LLSD::outstandingCount(); + //std::cout << "Using " << (llsd_object_count - start_llsd_count) << " LLSD objects" << std::endl; + + //m.dumpStats(); + } } template<> template<> @@ -769,4 +815,3 @@ namespace tut test serializations */ } - diff --git a/indra/test/llsdmessagebuilder_tut.cpp b/indra/test/llsdmessagebuilder_tut.cpp index cc6f78decd..be0692557a 100644 --- a/indra/test/llsdmessagebuilder_tut.cpp +++ b/indra/test/llsdmessagebuilder_tut.cpp @@ -33,6 +33,7 @@ #include "llsdmessagebuilder.h" #include "llsdmessagereader.h" #include "llsdtraits.h" +#include "llmath.h" #include "llquaternion.h" #include "u64.h" #include "v3dmath.h" @@ -86,17 +87,17 @@ namespace tut return createTemplateBlock(_PREHASH_Test0, type, size, block); } - static LLMessageBlock* createTemplateBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) + static LLMessageBlock* createTemplateBlock(const char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) { LLMessageBlock* result = new LLMessageBlock(name, block); if(type != MVT_NULL) { - result->addVariable(_PREHASH_Test0, type, size); + result->addVariable(const_cast<char*>(_PREHASH_Test0), type, size); } return result; } - static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = _PREHASH_Test0) + static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast<char*>(_PREHASH_Test0)) { templateNameMap[_PREHASH_TestMessage] = &messageTemplate; LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(templateNameMap); diff --git a/indra/test/lltemplatemessagebuilder_tut.cpp b/indra/test/lltemplatemessagebuilder_tut.cpp index 09beb53869..6e1c82bb24 100644 --- a/indra/test/lltemplatemessagebuilder_tut.cpp +++ b/indra/test/lltemplatemessagebuilder_tut.cpp @@ -31,6 +31,7 @@ #include "llapr.h" #include "llmessagetemplate.h" +#include "llmath.h" #include "llquaternion.h" #include "lltemplatemessagebuilder.h" #include "lltemplatemessagereader.h" @@ -75,7 +76,7 @@ namespace tut static LLMessageBlock* defaultBlock(const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) { - return createBlock(_PREHASH_Test0, type, size, block); + return createBlock(const_cast<char*>(_PREHASH_Test0), type, size, block); } static LLMessageBlock* createBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) @@ -83,12 +84,12 @@ namespace tut LLMessageBlock* result = new LLMessageBlock(name, block); if(type != MVT_NULL) { - result->addVariable(_PREHASH_Test0, type, size); + result->addVariable(const_cast<char*>(_PREHASH_Test0), type, size); } return result; } - static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = _PREHASH_Test0) + static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast<char*>(_PREHASH_Test0)) { nameMap[_PREHASH_TestMessage] = &messageTemplate; LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(nameMap); @@ -403,11 +404,11 @@ namespace tut // build template: Test0 before Test1 LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0)); builder->addU32(_PREHASH_Test0, 0xaaaa); builder->nextBlock(_PREHASH_Test1); builder->addU32(_PREHASH_Test0, 0xbbbb); @@ -416,11 +417,11 @@ namespace tut // build template: Test1 before Test0 messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb - builder = defaultBuilder(messageTemplate, _PREHASH_Test1); + builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test1)); builder->addU32(_PREHASH_Test0, 0xaaaa); builder->nextBlock(_PREHASH_Test0); builder->addU32(_PREHASH_Test0, 0xbbbb); @@ -443,11 +444,11 @@ namespace tut // build template: Test0 before Test1 LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0)); builder->addU32(_PREHASH_Test0, 0xaaaa); builder->nextBlock(_PREHASH_Test1); builder->addU32(_PREHASH_Test0, 0xbbbb); @@ -455,7 +456,7 @@ namespace tut delete builder; // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb - builder = defaultBuilder(messageTemplate, _PREHASH_Test1); + builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test1)); builder->addU32(_PREHASH_Test0, 0xbbbb); builder->nextBlock(_PREHASH_Test0); builder->addU32(_PREHASH_Test0, 0xaaaa); @@ -478,21 +479,21 @@ namespace tut // Build template: Test0 only LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); // Build message - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0)); builder->addU32(_PREHASH_Test0, 0xaaaa); bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0); delete builder; // Build template: Test0 before Test1 messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); // Build message - builder = defaultBuilder(messageTemplate, _PREHASH_Test0); + builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0)); builder->addU32(_PREHASH_Test0, 0xaaaa); builder->nextBlock(_PREHASH_Test1); builder->addU32(_PREHASH_Test0, 0xbbbb); @@ -511,8 +512,8 @@ namespace tut U32 inTest00 = 0, inTest01 = 1, inTest1 = 2; U32 outTest00, outTest01, outTest1; LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4)); - messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4)); LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); builder->addU32(_PREHASH_Test0, inTest00); builder->nextBlock(_PREHASH_Test0); @@ -536,15 +537,15 @@ namespace tut U32 inTest = 1, outTest; LLMessageTemplate messageTemplate = defaultTemplate(); messageTemplate.addBlock( - createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4)); + createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4)); LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); builder->addU32(_PREHASH_Test0, inTest); LLTemplateMessageReader* reader = setReader(messageTemplate, builder); reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest); - S32 blockCount = reader->getNumberOfBlocks(_PREHASH_Test1); + S32 blockCount = reader->getNumberOfBlocks(const_cast<char*>(_PREHASH_Test1)); ensure_equals("Ensure block count", blockCount, 0); ensure_equals("Ensure Test0", inTest, outTest); delete reader; @@ -556,7 +557,7 @@ namespace tut { // build template LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4)); // build message LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); @@ -881,7 +882,7 @@ namespace tut delete builder; // add block to reader template - messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); // read message value and default value numberMap[1] = &messageTemplate; @@ -914,7 +915,7 @@ namespace tut delete builder; // add variable block to reader template - messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4)); + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4)); // read message value and check block repeat count numberMap[1] = &messageTemplate; @@ -947,7 +948,7 @@ namespace tut delete builder; // add variable block to reader template - messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_VARIABLE, 4, + messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_VARIABLE, 4, MBT_SINGLE)); // read message value and default string |