diff options
494 files changed, 16581 insertions, 5440 deletions
@@ -52,6 +52,7 @@ a82e5b1e22c7f90e3c7977d146b80588f004ed0d 2.5.0-start 345b17e7cf630db77e840b4fe3451bd476d750a3 76f586a8e22b 0000000000000000000000000000000000000000 76f586a8e22b 54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f 2.5.0-beta2 +b542f8134a2bb5dd054ff4e509a44b2ee463b1bf nat-eventapi2-base 7076e22f9f43f479a4ea75eac447a36364bead5a DRTVWR-5_2.2.0-beta1 9822eb3e25f7fe0c28ffd8aba45c507caa383cbc DRTVWR-3_2.2.0-beta2 b0cd7e150009809a0b5b0a9d5785cd4bb230413a DRTVWR-7_2.2.0-beta3 @@ -70,6 +71,7 @@ b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3 b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release 92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start +3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work 63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start 4dede9ae1ec74d41f6887719f6f1de7340d8578d 2.5.1-release 4dede9ae1ec74d41f6887719f6f1de7340d8578d DRTVWR-37_2.5.1-release @@ -93,11 +95,17 @@ c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release 42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1 d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 +214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release +214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release 52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1 d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 -8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release -8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release -214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release -214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release +0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2 +0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2 +7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1 +7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1 +800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start +bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1 +bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1 +5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start diff --git a/BuildParams b/BuildParams index 6b4bdd0fd3..a602be2fe2 100644 --- a/BuildParams +++ b/BuildParams @@ -66,12 +66,13 @@ viewer-pre-release.viewer_channel = "Second Life Release" viewer-pre-release.login_channel = "Second Life Release" viewer-pre-release.build_debug_release_separately = true viewer-pre-release.build_viewer_update_version_manager = true +#viewer-pre-release.release-viewer.jira = DRTVWR-13 viewer-pre-release.release-viewer.jira = DRTVWR-46 + # ======================================= # brad # ======================================== - debug-halting.email = cg@lindenlab.com debug-halting.build_server = false debug-halting.build_server_tests = false @@ -156,11 +157,12 @@ media.build_viewer_update_version_manager = false # ================ oz_viewer-devreview.build_debug_release_separately = true -oz_viewer-poreview.build_debug_release_separately = true -oz-project-1.build_debug_release_separately = true -oz-project-2.build_debug_release_separately = true +oz_project-1.build_debug_release_separately = true +oz_project-2.build_debug_release_separately = true oz-project-3.build_debug_release_separately = true + +oz_viewer-beta-review.build_debug_release_separately = true # ======================================== # enus # ======================================== @@ -169,13 +171,6 @@ viewer-tut-teamcity.email = enus@lindenlab.com viewer-tut-teamcity.build_server = false viewer-tut-teamcity.build_server_tests = false -# ======================================== -# experience -# ======================================== -viewer-experience.public_build = false -viewer-experience.viewer_channel = "Second Life SkyLight Viewer" -viewer-experience.login_channel = "Second Life SkyLight Viewer" - # ================================================================= # asset delivery 2010 projects # ================================================================= diff --git a/autobuild.xml b/autobuild.xml index 0b1871b526..d72846b8fe 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -510,9 +510,9 @@ <key>archive</key> <map> <key>hash</key> - <string>9b58d1a9c15807a1301e42a313641010</string> + <string>9f8a9dc39fd7c3da0fb3533782d1fddf</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-linux-20110310.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/226814/arch/Linux/installer/freetype-2.3.9-linux-20110418.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1242,9 +1242,9 @@ <key>archive</key> <map> <key>hash</key> - <string>cc159598ef3fcd34fd33a8a0ef846165</string> + <string>3d40be8566fa4b9df9a38e2a0f9ea467</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/223711/arch/Linux/installer/openssl-0.9.8q-linux-20110314.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/226882/arch/Linux/installer/openssl-1.0.0d-linux-20110418.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1351,30 +1351,6 @@ </map> </map> </map> - <key>pth</key> - <map> - <key>license</key> - <string>lgpl</string> - <key>license_file</key> - <string>LICENSES/pth.txt</string> - <key>name</key> - <string>pth</string> - <key>platforms</key> - <map> - <key>darwin</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>2172379794217d0ffba0db09b2ac17bf</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20110303.tar.bz2</string> - </map> - <key>name</key> - <string>darwin</string> - </map> - </map> - </map> <key>quicktime</key> <map> <key>license</key> @@ -1590,15 +1566,15 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> </array> </map> <key>name</key> <string>Debug</string> </map> - <key>OpenSourceDebug</key> + <key>DebugOS</key> <map> <key>configure</key> <map> @@ -1607,67 +1583,23 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>OpenSourceDebug</string> - </map> - <key>OpenSourceRelWithDebInfo</key> - <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> </array> - </map> - <key>name</key> - <string>OpenSourceRelWithDebInfo</string> - </map> - <key>OpenSourceRelease</key> - <map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> + <key>arguments</key> <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>../indra</string> </array> </map> <key>name</key> - <string>OpenSourceRelease</string> + <string>DebugOS</string> </map> - <key>OpenSourceStandAloneDebug</key> + <key>RelWithDebInfo</key> <map> - <key>configure</key> + <key>build</key> <map> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> </map> - <key>name</key> - <string>OpenSourceStandAloneDebug</string> - </map> - <key>OpenSourceStandAloneRelWithDebInfo</key> - <map> <key>configure</key> <map> <key>command</key> @@ -1675,15 +1607,15 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> </array> </map> <key>name</key> - <string>OpenSourceStandAloneRelWithDebInfo</string> + <string>RelWithDebInfo</string> </map> - <key>OpenSourceStandAloneRelease</key> + <key>RelWithDebInfoOS</key> <map> <key>configure</key> <map> @@ -1691,34 +1623,18 @@ <string>cmake</string> <key>options</key> <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DUNATTENDED:BOOL=OFF</string> + <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneRelease</string> - </map> - <key>RelWithDebInfo</key> - <map> - <key>build</key> - <map> - </map> - <key>configure</key> - <map> - <key>command</key> - <string>cmake</string> - <key>options</key> + <key>arguments</key> <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>../indra</string> </array> </map> <key>name</key> - <string>RelWithDebInfo</string> + <string>RelWithDebInfoOS</string> </map> <key>Release</key> <map> @@ -1732,83 +1648,35 @@ <key>options</key> <array> <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DUNATTENDED:BOOL=OFF</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> </array> </map> <key>name</key> <string>Release</string> </map> - <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly --> - <key>VCexpressRelWithDebInfo</key> + <key>ReleaseOS</key> <map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>command</key> <string>cmake</string> <key>options</key> <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> - </map> - <key>name</key> - <string>VCexpressRelWithDebInfo</string> - </map> - <!-- OPEN-1 WORKAROUND end --> - <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelWithDebInfo</key> - <map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string> - <string>-DUNATTENDED:BOOL=OFF</string> + <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> <string>-DWORD_SIZE:STRING=32</string> <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> + <string>-DINSTALL_PROPRIETARY=FALSE</string> </array> - </map> - <key>name</key> - <string>VC10msbuildRelWithDebInfo</string> - </map> - <!-- OPEN-1a WORKAROUND end --> - <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelease</key> - <map> - <key>configure</key> - <map> <key>arguments</key> <array> <string>../indra</string> </array> - <key>command</key> - <string>cmake</string> - <key>options</key> - <array> - <string>-DCMAKE_BUILD_TYPE:STRING=Release</string> - <string>-DUNATTENDED:BOOL=OFF</string> - <string>-DWORD_SIZE:STRING=32</string> - <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string> - </array> </map> <key>name</key> - <string>VC10msbuildRelease</string> + <string>ReleaseOS</string> </map> - <!-- OPEN-1a Release WORKAROUND end --> </map> <key>name</key> <string>common</string> @@ -1848,15 +1716,12 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> <string>Debug</string> </map> - <key>OpenSourceDebug</key> + <key>DebugOS</key> <map> <key>build</key> <map> @@ -1870,116 +1735,26 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>OpenSourceDebug</string> + <string>DebugOS</string> </map> - <key>OpenSourceRelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration RelWithDebInfo</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelWithDebInfo</string> - </map> - <key>OpenSourceRelease</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Release</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelease</string> - </map> - <key>OpenSourceStandAloneDebug</key> + <key>RelWithDebInfo</key> <map> <key>build</key> <map> - <key>command</key> - <string>xcodebuild</string> - <key>options</key> - <array> - <string>-configuration Debug</string> - <string>-project SecondLife.xcodeproj</string> - </array> - </map> - <key>configure</key> - <map> <key>arguments</key> <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> + <string>|</string> + <string>grep</string> + <string>-v</string> + <string>setenv</string> </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneDebug</string> - </map> - <key>OpenSourceStandAloneRelWithDebInfo</key> - <map> - <key>build</key> - <map> <key>command</key> <string>xcodebuild</string> <key>options</key> @@ -1998,15 +1773,14 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> + <key>default</key> + <string>True</string> <key>name</key> - <string>OpenSourceStandAloneRelWithDebInfo</string> + <string>RelWithDebInfo</string> </map> - <key>OpenSourceStandAloneRelease</key> + <key>RelWithDebInfoOS</key> <map> <key>build</key> <map> @@ -2014,29 +1788,22 @@ <string>xcodebuild</string> <key>options</key> <array> - <string>-configuration Release</string> + <string>-configuration RelWithDebInfo</string> <string>-project SecondLife.xcodeproj</string> </array> </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>OpenSourceStandAloneRelease</string> + <string>RelWithDebInfoOS</string> </map> - <key>RelWithDebInfo</key> + <key>Release</key> <map> <key>build</key> <map> @@ -2051,7 +1818,7 @@ <string>xcodebuild</string> <key>options</key> <array> - <string>-configuration RelWithDebInfo</string> + <string>-configuration Release</string> <string>-project SecondLife.xcodeproj</string> </array> </map> @@ -2065,27 +1832,15 @@ <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> - <key>default</key> - <string>True</string> <key>name</key> - <string>RelWithDebInfo</string> + <string>Release</string> </map> - <key>Release</key> + <key>ReleaseOS</key> <map> <key>build</key> <map> - <key>arguments</key> - <array> - <string>|</string> - <string>grep</string> - <string>-v</string> - <string>setenv</string> - </array> <key>command</key> <string>xcodebuild</string> <key>options</key> @@ -2096,21 +1851,14 @@ </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> <string>'Xcode'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> - <string>Release</string> + <string>ReleaseOS</string> </map> </map> <key>name</key> @@ -2143,44 +1891,12 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> <string>Debug</string> </map> - <key>OpenSourceDebug</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceDebug</string> - </map> - <key>OpenSourceRelWithDebInfo</key> + <key>DebugOS</key> <map> <key>build</key> <map> @@ -2188,86 +1904,21 @@ <string>make</string> <key>options</key> <array> - <string>-j 12</string> + <string>-j 2</string> </array> </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>OpenSourceRelWithDebInfo</string> + <string>DebugOS</string> </map> - <key>OpenSourceRelease</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelease</string> - </map> - <key>OpenSourceStandAloneDebug</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>make</string> - <key>options</key> - <array> - <string>-j 12</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneDebug</string> - </map> - <key>OpenSourceStandAloneRelWithDebInfo</key> + <key>RelWithDebInfo</key> <map> <key>build</key> <map> @@ -2288,15 +1939,14 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> + <key>default</key> + <string>True</string> <key>name</key> - <string>OpenSourceStandAloneRelWithDebInfo</string> + <string>RelWithDebInfo</string> </map> - <key>OpenSourceStandAloneRelease</key> + <key>RelWithDebInfoOS</key> <map> <key>build</key> <map> @@ -2304,28 +1954,21 @@ <string>make</string> <key>options</key> <array> - <string>-j 12</string> + <string>-j 2</string> </array> </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>OpenSourceStandAloneRelease</string> + <string>RelWithDebInfoOS</string> </map> - <key>RelWithDebInfo</key> + <key>Release</key> <map> <key>build</key> <map> @@ -2346,17 +1989,12 @@ <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> - <key>default</key> - <string>True</string> <key>name</key> - <string>RelWithDebInfo</string> + <string>Release</string> </map> - <key>Release</key> + <key>ReleaseOS</key> <map> <key>build</key> <map> @@ -2364,26 +2002,19 @@ <string>make</string> <key>options</key> <array> - <string>-j 12</string> + <string>-j 2</string> </array> </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> <string>'Unix Makefiles'</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> - <string>Release</string> + <string>ReleaseOS</string> </map> <key>default</key> <map> @@ -2437,91 +2068,12 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> <string>Debug</string> </map> - <key>OpenSourceDebug</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>devenv.com</string> - <key>options</key> - <array> - <string>/build</string> - <string>Debug</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> - <string>SecondLife.sln</string> - <string>--config</string> - <string>Debug</string> - <string>--startup</string> - <string>secondlife-bin</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceDebug</string> - </map> - <key>OpenSourceRelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>devenv.com</string> - <key>options</key> - <array> - <string>/build</string> - <string>RelWithDebInfo</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceRelWithDebInfo</string> - </map> - <key>OpenSourceRelease</key> + <key>DebugOS</key> <map> <key>build</key> <map> @@ -2530,32 +2082,35 @@ <string>SecondLife.sln</string> </array> <key>command</key> - <string>devenv.com</string> + <string>msbuild.exe</string> <key>options</key> <array> - <string>/build</string> - <string>Release</string> + <string>/p:Configuration=Debug</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> </array> </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> <key>options</key> <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>OpenSourceRelease</string> + <string>DebugOS</string> </map> - <key>OpenSourceStandAloneDebug</key> + <key>RelWithDebInfo</key> <map> <key>build</key> <map> @@ -2564,11 +2119,11 @@ <string>SecondLife.sln</string> </array> <key>command</key> - <string>devenv.com</string> + <string>BuildConsole</string> <key>options</key> <array> <string>/build</string> - <string>Debug</string> + <string>"/cfg=RelWithDebInfo|Win32"</string> </array> </map> <key>configure</key> @@ -2589,83 +2144,14 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneDebug</string> - </map> - <key>OpenSourceStandAloneRelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>devenv.com</string> - <key>options</key> - <array> - <string>/build</string> - <string>RelWithDebInfo</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>OpenSourceStandAloneRelWithDebInfo</string> - </map> - <key>OpenSourceStandAloneRelease</key> - <map> - <key>build</key> - <map> - <key>arguments</key> - <array> - <string>SecondLife.sln</string> - </array> - <key>command</key> - <string>devenv.com</string> - <key>options</key> - <array> - <string>/build</string> - <string>Release</string> - </array> - </map> - <key>configure</key> - <map> - <key>arguments</key> - <array> - <string>../indra</string> - </array> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=TRUE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> </map> + <key>default</key> + <string>True</string> <key>name</key> - <string>OpenSourceStandAloneRelease</string> + <string>RelWithDebInfo</string> </map> - <key>RelWithDebInfo</key> + <key>RelWithDebInfoOS</key> <map> <key>build</key> <map> @@ -2674,40 +2160,33 @@ <string>SecondLife.sln</string> </array> <key>command</key> - <string>BuildConsole</string> + <string>msbuild.exe</string> <key>options</key> <array> - <string>/build</string> - <string>"/cfg=RelWithDebInfo|Win32"</string> + <string>/p:Configuration=RelWithDebInfo</string> + <string>/p:Platform=Win32</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> + <string>/p:"VCBuildAdditionalOptions= /incremental"</string> </array> </map> <key>configure</key> <map> - <key>arguments</key> - <array> - <string>..\indra</string> - <string>&&</string> - <string>..\indra\tools\vstool\VSTool.exe</string> - <string>--solution</string> - <string>SecondLife.sln</string> - <string>--config</string> - <string>RelWithDebInfo</string> - <string>--startup</string> - <string>secondlife-bin</string> - </array> <key>options</key> <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=OFF</string> + <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> + <string>-DUSE_KDU=FALSE</string> + <string>-DFMOD=FALSE</string> </array> </map> - <key>default</key> - <string>True</string> <key>name</key> - <string>RelWithDebInfo</string> + <string>RelWithDebInfoOS</string> </map> <key>Release</key> <map> @@ -2744,95 +2223,31 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=OFF</string> - <string>-DINSTALL_PROPRIETARY=TRUE</string> - <string>-DFMOD=TRUE</string> </array> </map> <key>name</key> <string>Release</string> </map> - <!-- OPEN-1 WORKAROUND begin - to be removed when VC express is detected correctly --> - <key>VCexpressRelWithDebInfo</key> + <key>ReleaseOS</key> <map> <key>build</key> <map> <key>arguments</key> <array> - <string>"RelWithDebInfo|Win32"</string> - </array> - <key>command</key> - <string>vcbuild.exe</string> - <key>options</key> - <array> - <string>/u</string> - <string>SecondLife.sln</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> - </array> - </map> - <key>name</key> - <string>VCexpressRelWithDebInfo</string> - </map> - <!-- OPEN-1 WORKAROUND end --> - <!-- OPEN-1a WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelWithDebInfo</key> - <map> - <key>build</key> - <map> - <key>command</key> - <string>msbuild.exe</string> - <key>options</key> - <array> <string>SecondLife.sln</string> - <string>/verbosity:minimal</string> - <string>/t:build</string> - <string>/p:Configuration=RelWithDebInfo</string> - <string>/p:Platform=Win32</string> - <string>/p:"VCBuildAdditionalOptions= /useenv"</string> - <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> - </map> - <key>configure</key> - <map> - <key>options</key> - <array> - <string>-G</string> - <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> - <string>-DFMOD=FALSE</string> </array> - </map> - <key>name</key> - <string>VC10msbuildRelWithDebInfo</string> - </map> - <!-- OPEN-1a WORKAROUND end --> - <!-- OPEN-1a Release WORKAROUND begin - to be removed when VC 2010 is detected correctly --> - <key>VC10msbuildRelease</key> - <map> - <key>build</key> - <map> <key>command</key> <string>msbuild.exe</string> <key>options</key> <array> - <string>SecondLife.sln</string> - <string>/t:build</string> <string>/p:Configuration=Release</string> <string>/p:Platform=Win32</string> - <string>/p:"VCBuildAdditionalOptions= /useenv"</string> + <string>/t:Build</string> + <string>/p:useenv=true</string> + <string>/verbosity:minimal</string> + <string>/toolsversion:4.0</string> <string>/p:"VCBuildAdditionalOptions= /incremental"</string> - </array> + </array> </map> <key>configure</key> <map> @@ -2840,15 +2255,16 @@ <array> <string>-G</string> <string>"Visual Studio 10"</string> - <string>-DSTANDALONE:BOOL=FALSE</string> - <string>-DINSTALL_PROPRIETARY=FALSE</string> + <string>-DUNATTENDED:BOOL=ON</string> + <string>-DUSE_PRECOMPILED_HEADERS=ON</string> + <string>-DINSTALL_PROPRIETARY=TRUE</string> + <string>-DUSE_KDU=FALSE</string> <string>-DFMOD=FALSE</string> </array> </map> <key>name</key> - <string>VC10msbuildRelease</string> + <string>ReleaseOS</string> </map> - <!-- OPEN-1a WORKAROUND end --> </map> <key>name</key> <string>windows</string> @@ -118,12 +118,14 @@ eval '$build_'"$arch" || pass # File no longer exists in code-sep branch, so let's make sure it exists in order to use it. if test -f scripts/update_version_files.py ; then begin_section UpdateVer - python scripts/update_version_files.py \ - --channel="$viewer_channel" \ - --server_channel="$server_channel" \ - --revision=$revision \ - --verbose \ + eval $(python scripts/update_version_files.py \ + --channel="$viewer_channel" \ + --server_channel="$server_channel" \ + --revision=$revision \ + --verbose \ + | sed -n -e "s,Setting viewer channel/version: '\([^']*\)' / '\([^']*\)',VIEWER_CHANNEL='\1';VIEWER_VERSION='\2',p")\ || fail update_version_files.py + echo "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_VERSION}\"}" > summary.json end_section UpdateVer fi @@ -261,6 +263,7 @@ then else upload_item installer "$package" binary/octet-stream upload_item quicklink "$package" binary/octet-stream + [ -f summary.json ] && upload_item installer summary.json text/plain # Upload crash reporter files. case "$last_built_variant" in diff --git a/doc/contributions.txt b/doc/contributions.txt index c92450acd2..09fca27f43 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -155,6 +155,8 @@ Angus Boyd VWR-592 Ann Congrejo CT-193 +Ansariel Hiller + STORM-1101 Ardy Lay VWR-19499 VWR-24917 @@ -202,6 +204,7 @@ Boroondas Gupte SNOW-624 SNOW-737 STORM-318 + STORM-1182 VWR-233 VWR-20583 VWR-20891 @@ -241,6 +244,7 @@ Coaldust Numbers Cron Stardust VWR-10579 VWR-25120 + STORM-1075 Cypren Christenson STORM-417 Dale Glass @@ -359,6 +363,8 @@ Ian Kas [NO JIRA] (Ukranian localization) CT-322 CT-325 +Ima Mechanique + OPEN-61 Irene Muni CT-324 CT-352 @@ -417,8 +423,14 @@ Jonathan Yap STORM-1020 STORM-1064 STORM-960 + STORM-1101 + STORM-1108 + STORM-1094 STORM-1077 STORM-953 + STORM-1128 + STORM-956 + STORM-1095 Kage Pixel VWR-11 Ken March @@ -440,6 +452,8 @@ Kitty Barnett Kunnis Basiat VWR-82 VWR-102 +Lance Corrimal + VWR-25269 Latif Khalifa VWR-5370 Lisa Lowe @@ -581,7 +595,7 @@ Nicholaz Beresford VWR-2684 Nicky Perian OPEN-1 - OPEN-1087 + STORM-1087 STORM-1090 Nounouch Hapmouche VWR-238 @@ -653,6 +667,8 @@ Robin Cornelius STORM-422 STORM-960 STORM-1019 + STORM-1095 + STORM-1128 VWR-2488 VWR-9557 VWR-10579 @@ -790,6 +806,8 @@ Thickbrick Sleaford VWR-13483 VWR-13947 VWR-24420 + STORM-956 + STORM-1147 Thraxis Epsilon SVC-371 VWR-383 @@ -865,6 +883,7 @@ WolfPup Lowenhar STORM-674 STORM-776 STORM-825 + STORM-1098 VWR-20741 VWR-20933 Zai Lynch diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 4698116022..4202b54f94 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -127,7 +127,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010 PATHS ${MSVC_DEBUG_REDIST_PATH} [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT - NO_DEFAULT_PATH + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64 + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32 NO_DEFAULT_PATH ) @@ -151,7 +152,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010 PATHS ${MSVC_REDIST_PATH} [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC100.CRT - NO_DEFAULT_PATH + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64 + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32 NO_DEFAULT_PATH ) @@ -243,7 +245,7 @@ elseif(LINUX) libaprutil-1.so.0 libatk-1.0.so libbreakpad_client.so.0 - libcrypto.so.0.9.8 + libcrypto.so.1.0.0 libdb-5.1.so libexpat.so libexpat.so.1 @@ -259,7 +261,7 @@ elseif(LINUX) libtcmalloc.so libuuid.so.16 libuuid.so.16.0.22 - libssl.so.0.9.8 + libssl.so.1.0.0 libfontconfig.so.1.4.4 ) diff --git a/indra/cmake/Pth.cmake b/indra/cmake/Pth.cmake deleted file mode 100644 index a28f6ec696..0000000000 --- a/indra/cmake/Pth.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# -*- cmake -*- -include(Prebuilt) - -set(PTH_FIND_QUIETLY ON) -set(PTH_FIND_REQUIRED ON) - -if (STANDALONE) -# ?? How would I construct FindPTH.cmake? This file was cloned from -# CURL.cmake, which uses include(FindCURL), but there's no FindCURL.cmake? -# include(FindPTH) -else (STANDALONE) - # This library is only needed to support Boost.Coroutine, and only on Mac. - if (DARWIN) - use_prebuilt_binary(pth) - set(PTH_LIBRARIES pth) - set(PTH_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) - else (DARWIN) - set(PTH_LIBRARIES) - set(PTH_INCLUDE_DIRS) - endif (DARWIN) -endif (STANDALONE) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 77dd34d122..03428691cf 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -102,7 +102,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CMAKE_OSX_DEPLOYMENT_TARGET 10.5) set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk) set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.2") - set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "DWARF with dSYM File") + set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf-with-dsym) # NOTE: To attempt an i386/PPC Universal build, add this on the configure line: # -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc' @@ -135,6 +135,7 @@ set(VIEWER_LOGIN_CHANNEL ${VIEWER_CHANNEL} CACHE STRING "Fake login channel for set(VERSION_BUILD "0" CACHE STRING "Revision number passed in from the outside") set(STANDALONE OFF CACHE BOOL "Do not use Linden-supplied prebuilt libraries.") +set(UNATTENDED OFF CACHE BOOL "Should be set to ON for building with VC Express editions.") if (NOT STANDALONE AND EXISTS ${CMAKE_SOURCE_DIR}/llphysics) set(SERVER ON CACHE BOOL "Build Second Life server software.") diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 365f5f758c..60ddf63b21 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -53,12 +53,32 @@ static const char USAGE[] = "\n" " -o, --output <file1 .. file2> OR <type>\n" " List of image files to create (assumes same order as for input files)\n" " OR 3 letters file type extension to convert each input file into.\n" +" -r, --region <x0, y0, x1, y1>\n" +" Crop region applied to the input files in pixels.\n" +" Only used for j2c images. Default is no region cropping.\n" +" -d, --discard_level <n>\n" +" Discard level max used on input. 0 is highest resolution. Max discard level is 5.\n" +" This allows the input image to be clamped in resolution when loading.\n" +" Only valid for j2c images. Default is no discard.\n" +" -p, --precincts <n>\n" +" Dimension of precincts in pixels. Precincts are assumed square and identical for\n" +" all levels. Note that this option also add PLT and tile markers to the codestream, \n" +" and uses RPCL order. Power of 2 must be used.\n" +" Only valid for output j2c images. Default is no precincts used.\n" +" -b, --blocks <n>\n" +" Dimension of coding blocks in pixels. Blocks are assumed square. Power of 2 must\n" +" be used. Blocks must be smaller than precincts. Like precincts, this option adds\n" +" PLT, tile markers and uses RPCL.\n" +" Only valid for output j2c images. Default is 64.\n" +" -rev, --reversible\n" +" Set the compression to be lossless (reversible in j2c parlance).\n" +" Only valid for output j2c images.\n" " -log, --logmetrics <metric>\n" " Log performance data for <metric>. Results in <metric>.slp\n" " Note: so far, only ImageCompressionTester has been tested.\n" -" -r, --analyzeperformance\n" +" -a, --analyzeperformance\n" " Create a report comparing <metric>_baseline.slp with current <metric>.slp\n" -" Results in <metric>_report.csv" +" Results in <metric>_report.csv\n" " -s, --image-stats\n" " Output stats for each input and output image.\n" "\n"; @@ -69,31 +89,8 @@ static bool sAllDone = false; // Create an empty formatted image instance of the correct type from the filename LLPointer<LLImageFormatted> create_image(const std::string &filename) { - std::string exten = gDirUtilp->getExtension(filename); - U32 codec = LLImageBase::getCodecFromExtension(exten); - - LLPointer<LLImageFormatted> image; - switch (codec) - { - case IMG_CODEC_BMP: - image = new LLImageBMP(); - break; - case IMG_CODEC_TGA: - image = new LLImageTGA(); - break; - case IMG_CODEC_JPEG: - image = new LLImageJPEG(); - break; - case IMG_CODEC_J2C: - image = new LLImageJ2C(); - break; - case IMG_CODEC_PNG: - image = new LLImagePNG(); - break; - default: - return NULL; - } - + std::string exten = gDirUtilp->getExtension(filename); + LLPointer<LLImageFormatted> image = LLImageFormatted::createFromExtension(exten); return image; } @@ -110,10 +107,11 @@ void output_image_stats(LLPointer<LLImageFormatted> image, const std::string &fi } // Load an image from file and return a raw (decompressed) instance of its data -LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_stats) +LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_level, int* region, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(src_filename); - + + // This just loads the image file stream into a buffer. No decoding done. if (!image->load(src_filename)) { return NULL; @@ -131,6 +129,15 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_st } LLPointer<LLImageRaw> raw_image = new LLImageRaw; + + // Set the image restriction on load in the case of a j2c image + if ((image->getCodec() == IMG_CODEC_J2C) && ((discard_level != -1) || (region != NULL))) + { + // That method doesn't exist (and likely, doesn't make sense) for any other image file format + // hence the required cryptic cast. + ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard_level, region); + } + if (!image->decode(raw_image, 0.0f)) { return NULL; @@ -140,10 +147,22 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_st } // Save a raw image instance into a file -bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, bool output_stats) +bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, bool reversible, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(dest_filename); + // Set the image codestream parameters on output in the case of a j2c image + if (image->getCodec() == IMG_CODEC_J2C) + { + // That method doesn't exist (and likely, doesn't make sense) for any other image file format + // hence the required cryptic cast. + if ((blocks_size != -1) || (precincts_size != -1)) + { + ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); + } + ((LLImageJ2C*)(image.get()))->setReversible(reversible); + } + if (!image->encode(raw_image, 0.0f)) { return false; @@ -280,8 +299,14 @@ int main(int argc, char** argv) // List of input and output files std::list<std::string> input_filenames; std::list<std::string> output_filenames; + // Other optional parsed arguments bool analyze_performance = false; bool image_stats = false; + int* region = NULL; + int discard_level = -1; + int precincts_size = -1; + int blocks_size = -1; + bool reversible = false; // Init whatever is necessary ll_init_apr(); @@ -323,6 +348,85 @@ int main(int argc, char** argv) file_name = argv[arg+1]; // Next argument and loop over } } + else if ((!strcmp(argv[arg], "--region") || !strcmp(argv[arg], "-r")) && arg < argc-1) + { + std::string value_str = argv[arg+1]; + int index = 0; + region = new int[4]; + while (value_str[0] != '-') // if arg starts with '-', it's the next option + { + int value = atoi(value_str.c_str()); + region[index++] = value; + arg += 1; // Definitely skip that arg now we know it's a number + if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list + break; + if (index == 4) // Break out of the loop if we captured 4 values already + break; + value_str = argv[arg+1]; // Next argument and loop over + } + if (index != 4) + { + std::cout << "--region arguments invalid" << std::endl; + delete [] region; + region = NULL; + } + } + else if (!strcmp(argv[arg], "--discard_level") || !strcmp(argv[arg], "-d")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --discard_level argument given, discard_level ignored" << std::endl; + } + else + { + discard_level = atoi(value_str.c_str()); + // Clamp to the values accepted by the viewer + discard_level = llclamp(discard_level,0,5); + } + } + else if (!strcmp(argv[arg], "--precincts") || !strcmp(argv[arg], "-p")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --precincts argument given, precincts ignored" << std::endl; + } + else + { + precincts_size = atoi(value_str.c_str()); + // *TODO: make sure precincts_size is a power of 2 + } + } + else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --blocks argument given, blocks ignored" << std::endl; + } + else + { + blocks_size = atoi(value_str.c_str()); + // *TODO: make sure blocks_size is a power of 2 + } + } + else if (!strcmp(argv[arg], "--reversible") || !strcmp(argv[arg], "-rev")) + { + reversible = true; + } else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log")) { // '--logmetrics' needs to be specified with a named test metric argument @@ -346,7 +450,7 @@ int main(int argc, char** argv) break; } } - else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-r")) + else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-a")) { analyze_performance = true; } @@ -364,7 +468,7 @@ int main(int argc, char** argv) } if (analyze_performance && !LLFastTimer::sMetricLog) { - std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log <perf> with -r) -> exit" << std::endl; + std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log <perf> with -a) -> exit" << std::endl; return 0; } @@ -382,10 +486,10 @@ int main(int argc, char** argv) std::list<std::string>::iterator out_file = output_filenames.begin(); std::list<std::string>::iterator in_end = input_filenames.end(); std::list<std::string>::iterator out_end = output_filenames.end(); - for (; in_file != in_end; ++in_file) + for (; in_file != in_end; ++in_file, ++out_file) { // Load file - LLPointer<LLImageRaw> raw_image = load_image(*in_file, image_stats); + LLPointer<LLImageRaw> raw_image = load_image(*in_file, discard_level, region, image_stats); if (!raw_image) { std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl; @@ -395,7 +499,7 @@ int main(int argc, char** argv) // Save file if (out_file != out_end) { - if (!save_image(*out_file, raw_image, image_stats)) + if (!save_image(*out_file, raw_image, blocks_size, precincts_size, reversible, image_stats)) { std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl; } @@ -403,29 +507,28 @@ int main(int argc, char** argv) { std::cout << *in_file << " -> " << *out_file << std::endl; } - ++out_file; } } - // Stop the perf gathering system if needed - if (LLFastTimer::sMetricLog) - { - LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName); - sAllDone = true; - } - // Output perf data if requested by user if (analyze_performance) { - std::cout << "Analyzing performance" << std::endl; - std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp"; std::string current_name = LLFastTimer::sLogName + ".slp"; std::string report_name = LLFastTimer::sLogName + "_report.csv"; + std::cout << "Analyzing performance, check report in : " << report_name << std::endl; + LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline_name, current_name, report_name); } + // Stop the perf gathering system if needed + if (LLFastTimer::sMetricLog) + { + LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName); + sAllDone = true; + } + // Cleanup and exit LLImage::cleanupClass(); if (fast_timer_log_thread) diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp index 532a2c1b0d..f3cf950afa 100644 --- a/indra/llcharacter/llbvhloader.cpp +++ b/indra/llcharacter/llbvhloader.cpp @@ -42,10 +42,10 @@ using namespace std; #define INCHES_TO_METERS 0.02540005f -const F32 POSITION_KEYFRAME_THRESHOLD = 0.03f; +const F32 POSITION_KEYFRAME_THRESHOLD_SQUARED = 0.03f * 0.03f; const F32 ROTATION_KEYFRAME_THRESHOLD = 0.01f; -const F32 POSITION_MOTION_THRESHOLD = 0.001f; +const F32 POSITION_MOTION_THRESHOLD_SQUARED = 0.001f * 0.001f; const F32 ROTATION_MOTION_THRESHOLD = 0.001f; char gInFile[1024]; /* Flawfinder: ignore */ @@ -1196,7 +1196,7 @@ void LLBVHLoader::optimize() if (ki_prev == ki_last_good_pos) { joint->mNumPosKeys++; - if (dist_vec(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD) + if (dist_vec_squared(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED) { pos_changed = TRUE; } @@ -1209,12 +1209,12 @@ void LLBVHLoader::optimize() LLVector3 current_pos(ki->mPos); LLVector3 interp_pos = lerp(current_pos, last_good_pos, 1.f / (F32)numPosFramesConsidered); - if (dist_vec(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD) + if (dist_vec_squared(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED) { pos_changed = TRUE; } - if (dist_vec(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD) + if (dist_vec_squared(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD_SQUARED) { ki_prev->mIgnorePos = TRUE; numPosFramesConsidered++; diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 6439ac3349..80df91a5c1 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -7,7 +7,6 @@ include(00-Common) include(LLCommon) include(Linking) include(Boost) -include(Pth) include(LLSharedLibs) include(GoogleBreakpad) include(GooglePerfTools) @@ -18,7 +17,6 @@ include_directories( ${EXPAT_INCLUDE_DIRS} ${LLCOMMON_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} - ${PTH_INCLUDE_DIRS} ) # add_executable(lltreeiterators lltreeiterators.cpp) @@ -63,6 +61,7 @@ set(llcommon_SOURCE_FILES llformat.cpp llframetimer.cpp llheartbeat.cpp + llinstancetracker.cpp llliveappconfig.cpp lllivefile.cpp lllog.cpp @@ -267,6 +266,10 @@ if(LLCOMMON_LINK_SHARED) add_definitions(-fPIC) endif(WINDOWS) endif(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + # always generate llcommon.pdb, even for "Release" builds + set_target_properties(llcommon PROPERTIES LINK_FLAGS "/DEBUG") + endif(WINDOWS) ll_stage_sharedlib(llcommon) else(LLCOMMON_LINK_SHARED) add_library (llcommon ${llcommon_SOURCE_FILES}) @@ -282,10 +285,15 @@ target_link_libraries( ${WINDOWS_LIBRARIES} ${BOOST_PROGRAM_OPTIONS_LIBRARY} ${BOOST_REGEX_LIBRARY} - ${PTH_LIBRARIES} ${GOOGLE_PERFTOOLS_LIBRARIES} ) +if (DARWIN) + include(CMakeFindFrameworks) + find_library(CARBON_LIBRARY Carbon) + target_link_libraries(llcommon ${CARBON_LIBRARY}) +endif (DARWIN) + add_dependencies(llcommon stage_third_party_libs) if (LL_TESTS) @@ -314,6 +322,7 @@ if (LL_TESTS) LL_ADD_INTEGRATION_TEST(lluri "" "${test_libs}") LL_ADD_INTEGRATION_TEST(reflection "" "${test_libs}") LL_ADD_INTEGRATION_TEST(stringize "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(lleventdispatcher "" "${test_libs}") # *TODO - reenable these once tcmalloc libs no longer break the build. #ADD_BUILD_TEST(llallocator llcommon) diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index 95cb606240..d0f287657e 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -312,6 +312,14 @@ const F32 CHAT_SHOUT_RADIUS = 100.f; const F32 CHAT_MAX_RADIUS = CHAT_SHOUT_RADIUS; const F32 CHAT_MAX_RADIUS_BY_TWO = CHAT_MAX_RADIUS / 2.f; +// squared editions of the above for distance checks +const F32 CHAT_WHISPER_RADIUS_SQUARED = CHAT_WHISPER_RADIUS * CHAT_WHISPER_RADIUS; +const F32 CHAT_NORMAL_RADIUS_SQUARED = CHAT_NORMAL_RADIUS * CHAT_NORMAL_RADIUS; +const F32 CHAT_SHOUT_RADIUS_SQUARED = CHAT_SHOUT_RADIUS * CHAT_SHOUT_RADIUS; +const F32 CHAT_MAX_RADIUS_SQUARED = CHAT_SHOUT_RADIUS_SQUARED; +const F32 CHAT_MAX_RADIUS_BY_TWO_SQUARED = CHAT_MAX_RADIUS_BY_TWO * CHAT_MAX_RADIUS_BY_TWO; + + // this times above gives barely audible radius const F32 CHAT_BARELY_AUDIBLE_FACTOR = 2.0f; diff --git a/indra/llcommon/lleventdispatcher.cpp b/indra/llcommon/lleventdispatcher.cpp index d6e820d793..5b6d4efbe9 100644 --- a/indra/llcommon/lleventdispatcher.cpp +++ b/indra/llcommon/lleventdispatcher.cpp @@ -41,6 +41,354 @@ #include "llevents.h" #include "llerror.h" #include "llsdutil.h" +#include "stringize.h" +#include <memory> // std::auto_ptr + +/***************************************************************************** +* LLSDArgsSource +*****************************************************************************/ +/** + * Store an LLSD array, producing its elements one at a time. Die with LL_ERRS + * if the consumer requests more elements than the array contains. + */ +class LL_COMMON_API LLSDArgsSource +{ +public: + LLSDArgsSource(const std::string function, const LLSD& args); + ~LLSDArgsSource(); + + LLSD next(); + + void done() const; + +private: + std::string _function; + LLSD _args; + LLSD::Integer _index; +}; + +LLSDArgsSource::LLSDArgsSource(const std::string function, const LLSD& args): + _function(function), + _args(args), + _index(0) +{ + if (! (_args.isUndefined() || _args.isArray())) + { + LL_ERRS("LLSDArgsSource") << _function << " needs an args array instead of " + << _args << LL_ENDL; + } +} + +LLSDArgsSource::~LLSDArgsSource() +{ + done(); +} + +LLSD LLSDArgsSource::next() +{ + if (_index >= _args.size()) + { + LL_ERRS("LLSDArgsSource") << _function << " requires more arguments than the " + << _args.size() << " provided: " << _args << LL_ENDL; + } + return _args[_index++]; +} + +void LLSDArgsSource::done() const +{ + if (_index < _args.size()) + { + LL_WARNS("LLSDArgsSource") << _function << " only consumed " << _index + << " of the " << _args.size() << " arguments provided: " + << _args << LL_ENDL; + } +} + +/***************************************************************************** +* LLSDArgsMapper +*****************************************************************************/ +/** + * From a formal parameters description and a map of arguments, construct an + * arguments array. + * + * That is, given: + * - an LLSD array of length n containing parameter-name strings, + * corresponding to the arguments of a function of interest + * - an LLSD collection specifying default parameter values, either: + * - an LLSD array of length m <= n, matching the rightmost m params, or + * - an LLSD map explicitly stating default name=value pairs + * - an LLSD map of parameter names and actual values for a particular + * function call + * construct an LLSD array of actual argument values for this function call. + * + * The parameter-names array and the defaults collection describe the function + * being called. The map might vary with every call, providing argument values + * for the described parameters. + * + * The array of parameter names must match the number of parameters expected + * by the function of interest. + * + * If you pass a map of default parameter values, it provides default values + * as you might expect. It is an error to specify a default value for a name + * not listed in the parameters array. + * + * If you pass an array of default parameter values, it is mapped to the + * rightmost m of the n parameter names. It is an error if the default-values + * array is longer than the parameter-names array. Consider the following + * parameter names: ["a", "b", "c", "d"]. + * + * - An empty array of default values (or an isUndefined() value) asserts that + * every one of the above parameter names is required. + * - An array of four default values [1, 2, 3, 4] asserts that every one of + * the above parameters is optional. If the current parameter map is empty, + * they will be passed to the function as [1, 2, 3, 4]. + * - An array of two default values [11, 12] asserts that parameters "a" and + * "b" are required, while "c" and "d" are optional, having default values + * "c"=11 and "d"=12. + * + * The arguments array is constructed as follows: + * + * - Arguments-map keys not found in the parameter-names array are ignored. + * - Entries from the map provide values for an improper subset of the + * parameters named in the parameter-names array. This results in a + * tentative values array with "holes." (size of map) + (number of holes) = + * (size of names array) + * - Holes are filled with the default values. + * - Any remaining holes constitute an error. + */ +class LL_COMMON_API LLSDArgsMapper +{ +public: + /// Accept description of function: function name, param names, param + /// default values + LLSDArgsMapper(const std::string& function, const LLSD& names, const LLSD& defaults); + + /// Given arguments map, return LLSD::Array of parameter values, or LL_ERRS. + LLSD map(const LLSD& argsmap) const; + +private: + static std::string formatlist(const LLSD&); + + // The function-name string is purely descriptive. We want error messages + // to be able to indicate which function's LLSDArgsMapper has the problem. + std::string _function; + // Store the names array pretty much as given. + LLSD _names; + // Though we're handed an array of name strings, it's more useful to us to + // store it as a map from name string to position index. Of course that's + // easy to generate from the incoming names array, but why do it more than + // once? + typedef std::map<LLSD::String, LLSD::Integer> IndexMap; + IndexMap _indexes; + // Generated array of default values, aligned with the array of param names. + LLSD _defaults; + // Indicate whether we have a default value for each param. + typedef std::vector<char> FilledVector; + FilledVector _has_dft; +}; + +LLSDArgsMapper::LLSDArgsMapper(const std::string& function, + const LLSD& names, const LLSD& defaults): + _function(function), + _names(names), + _has_dft(names.size()) +{ + if (! (_names.isUndefined() || _names.isArray())) + { + LL_ERRS("LLSDArgsMapper") << function << " names must be an array, not " << names << LL_ENDL; + } + LLSD::Integer nparams(_names.size()); + // From _names generate _indexes. + for (LLSD::Integer ni = 0, nend = _names.size(); ni < nend; ++ni) + { + _indexes[_names[ni]] = ni; + } + + // Presize _defaults() array so we don't have to resize it more than once. + // All entries are initialized to LLSD(); but since _has_dft is still all + // 0, they're all "holes" for now. + if (nparams) + { + _defaults[nparams - 1] = LLSD(); + } + + if (defaults.isUndefined() || defaults.isArray()) + { + LLSD::Integer ndefaults = defaults.size(); + // defaults is a (possibly empty) array. Right-align it with names. + if (ndefaults > nparams) + { + LL_ERRS("LLSDArgsMapper") << function << " names array " << names + << " shorter than defaults array " << defaults << LL_ENDL; + } + + // Offset by which we slide defaults array right to right-align with + // _names array + LLSD::Integer offset = nparams - ndefaults; + // Fill rightmost _defaults entries from defaults, and mark them as + // filled + for (LLSD::Integer i = 0, iend = ndefaults; i < iend; ++i) + { + _defaults[i + offset] = defaults[i]; + _has_dft[i + offset] = 1; + } + } + else if (defaults.isMap()) + { + // defaults is a map. Use it to populate the _defaults array. + LLSD bogus; + for (LLSD::map_const_iterator mi(defaults.beginMap()), mend(defaults.endMap()); + mi != mend; ++mi) + { + IndexMap::const_iterator ixit(_indexes.find(mi->first)); + if (ixit == _indexes.end()) + { + bogus.append(mi->first); + continue; + } + + LLSD::Integer pos = ixit->second; + // Store default value at that position in the _defaults array. + _defaults[pos] = mi->second; + // Don't forget to record the fact that we've filled this + // position. + _has_dft[pos] = 1; + } + if (bogus.size()) + { + LL_ERRS("LLSDArgsMapper") << function << " defaults specified for nonexistent params " + << formatlist(bogus) << LL_ENDL; + } + } + else + { + LL_ERRS("LLSDArgsMapper") << function << " defaults must be a map or an array, not " + << defaults << LL_ENDL; + } +} + +LLSD LLSDArgsMapper::map(const LLSD& argsmap) const +{ + if (! (argsmap.isUndefined() || argsmap.isMap() || argsmap.isArray())) + { + LL_ERRS("LLSDArgsMapper") << _function << " map() needs a map or array, not " + << argsmap << LL_ENDL; + } + // Initialize the args array. Indexing a non-const LLSD array grows it + // to appropriate size, but we don't want to resize this one on each + // new operation. Just make it as big as we need before we start + // stuffing values into it. + LLSD args(LLSD::emptyArray()); + if (_defaults.size() == 0) + { + // If this function requires no arguments, fast exit. (Don't try to + // assign to args[-1].) + return args; + } + args[_defaults.size() - 1] = LLSD(); + + // Get a vector of chars to indicate holes. It's tempting to just scan + // for LLSD::isUndefined() values after filling the args array from + // the map, but it's plausible for caller to explicitly pass + // isUndefined() as the value of some parameter name. That's legal + // since isUndefined() has well-defined conversions (default value) + // for LLSD data types. So use a whole separate array for detecting + // holes. (Avoid std::vector<bool> which is known to be odd -- can we + // iterate?) + FilledVector filled(args.size()); + + if (argsmap.isArray()) + { + // Fill args from array. If there are too many args in passed array, + // ignore the rest. + LLSD::Integer size(argsmap.size()); + if (size > args.size()) + { + // We don't just use std::min() because we want to sneak in this + // warning if caller passes too many args. + LL_WARNS("LLSDArgsMapper") << _function << " needs " << args.size() + << " params, ignoring last " << (size - args.size()) + << " of passed " << size << ": " << argsmap << LL_ENDL; + size = args.size(); + } + for (LLSD::Integer i(0); i < size; ++i) + { + // Copy the actual argument from argsmap + args[i] = argsmap[i]; + // Note that it's been filled + filled[i] = 1; + } + } + else + { + // argsmap is in fact a map. Walk the map. + for (LLSD::map_const_iterator mi(argsmap.beginMap()), mend(argsmap.endMap()); + mi != mend; ++mi) + { + // mi->first is a parameter-name string, with mi->second its + // value. Look up the name's position index in _indexes. + IndexMap::const_iterator ixit(_indexes.find(mi->first)); + if (ixit == _indexes.end()) + { + // Allow for a map containing more params than were passed in + // our names array. Caller typically receives a map containing + // the function name, cruft such as reqid, etc. Ignore keys + // not defined in _indexes. + LL_DEBUGS("LLSDArgsMapper") << _function << " ignoring " + << mi->first << "=" << mi->second << LL_ENDL; + continue; + } + LLSD::Integer pos = ixit->second; + // Store the value at that position in the args array. + args[pos] = mi->second; + // Don't forget to record the fact that we've filled this + // position. + filled[pos] = 1; + } + } + + // Fill any remaining holes from _defaults. + LLSD unfilled(LLSD::emptyArray()); + for (LLSD::Integer i = 0, iend = args.size(); i < iend; ++i) + { + if (! filled[i]) + { + // If there's no default value for this parameter, that's an + // error. + if (! _has_dft[i]) + { + unfilled.append(_names[i]); + } + else + { + args[i] = _defaults[i]; + } + } + } + // If any required args -- args without defaults -- were left unfilled + // by argsmap, that's a problem. + if (unfilled.size()) + { + LL_ERRS("LLSDArgsMapper") << _function << " missing required arguments " + << formatlist(unfilled) << " from " << argsmap << LL_ENDL; + } + + // done + return args; +} + +std::string LLSDArgsMapper::formatlist(const LLSD& list) +{ + std::ostringstream out; + const char* delim = ""; + for (LLSD::array_const_iterator li(list.beginArray()), lend(list.endArray()); + li != lend; ++li) + { + out << delim << li->asString(); + delim = ", "; + } + return out.str(); +} LLEventDispatcher::LLEventDispatcher(const std::string& desc, const std::string& key): mDesc(desc), @@ -52,12 +400,181 @@ LLEventDispatcher::~LLEventDispatcher() { } +/** + * DispatchEntry subclass used for callables accepting(const LLSD&) + */ +struct LLEventDispatcher::LLSDDispatchEntry: public LLEventDispatcher::DispatchEntry +{ + LLSDDispatchEntry(const std::string& desc, const Callable& func, const LLSD& required): + DispatchEntry(desc), + mFunc(func), + mRequired(required) + {} + + Callable mFunc; + LLSD mRequired; + + virtual void call(const std::string& desc, const LLSD& event) const + { + // Validate the syntax of the event itself. + std::string mismatch(llsd_matches(mRequired, event)); + if (! mismatch.empty()) + { + LL_ERRS("LLEventDispatcher") << desc << ": bad request: " << mismatch << LL_ENDL; + } + // Event syntax looks good, go for it! + mFunc(event); + } + + virtual LLSD addMetadata(LLSD meta) const + { + meta["required"] = mRequired; + return meta; + } +}; + +/** + * DispatchEntry subclass for passing LLSD to functions accepting + * arbitrary argument types (convertible via LLSDParam) + */ +struct LLEventDispatcher::ParamsDispatchEntry: public LLEventDispatcher::DispatchEntry +{ + ParamsDispatchEntry(const std::string& desc, const invoker_function& func): + DispatchEntry(desc), + mInvoker(func) + {} + + invoker_function mInvoker; + + virtual void call(const std::string& desc, const LLSD& event) const + { + LLSDArgsSource src(desc, event); + mInvoker(boost::bind(&LLSDArgsSource::next, boost::ref(src))); + } +}; + +/** + * DispatchEntry subclass for dispatching LLSD::Array to functions accepting + * arbitrary argument types (convertible via LLSDParam) + */ +struct LLEventDispatcher::ArrayParamsDispatchEntry: public LLEventDispatcher::ParamsDispatchEntry +{ + ArrayParamsDispatchEntry(const std::string& desc, const invoker_function& func, + LLSD::Integer arity): + ParamsDispatchEntry(desc, func), + mArity(arity) + {} + + LLSD::Integer mArity; + + virtual LLSD addMetadata(LLSD meta) const + { + LLSD array(LLSD::emptyArray()); + // Resize to number of arguments required + if (mArity) + array[mArity - 1] = LLSD(); + llassert_always(array.size() == mArity); + meta["required"] = array; + return meta; + } +}; + +/** + * DispatchEntry subclass for dispatching LLSD::Map to functions accepting + * arbitrary argument types (convertible via LLSDParam) + */ +struct LLEventDispatcher::MapParamsDispatchEntry: public LLEventDispatcher::ParamsDispatchEntry +{ + MapParamsDispatchEntry(const std::string& name, const std::string& desc, + const invoker_function& func, + const LLSD& params, const LLSD& defaults): + ParamsDispatchEntry(desc, func), + mMapper(name, params, defaults), + mRequired(LLSD::emptyMap()) + { + // Build the set of all param keys, then delete the ones that are + // optional. What's left are the ones that are required. + for (LLSD::array_const_iterator pi(params.beginArray()), pend(params.endArray()); + pi != pend; ++pi) + { + mRequired[pi->asString()] = LLSD(); + } + + if (defaults.isArray() || defaults.isUndefined()) + { + // Right-align the params and defaults arrays. + LLSD::Integer offset = params.size() - defaults.size(); + // Now the name of every defaults[i] is at params[i + offset]. + for (LLSD::Integer i(0), iend(defaults.size()); i < iend; ++i) + { + // Erase this optional param from mRequired. + mRequired.erase(params[i + offset].asString()); + // Instead, make an entry in mOptional with the default + // param's name and value. + mOptional[params[i + offset].asString()] = defaults[i]; + } + } + else if (defaults.isMap()) + { + // if defaults is already a map, then it's already in the form we + // intend to deliver in metadata + mOptional = defaults; + // Just delete from mRequired every key appearing in mOptional. + for (LLSD::map_const_iterator mi(mOptional.beginMap()), mend(mOptional.endMap()); + mi != mend; ++mi) + { + mRequired.erase(mi->first); + } + } + } + + LLSDArgsMapper mMapper; + LLSD mRequired; + LLSD mOptional; + + virtual void call(const std::string& desc, const LLSD& event) const + { + // Just convert from LLSD::Map to LLSD::Array using mMapper, then pass + // to base-class call() method. + ParamsDispatchEntry::call(desc, mMapper.map(event)); + } + + virtual LLSD addMetadata(LLSD meta) const + { + meta["required"] = mRequired; + meta["optional"] = mOptional; + return meta; + } +}; + +void LLEventDispatcher::addArrayParamsDispatchEntry(const std::string& name, + const std::string& desc, + const invoker_function& invoker, + LLSD::Integer arity) +{ + mDispatch.insert( + DispatchMap::value_type(name, DispatchMap::mapped_type( + new ArrayParamsDispatchEntry(desc, invoker, arity)))); +} + +void LLEventDispatcher::addMapParamsDispatchEntry(const std::string& name, + const std::string& desc, + const invoker_function& invoker, + const LLSD& params, + const LLSD& defaults) +{ + mDispatch.insert( + DispatchMap::value_type(name, DispatchMap::mapped_type( + new MapParamsDispatchEntry(name, desc, invoker, params, defaults)))); +} + /// Register a callable by name void LLEventDispatcher::add(const std::string& name, const std::string& desc, const Callable& callable, const LLSD& required) { - mDispatch.insert(DispatchMap::value_type(name, - DispatchMap::mapped_type(callable, desc, required))); + mDispatch.insert( + DispatchMap::value_type(name, DispatchMap::mapped_type( + new LLSDDispatchEntry(desc, callable, required)))); } void LLEventDispatcher::addFail(const std::string& name, const std::string& classname) const @@ -83,7 +600,7 @@ bool LLEventDispatcher::remove(const std::string& name) /// such callable exists, die with LL_ERRS. void LLEventDispatcher::operator()(const std::string& name, const LLSD& event) const { - if (! attemptCall(name, event)) + if (! try_call(name, event)) { LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << "): '" << name << "' not found" << LL_ENDL; @@ -98,44 +615,29 @@ void LLEventDispatcher::operator()(const LLSD& event) const // This could/should be implemented in terms of the two-arg overload. // However -- we can produce a more informative error message. std::string name(event[mKey]); - if (! attemptCall(name, event)) + if (! try_call(name, event)) { LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << "): bad " << mKey << " value '" << name << "'" << LL_ENDL; } } -bool LLEventDispatcher::attemptCall(const std::string& name, const LLSD& event) const +bool LLEventDispatcher::try_call(const LLSD& event) const { - DispatchMap::const_iterator found = mDispatch.find(name); - if (found == mDispatch.end()) - { - // The reason we only return false, leaving it up to our caller to die - // with LL_ERRS, is that different callers have different amounts of - // available information. - return false; - } - // Found the name, so it's plausible to even attempt the call. But first, - // validate the syntax of the event itself. - std::string mismatch(llsd_matches(found->second.mRequired, event)); - if (! mismatch.empty()) - { - LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << ") calling '" << name - << "': bad request: " << mismatch << LL_ENDL; - } - // Event syntax looks good, go for it! - (found->second.mFunc)(event); - return true; // tell caller we were able to call + return try_call(event[mKey], event); } -LLEventDispatcher::Callable LLEventDispatcher::get(const std::string& name) const +bool LLEventDispatcher::try_call(const std::string& name, const LLSD& event) const { DispatchMap::const_iterator found = mDispatch.find(name); if (found == mDispatch.end()) { - return Callable(); + return false; } - return found->second.mFunc; + // Found the name, so it's plausible to even attempt the call. + found->second->call(STRINGIZE("LLEventDispatcher(" << mDesc << ") calling '" << name << "'"), + event); + return true; // tell caller we were able to call } LLSD LLEventDispatcher::getMetadata(const std::string& name) const @@ -147,9 +649,8 @@ LLSD LLEventDispatcher::getMetadata(const std::string& name) const } LLSD meta; meta["name"] = name; - meta["desc"] = found->second.mDesc; - meta["required"] = found->second.mRequired; - return meta; + meta["desc"] = found->second->mDesc; + return found->second->addMetadata(meta); } LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key): @@ -164,3 +665,8 @@ bool LLDispatchListener::process(const LLSD& event) (*this)(event); return false; } + +LLEventDispatcher::DispatchEntry::DispatchEntry(const std::string& desc): + mDesc(desc) +{} + diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h index dfffd59eb6..7acc61de4e 100644 --- a/indra/llcommon/lleventdispatcher.h +++ b/indra/llcommon/lleventdispatcher.h @@ -27,18 +27,56 @@ * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ + * + * The invoker machinery that constructs a boost::fusion argument list for use + * with boost::fusion::invoke() is derived from + * http://www.boost.org/doc/libs/1_45_0/libs/function_types/example/interpreter.hpp + * whose license information is copied below: + * + * "(C) Copyright Tobias Schwinger + * + * Use modification and distribution are subject to the boost Software License, + * Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt)." */ #if ! defined(LL_LLEVENTDISPATCHER_H) #define LL_LLEVENTDISPATCHER_H +// nil is too generic a term to be allowed to be a global macro. In +// particular, boost::fusion defines a 'class nil' (properly encapsulated in a +// namespace) that a global 'nil' macro breaks badly. +#if defined(nil) +// Capture the value of the macro 'nil', hoping int is an appropriate type. +static const int nil_(nil); +// Now forget the macro. +#undef nil +// Finally, reintroduce 'nil' as a properly-scoped alias for the previously- +// defined const 'nil_'. Make it static since otherwise it produces duplicate- +// symbol link errors later. +static const int& nil(nil_); +#endif + #include <string> -#include <map> +#include <boost/shared_ptr.hpp> #include <boost/function.hpp> #include <boost/bind.hpp> #include <boost/iterator/transform_iterator.hpp> +#include <boost/utility/enable_if.hpp> +#include <boost/function_types/is_nonmember_callable_builtin.hpp> +#include <boost/function_types/parameter_types.hpp> +#include <boost/function_types/function_arity.hpp> +#include <boost/type_traits/remove_cv.hpp> +#include <boost/type_traits/remove_reference.hpp> +#include <boost/fusion/include/push_back.hpp> +#include <boost/fusion/include/cons.hpp> +#include <boost/fusion/include/invoke.hpp> +#include <boost/mpl/begin.hpp> +#include <boost/mpl/end.hpp> +#include <boost/mpl/next.hpp> +#include <boost/mpl/deref.hpp> #include <typeinfo> #include "llevents.h" +#include "llsdutil.h" class LLSD; @@ -54,12 +92,18 @@ public: LLEventDispatcher(const std::string& desc, const std::string& key); virtual ~LLEventDispatcher(); - /// Accept any C++ callable, typically a boost::bind() expression + /// @name Register functions accepting(const LLSD&) + //@{ + + /// Accept any C++ callable with the right signature, typically a + /// boost::bind() expression typedef boost::function<void(const LLSD&)> Callable; /** - * Register a @a callable by @a name. The optional @a required parameter - * is used to validate the structure of each incoming event (see + * Register a @a callable by @a name. The passed @a callable accepts a + * single LLSD value and uses it in any way desired, e.g. extract + * parameters and call some other function. The optional @a required + * parameter is used to validate the structure of each incoming event (see * llsd_matches()). */ void add(const std::string& name, @@ -68,9 +112,23 @@ public: const LLSD& required=LLSD()); /** + * The case of a free function (or static method) accepting(const LLSD&) + * could also be intercepted by the arbitrary-args overload below. Ensure + * that it's directed to the Callable overload above instead. + */ + void add(const std::string& name, + const std::string& desc, + void (*f)(const LLSD&), + const LLSD& required=LLSD()) + { + add(name, desc, Callable(f), required); + } + + /** * Special case: a subclass of this class can pass an unbound member - * function pointer without explicitly specifying the - * <tt>boost::bind()</tt> expression. + * function pointer (of an LLEventDispatcher subclass) without explicitly + * specifying the <tt>boost::bind()</tt> expression. The passed @a method + * accepts a single LLSD value, presumably containing other parameters. */ template <class CLASS> void add(const std::string& name, @@ -81,7 +139,8 @@ public: addMethod<CLASS>(name, desc, method, required); } - /// Overload for both const and non-const methods + /// Overload for both const and non-const methods. The passed @a method + /// accepts a single LLSD value, presumably containing other parameters. template <class CLASS> void add(const std::string& name, const std::string& desc, @@ -91,15 +150,106 @@ public: addMethod<CLASS>(name, desc, method, required); } - /// Convenience: for LLEventDispatcher, not every callable needs a - /// documentation string. - template <typename CALLABLE> - void add(const std::string& name, - CALLABLE callable, - const LLSD& required=LLSD()) - { - add(name, "", callable, required); - } + //@} + + /// @name Register functions with arbitrary param lists + //@{ + + /** + * Register a free function with arbitrary parameters. (This also works + * for static class methods.) + * + * @note This supports functions with up to about 6 parameters -- after + * that you start getting dismaying compile errors in which + * boost::fusion::joint_view is mentioned a surprising number of times. + * + * When calling this name, pass an LLSD::Array. Each entry in turn will be + * converted to the corresponding parameter type using LLSDParam. + */ + template<typename Function> + typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin<Function> + >::type add(const std::string& name, + const std::string& desc, + Function f); + + /** + * Register a nonstatic class method with arbitrary parameters. + * + * @note This supports functions with up to about 6 parameters -- after + * that you start getting dismaying compile errors in which + * boost::fusion::joint_view is mentioned a surprising number of times. + * + * To cover cases such as a method on an LLSingleton we don't yet want to + * instantiate, instead of directly storing an instance pointer, accept a + * nullary callable returning a pointer/reference to the desired class + * instance. If you already have an instance in hand, + * boost::lambda::var(instance) or boost::lambda::constant(instance_ptr) + * produce suitable callables. + * + * When calling this name, pass an LLSD::Array. Each entry in turn will be + * converted to the corresponding parameter type using LLSDParam. + */ + template<typename Method, typename InstanceGetter> + typename boost::enable_if< boost::function_types::is_member_function_pointer<Method> + >::type add(const std::string& name, + const std::string& desc, + Method f, + const InstanceGetter& getter); + + /** + * Register a free function with arbitrary parameters. (This also works + * for static class methods.) + * + * @note This supports functions with up to about 6 parameters -- after + * that you start getting dismaying compile errors in which + * boost::fusion::joint_view is mentioned a surprising number of times. + * + * Pass an LLSD::Array of parameter names, and optionally another + * LLSD::Array of default parameter values, a la LLSDArgsMapper. + * + * When calling this name, pass an LLSD::Map. We will internally generate + * an LLSD::Array using LLSDArgsMapper and then convert each entry in turn + * to the corresponding parameter type using LLSDParam. + */ + template<typename Function> + typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin<Function> + >::type add(const std::string& name, + const std::string& desc, + Function f, + const LLSD& params, + const LLSD& defaults=LLSD()); + + /** + * Register a nonstatic class method with arbitrary parameters. + * + * @note This supports functions with up to about 6 parameters -- after + * that you start getting dismaying compile errors in which + * boost::fusion::joint_view is mentioned a surprising number of times. + * + * To cover cases such as a method on an LLSingleton we don't yet want to + * instantiate, instead of directly storing an instance pointer, accept a + * nullary callable returning a pointer/reference to the desired class + * instance. If you already have an instance in hand, + * boost::lambda::var(instance) or boost::lambda::constant(instance_ptr) + * produce suitable callables. + * + * Pass an LLSD::Array of parameter names, and optionally another + * LLSD::Array of default parameter values, a la LLSDArgsMapper. + * + * When calling this name, pass an LLSD::Map. We will internally generate + * an LLSD::Array using LLSDArgsMapper and then convert each entry in turn + * to the corresponding parameter type using LLSDParam. + */ + template<typename Method, typename InstanceGetter> + typename boost::enable_if< boost::function_types::is_member_function_pointer<Method> + >::type add(const std::string& name, + const std::string& desc, + Method f, + const InstanceGetter& getter, + const LLSD& params, + const LLSD& defaults=LLSD()); + + //@} /// Unregister a callable bool remove(const std::string& name); @@ -109,12 +259,25 @@ public: /// the @a required prototype specified at add() time, die with LL_ERRS. void operator()(const std::string& name, const LLSD& event) const; + /// Call a registered callable with an explicitly-specified name and + /// return <tt>true</tt>. If no such callable exists, return + /// <tt>false</tt>. If the @a event fails to match the @a required + /// prototype specified at add() time, die with LL_ERRS. + bool try_call(const std::string& name, const LLSD& event) const; + /// Extract the @a key value from the incoming @a event, and call the /// callable whose name is specified by that map @a key. If no such /// callable exists, die with LL_ERRS. If the @a event fails to match the /// @a required prototype specified at add() time, die with LL_ERRS. void operator()(const LLSD& event) const; + /// Extract the @a key value from the incoming @a event, call the callable + /// whose name is specified by that map @a key and return <tt>true</tt>. + /// If no such callable exists, return <tt>false</tt>. If the @a event + /// fails to match the @a required prototype specified at add() time, die + /// with LL_ERRS. + bool try_call(const LLSD& event) const; + /// @name Iterate over defined names //@{ typedef std::pair<std::string, std::string> NameDesc; @@ -122,16 +285,22 @@ public: private: struct DispatchEntry { - DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required): - mFunc(func), - mDesc(desc), - mRequired(required) - {} - Callable mFunc; + DispatchEntry(const std::string& desc); + virtual ~DispatchEntry() {} // suppress MSVC warning, sigh + std::string mDesc; - LLSD mRequired; + + virtual void call(const std::string& desc, const LLSD& event) const = 0; + virtual LLSD addMetadata(LLSD) const = 0; }; - typedef std::map<std::string, DispatchEntry> DispatchMap; + // Tried using boost::ptr_map<std::string, DispatchEntry>, but ptr_map<> + // wants its value type to be "clonable," even just to dereference an + // iterator. I don't want to clone entries -- if I have to copy an entry + // around, I want it to continue pointing to the same DispatchEntry + // subclass object. However, I definitely want DispatchMap to destroy + // DispatchEntry if no references are outstanding at the time an entry is + // removed. This looks like a job for boost::shared_ptr. + typedef std::map<std::string, boost::shared_ptr<DispatchEntry> > DispatchMap; public: /// We want the flexibility to redefine what data we store per name, @@ -149,10 +318,6 @@ public: } //@} - /// Fetch the Callable for the specified name. If no such name was - /// registered, return an empty() Callable. - Callable get(const std::string& name) const; - /// Get information about a specific Callable LLSD getMetadata(const std::string& name) const; @@ -175,18 +340,184 @@ private: } } void addFail(const std::string& name, const std::string& classname) const; - /// try to dispatch, return @c true if success - bool attemptCall(const std::string& name, const LLSD& event) const; std::string mDesc, mKey; DispatchMap mDispatch; static NameDesc makeNameDesc(const DispatchMap::value_type& item) { - return NameDesc(item.first, item.second.mDesc); + return NameDesc(item.first, item.second->mDesc); + } + + struct LLSDDispatchEntry; + struct ParamsDispatchEntry; + struct ArrayParamsDispatchEntry; + struct MapParamsDispatchEntry; + + // Step 2 of parameter analysis. Instantiating invoker<some_function_type> + // implicitly sets its From and To parameters to the (compile time) begin + // and end iterators over that function's parameter types. + template< typename Function + , class From = typename boost::mpl::begin< boost::function_types::parameter_types<Function> >::type + , class To = typename boost::mpl::end< boost::function_types::parameter_types<Function> >::type + > + struct invoker; + + // deliver LLSD arguments one at a time + typedef boost::function<LLSD()> args_source; + // obtain args from an args_source to build param list and call target + // function + typedef boost::function<void(const args_source&)> invoker_function; + + template <typename Function> + invoker_function make_invoker(Function f); + template <typename Method, typename InstanceGetter> + invoker_function make_invoker(Method f, const InstanceGetter& getter); + void addArrayParamsDispatchEntry(const std::string& name, + const std::string& desc, + const invoker_function& invoker, + LLSD::Integer arity); + void addMapParamsDispatchEntry(const std::string& name, + const std::string& desc, + const invoker_function& invoker, + const LLSD& params, + const LLSD& defaults); +}; + +/***************************************************************************** +* LLEventDispatcher template implementation details +*****************************************************************************/ +// Step 3 of parameter analysis, the recursive case. +template<typename Function, class From, class To> +struct LLEventDispatcher::invoker +{ + template<typename T> + struct remove_cv_ref + : boost::remove_cv< typename boost::remove_reference<T>::type > + { }; + + // apply() accepts an arbitrary boost::fusion sequence as args. It + // examines the next parameter type in the parameter-types sequence + // bounded by From and To, obtains the next LLSD object from the passed + // args_source and constructs an LLSDParam of appropriate type to try + // to convert the value. It then recurs with the next parameter-types + // iterator, passing the args sequence thus far. + template<typename Args> + static inline + void apply(Function func, const args_source& argsrc, Args const & args) + { + typedef typename boost::mpl::deref<From>::type arg_type; + typedef typename boost::mpl::next<From>::type next_iter_type; + typedef typename remove_cv_ref<arg_type>::type plain_arg_type; + + invoker<Function, next_iter_type, To>::apply + ( func, argsrc, boost::fusion::push_back(args, LLSDParam<plain_arg_type>(argsrc()))); + } + + // Special treatment for instance (first) parameter of a non-static member + // function. Accept the instance-getter callable, calling that to produce + // the first args value. Since we know we're at the top of the recursion + // chain, we need not also require a partial args sequence from our caller. + template <typename InstanceGetter> + static inline + void method_apply(Function func, const args_source& argsrc, const InstanceGetter& getter) + { + typedef typename boost::mpl::next<From>::type next_iter_type; + + // Instead of grabbing the first item from argsrc and making an + // LLSDParam of it, call getter() and pass that as the instance param. + invoker<Function, next_iter_type, To>::apply + ( func, argsrc, boost::fusion::push_back(boost::fusion::nil(), boost::ref(getter()))); + } +}; + +// Step 4 of parameter analysis, the leaf case. When the general +// invoker<Function, From, To> logic has advanced From until it matches To, +// the compiler will pick this template specialization. +template<typename Function, class To> +struct LLEventDispatcher::invoker<Function,To,To> +{ + // the argument list is complete, now call the function + template<typename Args> + static inline + void apply(Function func, const args_source&, Args const & args) + { + boost::fusion::invoke(func, args); } }; +template<typename Function> +typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin<Function> >::type +LLEventDispatcher::add(const std::string& name, const std::string& desc, Function f) +{ + // Construct an invoker_function, a callable accepting const args_source&. + // Add to DispatchMap an ArrayParamsDispatchEntry that will handle the + // caller's LLSD::Array. + addArrayParamsDispatchEntry(name, desc, make_invoker(f), + boost::function_types::function_arity<Function>::value); +} + +template<typename Method, typename InstanceGetter> +typename boost::enable_if< boost::function_types::is_member_function_pointer<Method> >::type +LLEventDispatcher::add(const std::string& name, const std::string& desc, Method f, + const InstanceGetter& getter) +{ + // Subtract 1 from the compile-time arity because the getter takes care of + // the first parameter. We only need (arity - 1) additional arguments. + addArrayParamsDispatchEntry(name, desc, make_invoker(f, getter), + boost::function_types::function_arity<Method>::value - 1); +} + +template<typename Function> +typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin<Function> >::type +LLEventDispatcher::add(const std::string& name, const std::string& desc, Function f, + const LLSD& params, const LLSD& defaults) +{ + // See comments for previous is_nonmember_callable_builtin add(). + addMapParamsDispatchEntry(name, desc, make_invoker(f), params, defaults); +} + +template<typename Method, typename InstanceGetter> +typename boost::enable_if< boost::function_types::is_member_function_pointer<Method> >::type +LLEventDispatcher::add(const std::string& name, const std::string& desc, Method f, + const InstanceGetter& getter, + const LLSD& params, const LLSD& defaults) +{ + addMapParamsDispatchEntry(name, desc, make_invoker(f, getter), params, defaults); +} + +template <typename Function> +LLEventDispatcher::invoker_function +LLEventDispatcher::make_invoker(Function f) +{ + // Step 1 of parameter analysis, the top of the recursion. Passing a + // suitable f (see add()'s enable_if condition) to this method causes it + // to infer the function type; specifying that function type to invoker<> + // causes it to fill in the begin/end MPL iterators over the function's + // list of parameter types. + // While normally invoker::apply() could infer its template type from the + // boost::fusion::nil parameter value, here we must be explicit since + // we're boost::bind()ing it rather than calling it directly. + return boost::bind(&invoker<Function>::template apply<boost::fusion::nil>, + f, + _1, + boost::fusion::nil()); +} + +template <typename Method, typename InstanceGetter> +LLEventDispatcher::invoker_function +LLEventDispatcher::make_invoker(Method f, const InstanceGetter& getter) +{ + // Use invoker::method_apply() to treat the instance (first) arg specially. + return boost::bind(&invoker<Method>::template method_apply<InstanceGetter>, + f, + _1, + getter); +} + +/***************************************************************************** +* LLDispatchListener +*****************************************************************************/ /** * Bundle an LLEventPump and a listener with an LLEventDispatcher. A class * that contains (or derives from) LLDispatchListener need only specify the diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index 97e2bdeb57..ff03506e84 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -588,3 +588,16 @@ void LLReqID::stamp(LLSD& response) const } response["reqid"] = mReqid; } + +bool sendReply(const LLSD& reply, const LLSD& request, const std::string& replyKey) +{ + // Copy 'reply' to modify it. + LLSD newreply(reply); + // Get the ["reqid"] element from request + LLReqID reqID(request); + // and copy it to 'newreply'. + reqID.stamp(newreply); + // Send reply on LLEventPump named in request[replyKey]. Don't forget to + // send the modified 'newreply' instead of the original 'reply'. + return LLEventPumps::instance().obtain(request[replyKey]).post(newreply); +} diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h index 2491cf1371..65b0fef354 100644 --- a/indra/llcommon/llevents.h +++ b/indra/llcommon/llevents.h @@ -692,6 +692,20 @@ private: }; /** + * Conventionally send a reply to a request event. + * + * @a reply is the LLSD reply event to send + * @a request is the corresponding LLSD request event + * @a replyKey is the key in the @a request event, conventionally ["reply"], + * whose value is the name of the LLEventPump on which to send the reply. + * + * Before sending the reply event, sendReply() copies the ["reqid"] item from + * the request to the reply. + */ +LL_COMMON_API bool sendReply(const LLSD& reply, const LLSD& request, + const std::string& replyKey="reply"); + +/** * Base class for LLListenerWrapper. See visit_and_connect() and llwrap(). We * provide virtual @c accept_xxx() methods, customization points allowing a * subclass access to certain data visible at LLEventPump::listen() time. diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp index 89bc6cca39..f576204511 100644 --- a/indra/llcommon/llinstancetracker.cpp +++ b/indra/llcommon/llinstancetracker.cpp @@ -32,6 +32,17 @@ // external library headers // other Linden headers -// llinstancetracker.h is presently header-only. This file exists only because our CMake -// test macro ADD_BUILD_TEST requires it. -int dummy = 0; +//static +void * & LLInstanceTrackerBase::getInstances(std::type_info const & info) +{ + static std::map<std::string, void *> instances; + + std::string k = info.name(); + if(instances.find(k) == instances.end()) + { + instances[k] = NULL; + } + + return instances[k]; +} + diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 4945461d62..b971b2f914 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -37,14 +37,21 @@ #include <boost/iterator/transform_iterator.hpp> #include <boost/iterator/indirect_iterator.hpp> +class LL_COMMON_API LLInstanceTrackerBase : public boost::noncopyable +{ + protected: + static void * & getInstances(std::type_info const & info); +}; + /// This mix-in class adds support for tracking all instances of the specified class parameter T /// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup /// If KEY is not provided, then instances are stored in a simple set /// @NOTE: see explicit specialization below for default KEY==T* case template<typename T, typename KEY = T*> -class LLInstanceTracker : boost::noncopyable +class LLInstanceTracker : public LLInstanceTrackerBase { typedef typename std::map<KEY, T*> InstanceMap; + typedef LLInstanceTracker<T, KEY> MyT; typedef boost::function<const KEY&(typename InstanceMap::value_type&)> KeyGetter; typedef boost::function<T*(typename InstanceMap::value_type&)> InstancePtrGetter; public: @@ -99,25 +106,26 @@ private: static InstanceMap& getMap_() { - if (! sInstances) + void * & instances = getInstances(typeid(MyT)); + if (! instances) { - sInstances = new InstanceMap; + instances = new InstanceMap; } - return *sInstances; + return * static_cast<InstanceMap*>(instances); } private: KEY mKey; - static InstanceMap* sInstances; }; /// explicit specialization for default case where KEY is T* /// use a simple std::set<T*> template<typename T> -class LLInstanceTracker<T, T*> +class LLInstanceTracker<T, T*> : public LLInstanceTrackerBase { typedef typename std::set<T*> InstanceSet; + typedef LLInstanceTracker<T, T*> MyT; public: /// Dereferencing key_iter gives you a T* (since T* is the key) typedef typename InstanceSet::iterator key_iter; @@ -172,19 +180,17 @@ protected: static InstanceSet& getSet_() { - if (! sInstances) + void * & instances = getInstances(typeid(MyT)); + if (! instances) { - sInstances = new InstanceSet; + instances = new InstanceSet; } - return *sInstances; + return * static_cast<InstanceSet *>(instances); } - static InstanceSet* sInstances; static S32 sIterationNestDepth; }; -template <typename T, typename KEY> typename LLInstanceTracker<T, KEY>::InstanceMap* LLInstanceTracker<T, KEY>::sInstances = NULL; -template <typename T> typename LLInstanceTracker<T, T*>::InstanceSet* LLInstanceTracker<T, T*>::sInstances = NULL; template <typename T> S32 LLInstanceTracker<T, T*>::sIterationNestDepth = 0; #endif diff --git a/indra/llcommon/llsdutil.cpp b/indra/llcommon/llsdutil.cpp index f8f9ece058..803417d368 100644 --- a/indra/llcommon/llsdutil.cpp +++ b/indra/llcommon/llsdutil.cpp @@ -41,6 +41,7 @@ #include "llsdserialize.h" #include "stringize.h" +#include "is_approx_equal_fraction.h" #include <map> #include <set> @@ -571,7 +572,7 @@ std::string llsd_matches(const LLSD& prototype, const LLSD& data, const std::str return match_types(prototype.type(), TypeVector(), data.type(), pfx); } -bool llsd_equals(const LLSD& lhs, const LLSD& rhs) +bool llsd_equals(const LLSD& lhs, const LLSD& rhs, unsigned bits) { // We're comparing strict equality of LLSD representation rather than // performing any conversions. So if the types aren't equal, the LLSD @@ -588,6 +589,20 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs) // Both are TypeUndefined. There's nothing more to know. return true; + case LLSD::TypeReal: + // This is where the 'bits' argument comes in handy. If passed + // explicitly, it means to use is_approx_equal_fraction() to compare. + if (bits >= 0) + { + return is_approx_equal_fraction(lhs.asReal(), rhs.asReal(), bits); + } + // Otherwise we compare bit representations, and the usual caveats + // about comparing floating-point numbers apply. Omitting 'bits' when + // comparing Real values is only useful when we expect identical bit + // representation for a given Real value, e.g. for integer-valued + // Reals. + return (lhs.asReal() == rhs.asReal()); + #define COMPARE_SCALAR(type) \ case LLSD::Type##type: \ /* LLSD::URI has operator!=() but not operator==() */ \ @@ -596,10 +611,6 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs) COMPARE_SCALAR(Boolean); COMPARE_SCALAR(Integer); - // The usual caveats about comparing floating-point numbers apply. This is - // only useful when we expect identical bit representation for a given - // Real value, e.g. for integer-valued Reals. - COMPARE_SCALAR(Real); COMPARE_SCALAR(String); COMPARE_SCALAR(UUID); COMPARE_SCALAR(Date); @@ -617,7 +628,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs) for ( ; lai != laend && rai != raend; ++lai, ++rai) { // If any one array element is unequal, the arrays are unequal. - if (! llsd_equals(*lai, *rai)) + if (! llsd_equals(*lai, *rai, bits)) return false; } // Here we've reached the end of one or the other array. They're equal @@ -644,7 +655,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs) if (rhskeys.erase(lmi->first) != 1) return false; // Both maps have the current key. Compare values. - if (! llsd_equals(lmi->second, rhs[lmi->first])) + if (! llsd_equals(lmi->second, rhs[lmi->first], bits)) return false; } // We've now established that all the lhs keys have equal values in @@ -657,7 +668,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs) // We expect that every possible type() value is specifically handled // above. Failing to extend this switch to support a new LLSD type is // an error that must be brought to the coder's attention. - LL_ERRS("llsd_equals") << "llsd_equals(" << lhs << ", " << rhs << "): " + LL_ERRS("llsd_equals") << "llsd_equals(" << lhs << ", " << rhs << ", " << bits << "): " "unknown type " << lhs.type() << LL_ENDL; return false; // pacify the compiler } diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h index bb8c0690b1..65c7297cbf 100644 --- a/indra/llcommon/llsdutil.h +++ b/indra/llcommon/llsdutil.h @@ -123,8 +123,10 @@ LL_COMMON_API BOOL compare_llsd_with_template( */ LL_COMMON_API std::string llsd_matches(const LLSD& prototype, const LLSD& data, const std::string& pfx=""); -/// Deep equality -LL_COMMON_API bool llsd_equals(const LLSD& lhs, const LLSD& rhs); +/// Deep equality. If you want to compare LLSD::Real values for approximate +/// equality rather than bitwise equality, pass @a bits as for +/// is_approx_equal_fraction(). +LL_COMMON_API bool llsd_equals(const LLSD& lhs, const LLSD& rhs, unsigned bits=-1); // Simple function to copy data out of input & output iterators if // there is no need for casting. @@ -138,4 +140,283 @@ template<typename Input> LLSD llsd_copy_array(Input iter, Input end) return dest; } +/***************************************************************************** +* LLSDArray +*****************************************************************************/ +/** + * Construct an LLSD::Array inline, with implicit conversion to LLSD. Usage: + * + * @code + * void somefunc(const LLSD&); + * ... + * somefunc(LLSDArray("text")(17)(3.14)); + * @endcode + * + * For completeness, LLSDArray() with no args constructs an empty array, so + * <tt>LLSDArray()("text")(17)(3.14)</tt> produces an array equivalent to the + * above. But for most purposes, LLSD() is already equivalent to an empty + * array, and if you explicitly want an empty isArray(), there's + * LLSD::emptyArray(). However, supporting a no-args LLSDArray() constructor + * follows the principle of least astonishment. + */ +class LLSDArray +{ +public: + LLSDArray(): + _data(LLSD::emptyArray()) + {} + + /** + * Need an explicit copy constructor. Consider the following: + * + * @code + * LLSD array_of_arrays(LLSDArray(LLSDArray(17)(34)) + * (LLSDArray("x")("y"))); + * @endcode + * + * The coder intends to construct [[17, 34], ["x", "y"]]. + * + * With the compiler's implicit copy constructor, s/he gets instead + * [17, 34, ["x", "y"]]. + * + * The expression LLSDArray(17)(34) constructs an LLSDArray with those two + * values. The reader assumes it should be converted to LLSD, as we always + * want with LLSDArray, before passing it to the @em outer LLSDArray + * constructor! This copy constructor makes that happen. + */ + LLSDArray(const LLSDArray& inner): + _data(LLSD::emptyArray()) + { + _data.append(inner); + } + + LLSDArray(const LLSD& value): + _data(LLSD::emptyArray()) + { + _data.append(value); + } + + LLSDArray& operator()(const LLSD& value) + { + _data.append(value); + return *this; + } + + operator LLSD() const { return _data; } + LLSD get() const { return _data; } + +private: + LLSD _data; +}; + +/***************************************************************************** +* LLSDMap +*****************************************************************************/ +/** + * Construct an LLSD::Map inline, with implicit conversion to LLSD. Usage: + * + * @code + * void somefunc(const LLSD&); + * ... + * somefunc(LLSDMap("alpha", "abc")("number", 17)("pi", 3.14)); + * @endcode + * + * For completeness, LLSDMap() with no args constructs an empty map, so + * <tt>LLSDMap()("alpha", "abc")("number", 17)("pi", 3.14)</tt> produces a map + * equivalent to the above. But for most purposes, LLSD() is already + * equivalent to an empty map, and if you explicitly want an empty isMap(), + * there's LLSD::emptyMap(). However, supporting a no-args LLSDMap() + * constructor follows the principle of least astonishment. + */ +class LLSDMap +{ +public: + LLSDMap(): + _data(LLSD::emptyMap()) + {} + LLSDMap(const LLSD::String& key, const LLSD& value): + _data(LLSD::emptyMap()) + { + _data[key] = value; + } + + LLSDMap& operator()(const LLSD::String& key, const LLSD& value) + { + _data[key] = value; + return *this; + } + + operator LLSD() const { return _data; } + LLSD get() const { return _data; } + +private: + LLSD _data; +}; + +/***************************************************************************** +* LLSDParam +*****************************************************************************/ +/** + * LLSDParam is a customization point for passing LLSD values to function + * parameters of more or less arbitrary type. LLSD provides a small set of + * native conversions; but if a generic algorithm explicitly constructs an + * LLSDParam object in the function's argument list, a consumer can provide + * LLSDParam specializations to support more different parameter types than + * LLSD's native conversions. + * + * Usage: + * + * @code + * void somefunc(const paramtype&); + * ... + * somefunc(..., LLSDParam<paramtype>(someLLSD), ...); + * @endcode + */ +template <typename T> +class LLSDParam +{ +public: + /** + * Default implementation converts to T on construction, saves converted + * value for later retrieval + */ + LLSDParam(const LLSD& value): + _value(value) + {} + + operator T() const { return _value; } + +private: + T _value; +}; + +/** + * Turns out that several target types could accept an LLSD param using any of + * a few different conversions, e.g. LLUUID's constructor can accept LLUUID or + * std::string. Therefore, the compiler can't decide which LLSD conversion + * operator to choose, even though to us it seems obvious. But that's okay, we + * can specialize LLSDParam for such target types, explicitly specifying the + * desired conversion -- that's part of what LLSDParam is all about. Turns out + * we have to do that enough to make it worthwhile generalizing. Use a macro + * because I need to specify one of the asReal, etc., explicit conversion + * methods as well as a type. If I'm overlooking a clever way to implement + * that using a template instead, feel free to reimplement. + */ +#define LLSDParam_for(T, AS) \ +template <> \ +class LLSDParam<T> \ +{ \ +public: \ + LLSDParam(const LLSD& value): \ + _value(value.AS()) \ + {} \ + \ + operator T() const { return _value; } \ + \ +private: \ + T _value; \ +} + +LLSDParam_for(float, asReal); +LLSDParam_for(LLUUID, asUUID); +LLSDParam_for(LLDate, asDate); +LLSDParam_for(LLURI, asURI); +LLSDParam_for(LLSD::Binary, asBinary); + +/** + * LLSDParam<const char*> is an example of the kind of conversion you can + * support with LLSDParam beyond native LLSD conversions. Normally you can't + * pass an LLSD object to a function accepting const char* -- but you can + * safely pass an LLSDParam<const char*>(yourLLSD). + */ +template <> +class LLSDParam<const char*> +{ +private: + // The difference here is that we store a std::string rather than a const + // char*. It's important that the LLSDParam object own the std::string. + std::string _value; + // We don't bother storing the incoming LLSD object, but we do have to + // distinguish whether _value is an empty string because the LLSD object + // contains an empty string or because it's isUndefined(). + bool _undefined; + +public: + LLSDParam(const LLSD& value): + _value(value), + _undefined(value.isUndefined()) + {} + + // The const char* we retrieve is for storage owned by our _value member. + // That's how we guarantee that the const char* is valid for the lifetime + // of this LLSDParam object. Constructing your LLSDParam in the argument + // list should ensure that the LLSDParam object will persist for the + // duration of the function call. + operator const char*() const + { + if (_undefined) + { + // By default, an isUndefined() LLSD object's asString() method + // will produce an empty string. But for a function accepting + // const char*, it's often important to be able to pass NULL, and + // isUndefined() seems like the best way. If you want to pass an + // empty string, you can still pass LLSD(""). Without this special + // case, though, no LLSD value could pass NULL. + return NULL; + } + return _value.c_str(); + } +}; + +namespace llsd +{ + +/***************************************************************************** +* BOOST_FOREACH() helpers for LLSD +*****************************************************************************/ +/// Usage: BOOST_FOREACH(LLSD item, inArray(someLLSDarray)) { ... } +class inArray +{ +public: + inArray(const LLSD& array): + _array(array) + {} + + typedef LLSD::array_const_iterator const_iterator; + typedef LLSD::array_iterator iterator; + + iterator begin() { return _array.beginArray(); } + iterator end() { return _array.endArray(); } + const_iterator begin() const { return _array.beginArray(); } + const_iterator end() const { return _array.endArray(); } + +private: + LLSD _array; +}; + +/// MapEntry is what you get from dereferencing an LLSD::map_[const_]iterator. +typedef std::map<LLSD::String, LLSD>::value_type MapEntry; + +/// Usage: BOOST_FOREACH([const] MapEntry& e, inMap(someLLSDmap)) { ... } +class inMap +{ +public: + inMap(const LLSD& map): + _map(map) + {} + + typedef LLSD::map_const_iterator const_iterator; + typedef LLSD::map_iterator iterator; + + iterator begin() { return _map.beginMap(); } + iterator end() { return _map.endMap(); } + const_iterator begin() const { return _map.beginMap(); } + const_iterator end() const { return _map.endMap(); } + +private: + LLSD _map; +}; + +} // namespace llsd + #endif // LL_LLSDUTIL_H diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 10cdc7087b..ca2d3f9181 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -46,6 +46,7 @@ # include <sys/sysctl.h> # include <sys/utsname.h> # include <stdint.h> +# include <Carbon/Carbon.h> #elif LL_LINUX # include <errno.h> # include <sys/utsname.h> @@ -318,7 +319,58 @@ LLOSInfo::LLOSInfo() : } mOSString += compatibility_mode; +#elif LL_DARWIN + + // Initialize mOSStringSimple to something like: + // "Mac OS X 10.6.7" + { + const char * DARWIN_PRODUCT_NAME = "Mac OS X"; + + SInt32 major_version, minor_version, bugfix_version; + OSErr r1 = Gestalt(gestaltSystemVersionMajor, &major_version); + OSErr r2 = Gestalt(gestaltSystemVersionMinor, &minor_version); + OSErr r3 = Gestalt(gestaltSystemVersionBugFix, &bugfix_version); + + if((r1 == noErr) && (r2 == noErr) && (r3 == noErr)) + { + mMajorVer = major_version; + mMinorVer = minor_version; + mBuild = bugfix_version; + + std::stringstream os_version_string; + os_version_string << DARWIN_PRODUCT_NAME << " " << mMajorVer << "." << mMinorVer << "." << mBuild; + + // Put it in the OS string we are compiling + mOSStringSimple.append(os_version_string.str()); + } + else + { + mOSStringSimple.append("Unable to collect OS info"); + } + } + + // Initialize mOSString to something like: + // "Mac OS X 10.6.7 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386" + struct utsname un; + if(uname(&un) != -1) + { + mOSString = mOSStringSimple; + mOSString.append(" "); + mOSString.append(un.sysname); + mOSString.append(" "); + mOSString.append(un.release); + mOSString.append(" "); + mOSString.append(un.version); + mOSString.append(" "); + mOSString.append(un.machine); + } + else + { + mOSString = mOSStringSimple; + } + #else + struct utsname un; if(uname(&un) != -1) { @@ -334,15 +386,7 @@ LLOSInfo::LLOSInfo() : // Simplify 'Simple' std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0)); - if (ostype == "Darwin") - { - // Only care about major Darwin versions, truncate at first '.' - S32 idx1 = mOSStringSimple.find_first_of(".", 0); - std::string simple = mOSStringSimple.substr(0, idx1); - if (simple.length() > 0) - mOSStringSimple = simple; - } - else if (ostype == "Linux") + if (ostype == "Linux") { // Only care about major and minor Linux versions, truncate at second '.' std::string::size_type idx1 = mOSStringSimple.find_first_of(".", 0); diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 488ec5b239..08026c38a6 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 6; -const S32 LL_VERSION_PATCH = 3; +const S32 LL_VERSION_PATCH = 8; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llcommon/tests/lleventdispatcher_test.cpp b/indra/llcommon/tests/lleventdispatcher_test.cpp new file mode 100644 index 0000000000..263c9b171f --- /dev/null +++ b/indra/llcommon/tests/lleventdispatcher_test.cpp @@ -0,0 +1,1324 @@ +/** + * @file lleventdispatcher_test.cpp + * @author Nat Goodspeed + * @date 2011-01-20 + * @brief Test for lleventdispatcher. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Copyright (c) 2011, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "linden_common.h" +// associated header +#include "lleventdispatcher.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "../test/lltut.h" +#include "llsd.h" +#include "llsdutil.h" +#include "stringize.h" +#include "tests/wrapllerrs.h" + +#include <map> +#include <string> +#include <stdexcept> + +#include <boost/bind.hpp> +#include <boost/function.hpp> +#include <boost/range.hpp> +#include <boost/foreach.hpp> +#define foreach BOOST_FOREACH + +#include <boost/lambda/lambda.hpp> + +#include <iostream> +#include <iomanip> + +using boost::lambda::constant; +using boost::lambda::constant_ref; +using boost::lambda::var; + +using namespace llsd; + +/***************************************************************************** +* Output control +*****************************************************************************/ +#ifdef DEBUG_ON +using std::cout; +#else +static std::ostringstream cout; +#endif + +/***************************************************************************** +* Example data, functions, classes +*****************************************************************************/ +// We don't need a whole lot of different arbitrary-params methods, just (no | +// (const LLSD&) | arbitrary) args (function | static method | non-static +// method), where 'arbitrary' is (every LLSD datatype + (const char*)). +// But we need to register each one under different names for the different +// registration styles. Don't forget LLEventDispatcher subclass methods(const +// LLSD&). + +// However, the number of target parameter conversions we want to try exceeds +// boost::fusion::invoke()'s supported parameter-list size. Break out two +// different lists. +#define NPARAMSa bool b, int i, float f, double d, const char* cp +#define NPARAMSb const std::string& s, const LLUUID& uuid, const LLDate& date, \ + const LLURI& uri, const std::vector<U8>& bin +#define NARGSa b, i, f, d, cp +#define NARGSb s, uuid, date, uri, bin + +// For some registration methods we need methods on a subclass of +// LLEventDispatcher. To simplify things, we'll use this Dispatcher subclass +// for all our testing, including testing its own methods. +class Dispatcher: public LLEventDispatcher +{ +public: + Dispatcher(const std::string& name, const std::string& key): + LLEventDispatcher(name, key) + {} + + // sensing member, mutable because we want to know when we've reached our + // const method too + mutable LLSD llsd; + + void method1(const LLSD& obj) { llsd = obj; } + void cmethod1(const LLSD& obj) const { llsd = obj; } +}; + +// sensing vars, captured in a struct to make it convenient to clear them +struct Vars +{ + LLSD llsd; + bool b; + int i; + float f; + double d; + // Capture param passed as char*. But merely storing a char* received from + // our caller, possibly the .c_str() from a concatenation expression, + // would be Bad: the pointer will be invalidated long before we can query + // it. We could allocate a new chunk of memory, copy the string data and + // point to that instead -- but hey, guess what, we already have a class + // that does that! + std::string cp; + std::string s; + LLUUID uuid; + LLDate date; + LLURI uri; + std::vector<U8> bin; + + Vars(): + // Only need to initialize the POD types, the rest should take care of + // default-constructing themselves. + b(false), + i(0), + f(0), + d(0) + {} + + // Detect any non-default values for convenient testing + LLSD inspect() const + { + LLSD result; + + if (llsd.isDefined()) + result["llsd"] = llsd; + if (b) + result["b"] = b; + if (i) + result["i"] = i; + if (f) + result["f"] = f; + if (d) + result["d"] = d; + if (! cp.empty()) + result["cp"] = cp; + if (! s.empty()) + result["s"] = s; + if (uuid != LLUUID()) + result["uuid"] = uuid; + if (date != LLDate()) + result["date"] = date; + if (uri != LLURI()) + result["uri"] = uri; + if (! bin.empty()) + result["bin"] = bin; + + return result; + } + + /*------------- no-args (non-const, const, static) methods -------------*/ + void method0() + { + cout << "method0()\n"; + i = 17; + } + + void cmethod0() const + { + cout << 'c'; + const_cast<Vars*>(this)->method0(); + } + + static void smethod0(); + + /*------------ Callable (non-const, const, static) methods -------------*/ + void method1(const LLSD& obj) + { + cout << "method1(" << obj << ")\n"; + llsd = obj; + } + + void cmethod1(const LLSD& obj) const + { + cout << 'c'; + const_cast<Vars*>(this)->method1(obj); + } + + static void smethod1(const LLSD& obj); + + /*-------- Arbitrary-params (non-const, const, static) methods ---------*/ + void methodna(NPARAMSa) + { + // Because our const char* param cp might be NULL, and because we + // intend to capture the value in a std::string, have to distinguish + // between the NULL value and any non-NULL value. Use a convention + // easy for a human reader: enclose any non-NULL value in single + // quotes, reserving the unquoted string "NULL" to represent a NULL ptr. + std::string vcp; + if (cp == NULL) + vcp = "NULL"; + else + vcp = std::string("'") + cp + "'"; + + cout << "methodna(" << b + << ", " << i + << ", " << f + << ", " << d + << ", " << vcp + << ")\n"; + + this->b = b; + this->i = i; + this->f = f; + this->d = d; + this->cp = vcp; + } + + void methodnb(NPARAMSb) + { + std::ostringstream vbin; + foreach(U8 byte, bin) + { + vbin << std::hex << std::setfill('0') << std::setw(2) << unsigned(byte); + } + + cout << "methodnb(" << "'" << s << "'" + << ", " << uuid + << ", " << date + << ", '" << uri << "'" + << ", " << vbin.str() + << ")\n"; + + this->s = s; + this->uuid = uuid; + this->date = date; + this->uri = uri; + this->bin = bin; + } + + void cmethodna(NPARAMSa) const + { + cout << 'c'; + const_cast<Vars*>(this)->methodna(NARGSa); + } + + void cmethodnb(NPARAMSb) const + { + cout << 'c'; + const_cast<Vars*>(this)->methodnb(NARGSb); + } + + static void smethodna(NPARAMSa); + static void smethodnb(NPARAMSb); +}; +/*------- Global Vars instance for free functions and static methods -------*/ +static Vars g; + +/*------------ Static Vars method implementations reference 'g' ------------*/ +void Vars::smethod0() +{ + cout << "smethod0() -> "; + g.method0(); +} + +void Vars::smethod1(const LLSD& obj) +{ + cout << "smethod1(" << obj << ") -> "; + g.method1(obj); +} + +void Vars::smethodna(NPARAMSa) +{ + cout << "smethodna(...) -> "; + g.methodna(NARGSa); +} + +void Vars::smethodnb(NPARAMSb) +{ + cout << "smethodnb(...) -> "; + g.methodnb(NARGSb); +} + +/*--------------------------- Reset global Vars ----------------------------*/ +void clear() +{ + g = Vars(); +} + +/*------------------- Free functions also reference 'g' --------------------*/ +void free0() +{ + cout << "free0() -> "; + g.method0(); +} + +void free1(const LLSD& obj) +{ + cout << "free1(" << obj << ") -> "; + g.method1(obj); +} + +void freena(NPARAMSa) +{ + cout << "freena(...) -> "; + g.methodna(NARGSa); +} + +void freenb(NPARAMSb) +{ + cout << "freenb(...) -> "; + g.methodnb(NARGSb); +} + +/***************************************************************************** +* TUT +*****************************************************************************/ +namespace tut +{ + struct lleventdispatcher_data + { + WrapLL_ERRS redirect; + Dispatcher work; + Vars v; + std::string name, desc; + // Capture our own copy of all registered functions' descriptions + typedef std::map<std::string, std::string> DescMap; + DescMap descs; + // Capture the Vars instance on which we expect each function to operate + typedef std::map<std::string, Vars*> VarsMap; + VarsMap funcvars; + // Required structure for Callables with requirements + LLSD required; + // Parameter names for freena(), freenb() + LLSD params; + // Full, partial defaults arrays for params for freena(), freenb() + LLSD dft_array_full, dft_array_partial; + // Start index of partial defaults arrays + const LLSD::Integer partial_offset; + // Full, partial defaults maps for params for freena(), freenb() + LLSD dft_map_full, dft_map_partial; + // Most of the above are indexed by "a" or "b". Useful to have an + // array containing those strings for iterating. + std::vector<LLSD::String> ab; + + lleventdispatcher_data(): + work("test dispatcher", "op"), + // map {d=double, array=[3 elements]} + required(LLSDMap("d", LLSD::Real(0))("array", LLSDArray(LLSD())(LLSD())(LLSD()))), + // first several params are required, last couple optional + partial_offset(3) + { + // This object is reconstructed for every test<n> method. But + // clear global variables every time too. + ::clear(); + + const char* abs[] = { "a", "b" }; + ab.assign(boost::begin(abs), boost::end(abs)); + + // Registration cases: + // - (Callable | subclass const method | subclass non-const method | + // non-subclass method) (with | without) required + // - (Free function | static method | non-static method), (no | arbitrary) params, + // array style + // - (Free function | static method | non-static method), (no | arbitrary) params, + // map style, (empty | partial | full) (array | map) defaults + // - Map-style errors: + // - (scalar | map) param names + // - defaults scalar + // - defaults array longer than params array + // - defaults map with plural unknown param names + + // I hate to have to write things twice, because of having to keep + // them consistent. If we had variadic functions, addf() would be + // a variadic method, capturing the name and desc and passing them + // plus "everything else" to work.add(). If I could return a pair + // and use that pair as the first two args to work.add(), I'd do + // that. But the best I can do with present C++ is to set two + // instance variables as a side effect of addf(), and pass those + // variables to each work.add() call. :-P + + /*------------------------- Callables --------------------------*/ + + // Arbitrary Callable with/out required params + addf("free1", "free1", &g); + work.add(name, desc, free1); + addf("free1_req", "free1", &g); + work.add(name, desc, free1, required); + // Subclass non-const method with/out required params + addf("Dmethod1", "method1", NULL); + work.add(name, desc, &Dispatcher::method1); + addf("Dmethod1_req", "method1", NULL); + work.add(name, desc, &Dispatcher::method1, required); + // Subclass const method with/out required params + addf("Dcmethod1", "cmethod1", NULL); + work.add(name, desc, &Dispatcher::cmethod1); + addf("Dcmethod1_req", "cmethod1", NULL); + work.add(name, desc, &Dispatcher::cmethod1, required); + // Non-subclass method with/out required params + addf("method1", "method1", &v); + work.add(name, desc, boost::bind(&Vars::method1, boost::ref(v), _1)); + addf("method1_req", "method1", &v); + work.add(name, desc, boost::bind(&Vars::method1, boost::ref(v), _1), required); + + /*--------------- Arbitrary params, array style ----------------*/ + + // (Free function | static method) with (no | arbitrary) params, array style + addf("free0_array", "free0", &g); + work.add(name, desc, free0); + addf("freena_array", "freena", &g); + work.add(name, desc, freena); + addf("freenb_array", "freenb", &g); + work.add(name, desc, freenb); + addf("smethod0_array", "smethod0", &g); + work.add(name, desc, &Vars::smethod0); + addf("smethodna_array", "smethodna", &g); + work.add(name, desc, &Vars::smethodna); + addf("smethodnb_array", "smethodnb", &g); + work.add(name, desc, &Vars::smethodnb); + // Non-static method with (no | arbitrary) params, array style + addf("method0_array", "method0", &v); + work.add(name, desc, &Vars::method0, boost::lambda::var(v)); + addf("methodna_array", "methodna", &v); + work.add(name, desc, &Vars::methodna, boost::lambda::var(v)); + addf("methodnb_array", "methodnb", &v); + work.add(name, desc, &Vars::methodnb, boost::lambda::var(v)); + + /*---------------- Arbitrary params, map style -----------------*/ + + // We lay out each params list as an array, also each array of + // default values we'll register. We'll zip these into + // (param=value) maps. Why not define them as maps and just + // extract the keys and values to arrays? Because that wouldn't + // give us the right params-list order. + + // freena(), methodna(), cmethodna(), smethodna() all take same param list. + // Same for freenb() et al. + params = LLSDMap("a", LLSDArray("b")("i")("f")("d")("cp")) + ("b", LLSDArray("s")("uuid")("date")("uri")("bin")); + cout << "params:\n" << params << "\nparams[\"a\"]:\n" << params["a"] << "\nparams[\"b\"]:\n" << params["b"] << std::endl; + // default LLSD::Binary value + std::vector<U8> binary; + for (size_t ix = 0, h = 0xaa; ix < 6; ++ix, h += 0x11) + { + binary.push_back(h); + } + // Full defaults arrays. We actually don't care what the LLUUID or + // LLDate values are, as long as they're different from the + // LLUUID() and LLDate() default values so inspect() will report + // them. + dft_array_full = LLSDMap("a", LLSDArray(true)(17)(3.14)(123456.78)("classic")) + ("b", LLSDArray("string") + (LLUUID::generateNewID()) + (LLDate::now()) + (LLURI("http://www.ietf.org/rfc/rfc3986.txt")) + (binary)); + cout << "dft_array_full:\n" << dft_array_full << std::endl; + // Partial defaults arrays. + foreach(LLSD::String a, ab) + { + LLSD::Integer partition(std::min(partial_offset, dft_array_full[a].size())); + dft_array_partial[a] = + llsd_copy_array(dft_array_full[a].beginArray() + partition, + dft_array_full[a].endArray()); + } + cout << "dft_array_partial:\n" << dft_array_partial << std::endl; + + foreach(LLSD::String a, ab) + { + // Generate full defaults maps by zipping (params, dft_array_full). + dft_map_full[a] = zipmap(params[a], dft_array_full[a]); + + // Generate partial defaults map by zipping alternate entries from + // (params, dft_array_full). Part of the point of using map-style + // defaults is to allow any subset of the target function's + // parameters to be optional, not just the rightmost. + for (LLSD::Integer ix = 0, ixend = params[a].size(); ix < ixend; ix += 2) + { + dft_map_partial[a][params[a][ix].asString()] = dft_array_full[a][ix]; + } + } + cout << "dft_map_full:\n" << dft_map_full << "\ndft_map_partial:\n" << dft_map_partial << '\n'; + + // (Free function | static method) with (no | arbitrary) params, + // map style, no (empty array) defaults + addf("free0_map", "free0", &g); + work.add(name, desc, free0, LLSD::emptyArray()); + addf("smethod0_map", "smethod0", &g); + work.add(name, desc, &Vars::smethod0, LLSD::emptyArray()); + addf("freena_map_allreq", "freena", &g); + work.add(name, desc, freena, params["a"]); + addf("freenb_map_allreq", "freenb", &g); + work.add(name, desc, freenb, params["b"]); + addf("smethodna_map_allreq", "smethodna", &g); + work.add(name, desc, &Vars::smethodna, params["a"]); + addf("smethodnb_map_allreq", "smethodnb", &g); + work.add(name, desc, &Vars::smethodnb, params["b"]); + // Non-static method with (no | arbitrary) params, map style, no + // (empty array) defaults + addf("method0_map", "method0", &v); + work.add(name, desc, &Vars::method0, var(v), LLSD::emptyArray()); + addf("methodna_map_allreq", "methodna", &v); + work.add(name, desc, &Vars::methodna, var(v), params["a"]); + addf("methodnb_map_allreq", "methodnb", &v); + work.add(name, desc, &Vars::methodnb, var(v), params["b"]); + + // Except for the "more (array | map) defaults than params" error + // cases, tested separately below, the (partial | full)(array | + // map) defaults cases don't apply to no-params functions/methods. + // So eliminate free0, smethod0, method0 from the cases below. + + // (Free function | static method) with arbitrary params, map + // style, partial (array | map) defaults + addf("freena_map_leftreq", "freena", &g); + work.add(name, desc, freena, params["a"], dft_array_partial["a"]); + addf("freenb_map_leftreq", "freenb", &g); + work.add(name, desc, freenb, params["b"], dft_array_partial["b"]); + addf("smethodna_map_leftreq", "smethodna", &g); + work.add(name, desc, &Vars::smethodna, params["a"], dft_array_partial["a"]); + addf("smethodnb_map_leftreq", "smethodnb", &g); + work.add(name, desc, &Vars::smethodnb, params["b"], dft_array_partial["b"]); + addf("freena_map_skipreq", "freena", &g); + work.add(name, desc, freena, params["a"], dft_map_partial["a"]); + addf("freenb_map_skipreq", "freenb", &g); + work.add(name, desc, freenb, params["b"], dft_map_partial["b"]); + addf("smethodna_map_skipreq", "smethodna", &g); + work.add(name, desc, &Vars::smethodna, params["a"], dft_map_partial["a"]); + addf("smethodnb_map_skipreq", "smethodnb", &g); + work.add(name, desc, &Vars::smethodnb, params["b"], dft_map_partial["b"]); + // Non-static method with arbitrary params, map style, partial + // (array | map) defaults + addf("methodna_map_leftreq", "methodna", &v); + work.add(name, desc, &Vars::methodna, var(v), params["a"], dft_array_partial["a"]); + addf("methodnb_map_leftreq", "methodnb", &v); + work.add(name, desc, &Vars::methodnb, var(v), params["b"], dft_array_partial["b"]); + addf("methodna_map_skipreq", "methodna", &v); + work.add(name, desc, &Vars::methodna, var(v), params["a"], dft_map_partial["a"]); + addf("methodnb_map_skipreq", "methodnb", &v); + work.add(name, desc, &Vars::methodnb, var(v), params["b"], dft_map_partial["b"]); + + // (Free function | static method) with arbitrary params, map + // style, full (array | map) defaults + addf("freena_map_adft", "freena", &g); + work.add(name, desc, freena, params["a"], dft_array_full["a"]); + addf("freenb_map_adft", "freenb", &g); + work.add(name, desc, freenb, params["b"], dft_array_full["b"]); + addf("smethodna_map_adft", "smethodna", &g); + work.add(name, desc, &Vars::smethodna, params["a"], dft_array_full["a"]); + addf("smethodnb_map_adft", "smethodnb", &g); + work.add(name, desc, &Vars::smethodnb, params["b"], dft_array_full["b"]); + addf("freena_map_mdft", "freena", &g); + work.add(name, desc, freena, params["a"], dft_map_full["a"]); + addf("freenb_map_mdft", "freenb", &g); + work.add(name, desc, freenb, params["b"], dft_map_full["b"]); + addf("smethodna_map_mdft", "smethodna", &g); + work.add(name, desc, &Vars::smethodna, params["a"], dft_map_full["a"]); + addf("smethodnb_map_mdft", "smethodnb", &g); + work.add(name, desc, &Vars::smethodnb, params["b"], dft_map_full["b"]); + // Non-static method with arbitrary params, map style, full + // (array | map) defaults + addf("methodna_map_adft", "methodna", &v); + work.add(name, desc, &Vars::methodna, var(v), params["a"], dft_array_full["a"]); + addf("methodnb_map_adft", "methodnb", &v); + work.add(name, desc, &Vars::methodnb, var(v), params["b"], dft_array_full["b"]); + addf("methodna_map_mdft", "methodna", &v); + work.add(name, desc, &Vars::methodna, var(v), params["a"], dft_map_full["a"]); + addf("methodnb_map_mdft", "methodnb", &v); + work.add(name, desc, &Vars::methodnb, var(v), params["b"], dft_map_full["b"]); + + // All the above are expected to succeed, and are setup for the + // tests to follow. Registration error cases are exercised as + // tests rather than as test setup. + } + + void addf(const std::string& n, const std::string& d, Vars* v) + { + // This method is to capture in our own DescMap the name and + // description of every registered function, for metadata query + // testing. + descs[n] = d; + // Also capture the Vars instance on which each function should operate. + funcvars[n] = v; + // See constructor for rationale for setting these instance vars. + this->name = n; + this->desc = d; + } + + void verify_descs() + { + // Copy descs to a temp map of same type. + DescMap forgotten(descs.begin(), descs.end()); + // LLEventDispatcher intentionally provides only const_iterator: + // since dereferencing that iterator generates values on the fly, + // it's meaningless to have a modifiable iterator. But since our + // 'work' object isn't const, by default BOOST_FOREACH() wants to + // use non-const iterators. Persuade it to use the const_iterator. + foreach(LLEventDispatcher::NameDesc nd, const_cast<const Dispatcher&>(work)) + { + DescMap::iterator found = forgotten.find(nd.first); + ensure(STRINGIZE("LLEventDispatcher records function '" << nd.first + << "' we didn't enter"), + found != forgotten.end()); + ensure_equals(STRINGIZE("LLEventDispatcher desc '" << nd.second << + "' doesn't match what we entered: '" << found->second << "'"), + nd.second, found->second); + // found in our map the name from LLEventDispatcher, good, erase + // our map entry + forgotten.erase(found); + } + if (! forgotten.empty()) + { + std::ostringstream out; + out << "LLEventDispatcher failed to report"; + const char* delim = ": "; + foreach(const DescMap::value_type& fme, forgotten) + { + out << delim << fme.first; + delim = ", "; + } + ensure(out.str(), false); + } + } + + Vars* varsfor(const std::string& name) + { + VarsMap::const_iterator found = funcvars.find(name); + ensure(STRINGIZE("No Vars* for " << name), found != funcvars.end()); + ensure(STRINGIZE("NULL Vars* for " << name), found->second); + return found->second; + } + + void ensure_has(const std::string& outer, const std::string& inner) + { + ensure(STRINGIZE("'" << outer << "' does not contain '" << inner << "'").c_str(), + outer.find(inner) != std::string::npos); + } + + void call_exc(const std::string& func, const LLSD& args, const std::string& exc_frag) + { + std::string threw; + try + { + work(func, args); + } + catch (const std::runtime_error& e) + { + cout << "*** " << e.what() << '\n'; + threw = e.what(); + } + ensure_has(threw, exc_frag); + } + + LLSD getMetadata(const std::string& name) + { + LLSD meta(work.getMetadata(name)); + ensure(STRINGIZE("No metadata for " << name), meta.isDefined()); + return meta; + } + + // From two related LLSD arrays, e.g. a param-names array and a values + // array, zip them together into an LLSD map. + LLSD zipmap(const LLSD& keys, const LLSD& values) + { + LLSD map; + for (LLSD::Integer i = 0, iend = keys.size(); i < iend; ++i) + { + // Have to select asString() since you can index an LLSD + // object with either String or Integer. + map[keys[i].asString()] = values[i]; + } + return map; + } + + // If I call this ensure_equals(), it blocks visibility of all other + // ensure_equals() overloads. Normally I could say 'using + // baseclass::ensure_equals;' and fix that, but I don't know what the + // base class is! + void ensure_llsd(const std::string& msg, const LLSD& actual, const LLSD& expected, U32 bits) + { + std::ostringstream out; + if (! msg.empty()) + { + out << msg << ": "; + } + out << "expected " << expected << ", actual " << actual; + ensure(out.str(), llsd_equals(actual, expected, bits)); + } + + void ensure_llsd(const LLSD& actual, const LLSD& expected, U32 bits) + { + ensure_llsd("", actual, expected, bits); + } + }; + typedef test_group<lleventdispatcher_data> lleventdispatcher_group; + typedef lleventdispatcher_group::object object; + lleventdispatcher_group lleventdispatchergrp("lleventdispatcher"); + + // Call cases: + // - (try_call | call) (explicit name | event key) (real | bogus) name + // - Callable with args that (do | do not) match required + // - (Free function | non-static method), no args, (array | map) style + // - (Free function | non-static method), arbitrary args, + // (array style with (scalar | map) | map style with scalar) + // - (Free function | non-static method), arbitrary args, array style with + // array (too short | too long | just right) + // [trap LL_WARNS for too-long case?] + // - (Free function | non-static method), arbitrary args, map style with + // (array | map) (all | too many | holes (with | without) defaults) + // - const char* param gets ("" | NULL) + + // Query cases: + // - Iterate over all (with | without) remove() + // - getDispatchKey() + // - Callable style (with | without) required + // - (Free function | non-static method), array style, (no | arbitrary) params + // - (Free function | non-static method), map style, (no | arbitrary) params, + // (empty | full | partial (array | map)) defaults + + template<> template<> + void object::test<1>() + { + set_test_name("map-style registration with non-array params"); + // Pass "param names" as scalar or as map + LLSD attempts(LLSDArray(17)(LLSDMap("pi", 3.14)("two", 2))); + foreach(LLSD ae, inArray(attempts)) + { + std::string threw; + try + { + work.add("freena_err", "freena", freena, ae); + } + catch (const std::exception& e) + { + threw = e.what(); + } + ensure_has(threw, "must be an array"); + } + } + + template<> template<> + void object::test<2>() + { + set_test_name("map-style registration with badly-formed defaults"); + std::string threw; + try + { + work.add("freena_err", "freena", freena, LLSDArray("a")("b"), 17); + } + catch (const std::exception& e) + { + threw = e.what(); + } + ensure_has(threw, "must be a map or an array"); + } + + template<> template<> + void object::test<3>() + { + set_test_name("map-style registration with too many array defaults"); + std::string threw; + try + { + work.add("freena_err", "freena", freena, + LLSDArray("a")("b"), + LLSDArray(17)(0.9)("gack")); + } + catch (const std::exception& e) + { + threw = e.what(); + } + ensure_has(threw, "shorter than"); + } + + template<> template<> + void object::test<4>() + { + set_test_name("map-style registration with too many map defaults"); + std::string threw; + try + { + work.add("freena_err", "freena", freena, + LLSDArray("a")("b"), + LLSDMap("b", 17)("foo", 3.14)("bar", "sinister")); + } + catch (const std::exception& e) + { + threw = e.what(); + } + ensure_has(threw, "nonexistent params"); + ensure_has(threw, "foo"); + ensure_has(threw, "bar"); + } + + template<> template<> + void object::test<5>() + { + set_test_name("query all"); + verify_descs(); + } + + template<> template<> + void object::test<6>() + { + set_test_name("query all with remove()"); + ensure("remove('bogus') returned true", ! work.remove("bogus")); + ensure("remove('real') returned false", work.remove("free1")); + // Of course, remove that from 'descs' too... + descs.erase("free1"); + verify_descs(); + } + + template<> template<> + void object::test<7>() + { + set_test_name("getDispatchKey()"); + ensure_equals(work.getDispatchKey(), "op"); + } + + template<> template<> + void object::test<8>() + { + set_test_name("query Callables with/out required params"); + LLSD names(LLSDArray("free1")("Dmethod1")("Dcmethod1")("method1")); + foreach(LLSD nm, inArray(names)) + { + LLSD metadata(getMetadata(nm)); + ensure_equals("name mismatch", metadata["name"], nm); + ensure_equals(metadata["desc"].asString(), descs[nm]); + ensure("should not have required structure", metadata["required"].isUndefined()); + ensure("should not have optional", metadata["optional"].isUndefined()); + + std::string name_req(nm.asString() + "_req"); + metadata = getMetadata(name_req); + ensure_equals(metadata["name"].asString(), name_req); + ensure_equals(metadata["desc"].asString(), descs[name_req]); + ensure_equals("required mismatch", required, metadata["required"]); + ensure("should not have optional", metadata["optional"].isUndefined()); + } + } + + template<> template<> + void object::test<9>() + { + set_test_name("query array-style functions/methods"); + // Associate each registered name with expected arity. + LLSD expected(LLSDArray + (LLSDArray + (0)(LLSDArray("free0_array")("smethod0_array")("method0_array"))) + (LLSDArray + (5)(LLSDArray("freena_array")("smethodna_array")("methodna_array"))) + (LLSDArray + (5)(LLSDArray("freenb_array")("smethodnb_array")("methodnb_array")))); + foreach(LLSD ae, inArray(expected)) + { + LLSD::Integer arity(ae[0].asInteger()); + LLSD names(ae[1]); + LLSD req(LLSD::emptyArray()); + if (arity) + req[arity - 1] = LLSD(); + foreach(LLSD nm, inArray(names)) + { + LLSD metadata(getMetadata(nm)); + ensure_equals("name mismatch", metadata["name"], nm); + ensure_equals(metadata["desc"].asString(), descs[nm]); + ensure_equals(STRINGIZE("mismatched required for " << nm.asString()), + metadata["required"], req); + ensure("should not have optional", metadata["optional"].isUndefined()); + } + } + } + + template<> template<> + void object::test<10>() + { + set_test_name("query map-style no-params functions/methods"); + // - (Free function | non-static method), map style, no params (ergo + // no defaults) + LLSD names(LLSDArray("free0_map")("smethod0_map")("method0_map")); + foreach(LLSD nm, inArray(names)) + { + LLSD metadata(getMetadata(nm)); + ensure_equals("name mismatch", metadata["name"], nm); + ensure_equals(metadata["desc"].asString(), descs[nm]); + ensure("should not have required", + (metadata["required"].isUndefined() || metadata["required"].size() == 0)); + ensure("should not have optional", metadata["optional"].isUndefined()); + } + } + + template<> template<> + void object::test<11>() + { + set_test_name("query map-style arbitrary-params functions/methods: " + "full array defaults vs. full map defaults"); + // With functions registered with no defaults ("_allreq" suffixes), + // there is of course no difference between array defaults and map + // defaults. (We don't even bother registering with LLSD::emptyArray() + // vs. LLSD::emptyMap().) With functions registered with all defaults, + // there should (!) be no difference beween array defaults and map + // defaults. Verify, so we can ignore the distinction for all other + // tests. + LLSD equivalences(LLSDArray + (LLSDArray("freena_map_adft")("freena_map_mdft")) + (LLSDArray("freenb_map_adft")("freenb_map_mdft")) + (LLSDArray("smethodna_map_adft")("smethodna_map_mdft")) + (LLSDArray("smethodnb_map_adft")("smethodnb_map_mdft")) + (LLSDArray("methodna_map_adft")("methodna_map_mdft")) + (LLSDArray("methodnb_map_adft")("methodnb_map_mdft"))); + foreach(LLSD eq, inArray(equivalences)) + { + LLSD adft(eq[0]); + LLSD mdft(eq[1]); + // We can't just compare the results of the two getMetadata() + // calls, because they contain ["name"], which are different. So + // capture them, verify that each ["name"] is as expected, then + // remove for comparing the rest. + LLSD ameta(getMetadata(adft)); + LLSD mmeta(getMetadata(mdft)); + ensure_equals("adft name", adft, ameta["name"]); + ensure_equals("mdft name", mdft, mmeta["name"]); + ameta.erase("name"); + mmeta.erase("name"); + ensure_equals(STRINGIZE("metadata for " << adft.asString() + << " vs. " << mdft.asString()), + ameta, mmeta); + } + } + + template<> template<> + void object::test<12>() + { + set_test_name("query map-style arbitrary-params functions/methods"); + // - (Free function | non-static method), map style, arbitrary params, + // (empty | full | partial (array | map)) defaults + + // Generate maps containing all parameter names for cases in which all + // params are required. Also maps containing left requirements for + // partial defaults arrays. Also defaults maps from defaults arrays. + LLSD allreq, leftreq, rightdft; + foreach(LLSD::String a, ab) + { + // The map in which all params are required uses params[a] as + // keys, with all isUndefined() as values. We can accomplish that + // by passing zipmap() an empty values array. + allreq[a] = zipmap(params[a], LLSD::emptyArray()); + // Same for leftreq, save that we use the subset of the params not + // supplied by dft_array_partial[a]. + LLSD::Integer partition(params[a].size() - dft_array_partial[a].size()); + leftreq[a] = zipmap(llsd_copy_array(params[a].beginArray(), + params[a].beginArray() + partition), + LLSD::emptyArray()); + // Generate map pairing dft_array_partial[a] values with their + // param names. + rightdft[a] = zipmap(llsd_copy_array(params[a].beginArray() + partition, + params[a].endArray()), + dft_array_partial[a]); + } + cout << "allreq:\n" << allreq << "\nleftreq:\n" << leftreq << "\nrightdft:\n" << rightdft << std::endl; + + // Generate maps containing parameter names not provided by the + // dft_map_partial maps. + LLSD skipreq(allreq); + foreach(LLSD::String a, ab) + { + foreach(const MapEntry& me, inMap(dft_map_partial[a])) + { + skipreq[a].erase(me.first); + } + } + cout << "skipreq:\n" << skipreq << std::endl; + + LLSD groups(LLSDArray // array of groups + + (LLSDArray // group + (LLSDArray("freena_map_allreq")("smethodna_map_allreq")("methodna_map_allreq")) + (LLSDArray(allreq["a"])(LLSD()))) // required, optional + + (LLSDArray // group + (LLSDArray("freenb_map_allreq")("smethodnb_map_allreq")("methodnb_map_allreq")) + (LLSDArray(allreq["b"])(LLSD()))) // required, optional + + (LLSDArray // group + (LLSDArray("freena_map_leftreq")("smethodna_map_leftreq")("methodna_map_leftreq")) + (LLSDArray(leftreq["a"])(rightdft["a"]))) // required, optional + + (LLSDArray // group + (LLSDArray("freenb_map_leftreq")("smethodnb_map_leftreq")("methodnb_map_leftreq")) + (LLSDArray(leftreq["b"])(rightdft["b"]))) // required, optional + + (LLSDArray // group + (LLSDArray("freena_map_skipreq")("smethodna_map_skipreq")("methodna_map_skipreq")) + (LLSDArray(skipreq["a"])(dft_map_partial["a"]))) // required, optional + + (LLSDArray // group + (LLSDArray("freenb_map_skipreq")("smethodnb_map_skipreq")("methodnb_map_skipreq")) + (LLSDArray(skipreq["b"])(dft_map_partial["b"]))) // required, optional + + // We only need mention the full-map-defaults ("_mdft" suffix) + // registrations, having established their equivalence with the + // full-array-defaults ("_adft" suffix) registrations in another test. + (LLSDArray // group + (LLSDArray("freena_map_mdft")("smethodna_map_mdft")("methodna_map_mdft")) + (LLSDArray(LLSD::emptyMap())(dft_map_full["a"]))) // required, optional + + (LLSDArray // group + (LLSDArray("freenb_map_mdft")("smethodnb_map_mdft")("methodnb_map_mdft")) + (LLSDArray(LLSD::emptyMap())(dft_map_full["b"])))); // required, optional + + foreach(LLSD grp, inArray(groups)) + { + // Internal structure of each group in 'groups': + LLSD names(grp[0]); + LLSD required(grp[1][0]); + LLSD optional(grp[1][1]); + cout << "For " << names << ",\n" << "required:\n" << required << "\noptional:\n" << optional << std::endl; + + // Loop through 'names' + foreach(LLSD nm, inArray(names)) + { + LLSD metadata(getMetadata(nm)); + ensure_equals("name mismatch", metadata["name"], nm); + ensure_equals(nm.asString(), metadata["desc"].asString(), descs[nm]); + ensure_equals(STRINGIZE(nm << " required mismatch"), + metadata["required"], required); + ensure_equals(STRINGIZE(nm << " optional mismatch"), + metadata["optional"], optional); + } + } + } + + template<> template<> + void object::test<13>() + { + set_test_name("try_call()"); + ensure("try_call(bogus name, LLSD()) returned true", ! work.try_call("freek", LLSD())); + ensure("try_call(bogus name) returned true", ! work.try_call(LLSDMap("op", "freek"))); + ensure("try_call(real name, LLSD()) returned false", work.try_call("free0_array", LLSD())); + ensure("try_call(real name) returned false", work.try_call(LLSDMap("op", "free0_map"))); + } + + template<> template<> + void object::test<14>() + { + set_test_name("call with bad name"); + call_exc("freek", LLSD(), "not found"); + // We don't have a comparable helper function for the one-arg + // operator() method, and it's not worth building one just for this + // case. Write it out. + std::string threw; + try + { + work(LLSDMap("op", "freek")); + } + catch (const std::runtime_error& e) + { + cout << "*** " << e.what() << "\n"; + threw = e.what(); + } + ensure_has(threw, "bad"); + ensure_has(threw, "op"); + ensure_has(threw, "freek"); + } + + template<> template<> + void object::test<15>() + { + set_test_name("call with event key"); + // We don't need a separate test for operator()(string, LLSD) with + // valid name, because all the rest of the tests exercise that case. + // The one we don't exercise elsewhere is operator()(LLSD) with valid + // name, so here it is. + work(LLSDMap("op", "free0_map")); + ensure_equals(g.i, 17); + } + + // Cannot be defined inside function body... remind me again why we use C++... :-P + struct CallablesTriple + { + std::string name, name_req; + LLSD& llsd; + }; + + template<> template<> + void object::test<16>() + { + set_test_name("call Callables"); + CallablesTriple tests[] = + { + { "free1", "free1_req", g.llsd }, + { "Dmethod1", "Dmethod1_req", work.llsd }, + { "Dcmethod1", "Dcmethod1_req", work.llsd }, + { "method1", "method1_req", v.llsd } + }; + // Arbitrary LLSD value that we should be able to pass to Callables + // without 'required', but should not be able to pass to Callables + // with 'required'. + LLSD answer(42); + // LLSD value matching 'required' according to llsd_matches() rules. + LLSD matching(LLSDMap("d", 3.14)("array", LLSDArray("answer")(true)(answer))); + // Okay, walk through 'tests'. + foreach(const CallablesTriple& tr, tests) + { + // Should be able to pass 'answer' to Callables registered + // without 'required'. + work(tr.name, answer); + ensure_equals("answer mismatch", tr.llsd, answer); + // Should NOT be able to pass 'answer' to Callables registered + // with 'required'. + call_exc(tr.name_req, answer, "bad request"); + // But SHOULD be able to pass 'matching' to Callables registered + // with 'required'. + work(tr.name_req, matching); + ensure_equals("matching mismatch", tr.llsd, matching); + } + } + + template<> template<> + void object::test<17>() + { + set_test_name("passing wrong args to (map | array)-style registrations"); + + // Pass scalar/map to array-style functions, scalar/array to map-style + // functions. As that validation happens well before we engage the + // argument magic, it seems pointless to repeat this with every + // variation: (free function | non-static method), (no | arbitrary) + // args. We should only need to engage it for one map-style + // registration and one array-style registration. + std::string array_exc("needs an args array"); + call_exc("free0_array", 17, array_exc); + call_exc("free0_array", LLSDMap("pi", 3.14), array_exc); + + std::string map_exc("needs a map"); + call_exc("free0_map", 17, map_exc); + // Passing an array to a map-style function works now! No longer an + // error case! +// call_exc("free0_map", LLSDArray("a")("b"), map_exc); + } + + template<> template<> + void object::test<18>() + { + set_test_name("call no-args functions"); + LLSD names(LLSDArray + ("free0_array")("free0_map") + ("smethod0_array")("smethod0_map") + ("method0_array")("method0_map")); + foreach(LLSD name, inArray(names)) + { + // Look up the Vars instance for this function. + Vars* vars(varsfor(name)); + // Both the global and stack Vars instances are automatically + // cleared at the start of each test<n> method. But since we're + // calling these things several different times in the same + // test<n> method, manually reset the Vars between each. + *vars = Vars(); + ensure_equals(vars->i, 0); + // call function with empty array (or LLSD(), should be equivalent) + work(name, LLSD()); + ensure_equals(vars->i, 17); + } + } + + // Break out this data because we use it in a couple different tests. + LLSD array_funcs(LLSDArray + (LLSDMap("a", "freena_array") ("b", "freenb_array")) + (LLSDMap("a", "smethodna_array")("b", "smethodnb_array")) + (LLSDMap("a", "methodna_array") ("b", "methodnb_array"))); + + template<> template<> + void object::test<19>() + { + set_test_name("call array-style functions with too-short arrays"); + // Could have two different too-short arrays, one for *na and one for + // *nb, but since they both take 5 params... + LLSD tooshort(LLSDArray("this")("array")("too")("short")); + foreach(const LLSD& funcsab, inArray(array_funcs)) + { + foreach(const llsd::MapEntry& e, inMap(funcsab)) + { + call_exc(e.second, tooshort, "requires more arguments"); + } + } + } + + template<> template<> + void object::test<20>() + { + set_test_name("call array-style functions with (just right | too long) arrays"); + std::vector<U8> binary; + for (size_t h(0x01), i(0); i < 5; h+= 0x22, ++i) + { + binary.push_back(h); + } + LLSD args(LLSDMap("a", LLSDArray(true)(17)(3.14)(123.456)("char*")) + ("b", LLSDArray("string") + (LLUUID("01234567-89ab-cdef-0123-456789abcdef")) + (LLDate("2011-02-03T15:07:00Z")) + (LLURI("http://secondlife.com")) + (binary))); + LLSD argsplus(args); + argsplus["a"].append("bogus"); + argsplus["b"].append("bogus"); + LLSD expect; + foreach(LLSD::String a, ab) + { + expect[a] = zipmap(params[a], args[a]); + } + // Adjust expect["a"]["cp"] for special Vars::cp treatment. + expect["a"]["cp"] = std::string("'") + expect["a"]["cp"].asString() + "'"; + cout << "expect: " << expect << '\n'; + + // Use substantially the same logic for args and argsplus + LLSD argsarrays(LLSDArray(args)(argsplus)); + // So i==0 selects 'args', i==1 selects argsplus + for (LLSD::Integer i(0), iend(argsarrays.size()); i < iend; ++i) + { + foreach(const LLSD& funcsab, inArray(array_funcs)) + { + foreach(LLSD::String a, ab) + { + // Reset the Vars instance before each call + Vars* vars(varsfor(funcsab[a])); + *vars = Vars(); + work(funcsab[a], argsarrays[i][a]); + ensure_llsd(STRINGIZE(funcsab[a].asString() << + ": expect[\"" << a << "\"] mismatch"), + vars->inspect(), expect[a], 7); // 7 bits ~= 2 decimal digits + + // TODO: in the i==1 or argsplus case, intercept LL_WARNS + // output? Even without that, using argsplus verifies that + // passing too many args isn't fatal; it works -- but + // would be nice to notice the warning too. + } + } + } + } + + template<> template<> + void object::test<21>() + { + set_test_name("verify that passing LLSD() to const char* sends NULL"); + + ensure_equals("Vars::cp init", v.cp, ""); + work("methodna_map_mdft", LLSDMap("cp", LLSD())); + ensure_equals("passing LLSD()", v.cp, "NULL"); + work("methodna_map_mdft", LLSDMap("cp", "")); + ensure_equals("passing \"\"", v.cp, "''"); + work("methodna_map_mdft", LLSDMap("cp", "non-NULL")); + ensure_equals("passing \"non-NULL\"", v.cp, "'non-NULL'"); + } + + template<> template<> + void object::test<22>() + { + set_test_name("call map-style functions with (full | oversized) (arrays | maps)"); + const char binary[] = "\x99\x88\x77\x66\x55"; + LLSD array_full(LLSDMap + ("a", LLSDArray(false)(255)(98.6)(1024.5)("pointer")) + ("b", LLSDArray("object")(LLUUID::generateNewID())(LLDate::now())(LLURI("http://wiki.lindenlab.com/wiki"))(LLSD::Binary(boost::begin(binary), boost::end(binary))))); + LLSD array_overfull(array_full); + foreach(LLSD::String a, ab) + { + array_overfull[a].append("bogus"); + } + cout << "array_full: " << array_full << "\narray_overfull: " << array_overfull << std::endl; + // We rather hope that LLDate::now() will generate a timestamp + // distinct from the one it generated in the constructor, moments ago. + ensure_not_equals("Timestamps too close", + array_full["b"][2].asDate(), dft_array_full["b"][2].asDate()); + // We /insist/ that LLUUID::generateNewID() do so. + ensure_not_equals("UUID collision", + array_full["b"][1].asUUID(), dft_array_full["b"][1].asUUID()); + LLSD map_full, map_overfull; + foreach(LLSD::String a, ab) + { + map_full[a] = zipmap(params[a], array_full[a]); + map_overfull[a] = map_full[a]; + map_overfull[a]["extra"] = "ignore"; + } + cout << "map_full: " << map_full << "\nmap_overfull: " << map_overfull << std::endl; + LLSD expect(map_full); + // Twiddle the const char* param. + expect["a"]["cp"] = std::string("'") + expect["a"]["cp"].asString() + "'"; + // Another adjustment. For each data type, we're trying to distinguish + // three values: the Vars member's initial value (member wasn't + // stored; control never reached the set function), the registered + // default param value from dft_array_full, and the array_full value + // in this test. But bool can only distinguish two values. In this + // case, we want to differentiate the local array_full value from the + // dft_array_full value, so we use 'false'. However, that means + // Vars::inspect() doesn't differentiate it from the initial value, + // so won't bother returning it. Predict that behavior to match the + // LLSD values. + expect["a"].erase("b"); + cout << "expect: " << expect << std::endl; + // For this test, calling functions registered with different sets of + // parameter defaults should make NO DIFFERENCE WHATSOEVER. Every call + // should pass all params. + LLSD names(LLSDMap + ("a", LLSDArray + ("freena_map_allreq") ("smethodna_map_allreq") ("methodna_map_allreq") + ("freena_map_leftreq")("smethodna_map_leftreq")("methodna_map_leftreq") + ("freena_map_skipreq")("smethodna_map_skipreq")("methodna_map_skipreq") + ("freena_map_adft") ("smethodna_map_adft") ("methodna_map_adft") + ("freena_map_mdft") ("smethodna_map_mdft") ("methodna_map_mdft")) + ("b", LLSDArray + ("freenb_map_allreq") ("smethodnb_map_allreq") ("methodnb_map_allreq") + ("freenb_map_leftreq")("smethodnb_map_leftreq")("methodnb_map_leftreq") + ("freenb_map_skipreq")("smethodnb_map_skipreq")("methodnb_map_skipreq") + ("freenb_map_adft") ("smethodnb_map_adft") ("methodnb_map_adft") + ("freenb_map_mdft") ("smethodnb_map_mdft") ("methodnb_map_mdft"))); + // Treat (full | overfull) (array | map) the same. + LLSD argssets(LLSDArray(array_full)(array_overfull)(map_full)(map_overfull)); + foreach(const LLSD& args, inArray(argssets)) + { + foreach(LLSD::String a, ab) + { + foreach(LLSD::String name, inArray(names[a])) + { + // Reset the Vars instance + Vars* vars(varsfor(name)); + *vars = Vars(); + work(name, args[a]); + ensure_llsd(STRINGIZE(name << ": expect[\"" << a << "\"] mismatch"), + vars->inspect(), expect[a], 7); // 7 bits, 2 decimal digits + // intercept LL_WARNS for the two overfull cases? + } + } + } + } +} // namespace tut diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 39211bf7fa..f0d15d9607 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -1254,28 +1254,7 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip return false; } - LLPointer<LLImageFormatted> image; - switch(codec) - { - //case IMG_CODEC_RGB: - case IMG_CODEC_BMP: - image = new LLImageBMP(); - break; - case IMG_CODEC_TGA: - image = new LLImageTGA(); - break; - case IMG_CODEC_JPEG: - image = new LLImageJPEG(); - break; - case IMG_CODEC_J2C: - image = new LLImageJ2C(); - break; - case IMG_CODEC_DXT: - image = new LLImageDXT(); - break; - default: - return false; - } + LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec); llassert(image.notNull()); U8 *buffer = image->allocateData(length); diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp index 835664c60f..c6bfa50b40 100644 --- a/indra/llimage/llimagedimensionsinfo.cpp +++ b/indra/llimage/llimagedimensionsinfo.cpp @@ -73,9 +73,28 @@ bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec) bool LLImageDimensionsInfo::getImageDimensionsBmp() { - const S32 BMP_FILE_HEADER_SIZE = 14; + // Make sure the file is long enough. + const S32 DATA_LEN = 26; // BMP header (14) + DIB header size (4) + width (4) + height (4) + if (!checkFileLength(DATA_LEN)) + { + llwarns << "Premature end of file" << llendl; + return false; + } + + // Read BMP signature. + U8 signature[2]; + mInfile.read((void*)signature, sizeof(signature)/sizeof(signature[0])); + + // Make sure this is actually a BMP file. + // We only support Windows bitmaps (BM), according to LLImageBMP::updateData(). + if (signature[0] != 'B' || signature[1] != 'M') + { + llwarns << "Not a BMP" << llendl; + return false; + } - mInfile.seek(APR_CUR,BMP_FILE_HEADER_SIZE+4); + // Read image dimensions. + mInfile.seek(APR_CUR, 16); mWidth = read_reverse_s32(); mHeight = read_reverse_s32(); @@ -86,6 +105,14 @@ bool LLImageDimensionsInfo::getImageDimensionsTga() { const S32 TGA_FILE_HEADER_SIZE = 12; + // Make sure the file is long enough. + if (!checkFileLength(TGA_FILE_HEADER_SIZE + 1 /* width */ + 1 /* height */)) + { + llwarns << "Premature end of file" << llendl; + return false; + } + + // *TODO: Detect non-TGA files somehow. mInfile.seek(APR_CUR,TGA_FILE_HEADER_SIZE); mWidth = read_byte() | read_byte() << 8; mHeight = read_byte() | read_byte() << 8; @@ -95,9 +122,29 @@ bool LLImageDimensionsInfo::getImageDimensionsTga() bool LLImageDimensionsInfo::getImageDimensionsPng() { - const S32 PNG_FILE_MARKER_SIZE = 8; + const S32 PNG_MAGIC_SIZE = 8; + + // Make sure the file is long enough. + if (!checkFileLength(PNG_MAGIC_SIZE + 8 + sizeof(S32) * 2 /* width, height */)) + { + llwarns << "Premature end of file" << llendl; + return false; + } - mInfile.seek(APR_CUR,PNG_FILE_MARKER_SIZE + 8/*header offset+chunk length+chunk type*/); + // Read PNG signature. + const U8 png_magic[PNG_MAGIC_SIZE] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; + U8 signature[PNG_MAGIC_SIZE]; + mInfile.read((void*)signature, PNG_MAGIC_SIZE); + + // Make sure it's a PNG file. + if (memcmp(signature, png_magic, PNG_MAGIC_SIZE) != 0) + { + llwarns << "Not a PNG" << llendl; + return false; + } + + // Read image dimensions. + mInfile.seek(APR_CUR, 8 /* chunk length + chunk type */); mWidth = read_s32(); mHeight = read_s32(); @@ -122,6 +169,24 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg() setLastError("Unable to open file for reading", mSrcFilename); return false; } + + /* Make sure this is a JPEG file. */ + const size_t JPEG_MAGIC_SIZE = 2; + const uint8_t jpeg_magic[JPEG_MAGIC_SIZE] = {0xFF, 0xD8}; + uint8_t signature[JPEG_MAGIC_SIZE]; + + if (fread(signature, sizeof(signature), 1, fp) != 1) + { + llwarns << "Premature end of file" << llendl; + return false; + } + if (memcmp(signature, jpeg_magic, JPEG_MAGIC_SIZE) != 0) + { + llwarns << "Not a JPEG" << llendl; + return false; + } + fseek(fp, 0, SEEK_SET); // go back to start of the file + /* Init jpeg */ jpeg_error_mgr jerr; jpeg_decompress_struct cinfo; @@ -145,3 +210,13 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg() return !sJpegErrorEncountered; } +bool LLImageDimensionsInfo::checkFileLength(S32 min_len) +{ + // Make sure the file is not shorter than min_len bytes. + // so that we don't have to check value returned by each read() or seek(). + char* buf = new char[min_len]; + int nread = mInfile.read(buf, min_len); + delete[] buf; + mInfile.seek(APR_SET, 0); + return nread == min_len; +} diff --git a/indra/llimage/llimagedimensionsinfo.h b/indra/llimage/llimagedimensionsinfo.h index 5384faf3f4..382fdb2a0e 100644 --- a/indra/llimage/llimagedimensionsinfo.h +++ b/indra/llimage/llimagedimensionsinfo.h @@ -119,6 +119,9 @@ protected: return read_byte() << 8 | read_byte(); } + /// Check if the file is not shorter than min_len bytes. + bool checkFileLength(S32 min_len); + protected: LLAPRFile mInfile ; std::string mSrcFilename; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 80fec7f8a0..a90df0f1c1 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -139,6 +139,15 @@ BOOL LLImageJ2C::updateData() return res; } +BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* region) +{ + return mImpl->initDecode(*this,raw_image,discard_level,region); +} + +BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size) +{ + return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size); +} BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) { @@ -251,6 +260,9 @@ S32 LLImageJ2C::calcHeaderSizeJ2C() //static S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 rate) { + // Note: this only provides an *estimate* of the size in bytes of an image level + // *TODO: find a way to read the true size (when available) and convey the fact + // that the result is an estimate in the other cases if (rate <= 0.f) rate = .125f; while (discard_level > 0) { diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index dd5bec8b2e..6bba81aab5 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -56,6 +56,8 @@ public: /*virtual*/ void resetLastError(); /*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string()); + BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region); + BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size); // Encode with comment text BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0); @@ -117,6 +119,8 @@ protected: virtual BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) = 0; virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE) = 0; + virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0; + virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1) = 0; friend class LLImageJ2C; }; diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 13b12c0928..8288fa1f5c 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -107,6 +107,17 @@ LLImageJ2COJ::~LLImageJ2COJ() { } +BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region) +{ + // No specific implementation for this method in the OpenJpeg case + return FALSE; +} + +BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +{ + // No specific implementation for this method in the OpenJpeg case + return FALSE; +} BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) { diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index 9476665ccb..9c7cc09fcb 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -39,6 +39,8 @@ protected: /*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count); /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible = FALSE); + /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); }; #endif diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 10ea5685e8..ae456a48be 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -34,35 +34,35 @@ class kdc_flow_control { -public: // Member functions - kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream); - ~kdc_flow_control(); - bool advance_components(); - void process_components(); +public: + kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream); + ~kdc_flow_control(); + bool advance_components(); + void process_components(); + +private: -private: // Data - - struct kdc_component_flow_control { - public: // Data - kdu_image_in_base *reader; - int vert_subsampling; - int ratio_counter; /* Initialized to 0, decremented by `count_delta'; + struct kdc_component_flow_control { + public: + kdu_image_in_base *reader; + int vert_subsampling; + int ratio_counter; /* Initialized to 0, decremented by `count_delta'; when < 0, a new line must be processed, after which it is incremented by `vert_subsampling'. */ - int initial_lines; - int remaining_lines; - kdu_line_buf *line; - }; - - kdu_codestream codestream; - kdu_dims valid_tile_indices; - kdu_coords tile_idx; - kdu_tile tile; - int num_components; - kdc_component_flow_control *components; - int count_delta; // Holds the minimum of the `vert_subsampling' fields - kdu_multi_analysis engine; - kdu_long max_buffer_memory; + int initial_lines; + int remaining_lines; + kdu_line_buf *line; + }; + + kdu_codestream codestream; + kdu_dims valid_tile_indices; + kdu_coords tile_idx; + kdu_tile tile; + int num_components; + kdc_component_flow_control *components; + int count_delta; // Holds the minimum of the `vert_subsampling' fields + kdu_multi_analysis engine; + kdu_long max_buffer_memory; }; // @@ -72,7 +72,8 @@ void set_default_colour_weights(kdu_params *siz); const char* engineInfoLLImageJ2CKDU() { - return "KDU v6.4.1"; + std::string version = llformat("KDU %s", KDU_CORE_VERSION); + return version.c_str(); } LLImageJ2CKDU* createLLImageJ2CKDU() @@ -105,7 +106,11 @@ const char* fallbackEngineInfoLLImageJ2CImpl() class LLKDUDecodeState { public: + LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap); + ~LLKDUDecodeState(); + BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE); +private: S32 mNumComponents; BOOL mUseYCC; kdu_dims mDims; @@ -113,22 +118,12 @@ public: kdu_tile_comp mComps[4]; kdu_line_buf mLines[4]; kdu_pull_ifc mEngines[4]; - bool mReversible[4]; // Some components may be reversible and others not. - int mBitDepths[4]; // Original bit-depth may be quite different from 8. - + bool mReversible[4]; // Some components may be reversible and others not + int mBitDepths[4]; // Original bit-depth may be quite different from 8 + kdu_tile mTile; kdu_byte *mBuf; S32 mRowGap; - - LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap); - ~LLKDUDecodeState(); - BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE); - -public: - int *AssignLayerBytes(siz_params *siz, int &num_specs); - - void setupCodeStream(BOOL keep_codestream, LLImageJ2CKDU::ECodeStreamMode mode); - BOOL initDecode(LLImageRaw &raw_image, F32 decode_time, LLImageJ2CKDU::ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ); }; void ll_kdu_error( void ) @@ -153,7 +148,7 @@ class LLKDUMessageError : public kdu_message public: /*virtual*/ void put_text(const char *s); /*virtual*/ void put_text(const kdu_uint16 *s); - /*virtual*/ void flush(bool end_of_message=false); + /*virtual*/ void flush(bool end_of_message = false); static LLKDUMessageError sDefaultMessage; }; @@ -179,7 +174,7 @@ void LLKDUMessageError::put_text(const kdu_uint16 *s) void LLKDUMessageError::flush(bool end_of_message) { - if( end_of_message ) + if (end_of_message) { throw "KDU throwing an exception"; } @@ -195,7 +190,9 @@ mCodeStreamp(NULL), mTPosp(NULL), mTileIndicesp(NULL), mRawImagep(NULL), -mDecodeState(NULL) +mDecodeState(NULL), +mBlocksSize(-1), +mPrecinctsSize(-1) { } @@ -210,7 +207,7 @@ void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision); void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode) { S32 data_size = base.getDataSize(); - S32 max_bytes = base.getMaxBytes() ? base.getMaxBytes() : data_size; + S32 max_bytes = (base.getMaxBytes() ? base.getMaxBytes() : data_size); // // Initialization @@ -247,21 +244,21 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECod // Set the maximum number of bytes to use from the codestream mCodeStreamp->set_max_bytes(max_bytes); - // If you want to flip or rotate the image for some reason, change + // If you want to flip or rotate the image for some reason, change // the resolution, or identify a restricted region of interest, this is // the place to do it. You may use "kdu_codestream::change_appearance" // and "kdu_codestream::apply_input_restrictions" for this purpose. - // If you wish to truncate the code-stream prior to decompression, you + // If you wish to truncate the code-stream prior to decompression, you // may use "kdu_codestream::set_max_bytes". - // If you wish to retain all compressed data so that the material + // If you wish to retain all compressed data so that the material // can be decompressed multiple times, possibly with different appearance // parameters, you should call "kdu_codestream::set_persistent" here. - // There are a variety of other features which must be enabled at + // There are a variety of other features which must be enabled at // this point if you want to take advantage of them. See the // descriptions appearing with the "kdu_codestream" interface functions // in "kdu_compressed.h" for an itemized account of these capabilities. - switch( mode ) + switch (mode) { case MODE_FAST: mCodeStreamp->set_fast(); @@ -326,7 +323,19 @@ void LLImageJ2CKDU::cleanupCodeStream() mTileIndicesp = NULL; } -BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ) +BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region) +{ + return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region); +} + +BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +{ + mBlocksSize = blocks_size; + mPrecinctsSize = precincts_size; + return TRUE; +} + +BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region) { base.resetLastError(); @@ -339,17 +348,36 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco mRawImagep = &raw_image; mCodeStreamp->change_appearance(false, true, false); - mCodeStreamp->apply_input_restrictions(first_channel,max_channel_count,base.getRawDiscardLevel(),0,NULL); - kdu_dims dims; mCodeStreamp->get_dims(0,dims); - S32 channels = base.getComponents() - first_channel; - if( channels > max_channel_count ) + // Apply loading discard level and cropping if required + kdu_dims* region_kdu = NULL; + if (region != NULL) { - channels = max_channel_count; + region_kdu = new kdu_dims; + region_kdu->pos.x = region[0]; + region_kdu->pos.y = region[1]; + region_kdu->size.x = region[2] - region[0]; + region_kdu->size.y = region[3] - region[1]; } + int discard = (discard_level != -1 ? discard_level : base.getRawDiscardLevel()); + + // Apply loading restrictions + mCodeStreamp->apply_input_restrictions( first_channel, max_channel_count, discard, 0, region_kdu); + + // Clean-up + if (region_kdu) + { + delete region_kdu; + region_kdu = NULL; + } + + // Resize raw_image according to the image to be decoded + kdu_dims dims; mCodeStreamp->get_dims(0,dims); + S32 channels = base.getComponents() - first_channel; + channels = llmin(channels,max_channel_count); raw_image.resize(dims.size.x, dims.size.y, channels); + // llinfos << "Resizing raw_image to " << dims.size.x << ":" << dims.size.y << llendl; - // llinfos << "Resizing to " << dims.size.x << ":" << dims.size.y << llendl; if (!mTileIndicesp) { mTileIndicesp = new kdu_dims; @@ -426,7 +454,7 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco // canvas coordinate system. Comparing the two tells // us where the current tile is in the buffer. S32 channels = base.getComponents() - first_channel; - if( channels > max_channel_count ) + if (channels > max_channel_count) { channels = max_channel_count; } @@ -452,14 +480,14 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco return FALSE; } } - catch( const char* msg ) + catch (const char* msg) { base.setLastError(ll_safe_string(msg)); base.decodeFailed(); cleanupCodeStream(); return TRUE; // done } - catch( ... ) + catch (...) { base.setLastError( "Unknown J2C error" ); base.decodeFailed(); @@ -482,28 +510,17 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, BOOL reversible) { - // Collect simple arguments. - bool transpose, vflip, hflip; - bool allow_rate_prediction, mem, quiet, no_weights; - int cpu_iterations; - std::ostream *record_stream; - - transpose = false; - record_stream = NULL; - allow_rate_prediction = true; - no_weights = false; - cpu_iterations = -1; - mem = false; - quiet = false; - vflip = true; - hflip = false; + // Declare and set simple arguments + bool transpose = false; + bool vflip = true; + bool hflip = false; try { - // Set up input image files. + // Set up input image files siz_params siz; - // Should set rate someplace here. + // Should set rate someplace here LLKDUMemIn mem_in(raw_image.getData(), raw_image.getDataSize(), raw_image.getWidth(), @@ -521,26 +538,17 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co siz.set(Sprecision,0,0,8); // Image samples have original bit-depth of 8 siz.set(Ssigned,0,0,false); // Image samples are originally unsigned - kdu_params *siz_ref = &siz; siz_ref->finalize(); - siz_params transformed_siz; // Use this one to construct code-strea + kdu_params *siz_ref = &siz; + siz_ref->finalize(); + siz_params transformed_siz; // Use this one to construct code-stream transformed_siz.copy_from(&siz,-1,-1,-1,0,transpose,false,false); - // Construct the `kdu_codestream' object and parse all remaining arguments. - + // Construct the `kdu_codestream' object and parse all remaining arguments U32 max_output_size = base.getWidth()*base.getHeight()*base.getComponents(); - if (max_output_size < 1000) - { - max_output_size = 1000; - } + max_output_size = (max_output_size < 1000 ? 1000 : max_output_size); U8 *output_buffer = new U8[max_output_size]; - - U32 output_size = max_output_size; // gets modified - LLKDUMemTarget output(output_buffer, output_size, base.getWidth()*base.getHeight()*base.getComponents()); - if (output_size > max_output_size) - { - llerrs << llformat("LLImageJ2C::encode output_size(%d) > max_output_size(%d)", - output_size,max_output_size) << llendl; - } + U32 output_size = 0; // Address updated by LLKDUMemTarget to give the final compressed buffer size + LLKDUMemTarget output(output_buffer, output_size, max_output_size); kdu_codestream codestream; codestream.create(&transformed_siz,&output); @@ -558,16 +566,22 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co kdu_long layer_bytes[64]; U32 max_bytes = 0; - if ((num_components >= 3) && !no_weights) + if (num_components >= 3) { + // Note that we always use YCC and not YUV + // *TODO: Verify this doesn't screws up reversible textures (like sculpties) as YCC is not reversible but YUV is... set_default_colour_weights(codestream.access_siz()); } if (reversible) { - // If we're doing reversible, assume we're not using quality layers. - // Yes, I know this is incorrect! codestream.access_siz()->parse_string("Creversible=yes"); + // *TODO: we should use yuv in reversible mode and one level since those images are small. + // Don't turn this on now though as both create problems on decoding for the moment + //codestream.access_siz()->parse_string("Clevels=1"); + //codestream.access_siz()->parse_string("Cycc=no"); + // If we're doing reversible (i.e. lossless compression), assumes we're not using quality layers. + // *TODO: this is incorrect and unecessary. Try using the regular layer setting. codestream.access_siz()->parse_string("Clayers=1"); num_layer_specs = 1; layer_bytes[0] = 0; @@ -577,6 +591,7 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co // Rate is the argument passed into the LLImageJ2C which // specifies the target compression rate. The default is 8:1. // Possibly if max_bytes < 500, we should just use the default setting? + // *TODO: mRate is actually always 8:1 in the viewer. Test different values. Also force to reversible for small (< 500 bytes) textures. if (base.mRate != 0.f) { max_bytes = (U32)(base.mRate*base.getWidth()*base.getHeight()*base.getComponents()); @@ -617,42 +632,56 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co codestream.access_siz()->parse_string(layer_string.c_str()); } } - codestream.access_siz()->finalize_all(); - if (cpu_iterations >= 0) + + // Set up data ordering, markers, etc... if precincts or blocks specified + if ((mBlocksSize != -1) || (mPrecinctsSize != -1)) { - codestream.collect_timing_stats(cpu_iterations); + if (mPrecinctsSize != -1) + { + std::string precincts_string = llformat("Cprecincts={%d,%d}",mPrecinctsSize,mPrecinctsSize); + codestream.access_siz()->parse_string(precincts_string.c_str()); + } + if (mBlocksSize != -1) + { + std::string blocks_string = llformat("Cblk={%d,%d}",mBlocksSize,mBlocksSize); + codestream.access_siz()->parse_string(blocks_string.c_str()); + } + std::string ordering_string = llformat("Corder=RPCL"); + codestream.access_siz()->parse_string(ordering_string.c_str()); + std::string PLT_string = llformat("ORGgen_plt=yes"); + codestream.access_siz()->parse_string(PLT_string.c_str()); + std::string Parts_string = llformat("ORGtparts=R"); + codestream.access_siz()->parse_string(Parts_string.c_str()); } + + codestream.access_siz()->finalize_all(); codestream.change_appearance(transpose,vflip,hflip); // Now we are ready for sample data processing. - kdc_flow_control *tile = new kdc_flow_control(&mem_in,codestream); - bool done = false; - while (!done) - { - // Process line by line - done = true; - if (tile->advance_components()) - { - done = false; - tile->process_components(); - } - } + kdc_flow_control *tile = new kdc_flow_control(&mem_in,codestream); + bool done = false; + while (!done) + { + // Process line by line + if (tile->advance_components()) + { + tile->process_components(); + } + else + { + done = true; + } + } // Produce the compressed output - codestream.flush(layer_bytes,num_layer_specs); + codestream.flush(layer_bytes,num_layer_specs); // Cleanup - delete tile; - + delete tile; codestream.destroy(); - if (record_stream != NULL) - { - delete record_stream; - } // Now that we're done encoding, create the new data buffer for the compressed // image and stick it there. - base.copyData(output_buffer, output_size); base.updateData(); // set width, height delete[] output_buffer; @@ -674,19 +703,19 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co BOOL LLImageJ2CKDU::getMetadata(LLImageJ2C &base) { // *FIX: kdu calls our callback function if there's an error, and - // then bombs. To regain control, we throw an exception, and + // then bombs. To regain control, we throw an exception, and // catch it here. try { setupCodeStream(base, FALSE, MODE_FAST); return TRUE; } - catch( const char* msg ) + catch (const char* msg) { base.setLastError(ll_safe_string(msg)); return FALSE; } - catch( ... ) + catch (...) { base.setLastError( "Unknown J2C error" ); return FALSE; @@ -699,37 +728,49 @@ void set_default_colour_weights(kdu_params *siz) assert(cod != NULL); bool can_use_ycc = true; - bool rev0=false; - int depth0=0, sub_x0=1, sub_y0=1; - for (int c=0; c < 3; c++) + bool rev0 = false; + int depth0 = 0, sub_x0 = 1, sub_y0 = 1; + for (int c = 0; c < 3; c++) { - int depth=0; siz->get(Sprecision,c,0,depth); - int sub_y=1; siz->get(Ssampling,c,0,sub_y); - int sub_x=1; siz->get(Ssampling,c,1,sub_x); + int depth = 0; siz->get(Sprecision,c,0,depth); + int sub_y = 1; siz->get(Ssampling,c,0,sub_y); + int sub_x = 1; siz->get(Ssampling,c,1,sub_x); kdu_params *coc = cod->access_relation(-1,c); - bool rev=false; coc->get(Creversible,0,0,rev); + bool rev = false; coc->get(Creversible,0,0,rev); if (c == 0) - { rev0=rev; depth0=depth; sub_x0=sub_x; sub_y0=sub_y; } - else if ((rev != rev0) || (depth != depth0) || - (sub_x != sub_x0) || (sub_y != sub_y0)) + { + rev0 = rev; depth0 = depth; sub_x0 = sub_x; sub_y0 = sub_y; + } + else if ((rev != rev0) || (depth != depth0) || + (sub_x != sub_x0) || (sub_y != sub_y0)) + { can_use_ycc = false; + } } if (!can_use_ycc) + { return; + } bool use_ycc; if (!cod->get(Cycc,0,0,use_ycc)) + { cod->set(Cycc,0,0,use_ycc=true); + } if (!use_ycc) + { return; + } float weight; - if (cod->get(Clev_weights,0,0,weight) || - cod->get(Cband_weights,0,0,weight)) - return; // Weights already specified explicitly. + if (cod->get(Clev_weights,0,0,weight) || cod->get(Cband_weights,0,0,weight)) + { + // Weights already specified explicitly -> nothing to do + return; + } - /* These example weights are adapted from numbers generated by Marcus Nadenau - at EPFL, for a viewing distance of 15 cm and a display resolution of - 300 DPI. */ + // These example weights are adapted from numbers generated by Marcus Nadenau + // at EPFL, for a viewing distance of 15 cm and a display resolution of + // 300 DPI. cod->parse_string("Cband_weights:C0=" "{0.0901},{0.2758},{0.2758}," @@ -775,7 +816,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -793,7 +834,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -816,7 +857,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -835,7 +876,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:(256-(1<<upshift)); + val = (val < 0 ? 0 : 256 - (1<<upshift)); } *dest = (kdu_byte) val; } @@ -857,7 +898,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -873,7 +914,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:(256-(1<<upshift)); + val = (val < 0 ? 0 : 256 - (1<<upshift)); } *dest = (kdu_byte) val; } @@ -892,17 +933,17 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap) mNumComponents = tile.get_num_components(); - llassert(mNumComponents<=4); + llassert(mNumComponents <= 4); mUseYCC = tile.get_ycc(); - for (c=0; c<4; ++c) + for (c = 0; c < 4; ++c) { mReversible[c] = false; mBitDepths[c] = 0; } // Open tile-components and create processing engines and resources - for (c=0; c < mNumComponents; c++) + for (c = 0; c < mNumComponents; c++) { mComps[c] = mTile.access_component(c); mReversible[c] = mComps[c].get_reversible(); @@ -929,7 +970,7 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap) } } mAllocator.finalize(); // Actually creates buffering resources - for (c=0; c < mNumComponents; c++) + for (c = 0; c < mNumComponents; c++) { mLines[c].create(); // Grabs resources from the allocator. } @@ -937,13 +978,11 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap) LLKDUDecodeState::~LLKDUDecodeState() { - S32 c; // Cleanup - for (c=0; c < mNumComponents; c++) + for (S32 c = 0; c < mNumComponents; c++) { mEngines[c].destroy(); // engines are interfaces; no default destructors } - mTile.close(); } @@ -962,7 +1001,7 @@ separation between consecutive rows in the real buffer. */ LLTimer decode_timer; while (mDims.size.y--) { - for (c=0; c < mNumComponents; c++) + for (c = 0; c < mNumComponents; c++) { mEngines[c].pull(mLines[c],true); } @@ -970,7 +1009,7 @@ separation between consecutive rows in the real buffer. */ { kdu_convert_ycc_to_rgb(mLines[0],mLines[1],mLines[2]); } - for (c=0; c < mNumComponents; c++) + for (c = 0; c < mNumComponents; c++) { transfer_bytes(mBuf+c,mLines[c],mNumComponents,mBitDepths[c]); } @@ -990,96 +1029,100 @@ separation between consecutive rows in the real buffer. */ kdc_flow_control::kdc_flow_control (kdu_image_in_base *img_in, kdu_codestream codestream) { - int n; - - this->codestream = codestream; - codestream.get_valid_tiles(valid_tile_indices); - tile_idx = valid_tile_indices.pos; - tile = codestream.open_tile(tile_idx,NULL); - - // Set up the individual components - num_components = codestream.get_num_components(true); - components = new kdc_component_flow_control[num_components]; - count_delta = 0; - kdc_component_flow_control *comp = components; - for (n = 0; n < num_components; n++, comp++) - { - comp->line = NULL; - comp->reader = img_in; - kdu_coords subsampling; - codestream.get_subsampling(n,subsampling,true); - kdu_dims dims; - codestream.get_tile_dims(tile_idx,n,dims,true); - comp->vert_subsampling = subsampling.y; - if ((n == 0) || (comp->vert_subsampling < count_delta)) - { - count_delta = comp->vert_subsampling; - } - comp->ratio_counter = 0; - comp->remaining_lines = comp->initial_lines = dims.size.y; - } - assert(num_components >= 0); - - tile.set_components_of_interest(num_components); - max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false); + int n; + + this->codestream = codestream; + codestream.get_valid_tiles(valid_tile_indices); + tile_idx = valid_tile_indices.pos; + tile = codestream.open_tile(tile_idx,NULL); + + // Set up the individual components + num_components = codestream.get_num_components(true); + components = new kdc_component_flow_control[num_components]; + count_delta = 0; + kdc_component_flow_control *comp = components; + for (n = 0; n < num_components; n++, comp++) + { + comp->line = NULL; + comp->reader = img_in; + kdu_coords subsampling; + codestream.get_subsampling(n,subsampling,true); + kdu_dims dims; + codestream.get_tile_dims(tile_idx,n,dims,true); + comp->vert_subsampling = subsampling.y; + if ((n == 0) || (comp->vert_subsampling < count_delta)) + { + count_delta = comp->vert_subsampling; + } + comp->ratio_counter = 0; + comp->remaining_lines = comp->initial_lines = dims.size.y; + } + assert(num_components >= 0); + + tile.set_components_of_interest(num_components); + max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false); } kdc_flow_control::~kdc_flow_control() { - if (components != NULL) - delete[] components; - if (engine.exists()) - engine.destroy(); + if (components != NULL) + { + delete[] components; + } + if (engine.exists()) + { + engine.destroy(); + } } bool kdc_flow_control::advance_components() { - bool found_line = false; - while (!found_line) - { - bool all_done = true; - kdc_component_flow_control *comp = components; - for (int n = 0; n < num_components; n++, comp++) - { - assert(comp->ratio_counter >= 0); - if (comp->remaining_lines > 0) - { - all_done = false; - comp->ratio_counter -= count_delta; - if (comp->ratio_counter < 0) - { - found_line = true; - comp->line = engine.exchange_line(n,NULL,NULL); - assert(comp->line != NULL); + bool found_line = false; + while (!found_line) + { + bool all_done = true; + kdc_component_flow_control *comp = components; + for (int n = 0; n < num_components; n++, comp++) + { + assert(comp->ratio_counter >= 0); + if (comp->remaining_lines > 0) + { + all_done = false; + comp->ratio_counter -= count_delta; + if (comp->ratio_counter < 0) + { + found_line = true; + comp->line = engine.exchange_line(n,NULL,NULL); + assert(comp->line != NULL); if (comp->line->get_width()) { comp->reader->get(n,*(comp->line),0); } - } - } - } - if (all_done) - { - return false; - } - } - return true; + } + } + } + if (all_done) + { + return false; + } + } + return true; } void kdc_flow_control::process_components() { - kdc_component_flow_control *comp = components; - for (int n = 0; n < num_components; n++, comp++) - { - if (comp->ratio_counter < 0) - { - comp->ratio_counter += comp->vert_subsampling; - assert(comp->ratio_counter >= 0); - assert(comp->remaining_lines > 0); - comp->remaining_lines--; - assert(comp->line != NULL); - engine.exchange_line(n,comp->line,NULL); - comp->line = NULL; - } - } + kdc_component_flow_control *comp = components; + for (int n = 0; n < num_components; n++, comp++) + { + if (comp->ratio_counter < 0) + { + comp->ratio_counter += comp->vert_subsampling; + assert(comp->ratio_counter >= 0); + assert(comp->remaining_lines > 0); + comp->remaining_lines--; + assert(comp->line != NULL); + engine.exchange_line(n,comp->line,NULL); + comp->line = NULL; + } + } } diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 5628f69eeb..9fce58b762 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -58,17 +58,21 @@ protected: /*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count); /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE); + /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); private: + BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL); void setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode); void cleanupCodeStream(); - BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ); // Encode variable LLKDUMemSource *mInputp; kdu_codestream *mCodeStreamp; kdu_coords *mTPosp; // tile position kdu_dims *mTileIndicesp; + int mBlocksSize; + int mPrecinctsSize; // Temporary variables for in-progress decodes... LLImageRaw *mRawImagep; diff --git a/indra/llkdu/llkdumem.cpp b/indra/llkdu/llkdumem.cpp index 1f549cbbe0..0347475559 100644 --- a/indra/llkdu/llkdumem.cpp +++ b/indra/llkdu/llkdumem.cpp @@ -47,12 +47,12 @@ LLKDUMemIn::LLKDUMemIn(const U8 *data, num_components = in_num_components; alignment_bytes = 0; - for (n=0; n<3; ++n) + for (n = 0; n < 3; ++n) { precision[n] = 0; } - for (n=0; n < num_components; ++n) + for (n = 0; n < num_components; ++n) { siz->set(Sdims,n,0,rows); siz->set(Sdims,n,1,cols); @@ -80,12 +80,12 @@ LLKDUMemIn::~LLKDUMemIn() } image_line_buf *tmp; while ((tmp=incomplete_lines) != NULL) - { + { incomplete_lines = tmp->next; delete tmp; } while ((tmp=free_lines) != NULL) - { + { free_lines = tmp->next; delete tmp; } @@ -98,16 +98,16 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) assert((idx >= 0) && (idx < num_components)); x_tnum = x_tnum*num_components+idx; image_line_buf *scan, *prev=NULL; - for (scan=incomplete_lines; scan != NULL; prev=scan, scan=scan->next) - { + for (scan = incomplete_lines; scan != NULL; prev = scan, scan = scan->next) + { assert(scan->next_x_tnum >= x_tnum); if (scan->next_x_tnum == x_tnum) { break; } - } + } if (scan == NULL) - { // Need to read a new image line. + { // Need to read a new image line. assert(x_tnum == 0); // Must consume in very specific order. if (num_unread_rows == 0) { @@ -134,7 +134,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) num_unread_rows--; scan->accessed_samples = 0; scan->next_x_tnum = 0; - } + } assert((cols-scan->accessed_samples) >= line.get_width()); @@ -161,7 +161,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) } } else - { + { kdu_sample16 *dp = line.get_buf16(); if (line.is_absolute()) { // 16-bit absolute integers @@ -177,7 +177,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) dp->ival = (((kdu_int16)(*sp)) - 128) << (KDU_FIX_POINT-8); } } - } + } scan->next_x_tnum++; if (idx == (num_components-1)) diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h index 7064de4408..9d923fc367 100644 --- a/indra/llkdu/llkdumem.h +++ b/indra/llkdu/llkdumem.h @@ -39,7 +39,7 @@ class LLKDUMemSource: public kdu_compressed_source { -public: // Member functions +public: LLKDUMemSource(U8 *input_buffer, U32 size) { mData = input_buffer; @@ -47,11 +47,11 @@ public: // Member functions mCurPos = 0; } - ~LLKDUMemSource() + ~LLKDUMemSource() { } - int read(kdu_byte *buf, int num_bytes) + int read(kdu_byte *buf, int num_bytes) { U32 num_out; num_out = num_bytes; @@ -70,7 +70,7 @@ public: // Member functions mCurPos = 0; } -private: // Data +private: U8 *mData; U32 mSize; U32 mCurPos; @@ -78,7 +78,7 @@ private: // Data class LLKDUMemTarget: public kdu_compressed_target { -public: // Member functions +public: LLKDUMemTarget(U8 *output_buffer, U32 &output_size, const U32 buffer_size) { mData = output_buffer; @@ -87,11 +87,11 @@ public: // Member functions mOutputSize = &output_size; } - ~LLKDUMemTarget() - { + ~LLKDUMemTarget() + { } - bool write(const kdu_byte *buf, int num_bytes) + bool write(const kdu_byte *buf, int num_bytes) { U32 num_out; num_out = num_bytes; @@ -108,7 +108,7 @@ public: // Member functions return true; } -private: // Data +private: U8 *mData; U32 mSize; U32 mCurPos; @@ -117,27 +117,27 @@ private: // Data class LLKDUMemIn : public kdu_image_in_base { -public: // Member functions - LLKDUMemIn(const U8 *data, +public: + LLKDUMemIn(const U8 *data, const U32 size, const U16 rows, const U16 cols, U8 in_num_components, siz_params *siz); - ~LLKDUMemIn(); + ~LLKDUMemIn(); - bool get(int comp_idx, kdu_line_buf &line, int x_tnum); + bool get(int comp_idx, kdu_line_buf &line, int x_tnum); -private: // Data +private: const U8 *mData; - int first_comp_idx; - int num_components; - int rows, cols; - int alignment_bytes; // Number of 0's at end of each line. - int precision[3]; - image_line_buf *incomplete_lines; // Each "sample" represents a full pixel - image_line_buf *free_lines; - int num_unread_rows; + int first_comp_idx; + int num_components; + int rows, cols; + int alignment_bytes; // Number of 0's at end of each line. + int precision[3]; + image_line_buf *incomplete_lines; // Each "sample" represents a full pixel + image_line_buf *free_lines; + int num_unread_rows; U32 mCurPos; U32 mDataSize; diff --git a/indra/llmath/tests/llbbox_test.cpp b/indra/llmath/tests/llbbox_test.cpp index 8064ab217d..fd0dbb58fc 100644 --- a/indra/llmath/tests/llbbox_test.cpp +++ b/indra/llmath/tests/llbbox_test.cpp @@ -34,7 +34,7 @@ #define ANGLE (3.14159265f / 2.0f) -#define APPROX_EQUAL(a, b) dist_vec((a),(b)) < 1e-5 +#define APPROX_EQUAL(a, b) (dist_vec_squared((a),(b)) < 1e-10) namespace tut { diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index 27a368df3d..69d092de76 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -398,6 +398,12 @@ BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type, LLGetAssetCallback callback, void *user_data) { + if (user_data) + { + // The *user_data should not be passed without a callback to clean it up. + llassert(callback != NULL) + } + BOOL exists = mStaticVFS->getExists(uuid, type); if (exists) { @@ -432,15 +438,26 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl; + if (user_data) + { + // The *user_data should not be passed without a callback to clean it up. + llassert(callback != NULL) + } + if (mShutDown) { llinfos << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl; - return; // don't get the asset or do any callbacks, we are shutting down + + if (callback) + { + callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_FAILED, LL_EXSTAT_NONE); + } + return; } - + if (uuid.isNull()) { - // Special case early out for NULL uuid + // Special case early out for NULL uuid and for shutting down if (callback) { callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE, LL_EXSTAT_NULL_UUID); diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 767001b633..97f2792686 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -553,12 +553,10 @@ void LLAvatarNameCache::eraseUnrefreshed() if (!sLastExpireCheck || sLastExpireCheck < max_unrefreshed) { sLastExpireCheck = now; - cache_t::iterator it = sCache.begin(); - while (it != sCache.end()) + + for (cache_t::iterator it = sCache.begin(); it != sCache.end();) { - cache_t::iterator cur = it; - ++it; - const LLAvatarName& av_name = cur->second; + const LLAvatarName& av_name = it->second; if (av_name.mExpires < max_unrefreshed) { const LLUUID& agent_id = it->first; @@ -566,8 +564,12 @@ void LLAvatarNameCache::eraseUnrefreshed() << " user '" << av_name.mUsername << "' " << "expired " << now - av_name.mExpires << " secs ago" << LL_ENDL; - sCache.erase(cur); + sCache.erase(it++); } + else + { + ++it; + } } LL_INFOS("AvNameCache") << sCache.size() << " cached avatar names" << LL_ENDL; } diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index a485fa0160..9b3b24c312 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -674,15 +674,7 @@ void LLCurl::Multi::removeEasy(Easy* easy) //static std::string LLCurl::strerror(CURLcode errorcode) { -#if LL_DARWIN - // curl_easy_strerror was added in libcurl 7.12.0. Unfortunately, the version in the Mac OS X 10.3.9 SDK is 7.10.2... - // There's a problem with the custom curl headers in our build that keeps me from #ifdefing this on the libcurl version number - // (the correct check would be #if LIBCURL_VERSION_NUM >= 0x070c00). We'll fix the header problem soon, but for now - // just punt and print the numeric error code on the Mac. - return llformat("%d", errorcode); -#else // LL_DARWIN return std::string(curl_easy_strerror(errorcode)); -#endif // LL_DARWIN } //////////////////////////////////////////////////////////////////////////// diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 26a20cede8..2103216536 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -144,8 +144,10 @@ void LLPluginClassMedia::reset() mStatusText.clear(); mProgressPercent = 0; mClickURL.clear(); + mClickNavType.clear(); mClickTarget.clear(); mClickUUID.clear(); + mStatusCode = 0; // media_time class mCurrentTime = 0.0f; @@ -1024,9 +1026,15 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) else if(message_name == "click_nofollow") { mClickURL = message.getValue("uri"); + mClickNavType = message.getValue("nav_type"); mClickTarget.clear(); mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW); } + else if(message_name == "navigate_error_page") + { + mStatusCode = message.getValueS32("status_code"); + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_ERROR_PAGE); + } else if(message_name == "cookie_set") { if(mOwner) @@ -1192,16 +1200,6 @@ void LLPluginClassMedia::browse_back() sendMessage(message); } -void LLPluginClassMedia::set_status_redirect(int code, const std::string &url) -{ - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_status_redirect"); - - message.setValueS32("code", code); - message.setValue("url", url); - - sendMessage(message); -} - void LLPluginClassMedia::setBrowserUserAgent(const std::string& user_agent) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_user_agent"); diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 618e928a08..cf8d8b26b9 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -199,7 +199,6 @@ public: void browse_reload(bool ignore_cache = false); void browse_forward(); void browse_back(); - void set_status_redirect(int code, const std::string &url); void setBrowserUserAgent(const std::string& user_agent); void proxyWindowOpened(const std::string &target, const std::string &uuid); void proxyWindowClosed(const std::string &uuid); @@ -227,11 +226,17 @@ public: // This is valid after MEDIA_EVENT_CLICK_LINK_HREF or MEDIA_EVENT_CLICK_LINK_NOFOLLOW std::string getClickURL() const { return mClickURL; }; + // This is valid after MEDIA_EVENT_CLICK_LINK_NOFOLLOW + std::string getClickNavType() const { return mClickNavType; }; + // This is valid after MEDIA_EVENT_CLICK_LINK_HREF std::string getClickTarget() const { return mClickTarget; }; // This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE std::string getClickUUID() const { return mClickUUID; }; + + // This is valid after MEDIA_EVENT_NAVIGATE_ERROR_PAGE + S32 getStatusCode() const { return mStatusCode; }; // These are valid during MEDIA_EVENT_GEOMETRY_CHANGE S32 getGeometryX() const { return mGeometryX; }; @@ -378,12 +383,14 @@ protected: int mProgressPercent; std::string mLocation; std::string mClickURL; + std::string mClickNavType; std::string mClickTarget; std::string mClickUUID; S32 mGeometryX; S32 mGeometryY; S32 mGeometryWidth; S32 mGeometryHeight; + S32 mStatusCode; std::string mAuthURL; std::string mAuthRealm; std::string mHoverText; diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h index 42e93cc6d7..5a4fb1ce90 100644 --- a/indra/llplugin/llpluginclassmediaowner.h +++ b/indra/llplugin/llpluginclassmediaowner.h @@ -52,12 +52,13 @@ public: MEDIA_EVENT_STATUS_TEXT_CHANGED, // browser has updated the status text MEDIA_EVENT_NAME_CHANGED, // browser has updated the name of the media (typically <title> tag) MEDIA_EVENT_LOCATION_CHANGED, // browser location (URL) has changed (maybe due to internal navagation/frames/etc) + MEDIA_EVENT_NAVIGATE_ERROR_PAGE, // browser navigated to a page that resulted in an HTTP error MEDIA_EVENT_CLICK_LINK_HREF, // I'm not entirely sure what the semantics of these two are MEDIA_EVENT_CLICK_LINK_NOFOLLOW, MEDIA_EVENT_CLOSE_REQUEST, // The plugin requested its window be closed (currently hooked up to javascript window.close in webkit) MEDIA_EVENT_PICK_FILE_REQUEST, // The plugin wants the user to pick a file MEDIA_EVENT_GEOMETRY_CHANGE, // The plugin requested its window geometry be changed (per the javascript window interface) - + MEDIA_EVENT_PLUGIN_FAILED_LAUNCH, // The plugin failed to launch MEDIA_EVENT_PLUGIN_FAILED, // The plugin died unexpectedly diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 6ea63809f8..b1a4051e96 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -57,9 +57,12 @@ BOOL gDebugSession = FALSE; BOOL gDebugGL = FALSE; BOOL gClothRipple = FALSE; -BOOL gNoRender = FALSE; +BOOL gHeadlessClient = FALSE; BOOL gGLActive = FALSE; +static const std::string HEADLESS_VENDOR_STRING("Linden Lab"); +static const std::string HEADLESS_RENDERER_STRING("Headless"); +static const std::string HEADLESS_VERSION_STRING("1.0"); std::ofstream gFailLog; @@ -102,7 +105,6 @@ LLMatrix4 gGLObliqueProjectionInverse; #define LL_GL_NAME_POOLING 0 -LLGLNamePool::pool_list_t LLGLNamePool::sInstances; std::list<LLGLUpdate*> LLGLUpdate::sGLQ; #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS @@ -538,9 +540,19 @@ void LLGLManager::setToDebugGPU() void LLGLManager::getGLInfo(LLSD& info) { - info["GLInfo"]["GLVendor"] = std::string((const char *)glGetString(GL_VENDOR)); - info["GLInfo"]["GLRenderer"] = std::string((const char *)glGetString(GL_RENDERER)); - info["GLInfo"]["GLVersion"] = std::string((const char *)glGetString(GL_VERSION)); + if (gHeadlessClient) + { + info["GLInfo"]["GLVendor"] = HEADLESS_VENDOR_STRING; + info["GLInfo"]["GLRenderer"] = HEADLESS_RENDERER_STRING; + info["GLInfo"]["GLVersion"] = HEADLESS_VERSION_STRING; + return; + } + else + { + info["GLInfo"]["GLVendor"] = std::string((const char *)glGetString(GL_VENDOR)); + info["GLInfo"]["GLRenderer"] = std::string((const char *)glGetString(GL_RENDERER)); + info["GLInfo"]["GLVersion"] = std::string((const char *)glGetString(GL_VERSION)); + } #if !LL_MESA_HEADLESS std::string all_exts = ll_safe_string((const char *)gGLHExts.mSysExts); @@ -556,14 +568,22 @@ void LLGLManager::getGLInfo(LLSD& info) std::string LLGLManager::getGLInfoString() { std::string info_str; - std::string all_exts, line; - info_str += std::string("GL_VENDOR ") + ll_safe_string((const char *)glGetString(GL_VENDOR)) + std::string("\n"); - info_str += std::string("GL_RENDERER ") + ll_safe_string((const char *)glGetString(GL_RENDERER)) + std::string("\n"); - info_str += std::string("GL_VERSION ") + ll_safe_string((const char *)glGetString(GL_VERSION)) + std::string("\n"); + if (gHeadlessClient) + { + info_str += std::string("GL_VENDOR ") + HEADLESS_VENDOR_STRING + std::string("\n"); + info_str += std::string("GL_RENDERER ") + HEADLESS_RENDERER_STRING + std::string("\n"); + info_str += std::string("GL_VERSION ") + HEADLESS_VERSION_STRING + std::string("\n"); + } + else + { + info_str += std::string("GL_VENDOR ") + ll_safe_string((const char *)glGetString(GL_VENDOR)) + std::string("\n"); + info_str += std::string("GL_RENDERER ") + ll_safe_string((const char *)glGetString(GL_RENDERER)) + std::string("\n"); + info_str += std::string("GL_VERSION ") + ll_safe_string((const char *)glGetString(GL_VERSION)) + std::string("\n"); + } #if !LL_MESA_HEADLESS - all_exts = (const char *)gGLHExts.mSysExts; + std::string all_exts= ll_safe_string(((const char *)gGLHExts.mSysExts)); LLStringUtil::replaceChar(all_exts, ' ', '\n'); info_str += std::string("GL_EXTENSIONS:\n") + all_exts + std::string("\n"); #endif @@ -573,15 +593,21 @@ std::string LLGLManager::getGLInfoString() void LLGLManager::printGLInfoString() { - std::string info_str; - std::string all_exts, line; - - LL_INFOS("RenderInit") << "GL_VENDOR: " << ((const char *)glGetString(GL_VENDOR)) << LL_ENDL; - LL_INFOS("RenderInit") << "GL_RENDERER: " << ((const char *)glGetString(GL_RENDERER)) << LL_ENDL; - LL_INFOS("RenderInit") << "GL_VERSION: " << ((const char *)glGetString(GL_VERSION)) << LL_ENDL; + if (gHeadlessClient) + { + LL_INFOS("RenderInit") << "GL_VENDOR: " << HEADLESS_VENDOR_STRING << LL_ENDL; + LL_INFOS("RenderInit") << "GL_RENDERER: " << HEADLESS_RENDERER_STRING << LL_ENDL; + LL_INFOS("RenderInit") << "GL_VERSION: " << HEADLESS_VERSION_STRING << LL_ENDL; + } + else + { + LL_INFOS("RenderInit") << "GL_VENDOR: " << ((const char *)glGetString(GL_VENDOR)) << LL_ENDL; + LL_INFOS("RenderInit") << "GL_RENDERER: " << ((const char *)glGetString(GL_RENDERER)) << LL_ENDL; + LL_INFOS("RenderInit") << "GL_VERSION: " << ((const char *)glGetString(GL_VERSION)) << LL_ENDL; + } #if !LL_MESA_HEADLESS - all_exts = std::string(gGLHExts.mSysExts); + std::string all_exts= ll_safe_string(((const char *)gGLHExts.mSysExts)); LLStringUtil::replaceChar(all_exts, ' ', '\n'); LL_DEBUGS("RenderInit") << "GL_EXTENSIONS:\n" << all_exts << LL_ENDL; #endif @@ -590,7 +616,14 @@ void LLGLManager::printGLInfoString() std::string LLGLManager::getRawGLString() { std::string gl_string; - gl_string = ll_safe_string((char*)glGetString(GL_VENDOR)) + " " + ll_safe_string((char*)glGetString(GL_RENDERER)); + if (gHeadlessClient) + { + gl_string = HEADLESS_VENDOR_STRING + " " + HEADLESS_RENDERER_STRING; + } + else + { + gl_string = ll_safe_string((char*)glGetString(GL_VENDOR)) + " " + ll_safe_string((char*)glGetString(GL_RENDERER)); + } return gl_string; } @@ -614,47 +647,47 @@ void LLGLManager::initExtensions() mHasMultitexture = TRUE; # else mHasMultitexture = FALSE; -# endif +# endif // GL_ARB_multitexture # ifdef GL_ARB_texture_env_combine mHasARBEnvCombine = TRUE; # else mHasARBEnvCombine = FALSE; -# endif +# endif // GL_ARB_texture_env_combine # ifdef GL_ARB_texture_compression mHasCompressedTextures = TRUE; # else mHasCompressedTextures = FALSE; -# endif +# endif // GL_ARB_texture_compression # ifdef GL_ARB_vertex_buffer_object mHasVertexBufferObject = TRUE; # else mHasVertexBufferObject = FALSE; -# endif +# endif // GL_ARB_vertex_buffer_object # ifdef GL_EXT_framebuffer_object mHasFramebufferObject = TRUE; # else mHasFramebufferObject = FALSE; -# endif +# endif // GL_EXT_framebuffer_object # ifdef GL_EXT_framebuffer_multisample mHasFramebufferMultisample = TRUE; # else mHasFramebufferMultisample = FALSE; -# endif +# endif // GL_EXT_framebuffer_multisample # ifdef GL_ARB_draw_buffers mHasDrawBuffers = TRUE; #else mHasDrawBuffers = FALSE; -# endif +# endif // GL_ARB_draw_buffers # if defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp) mHasDepthClamp = TRUE; #else mHasDepthClamp = FALSE; -#endif +#endif // defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp) # if GL_EXT_blend_func_separate mHasBlendFuncSeparate = TRUE; #else mHasBlendFuncSeparate = FALSE; -# endif +# endif // GL_EXT_blend_func_separate mHasMipMapGeneration = FALSE; mHasSeparateSpecularColor = FALSE; mHasAnisotropic = FALSE; @@ -1145,7 +1178,7 @@ void assert_glerror() } } - if (!gNoRender && gDebugGL) + if (gDebugGL) { do_assert_glerror(); } @@ -1886,22 +1919,8 @@ LLGLNamePool::LLGLNamePool() { } -void LLGLNamePool::registerPool(LLGLNamePool* pool) -{ - pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), pool); - if (iter == sInstances.end()) - { - sInstances.push_back(pool); - } -} - LLGLNamePool::~LLGLNamePool() { - pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), this); - if (iter != sInstances.end()) - { - sInstances.erase(iter); - } } void LLGLNamePool::upkeep() @@ -1970,20 +1989,22 @@ void LLGLNamePool::release(GLuint name) void LLGLNamePool::upkeepPools() { LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS); - for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter) + tracker_t::LLInstanceTrackerScopedGuard guard; + for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter) { - LLGLNamePool* pool = *iter; - pool->upkeep(); + LLGLNamePool & pool = *iter; + pool.upkeep(); } } //static void LLGLNamePool::cleanupPools() { - for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter) + tracker_t::LLInstanceTrackerScopedGuard guard; + for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter) { - LLGLNamePool* pool = *iter; - pool->cleanup(); + LLGLNamePool & pool = *iter; + pool.cleanup(); } } diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 85fab7a0f8..51b0a1e45f 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -40,6 +40,7 @@ #include "v4math.h" #include "llplane.h" #include "llgltypes.h" +#include "llinstancetracker.h" #include "llglheaders.h" #include "glh/glh_linear.h" @@ -328,9 +329,11 @@ public: Generic pooling scheme for things which use GL names (used for occlusion queries and vertex buffer objects). Prevents thrashing of GL name caches by avoiding calls to glGenFoo and glDeleteFoo. */ -class LLGLNamePool +class LLGLNamePool : public LLInstanceTracker<LLGLNamePool> { public: + typedef LLInstanceTracker<LLGLNamePool> tracker_t; + struct NameEntry { GLuint name; @@ -357,13 +360,11 @@ public: GLuint allocate(); void release(GLuint name); - static void registerPool(LLGLNamePool* pool); static void upkeepPools(); static void cleanupPools(); protected: typedef std::vector<LLGLNamePool*> pool_list_t; - static pool_list_t sInstances; virtual GLuint allocateName() = 0; virtual void releaseName(GLuint name) = 0; @@ -415,7 +416,7 @@ void set_binormals(const S32 index, const U32 stride, const LLVector3 *binormals void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific ); extern BOOL gClothRipple; -extern BOOL gNoRender; +extern BOOL gHeadlessClient; extern BOOL gGLActive; #endif // LL_LLGL_H diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index e8e98211f1..d4ffd6f88e 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -967,12 +967,14 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3 } if (mTexName == 0) { - llwarns << "Setting subimage on image without GL texture" << llendl; + // *TODO: Re-enable warning? Ran into thread locking issues? DK 2011-02-18 + //llwarns << "Setting subimage on image without GL texture" << llendl; return FALSE; } if (datap == NULL) { - llwarns << "Setting subimage on image with NULL datap" << llendl; + // *TODO: Re-enable warning? Ran into thread locking issues? DK 2011-02-18 + //llwarns << "Setting subimage on image with NULL datap" << llendl; return FALSE; } @@ -1100,6 +1102,7 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt //the texture is assiciate with some image by calling glTexImage outside LLImageGL BOOL LLImageGL::createGLTexture() { + if (gHeadlessClient) return FALSE; if (gGLManager.mIsDisabled) { llwarns << "Trying to create a texture while GL is disabled!" << llendl; @@ -1128,6 +1131,7 @@ BOOL LLImageGL::createGLTexture() BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename/*=0*/, BOOL to_create, S32 category) { + if (gHeadlessClient) return FALSE; if (gGLManager.mIsDisabled) { llwarns << "Trying to create a texture while GL is disabled!" << llendl; diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 1beb74eca6..1a5a4f734d 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -323,10 +323,6 @@ void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping) } sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ; - LLGLNamePool::registerPool(&sDynamicVBOPool); - LLGLNamePool::registerPool(&sDynamicIBOPool); - LLGLNamePool::registerPool(&sStreamVBOPool); - LLGLNamePool::registerPool(&sStreamIBOPool); } //static diff --git a/indra/llui/llfloaterreglistener.cpp b/indra/llui/llfloaterreglistener.cpp index 821d4543ae..7525b8cab3 100644 --- a/indra/llui/llfloaterreglistener.cpp +++ b/indra/llui/llfloaterreglistener.cpp @@ -60,6 +60,11 @@ LLFloaterRegListener::LLFloaterRegListener(): "Ask to toggle the state of the floater specified in [\"name\"]", &LLFloaterRegListener::toggleInstance, requiredName); + add("instanceVisible", + "Return on [\"reply\"] an event whose [\"visible\"] indicates the visibility " + "of the floater specified in [\"name\"]", + &LLFloaterRegListener::instanceVisible, + requiredName); LLSD requiredNameButton; requiredNameButton["name"] = LLSD(); requiredNameButton["button"] = LLSD(); @@ -71,9 +76,7 @@ LLFloaterRegListener::LLFloaterRegListener(): void LLFloaterRegListener::getBuildMap(const LLSD& event) const { - // Honor the "reqid" convention by echoing event["reqid"] in our reply packet. - LLReqID reqID(event); - LLSD reply(reqID.makeResponse()); + LLSD reply; // Build an LLSD map that mirrors sBuildMap. Since we have no good way to // represent a C++ callable in LLSD, the only part of BuildData we can // store is the filename. For each LLSD map entry, it would be more @@ -86,7 +89,7 @@ void LLFloaterRegListener::getBuildMap(const LLSD& event) const reply[mi->first] = mi->second.mFile; } // Send the reply to the LLEventPump named in event["reply"]. - LLEventPumps::instance().obtain(event["reply"]).post(reply); + sendReply(reply, event); } void LLFloaterRegListener::showInstance(const LLSD& event) const @@ -104,6 +107,12 @@ void LLFloaterRegListener::toggleInstance(const LLSD& event) const LLFloaterReg::toggleInstance(event["name"], event["key"]); } +void LLFloaterRegListener::instanceVisible(const LLSD& event) const +{ + sendReply(LLSDMap("visible", LLFloaterReg::instanceVisible(event["name"], event["key"])), + event); +} + void LLFloaterRegListener::clickButton(const LLSD& event) const { // If the caller requests a reply, build the reply. diff --git a/indra/llui/llfloaterreglistener.h b/indra/llui/llfloaterreglistener.h index 586656667c..24311a2dfa 100644 --- a/indra/llui/llfloaterreglistener.h +++ b/indra/llui/llfloaterreglistener.h @@ -47,6 +47,7 @@ private: void showInstance(const LLSD& event) const; void hideInstance(const LLSD& event) const; void toggleInstance(const LLSD& event) const; + void instanceVisible(const LLSD& event) const; void clickButton(const LLSD& event) const; }; diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h index e9bdab2d47..669e126266 100644 --- a/indra/llui/lliconctrl.h +++ b/indra/llui/lliconctrl.h @@ -69,6 +69,7 @@ public: void setColor(const LLColor4& color) { mColor = color; } void setImage(LLPointer<LLUIImage> image) { mImagep = image; } + const LLPointer<LLUIImage> getImage() { return mImagep; } private: void setIconImageDrawSize() ; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 7e348656a9..d99ee5a545 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -2290,3 +2290,8 @@ void LLLineEditor::setContextMenu(LLContextMenu* new_context_menu) else mContextMenuHandle.markDead(); } + +void LLLineEditor::setFont(const LLFontGL* font) +{ + mGLFont = font; +} diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 723423a5b9..7b5fa218f2 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -201,6 +201,7 @@ public: const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); } const LLFontGL* getFont() const { return mGLFont; } + void setFont(const LLFontGL* font); void setIgnoreArrowKeys(BOOL b) { mIgnoreArrowKeys = b; } void setIgnoreTab(BOOL b) { mIgnoreTab = b; } diff --git a/indra/llui/llloadingindicator.cpp b/indra/llui/llloadingindicator.cpp index 7b29d92ea0..c4eec1835c 100644 --- a/indra/llui/llloadingindicator.cpp +++ b/indra/llui/llloadingindicator.cpp @@ -39,56 +39,24 @@ //static LLDefaultChildRegistry::Register<LLLoadingIndicator> r("loading_indicator"); /////////////////////////////////////////////////////////////////////////////// -// LLLoadingIndicator::Data class +// LLLoadingIndicator class /////////////////////////////////////////////////////////////////////////////// -/** - * Pre-loaded images shared by all instances of the widget - */ -class LLLoadingIndicator::Data: public LLSingleton<LLLoadingIndicator::Data> +LLLoadingIndicator::LLLoadingIndicator(const Params& p) +: LLUICtrl(p), + mImagesPerSec(p.images_per_sec > 0 ? p.images_per_sec : 1.0f), + mCurImageIdx(0) { -public: - /*virtual*/ void initSingleton(); // from LLSingleton - - LLPointer<LLUIImage> getNextImage(S8& idx) const; - U8 getImagesCount() const { return NIMAGES; } -private: - - static const U8 NIMAGES = 12; - LLPointer<LLUIImage> mImages[NIMAGES]; -}; +} -// virtual -// Called right after the instance gets constructed. -void LLLoadingIndicator::Data::initSingleton() +void LLLoadingIndicator::initFromParams(const Params& p) { - // Load images. - for (U8 i = 0; i < NIMAGES; ++i) + for (LLInitParam::ParamIterator<LLUIImage*>::const_iterator it = p.images().image.begin(), end_it = p.images().image.end(); + it != end_it; + ++it) { - std::string img_name = llformat("Progress_%d", i+1); - mImages[i] = LLUI::getUIImage(img_name, 0); - llassert(mImages[i]); + mImages.push_back(it->getValue()); } -} - -LLPointer<LLUIImage> LLLoadingIndicator::Data::getNextImage(S8& idx) const -{ - // Calculate next index, performing array bounds checking. - idx = (idx >= NIMAGES || idx < 0) ? 0 : (idx + 1) % NIMAGES; - return mImages[idx]; -} - -/////////////////////////////////////////////////////////////////////////////// -// LLLoadingIndicator class -/////////////////////////////////////////////////////////////////////////////// - -LLLoadingIndicator::LLLoadingIndicator(const Params& p) -: LLUICtrl(p) - , mRotationsPerSec(p.rotations_per_sec > 0 ? p.rotations_per_sec : 1.0f) - , mCurImageIdx(-1) -{ - // Select initial image. - mCurImagep = Data::instance().getNextImage(mCurImageIdx); // Start timer for switching images. start(); @@ -100,16 +68,21 @@ void LLLoadingIndicator::draw() if (mImageSwitchTimer.getStarted() && mImageSwitchTimer.hasExpired()) { // Switch to the next image. - mCurImagep = Data::instance().getNextImage(mCurImageIdx); + if (!mImages.empty()) + { + mCurImageIdx = (mCurImageIdx + 1) % mImages.size(); + } // Restart timer. start(); } + LLUIImagePtr cur_image = mImages.empty() ? LLUIImagePtr(NULL) : mImages[mCurImageIdx]; + // Draw current image. - if( mCurImagep.notNull() ) + if( cur_image.notNull() ) { - mCurImagep->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha); + cur_image->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha); } LLUICtrl::draw(); @@ -123,6 +96,6 @@ void LLLoadingIndicator::stop() void LLLoadingIndicator::start() { mImageSwitchTimer.start(); - F32 period = 1.0f / (Data::instance().getImagesCount() * mRotationsPerSec); + F32 period = 1.0f / (mImages.size() * mImagesPerSec); mImageSwitchTimer.setTimerExpirySec(period); } diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h index 4e4a224ef6..c0cb1cc74a 100644 --- a/indra/llui/llloadingindicator.h +++ b/indra/llui/llloadingindicator.h @@ -36,8 +36,8 @@ /** * Perpetual loading indicator (a la MacOSX or YouTube) * - * Number of rotations per second can be overriden - * with the "roations_per_sec" parameter. + * Number of rotations per second can be overridden + * with the "images_per_sec" parameter. * * Can start/stop spinning. * @@ -49,11 +49,24 @@ class LLLoadingIndicator { LOG_CLASS(LLLoadingIndicator); public: + + struct Images : public LLInitParam::Block<Images> + { + Multiple<LLUIImage*> image; + + Images() + : image("image") + {} + }; + struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { - Optional<F32> rotations_per_sec; + Optional<F32> images_per_sec; + Batch<Images> images; + Params() - : rotations_per_sec("rotations_per_sec", 1.0f) + : images_per_sec("images_per_sec", 1.0f), + images("images") {} }; @@ -74,14 +87,15 @@ public: private: LLLoadingIndicator(const Params&); - friend class LLUICtrlFactory; + void initFromParams(const Params&); - class Data; + friend class LLUICtrlFactory; - F32 mRotationsPerSec; + F32 mImagesPerSec; S8 mCurImageIdx; - LLPointer<LLUIImage> mCurImagep; LLFrameTimer mImageSwitchTimer; + + std::vector<LLUIImagePtr> mImages; }; #endif // LL_LLLOADINGINDICATOR_H diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index f0374de98f..8de9c769e2 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3105,9 +3105,6 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y) CURSOR_HEIGHT + MOUSE_CURSOR_PADDING * 2); menu->translateIntoRectWithExclusion( menu_region_rect, mouse_rect, FALSE ); menu->getParent()->sendChildToFront(menu); - - - } ///============================================================================ diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 49537ef78f..fd7bb699f8 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -157,6 +157,7 @@ LLTextBase::Params::Params() read_only("read_only", false), v_pad("v_pad", 0), h_pad("h_pad", 0), + clip("clip", true), clip_partial("clip_partial", true), line_spacing("line_spacing"), max_text_length("max_length", 255), @@ -199,6 +200,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mVAlign(p.font_valign), mLineSpacingMult(p.line_spacing.multiple), mLineSpacingPixels(p.line_spacing.pixels), + mClip(p.clip), mClipPartial(p.clip_partial && !p.allow_scroll), mTrackEnd( p.track_end ), mScrollIndex(-1), @@ -334,7 +336,7 @@ void LLTextBase::drawSelectionBackground() // binary search for line that starts before top of visible buffer line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mTop, compare_bottom()); - line_list_t::const_iterator end_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top()); + line_list_t::const_iterator end_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top()); bool done = false; @@ -512,7 +514,6 @@ void LLTextBase::drawText() selection_right = llmax( mSelectionStart, mSelectionEnd ); } - LLRect scrolled_view_rect = getVisibleDocumentRect(); std::pair<S32, S32> line_range = getVisibleLines(mClipPartial); S32 first_line = line_range.first; S32 last_line = line_range.second; @@ -545,10 +546,10 @@ void LLTextBase::drawText() line_end = next_start; } - LLRect text_rect(line.mRect.mLeft + mVisibleTextRect.mLeft - scrolled_view_rect.mLeft, - line.mRect.mTop - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom, - llmin(mDocumentView->getRect().getWidth(), line.mRect.mRight) - scrolled_view_rect.mLeft, - line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom); + LLRect text_rect(line.mRect); + text_rect.mRight = llmin(mDocumentView->getRect().getWidth(), text_rect.mRight); // clamp right edge to document extents + text_rect.translate(mVisibleTextRect.mLeft, mVisibleTextRect.mBottom); // translate into display region of text widget + text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); // adjust by scroll position // draw a single line of text S32 seg_start = line_start; @@ -993,14 +994,28 @@ void LLTextBase::draw() updateScrollFromCursor(); } - LLRect doc_rect; + LLRect text_rect; if (mScroller) { - mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &doc_rect, this); + mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &text_rect, this); } else { - doc_rect = getLocalRect(); + LLRect visible_lines_rect; + std::pair<S32, S32> line_range = getVisibleLines(mClipPartial); + for (S32 i = line_range.first; i < line_range.second; i++) + { + if (visible_lines_rect.isEmpty()) + { + visible_lines_rect = mLineInfoList[i].mRect; + } + else + { + visible_lines_rect.unionWith(mLineInfoList[i].mRect); + } + } + text_rect = visible_lines_rect; + text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); } if (mBGVisible) @@ -1010,28 +1025,37 @@ void LLTextBase::draw() LLRect bg_rect = mVisibleTextRect; if (mScroller) { - bg_rect.intersectWith(doc_rect); + bg_rect.intersectWith(text_rect); } LLColor4 bg_color = mReadOnly ? mReadOnlyBgColor.get() : hasFocus() ? mFocusBgColor.get() : mWriteableBgColor.get(); - gl_rect_2d(doc_rect, bg_color % alpha, TRUE); + gl_rect_2d(text_rect, bg_color % alpha, TRUE); } - // draw document view - LLUICtrl::draw(); - - { - // only clip if we support scrolling... - // since convention is that text boxes never vertically truncate their contents - // regardless of rect bounds - LLLocalClipRect clip(doc_rect, mScroller != NULL); + bool should_clip = mClip || mScroller != NULL; + { LLLocalClipRect clip(text_rect, should_clip); + + // draw document view + if (mScroller) + { + drawChild(mScroller); + } + else + { + drawChild(mDocumentView); + } + drawSelectionBackground(); drawText(); drawCursor(); } + + mDocumentView->setVisible(FALSE); + LLUICtrl::draw(); + mDocumentView->setVisible(TRUE); } @@ -1415,7 +1439,7 @@ S32 LLTextBase::getFirstVisibleLine() const return iter - mLineInfoList.begin(); } -std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible) +std::pair<S32, S32> LLTextBase::getVisibleLines(bool require_fully_visible) { LLRect visible_region = getVisibleDocumentRect(); line_list_t::const_iterator first_iter; @@ -1424,14 +1448,14 @@ std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible) // make sure we have an up-to-date mLineInfoList reflow(); - if (fully_visible) + if (require_fully_visible) { first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_top()); - last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom()); + last_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom()); } else { - first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom()); + first_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom()); last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_top()); } return std::pair<S32, S32>(first_iter - mLineInfoList.begin(), last_iter - mLineInfoList.begin()); @@ -1998,11 +2022,10 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, pos = segment_line_start + offset; break; } - else if (hit_past_end_of_line && segmentp->getEnd() > line_iter->mDocIndexEnd - 1) + else if (hit_past_end_of_line && segmentp->getEnd() >= line_iter->mDocIndexEnd) { // segment wraps to next line, so just set doc pos to the end of the line - // segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd) - pos = llmin(getLength(), line_iter->mDocIndexEnd); + pos = llclamp(line_iter->mDocIndexEnd - 1, 0, getLength()); break; } start_x += text_width; @@ -2405,14 +2428,41 @@ LLRect LLTextBase::getVisibleDocumentRect() const { return mScroller->getVisibleContentRect(); } - else + else if (mClip) { - // entire document rect is visible when not scrolling + LLRect visible_text_rect = getVisibleTextRect(); + LLRect doc_rect = mDocumentView->getRect(); + visible_text_rect.translate(-doc_rect.mLeft, -doc_rect.mBottom); + + // reject partially visible lines + LLRect visible_lines_rect; + for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end(); + it != end_it; + ++it) + { + bool line_visible = mClipPartial ? visible_text_rect.contains(it->mRect) : visible_text_rect.overlaps(it->mRect); + if (line_visible) + { + if (visible_lines_rect.isEmpty()) + { + visible_lines_rect = it->mRect; + } + else + { + visible_lines_rect.unionWith(it->mRect); + } + } + } + return visible_lines_rect; + } + else + { // entire document rect is visible // but offset according to height of widget + LLRect doc_rect = mDocumentView->getLocalRect(); doc_rect.mLeft -= mDocumentView->getRect().mLeft; // adjust for height of text above widget baseline - doc_rect.mBottom = doc_rect.getHeight() - mVisibleTextRect.getHeight(); + doc_rect.mBottom = llmin(0, doc_rect.getHeight() - mVisibleTextRect.getHeight()); return doc_rect; } } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index aafcf8ceb0..7d545a1ba6 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -265,6 +265,7 @@ public: use_ellipses, parse_urls, parse_highlights, + clip, clip_partial; Optional<S32> v_pad, @@ -338,7 +339,7 @@ public: void addDocumentChild(LLView* view); void removeDocumentChild(LLView* view); const LLView* getDocumentView() const { return mDocumentView; } - LLRect getVisibleTextRect() { return mVisibleTextRect; } + LLRect getVisibleTextRect() const { return mVisibleTextRect; } LLRect getTextBoundingRect(); LLRect getVisibleDocumentRect() const; @@ -552,6 +553,7 @@ protected: bool mTrackEnd; // if true, keeps scroll position at end of document during resize bool mReadOnly; bool mBGVisible; // render background? + bool mClip; // clip text to widget rect bool mClipPartial; // false if we show lines that are partially inside bounding rect bool mPlainText; // didn't use Image or Icon segments S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 5a46c7c98e..9bd445988d 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -592,6 +592,10 @@ void LLTextEditor::indentSelectedLines( S32 spaces ) } } + // Disabling parsing on the fly to avoid updating text segments + // until all indentation commands are executed. + mParseOnTheFly = FALSE; + // Find each start-of-line and indent it do { @@ -617,6 +621,8 @@ void LLTextEditor::indentSelectedLines( S32 spaces ) } while( cur < right ); + mParseOnTheFly = TRUE; + if( (right < getLength()) && (text[right] == '\n') ) { right++; diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index c300fe55d9..8020ca802b 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -61,6 +61,8 @@ // for XUIParse #include "llquaternion.h" #include <boost/tokenizer.hpp> +#include <boost/algorithm/string/find_iterator.hpp> +#include <boost/algorithm/string/finder.hpp> // // Globals @@ -1624,8 +1626,8 @@ void LLUI::cleanupClass() { if(sImageProvider) { - sImageProvider->cleanUp(); - } + sImageProvider->cleanUp(); +} } void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup, const clear_popups_t& clear_popups) @@ -2020,37 +2022,84 @@ void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y) view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect, FALSE ); } +LLView* LLUI::resolvePath(LLView* context, const std::string& path) +{ + // Nothing about resolvePath() should require non-const LLView*. If caller + // wants non-const, call the const flavor and then cast away const-ness. + return const_cast<LLView*>(resolvePath(const_cast<const LLView*>(context), path)); +} + +const LLView* LLUI::resolvePath(const LLView* context, const std::string& path) +{ + // Create an iterator over slash-separated parts of 'path'. Dereferencing + // this iterator returns an iterator_range over the substring. Unlike + // LLStringUtil::getTokens(), this split_iterator doesn't combine adjacent + // delimiters: leading/trailing slash produces an empty substring, double + // slash produces an empty substring. That's what we need. + boost::split_iterator<std::string::const_iterator> ti(path, boost::first_finder("/")), tend; + + if (ti == tend) + { + // 'path' is completely empty, no navigation + return context; + } + + // leading / means "start at root" + if (ti->empty()) + { + context = getRootView(); + ++ti; + } + + bool recurse = false; + for (; ti != tend && context; ++ti) + { + if (ti->empty()) + { + recurse = true; + } + else + { + std::string part(ti->begin(), ti->end()); + context = context->findChildView(part, recurse); + recurse = false; + } + } + + return context; +} + // LLLocalClipRect and LLScreenClipRect moved to lllocalcliprect.h/cpp namespace LLInitParam { - TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count), + ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color) + : super_t(color), red("red"), green("green"), blue("blue"), alpha("alpha"), control("") { - setBlockFromValue(); + updateBlockFromValue(); } - void TypedParam<LLUIColor>::setValueFromBlock() const + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock() { if (control.isProvided()) { - mData.mValue = LLUIColorTable::instance().getColor(control); + updateValue(LLUIColorTable::instance().getColor(control)); } else { - mData.mValue = LLColor4(red, green, blue, alpha); + updateValue(LLColor4(red, green, blue, alpha)); } } - void TypedParam<LLUIColor>::setBlockFromValue() + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() { - LLColor4 color = mData.mValue.get(); + LLColor4 color = getValue(); red.set(color.mV[VRED], false); green.set(color.mV[VGREEN], false); blue.set(color.mV[VBLUE], false); @@ -2058,38 +2107,32 @@ namespace LLInitParam control.set("", false); } - void TypeValues<LLUIColor>::declareValues() - { - declare("white", LLColor4::white); - declare("black", LLColor4::black); - declare("red", LLColor4::red); - declare("green", LLColor4::green); - declare("blue", LLColor4::blue); - } - bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) { return !(a->getFontDesc() < b->getFontDesc()) && !(b->getFontDesc() < a->getFontDesc()); } - TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, _name, value, func, min_count, max_count), + ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp) + : super_t(fontp), name("name"), size("size"), style("style") { - setBlockFromValue(); + if (!fontp) + { + updateValue(LLFontGL::getFontDefault()); + } addSynonym(name, ""); - setBlockFromValue(); + updateBlockFromValue(); } - void TypedParam<const LLFontGL*>::setValueFromBlock() const + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock() { const LLFontGL* res_fontp = LLFontGL::getFontByName(name); if (res_fontp) { - mData.mValue = res_fontp; + updateValue(res_fontp); return; } @@ -2099,22 +2142,26 @@ namespace LLInitParam const LLFontGL* fontp = LLFontGL::getFont(desc); if (fontp) { - mData.mValue = fontp; - } + updateValue(fontp); + } + else + { + updateValue(LLFontGL::getFontDefault()); + } } - void TypedParam<const LLFontGL*>::setBlockFromValue() + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue() { - if (mData.mValue) + if (getValue()) { - name.set(LLFontGL::nameFromFont(mData.mValue), false); - size.set(LLFontGL::sizeFromFont(mData.mValue), false); - style.set(LLFontGL::getStringFromStyle(mData.mValue->getFontDesc().getStyle()), false); + name.set(LLFontGL::nameFromFont(getValue()), false); + size.set(LLFontGL::sizeFromFont(getValue()), false); + style.set(LLFontGL::getStringFromStyle(getValue()->getFontDesc().getStyle()), false); } } - TypedParam<LLRect>::TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count), + ParamValue<LLRect, TypeValues<LLRect> >::ParamValue(const LLRect& rect) + : super_t(rect), left("left"), top("top"), right("right"), @@ -2122,10 +2169,10 @@ namespace LLInitParam width("width"), height("height") { - setBlockFromValue(); + updateBlockFromValue(); } - void TypedParam<LLRect>::setValueFromBlock() const + void ParamValue<LLRect, TypeValues<LLRect> >::updateValueFromBlock() { LLRect rect; @@ -2186,40 +2233,41 @@ namespace LLInitParam rect.mBottom = bottom; rect.mTop = top; } - mData.mValue = rect; + updateValue(rect); } - void TypedParam<LLRect>::setBlockFromValue() + void ParamValue<LLRect, TypeValues<LLRect> >::updateBlockFromValue() { // because of the ambiguity in specifying a rect by position and/or dimensions // we clear the "provided" flag so that values from xui/etc have priority // over those calculated from the rect object - left.set(mData.mValue.mLeft, false); - right.set(mData.mValue.mRight, false); - bottom.set(mData.mValue.mBottom, false); - top.set(mData.mValue.mTop, false); - width.set(mData.mValue.getWidth(), false); - height.set(mData.mValue.getHeight(), false); + LLRect& value = getValue(); + left.set(value.mLeft, false); + right.set(value.mRight, false); + bottom.set(value.mBottom, false); + top.set(value.mTop, false); + width.set(value.getWidth(), false); + height.set(value.getHeight(), false); } - TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count), + ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::ParamValue(const LLCoordGL& coord) + : super_t(coord), x("x"), y("y") { - setBlockFromValue(); + updateBlockFromValue(); } - void TypedParam<LLCoordGL>::setValueFromBlock() const + void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateValueFromBlock() { - mData.mValue.set(x, y); + updateValue(LLCoordGL(x, y)); } - void TypedParam<LLCoordGL>::setBlockFromValue() + void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateBlockFromValue() { - x.set(mData.mValue.mX, false); - y.set(mData.mValue.mY, false); + x.set(getValue().mX, false); + y.set(getValue().mY, false); } diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 62d10df8b2..6a43477693 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -185,6 +185,33 @@ public: //helper functions (should probably move free standing rendering helper functions here) static LLView* getRootView() { return sRootView; } static void setRootView(LLView* view) { sRootView = view; } + /** + * Walk the LLView tree to resolve a path + * Paths can be discovered using Develop > XUI > Show XUI Paths + * + * A leading "/" indicates the root of the tree is the starting + * position of the search, (otherwise the context node is used) + * + * Adjacent "//" mean that the next level of the search is done + * recursively ("descendant" rather than "child"). + * + * Return values: If no match is found, NULL is returned, + * otherwise the matching LLView* is returned. + * + * Examples: + * + * "/" -> return the root view + * "/foo" -> find "foo" as a direct child of the root + * "foo" -> find "foo" as a direct child of the context node + * "//foo" -> find the first "foo" child anywhere in the tree + * "/foo/bar" -> find "foo" as direct child of the root, and + * "bar" as a direct child of "foo" + * "//foo//bar/baz" -> find the first "foo" anywhere in the + * tree, the first "bar" anywhere under it, and "baz" + * as a direct child of that + */ + static const LLView* resolvePath(const LLView* context, const std::string& path); + static LLView* resolvePath(LLView* context, const std::string& path); static std::string locateSkin(const std::string& filename); static void setMousePositionScreen(S32 x, S32 y); static void getMousePositionScreen(S32 *x, S32 *y); @@ -371,10 +398,10 @@ public: namespace LLInitParam { template<> - class TypedParam<LLRect> - : public BlockValue<LLRect> + class ParamValue<LLRect, TypeValues<LLRect> > + : public CustomParamValue<LLRect> { - typedef BlockValue<LLRect> super_t; + typedef CustomParamValue<LLRect> super_t; public: Optional<S32> left, top, @@ -383,62 +410,43 @@ namespace LLInitParam width, height; - TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); + ParamValue(const LLRect& value); - void setValueFromBlock() const; - void setBlockFromValue(); + void updateValueFromBlock(); + void updateBlockFromValue(); }; template<> - struct TypeValues<LLUIColor> : public TypeValuesHelper<LLUIColor> + class ParamValue<LLUIColor, TypeValues<LLUIColor> > + : public CustomParamValue<LLUIColor> { - static void declareValues(); - }; + typedef CustomParamValue<LLUIColor> super_t; - template<> - class TypedParam<LLUIColor> - : public BlockValue<LLUIColor> - { - typedef BlockValue<LLUIColor> super_t; public: - Optional<F32> red, - green, - blue, - alpha; - Optional<std::string> control; - - TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); - void setValueFromBlock() const; - void setBlockFromValue(); + Optional<F32> red, + green, + blue, + alpha; + Optional<std::string> control; + + ParamValue(const LLUIColor& color); + void updateValueFromBlock(); + void updateBlockFromValue(); }; - // provide a better default for Optional<const LLFontGL*> than NULL - template <> - struct DefaultInitializer<const LLFontGL*> - { - // return reference to a single default instance of T - // built-in types will be initialized to zero, default constructor otherwise - static const LLFontGL* get() - { - static const LLFontGL* sDefaultFont = LLFontGL::getFontDefault(); - return sDefaultFont; - } - }; - - template<> - class TypedParam<const LLFontGL*> - : public BlockValue<const LLFontGL*> + class ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> > + : public CustomParamValue<const LLFontGL* > { - typedef BlockValue<const LLFontGL*> super_t; + typedef CustomParamValue<const LLFontGL*> super_t; public: Optional<std::string> name, size, style; - TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); - void setValueFromBlock() const; - void setBlockFromValue(); + ParamValue(const LLFontGL* value); + void updateValueFromBlock(); + void updateBlockFromValue(); }; template<> @@ -467,17 +475,17 @@ namespace LLInitParam template<> - class TypedParam<LLCoordGL> - : public BlockValue<LLCoordGL> + class ParamValue<LLCoordGL, TypeValues<LLCoordGL> > + : public CustomParamValue<LLCoordGL> { - typedef BlockValue<LLCoordGL> super_t; + typedef CustomParamValue<LLCoordGL> super_t; public: Optional<S32> x, y; - TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); - void setValueFromBlock() const; - void setBlockFromValue(); + ParamValue(const LLCoordGL& val); + void updateValueFromBlock(); + void updateBlockFromValue(); }; } diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp index 1ffad4806e..f37947a50b 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llui/lluiimage.cpp @@ -155,32 +155,32 @@ void LLUIImage::onImageLoaded() namespace LLInitParam { - void TypedParam<LLUIImage*>::setValueFromBlock() const + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock() { // The keyword "none" is specifically requesting a null image // do not default to current value. Used to overwrite template images. if (name() == "none") { - mData.mValue = NULL; + updateValue(NULL); return; } LLUIImage* imagep = LLUI::getUIImage(name()); if (imagep) { - mData.mValue = imagep; + updateValue(imagep); } } - void TypedParam<LLUIImage*>::setBlockFromValue() + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue() { - if (mData.mValue == NULL) + if (getValue() == NULL) { name.set("none", false); } else { - name.set(mData.mValue->getName(), false); + name.set(getValue()->getName(), false); } } diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h index 38107c112d..139d88e0ac 100644 --- a/indra/llui/lluiimage.h +++ b/indra/llui/lluiimage.h @@ -92,22 +92,23 @@ protected: namespace LLInitParam { template<> - class TypedParam<LLUIImage*, TypeValues<LLUIImage*>, false> - : public BlockValue<LLUIImage*> + class ParamValue<LLUIImage*, TypeValues<LLUIImage*> > + : public CustomParamValue<LLUIImage*> { typedef boost::add_reference<boost::add_const<LLUIImage*>::type>::type T_const_ref; - typedef BlockValue<LLUIImage*> super_t; + typedef CustomParamValue<LLUIImage*> super_t; public: Optional<std::string> name; - TypedParam(BlockDescriptor& descriptor, const char* name, super_t::value_assignment_t value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count) + ParamValue(LLUIImage* const& image) + : super_t(image) { - setBlockFromValue(); + updateBlockFromValue(); + addSynonym(name, "name"); } - void setValueFromBlock() const; - void setBlockFromValue(); + void updateValueFromBlock(); + void updateBlockFromValue(); }; // Need custom comparison function for our test app, which only loads diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index ac2412c928..26b3b17577 100644 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -114,32 +114,30 @@ namespace LLInitParam const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block); mEnclosingBlockOffset = (U16)(my_addr - block_addr); } - void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {} + void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {} - void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){} + void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){} + void BaseBlock::addSynonym(Param& param, const std::string& synonym) {} param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;} void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size) { descriptor.mCurrentBlockPtr = this; } - bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; } - bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; } - bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; } - bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } + bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; } + void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {} + bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_value, S32 max_value) const { return true; } + bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } bool BaseBlock::validateBlock(bool emit_errors) const { return true; } - TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count) + ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color) + : super_t(color) {} - void TypedParam<LLUIColor>::setValueFromBlock() const + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock() {} - void TypedParam<LLUIColor>::setBlockFromValue() - {} - - void TypeValues<LLUIColor>::declareValues() + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() {} bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) @@ -147,14 +145,14 @@ namespace LLInitParam return false; } - TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, _name, value, func, min_count, max_count) + ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp) + : super_t(fontp) {} - void TypedParam<const LLFontGL*>::setValueFromBlock() const + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock() {} - void TypedParam<const LLFontGL*>::setBlockFromValue() + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue() {} void TypeValues<LLFontGL::HAlign>::declareValues() @@ -166,10 +164,10 @@ namespace LLInitParam void TypeValues<LLFontGL::ShadowType>::declareValues() {} - void TypedParam<LLUIImage*>::setValueFromBlock() const + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock() {} - void TypedParam<LLUIImage*>::setBlockFromValue() + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue() {} diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 8f0a48018f..2f814f4200 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -70,6 +70,22 @@ S32 LLUIImage::getHeight() const return 0; } +namespace LLInitParam +{ + S32 Parser::sNextParseGeneration = 0; + BlockDescriptor::BlockDescriptor() {} + ParamDescriptor::ParamDescriptor(param_handle_t p, + merge_func_t merge_func, + deserialize_func_t deserialize_func, + serialize_func_t serialize_func, + validation_func_t validation_func, + inspect_func_t inspect_func, + S32 min_count, + S32 max_count){} + ParamDescriptor::~ParamDescriptor() {} + +} + namespace tut { struct LLUrlEntryData diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index fdaab00f18..e09ef33d49 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -66,11 +66,25 @@ namespace LLInitParam BaseBlock::BaseBlock() {} BaseBlock::~BaseBlock() {} - void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {} - - void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){} + S32 Parser::sNextParseGeneration = 0; + + BlockDescriptor::BlockDescriptor() {} + ParamDescriptor::ParamDescriptor(param_handle_t p, + merge_func_t merge_func, + deserialize_func_t deserialize_func, + serialize_func_t serialize_func, + validation_func_t validation_func, + inspect_func_t inspect_func, + S32 min_count, + S32 max_count){} + ParamDescriptor::~ParamDescriptor() {} + + void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {} + + void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){} param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;} - + void BaseBlock::addSynonym(Param& param, const std::string& synonym) {} + void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size) { descriptor.mCurrentBlockPtr = this; @@ -84,23 +98,20 @@ namespace LLInitParam mEnclosingBlockOffset = (U16)(my_addr - block_addr); } - bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; } - bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; } - bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; } - bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } + bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation){ return true; } + void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const {} + bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const { return true; } + bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } bool BaseBlock::validateBlock(bool emit_errors) const { return true; } - TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, name, value, func, min_count, max_count) + ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color) + : super_t(color) {} - void TypedParam<LLUIColor>::setValueFromBlock() const + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock() {} - void TypedParam<LLUIColor>::setBlockFromValue() - {} - - void TypeValues<LLUIColor>::declareValues() + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() {} bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) @@ -108,14 +119,15 @@ namespace LLInitParam return false; } - TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) - : super_t(descriptor, _name, value, func, min_count, max_count) + + ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp) + : super_t(fontp) {} - void TypedParam<const LLFontGL*>::setValueFromBlock() const + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock() {} - void TypedParam<const LLFontGL*>::setBlockFromValue() + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue() {} void TypeValues<LLFontGL::HAlign>::declareValues() @@ -127,10 +139,10 @@ namespace LLInitParam void TypeValues<LLFontGL::ShadowType>::declareValues() {} - void TypedParam<LLUIImage*>::setValueFromBlock() const + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock() {} - void TypedParam<LLUIImage*>::setBlockFromValue() + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue() {} bool ParamCompare<LLUIImage*, false>::equals( diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index 73f2336f94..72b54f5380 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -93,11 +93,11 @@ LLDir_Linux::LLDir_Linux() #else mAppRODataDir = tmp_str; #endif - std::string::size_type indra_pos = mExecutableDir.find("/indra"); - if (indra_pos != std::string::npos) + std::string::size_type build_dir_pos = mExecutableDir.rfind("/build-linux-"); + if (build_dir_pos != std::string::npos) { // ...we're in a dev checkout - mSkinBaseDir = mExecutableDir.substr(0, indra_pos) + "/indra/newview/skins"; + mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + "/indra/newview/skins"; llinfos << "Running in dev checkout with mSkinBaseDir " << mSkinBaseDir << llendl; } diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index 445285aa43..f9369b043e 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -150,11 +150,11 @@ LLDir_Mac::LLDir_Mac() CFURLRef resourcesURLRef = CFBundleCopyResourcesDirectoryURL(mainBundleRef); CFURLRefToLLString(resourcesURLRef, mAppRODataDir, true); - U32 indra_pos = mExecutableDir.find("/indra"); - if (indra_pos != std::string::npos) + U32 build_dir_pos = mExecutableDir.rfind("/build-darwin-"); + if (build_dir_pos != std::string::npos) { // ...we're in a dev checkout - mSkinBaseDir = mExecutableDir.substr(0, indra_pos) + mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + "/indra/newview/skins"; llinfos << "Running in dev checkout with mSkinBaseDir " << mSkinBaseDir << llendl; diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp index c1fe21c57d..78b67e9b68 100644 --- a/indra/llvfs/llvfs.cpp +++ b/indra/llvfs/llvfs.cpp @@ -26,6 +26,8 @@ #include "linden_common.h" +#include "llvfs.h" + #include <sys/stat.h> #include <set> #include <map> @@ -39,8 +41,6 @@ #include <sys/file.h> #endif -#include "llvfs.h" - #include "llstl.h" #include "lltimer.h" @@ -1711,7 +1711,8 @@ void LLVFS::audit() BOOL vfs_corrupt = FALSE; - std::vector<U8> buffer(index_size); + // since we take the address of element 0, we need to have at least one element. + std::vector<U8> buffer(llmax<size_t>(index_size,1U)); if (fread(&buffer[0], 1, index_size, mIndexFP) != index_size) { diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 9d174ef1cd..3d89867bc1 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -35,16 +35,20 @@ include_directories( set(llwindow_SOURCE_FILES llkeyboard.cpp + llkeyboardheadless.cpp llwindowheadless.cpp llwindowcallbacks.cpp + llwindowlistener.cpp ) set(llwindow_HEADER_FILES CMakeLists.txt llkeyboard.h + llkeyboardheadless.h llwindowheadless.h llwindowcallbacks.h + llwindowlistener.h ) set(viewer_SOURCE_FILES diff --git a/indra/llwindow/llkeyboardheadless.cpp b/indra/llwindow/llkeyboardheadless.cpp new file mode 100644 index 0000000000..4dfaaed4e1 --- /dev/null +++ b/indra/llwindow/llkeyboardheadless.cpp @@ -0,0 +1,50 @@ +/** + * @file llkeyboardheadless.cpp + * @brief Handler for assignable key bindings + * + * $LicenseInfo:firstyear=2001&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 "linden_common.h" +#include "llkeyboardheadless.h" +#include "llwindowcallbacks.h" + +LLKeyboardHeadless::LLKeyboardHeadless() +{ } + +void LLKeyboardHeadless::resetMaskKeys() +{ } + + +BOOL LLKeyboardHeadless::handleKeyDown(const U16 key, const U32 mask) +{ return FALSE; } + + +BOOL LLKeyboardHeadless::handleKeyUp(const U16 key, const U32 mask) +{ return FALSE; } + +MASK LLKeyboardHeadless::currentMask(BOOL for_mouse_event) +{ return MASK_NONE; } + +void LLKeyboardHeadless::scanKeyboard() +{ } + diff --git a/indra/llwindow/llkeyboardheadless.h b/indra/llwindow/llkeyboardheadless.h new file mode 100644 index 0000000000..4e666f8ce8 --- /dev/null +++ b/indra/llwindow/llkeyboardheadless.h @@ -0,0 +1,45 @@ +/** + * @file llkeyboardheadless.h + * @brief Handler for assignable key bindings + * + * $LicenseInfo:firstyear=2004&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_LLKEYBOARDHEADLESS_H +#define LL_LLKEYBOARDHEADLESS_H + +#include "llkeyboard.h" + +class LLKeyboardHeadless : public LLKeyboard +{ +public: + LLKeyboardHeadless(); + /*virtual*/ ~LLKeyboardHeadless() {}; + + /*virtual*/ BOOL handleKeyUp(const U16 key, MASK mask); + /*virtual*/ BOOL handleKeyDown(const U16 key, MASK mask); + /*virtual*/ void resetMaskKeys(); + /*virtual*/ MASK currentMask(BOOL for_mouse_event); + /*virtual*/ void scanKeyboard(); +}; + +#endif diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 072f694c24..71a5df910d 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -41,6 +41,8 @@ #include "llkeyboard.h" #include "linked_lists.h" #include "llwindowcallbacks.h" +#include "llwindowlistener.h" +#include <boost/lambda/core.hpp> // @@ -115,10 +117,19 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags) mHideCursorPermanent(FALSE), mFlags(flags), mHighSurrogate(0) -{ } +{ + // gKeyboard is still NULL, so it doesn't do LLWindowListener any good to + // pass its value right now. Instead, pass it a nullary function that + // will, when we later need it, return the value of gKeyboard. + // boost::lambda::var() constructs such a functor on the fly. + mListener = new LLWindowListener(callbacks, boost::lambda::var(gKeyboard)); +} LLWindow::~LLWindow() -{ } +{ + delete mListener; + mListener = NULL; +} //virtual BOOL LLWindow::isValid() diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index e8a86a1880..6bdc01ae88 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -36,6 +36,7 @@ class LLSplashScreen; class LLPreeditor; class LLWindowCallbacks; +class LLWindowListener; // Refer to llwindow_test in test/common/llwindow for usage example @@ -188,6 +189,7 @@ protected: BOOL mHideCursorPermanent; U32 mFlags; U16 mHighSurrogate; + LLWindowListener* mListener; // Handle a UTF-16 encoding unit received from keyboard. // Converting the series of UTF-16 encoding units to UTF-32 data, diff --git a/indra/llwindow/llwindowheadless.cpp b/indra/llwindow/llwindowheadless.cpp index 35398f1c09..e6e6bc67ff 100644 --- a/indra/llwindow/llwindowheadless.cpp +++ b/indra/llwindow/llwindowheadless.cpp @@ -28,6 +28,7 @@ #include "indra_constants.h" #include "llwindowheadless.h" +#include "llkeyboardheadless.h" // // LLWindowHeadless @@ -37,6 +38,9 @@ LLWindowHeadless::LLWindowHeadless(LLWindowCallbacks* callbacks, const std::stri BOOL disable_vsync, BOOL use_gl, BOOL ignore_pixel_depth) : LLWindow(callbacks, fullscreen, flags) { + // Initialize a headless keyboard. + gKeyboard = new LLKeyboardHeadless(); + gKeyboard->setCallbacks(callbacks); } diff --git a/indra/llwindow/llwindowlistener.cpp b/indra/llwindow/llwindowlistener.cpp new file mode 100644 index 0000000000..91b99d83c6 --- /dev/null +++ b/indra/llwindow/llwindowlistener.cpp @@ -0,0 +1,307 @@ +/** + * @file llwindowlistener.cpp + * @brief EventAPI interface for injecting input into LLWindow + * + * $LicenseInfo:firstyear=2001&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 "linden_common.h" + +#include "llwindowlistener.h" + +#include "llcoord.h" +#include "llkeyboard.h" +#include "llwindowcallbacks.h" +#include <map> + +LLWindowListener::LLWindowListener(LLWindowCallbacks *window, const KeyboardGetter& kbgetter) + : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"), + mWindow(window), + mKbGetter(kbgetter) +{ + std::string keySomething = + "Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified "; + std::string keyExplain = + "(integer keycode values, or keysym \"XXXX\" from any KEY_XXXX, in\n" + "http://hg.secondlife.com/viewer-development/src/tip/indra/llcommon/indra_constants.h )"; + std::string mask = + "Specify optional [\"mask\"] as an array containing any of \"CONTROL\", \"ALT\",\n" + "\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n" + "to form the mask used with the event."; + + std::string mouseSomething = + "Given [\"button\"], [\"x\"] and [\"y\"], inject the given mouse "; + std::string mouseExplain = + "(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")"; + + add("keyDown", + keySomething + "keypress event.\n" + keyExplain + '\n' + mask, + &LLWindowListener::keyDown); + add("keyUp", + keySomething + "key release event.\n" + keyExplain + '\n' + mask, + &LLWindowListener::keyUp); + add("mouseDown", + mouseSomething + "click event.\n" + mouseExplain + '\n' + mask, + &LLWindowListener::mouseDown); + add("mouseUp", + mouseSomething + "release event.\n" + mouseExplain + '\n' + mask, + &LLWindowListener::mouseUp); + add("mouseMove", + std::string("Given [\"x\"] and [\"y\"], inject the given mouse movement event.\n") + + mask, + &LLWindowListener::mouseMove); + add("mouseScroll", + "Given an integer number of [\"clicks\"], inject the given mouse scroll event.\n" + "(positive clicks moves downward through typical content)", + &LLWindowListener::mouseScroll); +} + +template <typename MAPPED> +class StringLookup +{ +private: + std::string mDesc; + typedef std::map<std::string, MAPPED> Map; + Map mMap; + +public: + StringLookup(const std::string& desc): mDesc(desc) {} + + MAPPED lookup(const typename Map::key_type& key) const + { + typename Map::const_iterator found = mMap.find(key); + if (found == mMap.end()) + { + LL_WARNS("LLWindowListener") << "Unknown " << mDesc << " '" << key << "'" << LL_ENDL; + return MAPPED(); + } + return found->second; + } + +protected: + void add(const typename Map::key_type& key, const typename Map::mapped_type& value) + { + mMap.insert(typename Map::value_type(key, value)); + } +}; + +// for WhichKeysym. KeyProxy is like the typedef KEY, except that KeyProxy() +// (default-constructed) is guaranteed to have the value KEY_NONE. +class KeyProxy +{ +public: + KeyProxy(KEY k): mKey(k) {} + KeyProxy(): mKey(KEY_NONE) {} + operator KEY() const { return mKey; } + +private: + KEY mKey; +}; + +struct WhichKeysym: public StringLookup<KeyProxy> +{ + WhichKeysym(): StringLookup<KeyProxy>("keysym") + { + add("RETURN", KEY_RETURN); + add("LEFT", KEY_LEFT); + add("RIGHT", KEY_RIGHT); + add("UP", KEY_UP); + add("DOWN", KEY_DOWN); + add("ESCAPE", KEY_ESCAPE); + add("BACKSPACE", KEY_BACKSPACE); + add("DELETE", KEY_DELETE); + add("SHIFT", KEY_SHIFT); + add("CONTROL", KEY_CONTROL); + add("ALT", KEY_ALT); + add("HOME", KEY_HOME); + add("END", KEY_END); + add("PAGE_UP", KEY_PAGE_UP); + add("PAGE_DOWN", KEY_PAGE_DOWN); + add("HYPHEN", KEY_HYPHEN); + add("EQUALS", KEY_EQUALS); + add("INSERT", KEY_INSERT); + add("CAPSLOCK", KEY_CAPSLOCK); + add("TAB", KEY_TAB); + add("ADD", KEY_ADD); + add("SUBTRACT", KEY_SUBTRACT); + add("MULTIPLY", KEY_MULTIPLY); + add("DIVIDE", KEY_DIVIDE); + add("F1", KEY_F1); + add("F2", KEY_F2); + add("F3", KEY_F3); + add("F4", KEY_F4); + add("F5", KEY_F5); + add("F6", KEY_F6); + add("F7", KEY_F7); + add("F8", KEY_F8); + add("F9", KEY_F9); + add("F10", KEY_F10); + add("F11", KEY_F11); + add("F12", KEY_F12); + + add("PAD_UP", KEY_PAD_UP); + add("PAD_DOWN", KEY_PAD_DOWN); + add("PAD_LEFT", KEY_PAD_LEFT); + add("PAD_RIGHT", KEY_PAD_RIGHT); + add("PAD_HOME", KEY_PAD_HOME); + add("PAD_END", KEY_PAD_END); + add("PAD_PGUP", KEY_PAD_PGUP); + add("PAD_PGDN", KEY_PAD_PGDN); + add("PAD_CENTER", KEY_PAD_CENTER); // the 5 in the middle + add("PAD_INS", KEY_PAD_INS); + add("PAD_DEL", KEY_PAD_DEL); + add("PAD_RETURN", KEY_PAD_RETURN); + add("PAD_ADD", KEY_PAD_ADD); // not used + add("PAD_SUBTRACT", KEY_PAD_SUBTRACT); // not used + add("PAD_MULTIPLY", KEY_PAD_MULTIPLY); // not used + add("PAD_DIVIDE", KEY_PAD_DIVIDE); // not used + + add("BUTTON0", KEY_BUTTON0); + add("BUTTON1", KEY_BUTTON1); + add("BUTTON2", KEY_BUTTON2); + add("BUTTON3", KEY_BUTTON3); + add("BUTTON4", KEY_BUTTON4); + add("BUTTON5", KEY_BUTTON5); + add("BUTTON6", KEY_BUTTON6); + add("BUTTON7", KEY_BUTTON7); + add("BUTTON8", KEY_BUTTON8); + add("BUTTON9", KEY_BUTTON9); + add("BUTTON10", KEY_BUTTON10); + add("BUTTON11", KEY_BUTTON11); + add("BUTTON12", KEY_BUTTON12); + add("BUTTON13", KEY_BUTTON13); + add("BUTTON14", KEY_BUTTON14); + add("BUTTON15", KEY_BUTTON15); + } +}; +static WhichKeysym keysyms; + +struct WhichMask: public StringLookup<MASK> +{ + WhichMask(): StringLookup<MASK>("shift mask") + { + add("NONE", MASK_NONE); + add("CONTROL", MASK_CONTROL); // Mapped to cmd on Macs + add("ALT", MASK_ALT); + add("SHIFT", MASK_SHIFT); + add("MAC_CONTROL", MASK_MAC_CONTROL); // Un-mapped Ctrl key on Macs, not used on Windows + } +}; +static WhichMask masks; + +static MASK getMask(const LLSD& event) +{ + MASK mask(MASK_NONE); + LLSD masknames(event["mask"]); + for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray()); + ai != aend; ++ai) + { + mask |= masks.lookup(*ai); + } + return mask; +} + +static KEY getKEY(const LLSD& event) +{ + if (event.has("keysym")) + { + return keysyms.lookup(event["keysym"]); + } + else if (event.has("keycode")) + { + return KEY(event["keycode"].asInteger()); + } + else + { + return KEY(event["char"].asString()[0]); + } +} + +void LLWindowListener::keyDown(LLSD const & evt) +{ + mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt)); +} + +void LLWindowListener::keyUp(LLSD const & evt) +{ + mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt)); +} + +// for WhichButton +typedef BOOL (LLWindowCallbacks::*MouseFunc)(LLWindow *, LLCoordGL, MASK); +struct Actions +{ + Actions(const MouseFunc& d, const MouseFunc& u): down(d), up(u), valid(true) {} + Actions(): valid(false) {} + MouseFunc down, up; + bool valid; +}; + +struct WhichButton: public StringLookup<Actions> +{ + WhichButton(): StringLookup<Actions>("mouse button") + { + add("LEFT", Actions(&LLWindowCallbacks::handleMouseDown, + &LLWindowCallbacks::handleMouseUp)); + add("RIGHT", Actions(&LLWindowCallbacks::handleRightMouseDown, + &LLWindowCallbacks::handleRightMouseUp)); + add("MIDDLE", Actions(&LLWindowCallbacks::handleMiddleMouseDown, + &LLWindowCallbacks::handleMiddleMouseUp)); + } +}; +static WhichButton buttons; + +static LLCoordGL getPos(const LLSD& event) +{ + return LLCoordGL(event["x"].asInteger(), event["y"].asInteger()); +} + +void LLWindowListener::mouseDown(LLSD const & evt) +{ + Actions actions(buttons.lookup(evt["button"])); + if (actions.valid) + { + (mWindow->*(actions.down))(NULL, getPos(evt), getMask(evt)); + } +} + +void LLWindowListener::mouseUp(LLSD const & evt) +{ + Actions actions(buttons.lookup(evt["button"])); + if (actions.valid) + { + (mWindow->*(actions.up))(NULL, getPos(evt), getMask(evt)); + } +} + +void LLWindowListener::mouseMove(LLSD const & evt) +{ + mWindow->handleMouseMove(NULL, getPos(evt), getMask(evt)); +} + +void LLWindowListener::mouseScroll(LLSD const & evt) +{ + S32 clicks = evt["clicks"].asInteger(); + + mWindow->handleScrollWheel(NULL, clicks); +} + diff --git a/indra/llwindow/llwindowlistener.h b/indra/llwindow/llwindowlistener.h new file mode 100644 index 0000000000..74e577ff93 --- /dev/null +++ b/indra/llwindow/llwindowlistener.h @@ -0,0 +1,55 @@ +/** + * @file llwindowlistener.h + * @brief EventAPI interface for injecting input into LLWindow + * + * $LicenseInfo:firstyear=2001&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_LLWINDOWLISTENER_H +#define LL_LLWINDOWLISTENER_H + +#include "lleventapi.h" +#include <boost/function.hpp> + +class LLKeyboard; +class LLWindowCallbacks; + +class LLWindowListener : public LLEventAPI +{ +public: + typedef boost::function<LLKeyboard*()> KeyboardGetter; + LLWindowListener(LLWindowCallbacks * window, const KeyboardGetter& kbgetter); + + void keyDown(LLSD const & evt); + void keyUp(LLSD const & evt); + void mouseDown(LLSD const & evt); + void mouseUp(LLSD const & evt); + void mouseMove(LLSD const & evt); + void mouseScroll(LLSD const & evt); + +private: + LLWindowCallbacks * mWindow; + KeyboardGetter mKbGetter; +}; + + +#endif // LL_LLWINDOWLISTENER_H diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index affd7276cc..447e3661db 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -108,9 +108,6 @@ static long getDictLong (CFDictionaryRef refDict, CFStringRef key); static EventTypeSpec WindowHandlerEventList[] = { // Window-related events - // { kEventClassWindow, kEventWindowCollapsing }, - // { kEventClassWindow, kEventWindowCollapsed }, - // { kEventClassWindow, kEventWindowShown }, { kEventClassWindow, kEventWindowActivated }, { kEventClassWindow, kEventWindowDeactivated }, { kEventClassWindow, kEventWindowShown }, @@ -121,8 +118,7 @@ static EventTypeSpec WindowHandlerEventList[] = { kEventClassWindow, kEventWindowClose }, { kEventClassWindow, kEventWindowBoundsChanging }, { kEventClassWindow, kEventWindowBoundsChanged }, - // { kEventClassWindow, kEventWindowZoomed }, - // { kEventClassWindow, kEventWindowDrawContent }, + { kEventClassWindow, kEventWindowGetIdealSize }, // Mouse events { kEventClassMouse, kEventMouseDown }, @@ -248,6 +244,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks, mCursorIgnoreNextDelta = FALSE; mNeedsResize = FALSE; mOverrideAspectRatio = 0.f; + mMaximized = FALSE; mMinimized = FALSE; mTSMDocument = NULL; // Just in case. mLanguageTextInputAllowed = FALSE; @@ -455,24 +452,23 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits if(!mFullscreen && (mWindow == NULL)) { - Rect window_rect; //int displayWidth = CGDisplayPixelsWide(mDisplay); //int displayHeight = CGDisplayPixelsHigh(mDisplay); //const int menuBarPlusTitleBar = 44; // Ugly magic number. LL_DEBUGS("Window") << "createContext: creating window" << LL_ENDL; - window_rect.left = (long) x; - window_rect.right = (long) x + width; - window_rect.top = (long) y; - window_rect.bottom = (long) y + height; + mPreviousWindowRect.left = (long) x; + mPreviousWindowRect.right = (long) x + width; + mPreviousWindowRect.top = (long) y; + mPreviousWindowRect.bottom = (long) y + height; //----------------------------------------------------------------------- // Create the window //----------------------------------------------------------------------- mWindow = NewCWindow( NULL, - &window_rect, + &mPreviousWindowRect, mWindowTitle, false, // Create the window invisible. Whoever calls createContext() should show it after any moving/resizing. // noGrowDocProc, // Window with no grow box and no zoom box @@ -481,8 +477,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits kFirstWindowOfClass, true, (long)this); - - + if (!mWindow) { setupFailure("Window creation error", "Error", OSMB_OK); @@ -1093,31 +1088,22 @@ BOOL LLWindowMacOSX::getVisible() BOOL LLWindowMacOSX::getMinimized() { - BOOL result = FALSE; - - // Since the set of states where we want to act "minimized" is non-trivial, it's easier to - // track things locally than to try and retrieve the state from the window manager. - result = mMinimized; - - return(result); + return mMinimized; } BOOL LLWindowMacOSX::getMaximized() { - BOOL result = FALSE; - - if (mWindow) - { - // TODO - } - - return(result); + return mMaximized; } BOOL LLWindowMacOSX::maximize() { - // TODO - return FALSE; + if (mWindow && !mMaximized) + { + ZoomWindow(mWindow, inContent, true); + } + + return mMaximized; } BOOL LLWindowMacOSX::getFullscreen() @@ -2559,7 +2545,24 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, ¤tBounds); GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &previousBounds); - + + // Put an offset into window un-maximize operation since the kEventWindowGetIdealSize + // event only allows the specification of size and not position. + if (mMaximized) + { + short leftOffset = mPreviousWindowRect.left - currentBounds.left; + currentBounds.left += leftOffset; + currentBounds.right += leftOffset; + + short topOffset = mPreviousWindowRect.top - currentBounds.top; + currentBounds.top += topOffset; + currentBounds.bottom += topOffset; + } + else + { + // Store off the size for future un-maximize operations + mPreviousWindowRect = previousBounds; + } if ((currentBounds.right - currentBounds.left) < MIN_WIDTH) { @@ -2578,13 +2581,43 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e case kEventWindowBoundsChanged: { + // Get new window bounds Rect newBounds; - GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &newBounds); + + // Get previous window bounds + Rect oldBounds; + GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &oldBounds); + + // Determine if the new size is larger than the old + bool newBoundsLarger = ((newBounds.right - newBounds.left) >= (oldBounds.right - oldBounds.left)); + newBoundsLarger &= ((newBounds.bottom - newBounds.top) >= (oldBounds.bottom - oldBounds.top)); + + // Check to see if this is a zoom event (+ button on window pane) + unsigned int eventParams; + GetEventParameter(event, kEventParamAttributes, typeUInt32, NULL, sizeof(int), NULL, &eventParams); + bool isZoomEvent = ((eventParams & kWindowBoundsChangeZoom) != 0); + + // Maximized flag is if zoom event and increasing window size + mMaximized = (isZoomEvent && newBoundsLarger); + aglUpdateContext(mContext); + mCallbacks->handleResize(this, newBounds.right - newBounds.left, newBounds.bottom - newBounds.top); - - + } + break; + + case kEventWindowGetIdealSize: + // Only recommend a new ideal size when un-maximizing + if (mMaximized == TRUE) + { + Point nonMaximizedSize; + + nonMaximizedSize.v = mPreviousWindowRect.bottom - mPreviousWindowRect.top; + nonMaximizedSize.h = mPreviousWindowRect.right - mPreviousWindowRect.left; + + SetEventParameter(event, kEventParamDimensions, typeQDPoint, sizeof(Point), &nonMaximizedSize); + result = noErr; } break; diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 6dc093b4be..6c9e075a21 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -156,7 +156,6 @@ protected: static pascal Boolean staticMoveEventComparator( EventRef event, void* data); OSStatus eventHandler (EventHandlerCallRef myHandler, EventRef event); void adjustCursorDecouple(bool warpingMouse = false); - void fixWindowSize(void); void stopDockTileBounce(); static MASK modifiersToMask(SInt16 modifiers); @@ -182,6 +181,7 @@ protected: EventComparatorUPP mMoveEventCampartorUPP; Rect mOldMouseClip; // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse() + Rect mPreviousWindowRect; // Save previous window for un-maximize event Str255 mWindowTitle; double mOriginalAspectRatio; BOOL mSimulatedRightClick; @@ -195,6 +195,7 @@ protected: BOOL mNeedsResize; // Constructor figured out the window is too big, it needs a resize. LLCoordScreen mNeedsResizeSize; F32 mOverrideAspectRatio; + BOOL mMaximized; BOOL mMinimized; U32 mFSAASamples; BOOL mForceRebuild; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 6722248c23..551d487cc8 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -500,7 +500,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, //----------------------------------------------------------------------- DEVMODE dev_mode; - ::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+ ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); dev_mode.dmSize = sizeof(DEVMODE); DWORD current_refresh; if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode)) @@ -880,7 +880,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO { GLuint pixel_format; DEVMODE dev_mode; - ::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+ ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); dev_mode.dmSize = sizeof(DEVMODE); DWORD current_refresh; DWORD dw_ex_style; @@ -2715,7 +2715,7 @@ LLWindow::LLWindowResolution* LLWindowWin32::getSupportedResolutions(S32 &num_re { mSupportedResolutions = new LLWindowResolution[MAX_NUM_RESOLUTIONS]; DEVMODE dev_mode; - ::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+ ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); dev_mode.dmSize = sizeof(DEVMODE); mNumSupportedResolutions = 0; @@ -2792,7 +2792,7 @@ F32 LLWindowWin32::getPixelAspectRatio() BOOL LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh) { DEVMODE dev_mode; - ::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+ ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); dev_mode.dmSize = sizeof(DEVMODE); BOOL success = FALSE; diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 6e4364a20d..0809d95628 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -837,9 +837,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values, bool save_values) { - std::string name; LLSD settings; - LLSD control_map; llifstream infile; infile.open(filename); if(!infile.is_open()) @@ -863,8 +861,8 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr) { bool persist = true; - name = (*itr).first; - control_map = (*itr).second; + std::string const & name = itr->first; + LLSD const & control_map = itr->second; if(control_map.has("Persist")) { diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index fcdbaa4309..b3312798dd 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -44,8 +44,51 @@ namespace LLInitParam } // + // ParamDescriptor + // + ParamDescriptor::ParamDescriptor(param_handle_t p, + merge_func_t merge_func, + deserialize_func_t deserialize_func, + serialize_func_t serialize_func, + validation_func_t validation_func, + inspect_func_t inspect_func, + S32 min_count, + S32 max_count) + : mParamHandle(p), + mMergeFunc(merge_func), + mDeserializeFunc(deserialize_func), + mSerializeFunc(serialize_func), + mValidationFunc(validation_func), + mInspectFunc(inspect_func), + mMinCount(min_count), + mMaxCount(max_count), + mGeneration(0), + mUserData(NULL) + {} + + ParamDescriptor::ParamDescriptor() + : mParamHandle(0), + mMergeFunc(NULL), + mDeserializeFunc(NULL), + mSerializeFunc(NULL), + mValidationFunc(NULL), + mInspectFunc(NULL), + mMinCount(0), + mMaxCount(0), + mGeneration(0), + mUserData(NULL) + {} + + ParamDescriptor::~ParamDescriptor() + { + delete mUserData; + } + + // // Parser // + S32 Parser::sNextParseGeneration = 0; + Parser::~Parser() {} @@ -73,6 +116,12 @@ namespace LLInitParam std::copy(src_block_data.mAllParams.begin(), src_block_data.mAllParams.end(), std::back_inserter(mAllParams)); } + BlockDescriptor::BlockDescriptor() + : mMaxParamOffset(0), + mInitializationState(UNINITIALIZED), + mCurrentBlockPtr(NULL) + {} + // // BaseBlock // @@ -115,7 +164,7 @@ namespace LLInitParam bool BaseBlock::submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent) { - if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end()))) + if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end()), -1)) { if (!silent) { @@ -145,7 +194,7 @@ namespace LLInitParam return true; } - bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const + void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { // named param is one like LLView::Params::follows // unnamed param is like LLView::Params::rect - implicit @@ -212,11 +261,9 @@ namespace LLInitParam name_stack.pop_back(); } } - - return true; } - bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const + bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const { // named param is one like LLView::Params::follows // unnamed param is like LLView::Params::rect - implicit @@ -273,11 +320,13 @@ namespace LLInitParam return true; } - bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack) + bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 parent_generation) { BlockDescriptor& block_data = mostDerivedBlockDescriptor(); bool names_left = name_stack.first != name_stack.second; + S32 parse_generation = name_stack.first == name_stack.second ? -1 : name_stack.first->second; + if (names_left) { const std::string& top_name = name_stack.first->first; @@ -294,7 +343,7 @@ namespace LLInitParam Parser::name_stack_range_t new_name_stack(name_stack.first, name_stack.second); ++new_name_stack.first; - return deserialize_func(*paramp, p, new_name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second); + return deserialize_func(*paramp, p, new_name_stack, parse_generation); } } @@ -306,7 +355,7 @@ namespace LLInitParam Param* paramp = getParamFromHandle((*it)->mParamHandle); ParamDescriptor::deserialize_func_t deserialize_func = (*it)->mDeserializeFunc; - if (deserialize_func && deserialize_func(*paramp, p, name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second)) + if (deserialize_func && deserialize_func(*paramp, p, name_stack, parse_generation)) { return true; } @@ -324,32 +373,32 @@ namespace LLInitParam } //static - void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name) + void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name) { - // create a copy of the paramdescriptor in allparams + // create a copy of the param descriptor in mAllParams // so other data structures can store a pointer to it block_data.mAllParams.push_back(in_param); - ParamDescriptor& param(block_data.mAllParams.back()); + ParamDescriptorPtr param(block_data.mAllParams.back()); std::string name(char_name); - if ((size_t)param.mParamHandle > block_data.mMaxParamOffset) + if ((size_t)param->mParamHandle > block_data.mMaxParamOffset) { llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl; } if (name.empty()) { - block_data.mUnnamedParams.push_back(¶m); + block_data.mUnnamedParams.push_back(param); } else { // don't use insert, since we want to overwrite existing entries - block_data.mNamedParams[name] = ¶m; + block_data.mNamedParams[name] = param; } - if (param.mValidationFunc) + if (param->mValidationFunc) { - block_data.mValidationList.push_back(std::make_pair(param.mParamHandle, param.mValidationFunc)); + block_data.mValidationList.push_back(std::make_pair(param->mParamHandle, param->mValidationFunc)); } } @@ -367,7 +416,7 @@ namespace LLInitParam llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl; } - ParamDescriptor* param_descriptor = findParamDescriptor(handle); + ParamDescriptorPtr param_descriptor = findParamDescriptor(param); if (param_descriptor) { if (synonym.empty()) @@ -382,7 +431,7 @@ namespace LLInitParam } } - void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) + void BaseBlock::paramChanged(const Param& changed_param, bool user_provided) { if (user_provided) { @@ -404,22 +453,23 @@ namespace LLInitParam return LLStringUtil::null; } - ParamDescriptor* BaseBlock::findParamDescriptor(param_handle_t handle) + ParamDescriptorPtr BaseBlock::findParamDescriptor(const Param& param) { + param_handle_t handle = getHandleFromParam(¶m); BlockDescriptor& descriptor = mostDerivedBlockDescriptor(); BlockDescriptor::all_params_list_t::iterator end_it = descriptor.mAllParams.end(); for (BlockDescriptor::all_params_list_t::iterator it = descriptor.mAllParams.begin(); it != end_it; ++it) { - if (it->mParamHandle == handle) return &(*it); + if ((*it)->mParamHandle == handle) return *it; } - return NULL; + return ParamDescriptorPtr(); } // take all provided params from other and apply to self // NOTE: this requires that "other" is of the same derived type as this - bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) + bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { bool some_param_changed = false; BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end(); @@ -427,19 +477,14 @@ namespace LLInitParam it != end_it; ++it) { - const Param* other_paramp = other.getParamFromHandle(it->mParamHandle); - ParamDescriptor::merge_func_t merge_func = it->mMergeFunc; + const Param* other_paramp = other.getParamFromHandle((*it)->mParamHandle); + ParamDescriptor::merge_func_t merge_func = (*it)->mMergeFunc; if (merge_func) { - Param* paramp = getParamFromHandle(it->mParamHandle); + Param* paramp = getParamFromHandle((*it)->mParamHandle); some_param_changed |= merge_func(*paramp, *other_paramp, overwrite); } } return some_param_changed; } - - bool ParamCompare<LLSD, false>::equals(const LLSD &a, const LLSD &b) - { - return false; - } } diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 1f9045754a..a853999e94 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -1,5 +1,5 @@ /** -f * @file llinitparam.h + * @file llinitparam.h * @brief parameter block abstraction for creating complex objects and * parsing construction parameters from xml and LLSD * @@ -29,18 +29,14 @@ f * @file llinitparam.h #define LL_LLPARAM_H #include <vector> - -#include <stddef.h> #include <boost/function.hpp> -#include <boost/bind.hpp> #include <boost/type_traits/is_convertible.hpp> #include <boost/unordered_map.hpp> -#include "llregistry.h" -#include "llmemory.h" - +#include <boost/shared_ptr.hpp> namespace LLInitParam { + template<typename T> const T& defaultValue() { static T value; return value; } template <typename T, bool IS_BOOST_FUNCTION = boost::is_convertible<T, boost::function_base>::value > struct ParamCompare @@ -61,122 +57,119 @@ namespace LLInitParam } }; - // default constructor adaptor for InitParam Values - // constructs default instances of the given type, returned by const reference - template <typename T> - struct DefaultInitializer + template<> + struct ParamCompare<LLSD, false> { - typedef const T& T_const_ref; - // return reference to a single default instance of T - // built-in types will be initialized to zero, default constructor otherwise - static T_const_ref get() { static T t = T(); return t; } + static bool equals(const LLSD &a, const LLSD &b) { return false; } }; // helper functions and classes typedef ptrdiff_t param_handle_t; + // empty default implementation of key cache + // leverages empty base class optimization template <typename T> class TypeValues { public: - // empty default implemenation of key cache - class KeyCache + typedef std::map<std::string, T> value_name_map_t; + + void setValueName(const std::string& key) {} + std::string getValueName() const { return ""; } + void clearValueName() const {} + + static bool getValueFromName(const std::string& name, T& value) { - public: - void setKey(const std::string& key) {} - std::string getKey() const { return ""; } - void clearKey(){} - }; + return false; + } - static bool get(const std::string& name, T& value) + static bool valueNamesExist() { return false; } - static bool empty() + static std::vector<std::string>* getPossibleValues() { - return true; + return NULL; } - static std::vector<std::string>* getPossibleValues() { return NULL; } + static value_name_map_t* getValueNames() {return NULL;} }; template <typename T, typename DERIVED_TYPE = TypeValues<T> > class TypeValuesHelper - : public LLRegistrySingleton<std::string, T, DERIVED_TYPE > { - typedef LLRegistrySingleton<std::string, T, DERIVED_TYPE> super_t; - typedef LLSingleton<DERIVED_TYPE> singleton_t; public: + typedef typename std::map<std::string, T> value_name_map_t; //TODO: cache key by index to save on param block size - class KeyCache + void setValueName(const std::string& value_name) { - public: - void setKey(const std::string& key) - { - mKey = key; - } - - void clearKey() - { - mKey = ""; - } + mValueName = value_name; + } - std::string getKey() const - { - return mKey; - } + std::string getValueName() const + { + return mValueName; + } - private: - std::string mKey; - }; + void clearValueName() const + { + mValueName.clear(); + } - static bool get(const std::string& name, T& value) + static bool getValueFromName(const std::string& name, T& value) { - if (!singleton_t::instance().exists(name)) return false; + value_name_map_t* map = getValueNames(); + typename value_name_map_t::iterator found_it = map->find(name); + if (found_it == map->end()) return false; - value = *singleton_t::instance().getValue(name); + value = found_it->second; return true; } - static bool empty() + static bool valueNamesExist() { - return singleton_t::instance().LLRegistry<std::string, T>::empty(); + return !getValueNames()->empty(); } - //override this to add name value pairs - static void declareValues() {} - - void initSingleton() + static value_name_map_t* getValueNames() { - DERIVED_TYPE::declareValues(); - } + static value_name_map_t sMap; + static bool sInitialized = false; - static const std::vector<std::string>* getPossibleValues() - { - // in order to return a pointer to a member, we lazily - // evaluate the result and store it in mValues here - if (singleton_t::instance().mValues.empty()) + if (!sInitialized) { - typename super_t::Registrar::registry_map_t::const_iterator it; - for (it = super_t::defaultRegistrar().beginItems(); it != super_t::defaultRegistrar().endItems(); ++it) - { - singleton_t::instance().mValues.push_back(it->first); - } + sInitialized = true; + DERIVED_TYPE::declareValues(); } - return &singleton_t::instance().mValues; + return &sMap; } + static std::vector<std::string>* getPossibleValues() + { + static std::vector<std::string> sValues; + + value_name_map_t* map = getValueNames(); + for (typename value_name_map_t::iterator it = map->begin(), end_it = map->end(); + it != end_it; + ++it) + { + sValues.push_back(it->first); + } + return &sValues; + } - protected: static void declare(const std::string& name, const T& value) { - super_t::defaultRegistrar().add(name, value); + (*getValueNames())[name] = value; } - private: - std::vector<std::string> mValues; + protected: + static void getName(const std::string& name, const T& value) + {} + + mutable std::string mValueName; }; class Parser @@ -193,9 +186,9 @@ namespace LLInitParam } }; - typedef std::vector<std::pair<std::string, S32> > name_stack_t; + typedef std::vector<std::pair<std::string, S32> > name_stack_t; typedef std::pair<name_stack_t::const_iterator, name_stack_t::const_iterator> name_stack_range_t; - typedef std::vector<std::string> possible_values_t; + typedef std::vector<std::string> possible_values_t; typedef bool (*parser_read_func_t)(Parser& parser, void* output); typedef bool (*parser_write_func_t)(Parser& parser, const void*, const name_stack_t&); @@ -207,7 +200,7 @@ namespace LLInitParam Parser(parser_read_func_map_t& read_map, parser_write_func_map_t& write_map, parser_inspect_func_map_t& inspect_map) : mParseSilently(false), - mParseGeneration(0), + mParseGeneration(sNextParseGeneration), mParserReadFuncs(&read_map), mParserWriteFuncs(&write_map), mParserInspectFuncs(&inspect_map) @@ -252,7 +245,7 @@ namespace LLInitParam void setParseSilently(bool silent) { mParseSilently = silent; } S32 getParseGeneration() { return mParseGeneration; } - S32 newParseGeneration() { return ++mParseGeneration; } + S32 newParseGeneration() { return mParseGeneration = ++sNextParseGeneration; } protected: @@ -276,6 +269,8 @@ namespace LLInitParam parser_write_func_map_t* mParserWriteFuncs; parser_inspect_func_map_t* mParserInspectFuncs; S32 mParseGeneration; + + static S32 sNextParseGeneration; }; // used to indicate no matching value to a given name when parsing @@ -295,12 +290,13 @@ namespace LLInitParam Param(class BaseBlock* enclosing_block); // store pointer to enclosing block as offset to reduce space and allow for quick copying - BaseBlock& enclosingBlock() const + class BaseBlock& enclosingBlock() const { const U8* my_addr = reinterpret_cast<const U8*>(this); // get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class - return *const_cast<BaseBlock*>( - reinterpret_cast<const BaseBlock*>(my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset)); + return *const_cast<class BaseBlock*> + (reinterpret_cast<const class BaseBlock*> + (my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset)); } private: @@ -313,7 +309,11 @@ namespace LLInitParam // various callbacks and constraints associated with an individual param struct ParamDescriptor { - public: + struct UserData + { + virtual ~UserData() {} + }; + typedef bool(*merge_func_t)(Param&, const Param&, bool); typedef bool(*deserialize_func_t)(Param&, Parser&, const Parser::name_stack_range_t&, S32); typedef void(*serialize_func_t)(const Param&, Parser&, Parser::name_stack_t&, const Param* diff_param); @@ -321,40 +321,18 @@ namespace LLInitParam typedef bool(*validation_func_t)(const Param*); ParamDescriptor(param_handle_t p, - merge_func_t merge_func, - deserialize_func_t deserialize_func, - serialize_func_t serialize_func, - validation_func_t validation_func, - inspect_func_t inspect_func, - S32 min_count, - S32 max_count) - : mParamHandle(p), - mMergeFunc(merge_func), - mDeserializeFunc(deserialize_func), - mSerializeFunc(serialize_func), - mValidationFunc(validation_func), - mInspectFunc(inspect_func), - mMinCount(min_count), - mMaxCount(max_count), - mGeneration(0), - mNumRefs(0) - {} + merge_func_t merge_func, + deserialize_func_t deserialize_func, + serialize_func_t serialize_func, + validation_func_t validation_func, + inspect_func_t inspect_func, + S32 min_count, + S32 max_count); - ParamDescriptor() - : mParamHandle(0), - mMergeFunc(NULL), - mDeserializeFunc(NULL), - mSerializeFunc(NULL), - mValidationFunc(NULL), - mInspectFunc(NULL), - mMinCount(0), - mMaxCount(0), - mGeneration(0), - mNumRefs(0) - {} + ParamDescriptor(); + ~ParamDescriptor(); param_handle_t mParamHandle; - merge_func_t mMergeFunc; deserialize_func_t mDeserializeFunc; serialize_func_t mSerializeFunc; @@ -364,17 +342,16 @@ namespace LLInitParam S32 mMaxCount; S32 mGeneration; S32 mNumRefs; + UserData* mUserData; }; + typedef boost::shared_ptr<ParamDescriptor> ParamDescriptorPtr; + // each derived Block class keeps a static data structure maintaining offsets to various params class BlockDescriptor { public: - BlockDescriptor() - : mMaxParamOffset(0), - mInitializationState(UNINITIALIZED), - mCurrentBlockPtr(NULL) - {} + BlockDescriptor(); typedef enum e_initialization_state { @@ -385,12 +362,10 @@ namespace LLInitParam void aggregateBlockData(BlockDescriptor& src_block_data); - public: - typedef boost::unordered_map<const std::string, ParamDescriptor*> param_map_t; // references param descriptors stored in mAllParams - typedef std::vector<ParamDescriptor*> param_list_t; - - typedef std::list<ParamDescriptor> all_params_list_t;// references param descriptors stored in mAllParams - typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t; + typedef boost::unordered_map<const std::string, ParamDescriptorPtr> param_map_t; + typedef std::vector<ParamDescriptorPtr> param_list_t; + typedef std::list<ParamDescriptorPtr> all_params_list_t; + typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t; param_map_t mNamedParams; // parameters with associated names param_list_t mUnnamedParams; // parameters with_out_ associated names @@ -456,6 +431,7 @@ namespace LLInitParam Param* getParamFromHandle(const param_handle_t param_handle) { if (param_handle == 0) return NULL; + U8* baseblock_address = reinterpret_cast<U8*>(this); return reinterpret_cast<Param*>(baseblock_address + param_handle); } @@ -469,14 +445,13 @@ namespace LLInitParam void addSynonym(Param& param, const std::string& synonym); // Blocks can override this to do custom tracking of changes - virtual void setLastChangedParam(const Param& last_param, bool user_provided); + virtual void paramChanged(const Param& changed_param, bool user_provided); S32 getLastChangeVersion() const { return mChangeVersion; } - bool isDefault() const { return mChangeVersion == 0; } - bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack); - bool serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const; - bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t()) const; + bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 generation); + void serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const; + bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const; virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); } @@ -493,13 +468,20 @@ namespace LLInitParam return false; } - static void addParam(BlockDescriptor& block_data, const ParamDescriptor& param, const char* name); + static void addParam(BlockDescriptor& block_data, ParamDescriptorPtr param, const char* name); + + ParamDescriptorPtr findParamDescriptor(const Param& param); + protected: void init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size); + bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) + { + return mergeBlock(block_data, other, overwrite); + } // take all provided params from other and apply to self - bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite); + bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite); // can be updated in getters mutable S32 mChangeVersion; @@ -512,63 +494,133 @@ namespace LLInitParam private: const std::string& getParamName(const BlockDescriptor& block_data, const Param* paramp) const; - ParamDescriptor* findParamDescriptor(param_handle_t handle); - }; - - - template<typename T> - struct ParamIterator - { - typedef typename std::vector<T>::const_iterator const_iterator; - typedef typename std::vector<T>::iterator iterator; }; // these templates allow us to distinguish between template parameters // that derive from BaseBlock and those that don't - // this is supposedly faster than boost::is_convertible and its ilk template<typename T, typename Void = void> - struct IsBaseBlock + struct IsBlock { static const bool value = false; }; template<typename T> - struct IsBaseBlock<T, typename T::baseblock_base_class_t> + struct IsBlock<T, typename T::baseblock_base_class_t> { static const bool value = true; }; + template<typename T, typename NAME_VALUE_LOOKUP, bool VALUE_IS_BLOCK = IsBlock<T>::value> + class ParamValue : public NAME_VALUE_LOOKUP + { + public: + typedef const T& value_assignment_t; + + ParamValue(): mValue() {} + ParamValue(const T& other) : mValue(other) {} + + void setValue(value_assignment_t val) + { + mValue = val; + } + + value_assignment_t getValue() const + { + return mValue; + } + + T& getValue() + { + return mValue; + } + + private: + T mValue; + }; + + template<typename T, typename NAME_VALUE_LOOKUP> + class ParamValue<T, NAME_VALUE_LOOKUP, true> + : public T, + public NAME_VALUE_LOOKUP + { + public: + typedef const T& value_assignment_t; + + S32 mKeyVersion; + mutable S32 mValidatedVersion; + mutable bool mValidated; // lazy validation flag + + ParamValue() + : T(), + mKeyVersion(0), + mValidatedVersion(-1), + mValidated(false) + {} + + ParamValue(const T& other) + : T(other), + mKeyVersion(0), + mValidatedVersion(-1), + mValidated(false) + { + } + + void setValue(value_assignment_t val) + { + *this = val; + } + + value_assignment_t getValue() const + { + return *this; + } + + T& getValue() + { + return *this; + } + }; + + template<typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> > + struct ParamIterator + { + typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::const_iterator const_iterator; + typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::iterator iterator; + }; + // specialize for custom parsing/decomposition of specific classes // e.g. TypedParam<LLRect> has left, top, right, bottom, etc... template<typename T, typename NAME_VALUE_LOOKUP = TypeValues<T>, bool HAS_MULTIPLE_VALUES = false, - bool VALUE_IS_BLOCK = IsBaseBlock<T>::value> + bool VALUE_IS_BLOCK = IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> class TypedParam - : public Param + : public Param, + public ParamValue<T, NAME_VALUE_LOOKUP> { public: - typedef const T& value_const_ref_t; - typedef value_const_ref_t value_assignment_t; - typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t; + typedef const T& value_assignment_t; typedef TypedParam<T, NAME_VALUE_LOOKUP, HAS_MULTIPLE_VALUES, VALUE_IS_BLOCK> self_t; + typedef NAME_VALUE_LOOKUP name_value_lookup_t; + typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t; TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr) { if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, &deserializeParam, &serializeParam, validate_func, &inspectParam, - min_count, max_count); + min_count, max_count)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } - mData.mValue = value; + setValue(value); } bool isProvided() const { return Param::anyProvided(); } @@ -579,27 +631,27 @@ namespace LLInitParam // no further names in stack, attempt to parse value now if (name_stack.first == name_stack.second) { - if (parser.readValue(typed_param.mData.mValue)) + if (parser.readValue(typed_param.getValue())) { - typed_param.mData.clearKey(); + typed_param.clearValueName(); typed_param.setProvided(true); - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.enclosingBlock().paramChanged(param, true); return true; } // try to parse a known named value - if(!NAME_VALUE_LOOKUP::empty()) + if(name_value_lookup_t::valueNamesExist()) { // try to parse a known named value std::string name; if (parser.readValue(name)) { // try to parse a per type named value - if (NAME_VALUE_LOOKUP::get(name, typed_param.mData.mValue)) + if (name_value_lookup_t::getValueFromName(name, typed_param.getValue())) { - typed_param.mData.setKey(name); + typed_param.setValueName(name); typed_param.setProvided(true); - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.enclosingBlock().paramChanged(param, true); return true; } @@ -619,13 +671,13 @@ namespace LLInitParam name_stack.back().second = parser.newParseGeneration(); } - std::string key = typed_param.mData.getKey(); + std::string key = typed_param.getValueName(); // first try to write out name of name/value pair if (!key.empty()) { - if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key)) + if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), key)) { if (!parser.writeValue(key, name_stack)) { @@ -634,8 +686,9 @@ namespace LLInitParam } } // then try to serialize value directly - else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), static_cast<const self_t*>(diff_param)->get())) { - if (!parser.writeValue(typed_param.mData.mValue, name_stack)) + else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), static_cast<const self_t*>(diff_param)->getValue())) + { + if (!parser.writeValue(typed_param.getValue(), name_stack)) { return; } @@ -647,18 +700,18 @@ namespace LLInitParam // tell parser about our actual type parser.inspectValue<T>(name_stack, min_count, max_count, NULL); // then tell it about string-based alternatives ("red", "blue", etc. for LLColor4) - if (NAME_VALUE_LOOKUP::getPossibleValues()) + if (name_value_lookup_t::getPossibleValues()) { - parser.inspectValue<std::string>(name_stack, min_count, max_count, NAME_VALUE_LOOKUP::getPossibleValues()); + parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues()); } } void set(value_assignment_t val, bool flag_as_provided = true) { - mData.mValue = val; - mData.clearKey(); + setValue(val); + param_value_t::clearValueName(); setProvided(flag_as_provided); - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); + Param::enclosingBlock().paramChanged(*this, flag_as_provided); } void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true) @@ -670,65 +723,56 @@ namespace LLInitParam } // implicit conversion - operator value_assignment_t() const { return get(); } + operator value_assignment_t() const { return param_value_t::getValue(); } // explicit conversion - value_assignment_t operator()() const { return get(); } + value_assignment_t operator()() const { return param_value_t::getValue(); } protected: - value_assignment_t get() const - { - return mData.mValue; - } static bool mergeWith(Param& dst, const Param& src, bool overwrite) { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); + if (src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided())) { - dst_typed_param.mData.clearKey(); - dst_typed_param.set(src_typed_param.get()); + dst_typed_param.clearValueName(); + dst_typed_param.set(src_typed_param.getValue()); return true; } return false; } - - struct Data : public key_cache_t - { - T mValue; - }; - - Data mData; }; // parameter that is a block template <typename T, typename NAME_VALUE_LOOKUP> class TypedParam<T, NAME_VALUE_LOOKUP, false, true> - : public T, - public Param + : public Param, + public ParamValue<T, NAME_VALUE_LOOKUP> { public: typedef const T value_const_t; typedef T value_t; - typedef value_const_t& value_const_ref_t; - typedef value_const_ref_t value_assignment_t; - typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t; + typedef value_const_t& value_assignment_t; typedef TypedParam<T, NAME_VALUE_LOOKUP, false, true> self_t; + typedef NAME_VALUE_LOOKUP name_value_lookup_t; + typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t; TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr), - T(value) + param_value_t(value) { if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, &deserializeParam, &serializeParam, validate_func, &inspectParam, - min_count, max_count); + min_count, max_count)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } } @@ -737,25 +781,27 @@ namespace LLInitParam { self_t& typed_param = static_cast<self_t&>(param); // attempt to parse block... - if(typed_param.deserializeBlock(parser, name_stack)) + if(typed_param.deserializeBlock(parser, name_stack, generation)) { - typed_param.mData.clearKey(); - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.clearValueName(); + typed_param.enclosingBlock().paramChanged(param, true); + typed_param.setProvided(true); return true; } - if(!NAME_VALUE_LOOKUP::empty()) + if(name_value_lookup_t::valueNamesExist()) { // try to parse a known named value std::string name; if (parser.readValue(name)) { // try to parse a per type named value - if (NAME_VALUE_LOOKUP::get(name, typed_param)) + if (name_value_lookup_t::getValueFromName(name, typed_param.getValue())) { - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.mData.setKey(name); - typed_param.mData.mKeyVersion = typed_param.getLastChangeVersion(); + typed_param.enclosingBlock().paramChanged(param, true); + typed_param.setValueName(name); + typed_param.setProvided(true); + typed_param.mKeyVersion = typed_param.getLastChangeVersion(); return true; } @@ -767,13 +813,15 @@ namespace LLInitParam static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param) { const self_t& typed_param = static_cast<const self_t&>(param); + if (!typed_param.isProvided()) return; + if (!name_stack.empty()) { name_stack.back().second = parser.newParseGeneration(); } - std::string key = typed_param.mData.getKey(); - if (!key.empty() && typed_param.mData.mKeyVersion == typed_param.getLastChangeVersion()) + std::string key = typed_param.getValueName(); + if (!key.empty() && typed_param.mKeyVersion == typed_param.getLastChangeVersion()) { if (!parser.writeValue(key, name_stack)) { @@ -790,33 +838,33 @@ namespace LLInitParam { // I am a param that is also a block, so just recurse into my contents const self_t& typed_param = static_cast<const self_t&>(param); - typed_param.inspectBlock(parser, name_stack); + typed_param.inspectBlock(parser, name_stack, min_count, max_count); } // a param-that-is-a-block is provided when the user has set one of its child params // *and* the block as a whole validates bool isProvided() const { - // only validate block when it hasn't already passed validation and user has supplied *some* value - if (Param::anyProvided() && mData.mValidatedVersion < T::getLastChangeVersion()) + // only validate block when it hasn't already passed validation with current data + if (Param::anyProvided() && param_value_t::mValidatedVersion < param_value_t::getLastChangeVersion()) { // a sub-block is "provided" when it has been filled in enough to be valid - mData.mValidated = T::validateBlock(false); - mData.mValidatedVersion = T::getLastChangeVersion(); + param_value_t::mValidated = param_value_t::validateBlock(false); + param_value_t::mValidatedVersion = param_value_t::getLastChangeVersion(); } - return Param::anyProvided() && mData.mValidated; + return Param::anyProvided() && param_value_t::mValidated; } // assign block contents to this param-that-is-a-block void set(value_assignment_t val, bool flag_as_provided = true) { - value_t::operator=(val); - mData.clearKey(); + setValue(val); + param_value_t::clearValueName(); // force revalidation of block by clearing known provided version // next call to isProvided() will update provision status based on validity - mData.mValidatedVersion = 0; + param_value_t::mValidatedVersion = -1; setProvided(flag_as_provided); - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); + Param::enclosingBlock().paramChanged(*this, flag_as_provided); } void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true) @@ -828,10 +876,10 @@ namespace LLInitParam } // propagate changed status up to enclosing block - /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided) + /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided) { - T::setLastChangedParam(last_param, user_provided); - Param::enclosingBlock().setLastChangedParam(*this, user_provided); + ParamValue<T, NAME_VALUE_LOOKUP>::paramChanged(changed_param, user_provided); + Param::enclosingBlock().paramChanged(*this, user_provided); if (user_provided) { // a child param has been explicitly changed @@ -841,41 +889,30 @@ namespace LLInitParam } // implicit conversion - operator value_assignment_t() const { return get(); } + operator value_assignment_t() const { return param_value_t::getValue(); } // explicit conversion - value_assignment_t operator()() const { return get(); } + value_assignment_t operator()() const { return param_value_t::getValue(); } protected: - value_assignment_t get() const - { - return *this; - } static bool mergeWith(Param& dst, const Param& src, bool overwrite) { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); - if (dst_typed_param.T::merge(T::selfBlockDescriptor(), src_typed_param, overwrite)) + + if (src_typed_param.anyProvided()) { - dst_typed_param.mData.clearKey(); - return true; + bool param_provided = src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided()); + if (dst_typed_param.mergeBlockParam(param_provided, param_value_t::selfBlockDescriptor(), src_typed_param, overwrite)) + { + dst_typed_param.clearValueName(); + dst_typed_param.setProvided(true); + dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true); + return true; + } } return false; } - - struct Data : public key_cache_t - { - S32 mKeyVersion; - mutable S32 mValidatedVersion; - mutable bool mValidated; // lazy validation flag - - Data() - : mKeyVersion(0), - mValidatedVersion(0), - mValidated(false) - {} - }; - Data mData; }; // container of non-block parameters @@ -885,29 +922,28 @@ namespace LLInitParam { public: typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, false> self_t; - typedef typename std::vector<VALUE_TYPE> container_t; + typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t; + typedef typename std::vector<param_value_t> container_t; typedef const container_t& value_assignment_t; typedef VALUE_TYPE value_t; - typedef value_t& value_ref_t; - typedef const value_t& value_const_ref_t; + typedef NAME_VALUE_LOOKUP name_value_lookup_t; - typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t; - TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) - : Param(block_descriptor.mCurrentBlockPtr), - mValues(value) + : Param(block_descriptor.mCurrentBlockPtr) { - mCachedKeys.resize(mValues.size()); + std::copy(value.begin(), value.end(), std::back_inserter(mValues)); + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, &deserializeParam, &serializeParam, validate_func, &inspectParam, - min_count, max_count); + min_count, max_count)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } } @@ -924,29 +960,22 @@ namespace LLInitParam // attempt to read value directly if (parser.readValue(value)) { - typed_param.mValues.push_back(value); - // save an empty name/value key as a placeholder - typed_param.mCachedKeys.push_back(key_cache_t()); - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); + typed_param.add(value); return true; } // try to parse a known named value - if(!NAME_VALUE_LOOKUP::empty()) + if(name_value_lookup_t::valueNamesExist()) { // try to parse a known named value std::string name; if (parser.readValue(name)) { // try to parse a per type named value - if (NAME_VALUE_LOOKUP::get(name, typed_param.mValues)) + if (name_value_lookup_t::getValueFromName(name, typed_param.mValues)) { - typed_param.mValues.push_back(value); - typed_param.mCachedKeys.push_back(key_cache_t()); - typed_param.mCachedKeys.back().setKey(name); - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); + typed_param.add(value); + typed_param.mValues.back().setValueName(name); return true; } @@ -961,25 +990,27 @@ namespace LLInitParam const self_t& typed_param = static_cast<const self_t&>(param); if (!typed_param.isProvided() || name_stack.empty()) return; - const_iterator it = typed_param.mValues.begin(); - for (typename std::vector<key_cache_t>::const_iterator key_it = typed_param.mCachedKeys.begin(); - it != typed_param.mValues.end(); - ++key_it, ++it) + for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end(); + it != end_it; + ++it) { - std::string key = key_it->get(); + std::string key = it->getValue(); name_stack.back().second = parser.newParseGeneration(); - if(!key.empty()) + if(key.empty()) + // not parsed via name values, write out value directly { - if(!parser.writeValue(key, name_stack)) + if (!parser.writeValue(*it, name_stack)) { - return; + break; } } - // not parse via name values, write out value directly - else if (!parser.writeValue(*it, name_stack)) + else { - return; + if(!parser.writeValue(key, name_stack)) + { + break; + } } } } @@ -987,19 +1018,17 @@ namespace LLInitParam static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count) { parser.inspectValue<VALUE_TYPE>(name_stack, min_count, max_count, NULL); - if (NAME_VALUE_LOOKUP::getPossibleValues()) + if (name_value_lookup_t::getPossibleValues()) { - parser.inspectValue<std::string>(name_stack, min_count, max_count, NAME_VALUE_LOOKUP::getPossibleValues()); + parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues()); } } void set(value_assignment_t val, bool flag_as_provided = true) { mValues = val; - mCachedKeys.clear(); - mCachedKeys.resize(mValues.size()); setProvided(flag_as_provided); - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); + Param::enclosingBlock().paramChanged(*this, flag_as_provided); } @@ -1011,23 +1040,23 @@ namespace LLInitParam } } - value_ref_t add() + value_t& add() { - mValues.push_back(value_t()); - mCachedKeys.push_back(key_cache_t()); + mValues.push_back(param_value_t(value_t())); setProvided(true); + Param::enclosingBlock().paramChanged(*this, true); return mValues.back(); } - void add(value_const_ref_t item) + void add(const value_t& item) { - mValues.push_back(item); - mCachedKeys.push_back(key_cache_t()); + mValues.push_back(param_value_t(item)); setProvided(true); + Param::enclosingBlock().paramChanged(*this, true); } // implicit conversion - operator value_assignment_t() const { return self_t::get(); } + operator value_assignment_t() const { return mValues; } typedef typename container_t::iterator iterator; typedef typename container_t::const_iterator const_iterator; @@ -1044,27 +1073,31 @@ namespace LLInitParam } protected: - value_assignment_t get() const - { - return mValues; - } - static bool mergeWith(Param& dst, const Param& src, bool overwrite) { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); - if (src_typed_param.isProvided() - && (overwrite || !dst_typed_param.isProvided())) + if (overwrite) { - dst_typed_param.set(src_typed_param.get()); - return true; + std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues)); } - return false; + else + { + container_t new_values(src_typed_param.mValues); + std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values)); + std::swap(dst_typed_param.mValues, new_values); + } + + if (src_typed_param.begin() != src_typed_param.end()) + { + dst_typed_param.setProvided(true); + dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true); + } + return true; } container_t mValues; - std::vector<key_cache_t> mCachedKeys; }; // container of block parameters @@ -1074,80 +1107,76 @@ namespace LLInitParam { public: typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, true> self_t; - typedef typename std::vector<VALUE_TYPE> container_t; + typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t; + typedef typename std::vector<param_value_t> container_t; typedef const container_t& value_assignment_t; - typedef VALUE_TYPE value_t; - typedef value_t& value_ref_t; - typedef const value_t& value_const_ref_t; - - typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t; + typedef NAME_VALUE_LOOKUP name_value_lookup_t; TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr), - mValues(value), - mLastParamGeneration(0) + mLastParseGeneration(0) { - mCachedKeys.resize(mValues.size()); + std::copy(value.begin(), value.end(), back_inserter(mValues)); + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, &deserializeParam, &serializeParam, validate_func, &inspectParam, - min_count, max_count); + min_count, max_count)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } } bool isProvided() const { return Param::anyProvided(); } - value_ref_t operator[](S32 index) { return mValues[index]; } - value_const_ref_t operator[](S32 index) const { return mValues[index]; } - static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) { self_t& typed_param = static_cast<self_t&>(param); bool new_value = false; - if (generation != typed_param.mLastParamGeneration || typed_param.mValues.empty()) + + if (generation != typed_param.mLastParseGeneration + || typed_param.mValues.empty()) { new_value = true; typed_param.mValues.push_back(value_t()); - typed_param.mCachedKeys.push_back(Data()); } - value_ref_t value = typed_param.mValues.back(); + param_value_t& value = typed_param.mValues.back(); // attempt to parse block... - if(value.deserializeBlock(parser, name_stack)) + if(value.deserializeBlock(parser, name_stack, generation)) { if (new_value) { // successfully parsed new value, let's keep it - typed_param.mLastParamGeneration = generation; + typed_param.mLastParseGeneration = generation; } - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.enclosingBlock().paramChanged(param, true); typed_param.setProvided(true); return true; } - else if(!NAME_VALUE_LOOKUP::empty()) + else if(name_value_lookup_t::valueNamesExist()) { // try to parse a known named value std::string name; if (parser.readValue(name)) { // try to parse a per type named value - if (NAME_VALUE_LOOKUP::get(name, value)) + if (name_value_lookup_t::getValueFromName(name, value.getValue())) { if (new_value) { // successfully parsed new value, let's keep it - typed_param.mLastParamGeneration = generation; + typed_param.mLastParseGeneration = generation; } - typed_param.mCachedKeys.back().setKey(name); - typed_param.mCachedKeys.back().mKeyVersion = value.getLastChangeVersion(); - typed_param.enclosingBlock().setLastChangedParam(param, true); + typed_param.mValues.back().setValueName(name); + typed_param.mValues.back().mKeyVersion = value.getLastChangeVersion(); + typed_param.enclosingBlock().paramChanged(param, true); typed_param.setProvided(true); return true; } @@ -1158,7 +1187,6 @@ namespace LLInitParam if (new_value) { // failed to parse new value, pop it off typed_param.mValues.pop_back(); - typed_param.mCachedKeys.pop_back(); } return false; @@ -1169,26 +1197,22 @@ namespace LLInitParam const self_t& typed_param = static_cast<const self_t&>(param); if (!typed_param.isProvided() || name_stack.empty()) return; - const_iterator it = typed_param.mValues.begin(); - for (typename std::vector<Data>::const_iterator key_it = typed_param.mCachedKeys.begin(); - it != typed_param.mValues.end(); - ++key_it, ++it) + for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end(); + it != end_it; + ++it) { name_stack.back().second = parser.newParseGeneration(); - std::string key = key_it->getKey(); - if (!key.empty() && key_it->mKeyVersion == it->getLastChangeVersion()) + std::string key = it->getValueName(); + if (!key.empty() && it->mKeyVersion == it->getLastChangeVersion()) { - if(!parser.writeValue(key, name_stack)) - { - return; - } + parser.writeValue(key, name_stack); } // Not parsed via named values, write out value directly // NOTE: currently we don't worry about removing default values in Multiple - else if (!it->serializeBlock(parser, name_stack, NULL)) + else { - return; + it->serializeBlock(parser, name_stack, NULL); } } } @@ -1196,16 +1220,14 @@ namespace LLInitParam static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count) { // I am a vector of blocks, so describe my contents recursively - value_t().inspectBlock(parser, name_stack); + param_value_t(value_t()).inspectBlock(parser, name_stack, min_count, max_count); } void set(value_assignment_t val, bool flag_as_provided = true) { mValues = val; - mCachedKeys.clear(); - mCachedKeys.resize(mValues.size()); setProvided(flag_as_provided); - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); + Param::enclosingBlock().paramChanged(*this, flag_as_provided); } void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true) @@ -1216,23 +1238,23 @@ namespace LLInitParam } } - value_ref_t add() + value_t& add() { mValues.push_back(value_t()); - mCachedKeys.push_back(Data()); setProvided(true); + Param::enclosingBlock().paramChanged(*this, true); return mValues.back(); } - void add(value_const_ref_t item) + void add(const value_t& item) { mValues.push_back(item); - mCachedKeys.push_back(Data()); setProvided(true); + Param::enclosingBlock().paramChanged(*this, true); } // implicit conversion - operator value_assignment_t() const { return self_t::get(); } + operator value_assignment_t() const { return mValues; } typedef typename container_t::iterator iterator; typedef typename container_t::const_iterator const_iterator; @@ -1246,8 +1268,8 @@ namespace LLInitParam U32 numValidElements() const { U32 count = 0; - for (const_iterator it = mValues.begin(); - it != mValues.end(); + for (const_iterator it = mValues.begin(), end_it = mValues.end(); + it != end_it; ++it) { if(it->validateBlock(false)) count++; @@ -1256,74 +1278,77 @@ namespace LLInitParam } protected: - value_assignment_t get() const - { - return mValues; - } static bool mergeWith(Param& dst, const Param& src, bool overwrite) { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); - if (src_typed_param.isProvided() - && (overwrite || !dst_typed_param.isProvided())) + if (overwrite) { - dst_typed_param.set(src_typed_param.get()); - return true; + std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues)); + } + else + { + container_t new_values(src_typed_param.mValues); + std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values)); + std::swap(dst_typed_param.mValues, new_values); } - return false; - } - struct Data : public key_cache_t - { - S32 mKeyVersion; // version of block for which key was last valid + if (src_typed_param.begin() != src_typed_param.end()) + { + dst_typed_param.setProvided(true); + dst_typed_param.enclosingBlock().paramChanged(dst_typed_param, true); + } - Data() : mKeyVersion(0) {} - }; + return true; + } container_t mValues; - std::vector<Data> mCachedKeys; - S32 mLastParamGeneration; + S32 mLastParseGeneration; }; template <typename DERIVED_BLOCK> class Choice : public BaseBlock { - typedef Choice<DERIVED_BLOCK> self_t; - typedef Choice<DERIVED_BLOCK> enclosing_block_t; + typedef Choice<DERIVED_BLOCK> self_t; + typedef Choice<DERIVED_BLOCK> enclosing_block_t; LOG_CLASS(self_t); public: // take all provided params from other and apply to self bool overwriteFrom(const self_t& other) { - return merge(selfBlockDescriptor(), other, true); + return mergeBlock(selfBlockDescriptor(), other, true); } // take all provided params that are not already provided, and apply to self bool fillFrom(const self_t& other) { - return merge(selfBlockDescriptor(), other, false); + return mergeBlock(selfBlockDescriptor(), other, false); } - // merge with other block - bool merge(BlockDescriptor& block_data, const self_t& other, bool overwrite) + bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const self_t& other, bool overwrite) { - // only merge a choice if we are overwriting with other's contents - if (overwrite) + if (param_provided) { - mCurChoice = other.mCurChoice; - return BaseBlock::merge(selfBlockDescriptor(), other, overwrite); + return mergeBlock(block_data, other, overwrite); } return false; } + // merge with other block + bool mergeBlock(BlockDescriptor& block_data, const self_t& other, bool overwrite) + { + mCurChoice = other.mCurChoice; + return BaseBlock::mergeBlock(selfBlockDescriptor(), other, overwrite); + } + // clear out old choice when param has changed - /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided) + /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided) { - param_handle_t changed_param_handle = BaseBlock::getHandleFromParam(&last_param); + param_handle_t changed_param_handle = BaseBlock::getHandleFromParam(&changed_param); // if we have a new choice... if (changed_param_handle != mCurChoice) { @@ -1335,7 +1360,7 @@ namespace LLInitParam } mCurChoice = changed_param_handle; } - BaseBlock::setLastChangedParam(last_param, user_provided); + BaseBlock::paramChanged(changed_param, user_provided); } virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } @@ -1358,20 +1383,21 @@ namespace LLInitParam friend class Choice<DERIVED_BLOCK>; typedef Alternative<T, NAME_VALUE_LOOKUP> self_t; - typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t; typedef typename super_t::value_assignment_t value_assignment_t; - explicit Alternative(const char* name, value_assignment_t val = DefaultInitializer<T>::get()) + explicit Alternative(const char* name, value_assignment_t val = defaultValue<T>()) : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1), mOriginalValue(val) { // assign initial choice to first declared option DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr); - if (LL_UNLIKELY( - DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING - && blockp->mCurChoice == 0)) + if (LL_UNLIKELY(DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING)) { - blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this); + if(blockp->mCurChoice == 0) + { + blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this); + } } } @@ -1390,7 +1416,7 @@ namespace LLInitParam { if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this) { - return super_t::get(); + return super_t::getValue(); } return mOriginalValue; } @@ -1399,7 +1425,7 @@ namespace LLInitParam { if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this) { - return super_t::get(); + return super_t::getValue(); } return mOriginalValue; } @@ -1433,8 +1459,8 @@ namespace LLInitParam class Block : public BASE_BLOCK { - typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t; - typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t; + typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t; + typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t; public: typedef BASE_BLOCK base_block_t; @@ -1442,13 +1468,13 @@ namespace LLInitParam // take all provided params from other and apply to self bool overwriteFrom(const self_t& other) { - return BaseBlock::merge(selfBlockDescriptor(), other, true); + return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, true); } // take all provided params that are not already provided, and apply to self bool fillFrom(const self_t& other) { - return BaseBlock::merge(selfBlockDescriptor(), other, false); + return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, false); } virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } @@ -1468,10 +1494,10 @@ namespace LLInitParam class Optional : public TypedParam<T, NAME_VALUE_LOOKUP, false> { public: - typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t; typedef typename super_t::value_assignment_t value_assignment_t; - explicit Optional(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get()) + explicit Optional(const char* name = "", value_assignment_t val = defaultValue<T>()) : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1) { //#pragma message("Parsing LLInitParam::Block::Optional") @@ -1483,7 +1509,7 @@ namespace LLInitParam return *this; } - DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val) + DERIVED_BLOCK& operator()(value_assignment_t val) { super_t::set(val); return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock()); @@ -1495,12 +1521,12 @@ namespace LLInitParam class Mandatory : public TypedParam<T, NAME_VALUE_LOOKUP, false> { public: - typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t; typedef Mandatory<T, NAME_VALUE_LOOKUP> self_t; typedef typename super_t::value_assignment_t value_assignment_t; // mandatory parameters require a name to be parseable - explicit Mandatory(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get()) + explicit Mandatory(const char* name = "", value_assignment_t val = defaultValue<T>()) : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, 1, 1) {} @@ -1529,15 +1555,15 @@ namespace LLInitParam class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true> { public: - typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBaseBlock<T>::value> super_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t; typedef Multiple<T, RANGE, NAME_VALUE_LOOKUP> self_t; typedef typename super_t::container_t container_t; typedef typename super_t::value_assignment_t value_assignment_t; typedef typename super_t::iterator iterator; typedef typename super_t::const_iterator const_iterator; - explicit Multiple(const char* name = "", value_assignment_t val = DefaultInitializer<container_t>::get()) - : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount()) + explicit Multiple(const char* name = "") + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, container_t(), &validate, RANGE::minCount(), RANGE::maxCount()) {} Multiple& operator=(value_assignment_t val) @@ -1545,7 +1571,7 @@ namespace LLInitParam set(val); return *this; } - + DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val) { super_t::set(val); @@ -1559,6 +1585,96 @@ namespace LLInitParam } }; + template <typename T, typename RANGE = BaseBlock::AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> > + class Batch : private TypedParam<T, NAME_VALUE_LOOKUP, false> + { + public: + typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t; + typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<param_value_t>::value> super_t; + typedef Batch<T, RANGE, NAME_VALUE_LOOKUP> self_t; + typedef typename super_t::value_assignment_t value_assignment_t; + typedef typename super_t::value_t value_t; + + struct BatchDefaultValue : public ParamDescriptor::UserData + { + BatchDefaultValue(const T& value) + : mValue(value) + {} + + T mValue; + }; + + explicit Batch(const char* name, value_assignment_t val) + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1), + mLastParseGeneration(-1) + { + BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor(); + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) + { + ParamDescriptorPtr param_descriptorp = block_descriptor.mCurrentBlockPtr->findParamDescriptor(*this); + + if (param_descriptorp) + { + param_descriptorp->mDeserializeFunc = &deserializeParam; + param_descriptorp->mUserData = new BatchDefaultValue(new param_value_t(val)); + } + } + } + + explicit Batch(const char* name = "") + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, defaultValue<T>(), NULL, 0, 1), + mLastParseGeneration(-1) + { + BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor(); + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) + { + ParamDescriptorPtr param_descriptorp = block_descriptor.mCurrentBlockPtr->findParamDescriptor(*this); + + if (param_descriptorp) + { + param_descriptorp->mDeserializeFunc = &deserializeParam; + } + } + } + + Batch& operator=(value_assignment_t val) + { + set(val); + return *this; + } + + DERIVED_BLOCK& operator()(value_assignment_t val) + { + super_t::set(val); + return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock()); + } + + using super_t::operator(); + + private: + static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) + { + self_t& typed_param = static_cast<self_t&>(param); + + if (generation != typed_param.mLastParseGeneration) + { + ParamDescriptorPtr descriptor = typed_param.enclosingBlock().findParamDescriptor(param); + if (descriptor && static_cast<BatchDefaultValue*>(descriptor->mUserData)) + { + static_cast<param_value_t&>(typed_param) = (static_cast<BatchDefaultValue*>(descriptor->mUserData))->mValue; + } + else + { + static_cast<param_value_t&>(typed_param) = param_value_t(value_t()); + } + typed_param.mLastParseGeneration = generation; + } + return super_t::deserializeParam(param, parser, name_stack, generation); + } + + S32 mLastParseGeneration; + }; + class Deprecated : public Param { public: @@ -1568,13 +1684,14 @@ namespace LLInitParam BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor(); if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), + ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor( + block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), NULL, &deserializeParam, NULL, NULL, NULL, - 0, S32_MAX); + 0, S32_MAX)); BaseBlock::addParam(block_descriptor, param_descriptor, name); } } @@ -1602,137 +1719,91 @@ namespace LLInitParam } }; - template<typename T, typename DERIVED = TypedParam<T> > - class BlockValue - : public Block<TypedParam<T, TypeValues<T>, false> >, - public Param + template<typename T> + class CustomParamValue + : public Block<ParamValue<T, TypeValues<T> > >, + public TypeValues<T> { public: typedef enum e_value_age { - OLDER_THAN_BLOCK, // mData.mValue needs to be refreshed from the block parameters - NEWER_THAN_BLOCK, // mData.mValue holds the authoritative value (which has been replicated to the block parameters via setBlockFromValue) - SAME_AS_BLOCK // mData.mValue is derived from the block parameters, which are authoritative + VALUE_NEEDS_UPDATE, // mValue needs to be refreshed from the block parameters + VALUE_AUTHORITATIVE, // mValue holds the authoritative value (which has been replicated to the block parameters via updateBlockFromValue) + BLOCK_AUTHORITATIVE // mValue is derived from the block parameters, which are authoritative } EValueAge; - typedef BlockValue<T> self_t; - typedef Block<TypedParam<T, TypeValues<T>, false> > block_t; - typedef const T& value_const_ref_t; - typedef value_const_ref_t value_assignment_t; - typedef typename TypeValues<T>::KeyCache key_cache_t; - - BlockValue(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) - : Param(block_descriptor.mCurrentBlockPtr), - mData(value, NEWER_THAN_BLOCK) - { - if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) - { - ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), - &mergeWith, - &deserializeParam, - &serializeParam, - validate_func, - &inspectParam, - min_count, max_count); - BaseBlock::addParam(block_descriptor, param_descriptor, name); - } - } + typedef ParamValue<T, TypeValues<T> > derived_t; + typedef CustomParamValue<T> self_t; + typedef Block<derived_t> block_t; + typedef const T& value_assignment_t; - // implicit conversion - operator value_assignment_t() const { return get(); } - // explicit conversion - value_assignment_t operator()() const { return get(); } + CustomParamValue(const T& value = T()) + : mValue(value), + mValueAge(VALUE_AUTHORITATIVE), + mKeyVersion(0), + mValidatedVersion(-1) + {} - static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) + bool deserializeBlock(Parser& parser, Parser::name_stack_range_t name_stack, S32 generation) { - DERIVED& typed_param = static_cast<DERIVED&>(param); + derived_t& typed_param = static_cast<derived_t&>(*this); // type to apply parse direct value T if (name_stack.first == name_stack.second) { - if(parser.readValue(typed_param.mData.mValue)) + if(parser.readValue(typed_param.mValue)) { - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); - typed_param.mData.clearKey(); - typed_param.mData.mValueAge = NEWER_THAN_BLOCK; - typed_param.setBlockFromValue(); + typed_param.clearValueName(); + typed_param.mValueAge = VALUE_AUTHORITATIVE; + typed_param.updateBlockFromValue(); return true; } - - if(!TypeValues<T>::empty()) - { - // try to parse a known named value - std::string name; - if (parser.readValue(name)) - { - // try to parse a per type named value - if (TypeValues<T>::get(name, typed_param.mData.mValue)) - { - typed_param.mData.setKey(name); - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); - typed_param.mData.mValueAge = NEWER_THAN_BLOCK; - typed_param.setBlockFromValue(); - - return true; - } - } - } } // fall back on parsing block components for T // if we deserialized at least one component... - if (typed_param.BaseBlock::deserializeBlock(parser, name_stack)) + if (typed_param.BaseBlock::deserializeBlock(parser, name_stack, generation)) { - // ...our block is provided, and considered changed - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.setProvided(true); return true; } + return false; } - static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param) + void serializeBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const { - const self_t& typed_param = static_cast<const self_t&>(param); - - if (!typed_param.isProvided()) return; + const self_t& typed_param = static_cast<const self_t&>(*this); + const self_t* diff_param = static_cast<const self_t*>(diff_block); - std::string key = typed_param.mData.getKey(); + std::string key = typed_param.getValueName(); // first try to write out name of name/value pair if (!key.empty()) { - if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key)) + if (!diff_param || !ParamCompare<std::string>::equals(diff_param->getValueName(), key)) { - if (!parser.writeValue(key, name_stack)) - { - return; - } + parser.writeValue(key, name_stack); } } // then try to serialize value directly - else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), (static_cast<const self_t*>(diff_param))->get())) + else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), diff_param->getValue())) { - if (parser.writeValue(typed_param.mData.mValue, name_stack)) + if (!parser.writeValue(typed_param.getValue(), name_stack)) { - return; + //RN: *always* serialize provided components of BlockValue (don't pass diff_param on), + // since these tend to be viewed as the constructor arguments for the value T. It seems + // cleaner to treat the uniqueness of a BlockValue according to the generated value, and + // not the individual components. This way <color red="0" green="1" blue="0"/> will not + // be exported as <color green="1"/>, since it was probably the intent of the user to + // be specific about the RGB color values. This also fixes an issue where we distinguish + // between rect.left not being provided and rect.left being explicitly set to 0 (same as default) + block_t::serializeBlock(parser, name_stack, NULL); } - - //RN: *always* serialize provided components of BlockValue (don't pass diff_param on), - // since these tend to be viewed as the constructor arguments for the value T. It seems - // cleaner to treat the uniqueness of a BlockValue according to the generated value, and - // not the individual components. This way <color red="0" green="1" blue="0"/> will not - // be exported as <color green="1"/>, since it was probably the intent of the user to - // be specific about the RGB color values. This also fixes an issue where we distinguish - // between rect.left not being provided and rect.left being explicitly set to 0 (same as default) - typed_param.BaseBlock::serializeBlock(parser, name_stack, NULL); } } - static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count) + bool inspectBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const { // first, inspect with actual type... parser.inspectValue<T>(name_stack, min_count, max_count, NULL); @@ -1742,25 +1813,19 @@ namespace LLInitParam parser.inspectValue<std::string>(name_stack, min_count, max_count, TypeValues<T>::getPossibleValues()); } // then recursively inspect contents... - const self_t& typed_param = static_cast<const self_t&>(param); - typed_param.inspectBlock(parser, name_stack); + return block_t::inspectBlock(parser, name_stack, min_count, max_count); } - - bool isProvided() const + bool validateBlock(bool emit_errors = true) const { - if (!Param::anyProvided()) return false; - - // block has an updated parameter - // if cached value is stale, regenerate from params - if (mData.mValueAge == OLDER_THAN_BLOCK) + if (mValueAge == VALUE_NEEDS_UPDATE) { - if (block_t::validateBlock(false)) + if (block_t::validateBlock(emit_errors)) { - static_cast<const DERIVED*>(this)->setValueFromBlock(); // clear stale keyword associated with old value - mData.clearKey(); - mData.mValueAge = SAME_AS_BLOCK; + TypeValues<T>::clearValueName(); + mValueAge = BLOCK_AUTHORITATIVE; + static_cast<derived_t*>(const_cast<self_t*>(this))->updateValueFromBlock(); return true; } else @@ -1777,104 +1842,84 @@ namespace LLInitParam } } - void set(value_assignment_t val, bool flag_as_provided = true) + // propagate change status up to enclosing block + /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided) + { + BaseBlock::paramChanged(changed_param, user_provided); + if (user_provided) { - Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); + // a parameter changed, so our value is out of date + mValueAge = VALUE_NEEDS_UPDATE; + } + } + void setValue(value_assignment_t val) + { + derived_t& typed_param = static_cast<derived_t&>(*this); // set param version number to be up to date, so we ignore block contents - mData.mValueAge = NEWER_THAN_BLOCK; - - mData.mValue = val; - mData.clearKey(); - setProvided(flag_as_provided); - static_cast<DERIVED*>(this)->setBlockFromValue(); + mValueAge = VALUE_AUTHORITATIVE; + mValue = val; + typed_param.clearValueName(); + static_cast<derived_t*>(const_cast<self_t*>(this))->updateBlockFromValue(); } - void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true) + value_assignment_t getValue() const { - // don't override any user provided value - if (!isProvided()) - { - set(val, flag_as_provided); - } + validateBlock(true); + return mValue; } - // propagate change status up to enclosing block - /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided) - { - BaseBlock::setLastChangedParam(last_param, user_provided); - Param::enclosingBlock().setLastChangedParam(*this, user_provided); - if (user_provided) - { - setProvided(true); // some component provided - // a parameter changed, so our value is out of date - mData.mValueAge = OLDER_THAN_BLOCK; - } + T& getValue() + { + validateBlock(true); + return mValue; } + S32 mKeyVersion; + protected: - value_assignment_t get() const - { - // if some parameters were provided, issue warnings on invalid blocks - if (Param::anyProvided() && (mData.mValueAge == OLDER_THAN_BLOCK)) - { - // go ahead and issue warnings at this point if any param is invalid - if(block_t::validateBlock(true)) - { - static_cast<const DERIVED*>(this)->setValueFromBlock(); - mData.clearKey(); - mData.mValueAge = SAME_AS_BLOCK; - } - } - return mData.mValue; + // use this from within updateValueFromBlock() to set the value without making it authoritative + void updateValue(value_assignment_t value) + { + mValue = value; } - - struct Data : public key_cache_t + bool mergeBlockParam(bool param_provided, BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { - Data(const T& value, EValueAge age) - : mValue(value), - mValueAge(age) - {} - - T mValue; - EValueAge mValueAge; - }; - - // mutable to allow lazy updates on get - mutable Data mData; + if (param_provided) + { + return mergeBlock(block_data, other, overwrite); + } + return false; + } - private: - static bool mergeWith(Param& dst, const Param& src, bool overwrite) + bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { - const DERIVED& src_typed_param = static_cast<const DERIVED&>(src); - DERIVED& dst_typed_param = static_cast<DERIVED&>(dst); + const derived_t& src_typed_param = static_cast<const derived_t&>(other); - if (src_typed_param.isProvided() - && (overwrite || !dst_typed_param.isProvided())) + if (src_typed_param.mValueAge == VALUE_AUTHORITATIVE) { - if (src_typed_param.mData.mValueAge == NEWER_THAN_BLOCK) - { - // copy value over - dst_typed_param.set(src_typed_param.get()); - } - else - { - // merge individual parameters into destination - dst_typed_param.merge(block_t::selfBlockDescriptor(), src_typed_param, overwrite); - } + // copy value over + setValue(src_typed_param.getValue()); return true; } - return false; + else + { + // merge individual parameters into destination + return block_t::mergeBlock(block_t::selfBlockDescriptor(), src_typed_param, overwrite); + } } - }; - template<> - struct ParamCompare<LLSD, false> - { - static bool equals(const LLSD &a, const LLSD &b); + mutable S32 mValidatedVersion; + mutable bool mValidated; // lazy validation flag + + private: + + mutable T mValue; + mutable EValueAge mValueAge; }; } + #endif // LL_LLPARAM_H diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index e24ee6629e..9ba8edbb59 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -492,6 +492,15 @@ private: //////////////////////////////////////////////////////////////////////////////// // virtual + void onNavigateErrorPage(const EventType& event) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_error_page"); + message.setValueS32("status_code", event.getIntValue()); + sendMessage(message); + } + + //////////////////////////////////////////////////////////////////////////////// + // virtual void onLocationChange(const EventType& event) { if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) @@ -519,6 +528,11 @@ private: { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow"); message.setValue("uri", event.getEventUri()); +#if LLQTWEBKIT_API_VERSION >= 7 + message.setValue("nav_type", event.getNavigationType()); +#else + message.setValue("nav_type", "clicked"); +#endif sendMessage(message); } diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 32d3a31786..95cfc23ede 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -214,6 +214,7 @@ set(viewer_SOURCE_FILES llfloatersettingsdebug.cpp llfloatersidetraytab.cpp llfloatersnapshot.cpp + llfloatersounddevices.cpp llfloatertelehub.cpp llfloatertestinspectors.cpp llfloatertestlistview.cpp @@ -416,6 +417,7 @@ set(viewer_SOURCE_FILES llsidepaneliteminfo.cpp llsidepaneltaskinfo.cpp llsidetray.cpp + llsidetraylistener.cpp llsidetraypanelcontainer.cpp llsky.cpp llslurl.cpp @@ -757,6 +759,7 @@ set(viewer_HEADER_FILES llfloatersettingsdebug.h llfloatersidetraytab.h llfloatersnapshot.h + llfloatersounddevices.h llfloatertelehub.h llfloatertestinspectors.h llfloatertestlistview.h @@ -954,6 +957,7 @@ set(viewer_HEADER_FILES llsidepaneliteminfo.h llsidepaneltaskinfo.h llsidetray.h + llsidetraylistener.h llsidetraypanelcontainer.h llsky.h llslurl.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 898d89b17d..ac52cff49a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2612,10 +2612,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>DisableRendering</key> + <key>HeadlessClient</key> <map> <key>Comment</key> - <string>Disable GL rendering and GUI (load testing)</string> + <string>Run in headless mode by disabling GL rendering, keyboard, etc</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -3221,14 +3221,14 @@ <map> <key>Comment</key> <string>Specifies that you have not logged in with the viewer since you performed a clean install</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstSelectedDisabledPopups</key> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>FirstSelectedDisabledPopups</key> <map> <key>Comment</key> <string>Return false if there is not disabled popup selected in the list of floater preferences popups</string> @@ -9546,7 +9546,7 @@ <key>ShowNetStats</key> <map> <key>Comment</key> - <string>Show the Search Bar in the Status Overlay</string> + <string>Show the Status Indicators for the Viewer and Network Usage in the Status Overlay</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -11651,10 +11651,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>VoiceCallsRejectAll</key> + <key>VoiceCallsRejectGroup</key> <map> <key>Comment</key> - <string>Silently reject all incoming voice calls.</string> + <string>Silently reject all incoming group voice calls.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -11915,6 +11915,33 @@ <key>Value</key> <integer>0</integer> </map> + <key>WaterFogColor</key> + <map> + <key>Comment</key> + <string>Water fog color</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Color4</string> + <key>Value</key> + <array> + <real>0.0863</real> + <real>0.168</real> + <real>0.212</real> + <real>0</real> + </array> + </map> + <key>WaterFogDensity</key> + <map> + <key>Comment</key> + <string>Water fog density</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>16.0</real> + </map> <key>WaterGLFogDensityScale</key> <map> <key>Comment</key> @@ -12519,6 +12546,17 @@ <string>Boolean</string> <key>Value</key> <integer>1</integer> + </map> + <key>EnablePlaceProfile</key> + <map> + <key>Comment</key> + <string>Enable viewing of place profile from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> </map> <key>EnablePicks</key> <map> @@ -12575,6 +12613,39 @@ <key>Value</key> <integer>1</integer> </map> + <key>EnableInventory</key> + <map> + <key>Comment</key> + <string>Enable opening inventory from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>EnableSearch</key> + <map> + <key>Comment</key> + <string>Enable opening search from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>EnableAppearance</key> + <map> + <key>Comment</key> + <string>Enable opening appearance from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>SearchFromAddressBar</key> <map> <key>Comment</key> @@ -12630,5 +12701,49 @@ <key>Value</key> <integer>1</integer> </map> + <key>GenericErrorPageURL</key> + <map> + <key>Comment</key> + <string>URL to set as a property on LLMediaControl to navigate to if the a page completes with a 400-499 HTTP status code</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/404.html</string> + </map> + <key>DestinationsAndAvatarsVisibility</key> + <map> + <key>Comment</key> + <string>Whether destination panel or avatar picker are open (0=destination guide, 1=avatar picker, default=nothing)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>OpenIMOnVoice</key> + <map> + <key>Comment</key> + <string>Open the corresponding IM window when connecting to a voice call.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>AllowBottomTrayButtonReordering</key> + <map> + <key>Comment</key> + <string>Allow user to move and hide bottom tray buttons</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 03656f2a53..d3f0ec5dad 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -52,7 +52,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>HelpURLFormat</key> <map> @@ -61,7 +61,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/howto/index.html?topic=[TOPIC]</string> + <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/howto/index.html?topic=[TOPIC]</string> </map> <key>PreferredMaturity</key> <map> @@ -117,10 +117,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>VoiceCallsRejectAll</key> + <key>VoiceCallsRejectGroup</key> <map> <key>Comment</key> - <string>Silently reject all incoming voice calls.</string> + <string>Silently reject all incoming group voice calls.</string> <key>Type</key> <string>Boolean</string> <key>Value</key> @@ -133,7 +133,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>ScriptsCanShowUI</key> <map> @@ -248,6 +248,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>EnablePlaceProfile</key> + <map> + <key>Comment</key> + <string>Enable viewing of place profile from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>EnablePicks</key> <map> <key>Comment</key> @@ -290,7 +301,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>EnableAvatarShare</key> <map> @@ -303,6 +314,39 @@ <key>Value</key> <integer>0</integer> </map> + <key>EnableInventory</key> + <map> + <key>Comment</key> + <string>Enable opening inventory from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>EnableSearch</key> + <map> + <key>Comment</key> + <string>Enable opening search from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>EnableAppearance</key> + <map> + <key>Comment</key> + <string>Enable opening appearance from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DoubleClickShowWorldMap</key> <map> <key>Comment</key> @@ -345,7 +389,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/guide.html</string> + <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/guide.html</string> </map> <key>AvatarPickerURL</key> <map> @@ -356,7 +400,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/avatars.html</string> + <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/avatars.html</string> </map> <key>LogInventoryDecline</key> <map> @@ -402,5 +446,27 @@ <key>Value</key> <integer>0</integer> </map> + <key>OpenIMOnVoice</key> + <map> + <key>Comment</key> + <string>Open the corresponding IM window when connecting to a voice call.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>AllowBottomTrayButtonReordering</key> + <map> + <key>Comment</key> + <string>Allow user to move and hide bottom tray buttons</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> </map> </llsd> diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt index 1324fa1a86..af80bff5d9 100644 --- a/indra/newview/licenses-mac.txt +++ b/indra/newview/licenses-mac.txt @@ -315,516 +315,6 @@ This product includes cryptographic software written by Eric Young Hudson (tjh@cryptsoft.com). -=========== -Pth License -=========== - ____ _ _ - | _ \| |_| |__ ``Ian Fleming was a UNIX fan! - | |_) | __| '_ \ How do I know? Well, James Bond - | __/| |_| | | | had the (license to kill) number 007, - |_| \__|_| |_| i.e., he could execute anyone!'' - - GNU Pth - The GNU Portable Threads - - LICENSE - ======= - - 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; either version 2.1 of the - License, or (at your option) any later version. - - For some people, it is not clear, what is the real intention of the - author by using the GNU Lesser General Public License (LGPL) as the - distribution license for GNU Pth. This is, because the LGPL and the - GPL can be (and are often) interpreted very differently and some - interpretations seem to be not compatible with others. So an explicit - clarification for the use of the LGPL for GNU Pth from the authors - point of view might be useful. - - The author places this library under the LGPL to make sure that it - can be used both commercially and non-commercially provided that - modifications to the code base are always donated back to the official - code base under the same license conditions. Please keep in mind that - especially using this library in code not staying under the GPL or - the LGPL _is_ allowed and that any taint or license creap into code - that uses the library is not the authors intention. It is just the - case that _including_ this library into the source tree of other - applications is a little bit more inconvinient because of the LGPL. - But it has to be this way for good reasons. And keep in mind that - inconvinient doesn't mean not allowed or even impossible. - - Even if you want to use this library in some BSD-style licensed - packages, this _is_ possible as long as you are a little bit - carefully. Usually this means you have to make sure that the code is - still clearly separated into the source tree and that modifications to - this source area are done under the conditions of the LGPL. Read below - for more details on the conditions. Contact the author if you have - more questions. - - The license text of the GNU Lesser General Public License follows: - __________________________________________________________________________ - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - ======================= Original SSLeay License ======================= diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7d908df5ce..7319c0d902 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -62,6 +62,7 @@ #include "llstatusbar.h" #include "llteleportflags.h" #include "lltool.h" +#include "lltoolpie.h" #include "lltoolmgr.h" #include "lltrans.h" #include "llurlentry.h" @@ -559,6 +560,8 @@ void LLAgent::setFlying(BOOL fly) // static void LLAgent::toggleFlying() { + LLToolPie::instance().stopClickToWalk(); + BOOL fly = !gAgent.getFlying(); gAgent.mMoveTimer.reset(); @@ -1119,12 +1122,6 @@ void LLAgent::resetControlFlags() //----------------------------------------------------------------------------- void LLAgent::setAFK() { - // Drones can't go AFK - if (gNoRender) - { - return; - } - if (!gAgent.getRegion()) { // Don't set AFK if we're not talking to a region yet. @@ -1343,7 +1340,7 @@ void LLAgent::stopAutoPilot(BOOL user_cancel) //NB: auto pilot can terminate for a reason other than reaching the destination if (mAutoPilotFinishedCallback) { - mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData); + mAutoPilotFinishedCallback(!user_cancel && dist_vec_squared(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < (mAutoPilotStopDistance * mAutoPilotStopDistance), mAutoPilotCallbackData); } mLeaderID = LLUUID::null; @@ -1684,11 +1681,6 @@ void LLAgent::clearRenderState(U8 clearstate) //----------------------------------------------------------------------------- U8 LLAgent::getRenderState() { - if (gNoRender || gKeyboard == NULL) - { - return 0; - } - // *FIX: don't do stuff in a getter! This is infinite loop city! if ((mTypingTimer.getElapsedTimeF32() > TYPING_TIMEOUT_SECS) && (mRenderState & AGENT_STATE_TYPING)) diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index f01d5ff1f5..6c5c3bcdab 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -282,25 +282,22 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera) gAgent.stopAutoPilot(TRUE); } - if (!gNoRender) - { - LLSelectMgr::getInstance()->unhighlightAll(); + LLSelectMgr::getInstance()->unhighlightAll(); - // By popular request, keep land selection while walking around. JC - // LLViewerParcelMgr::getInstance()->deselectLand(); + // By popular request, keep land selection while walking around. JC + // LLViewerParcelMgr::getInstance()->deselectLand(); - // force deselect when walking and attachment is selected - // this is so people don't wig out when their avatar moves without animating - if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) - { - LLSelectMgr::getInstance()->deselectAll(); - } + // force deselect when walking and attachment is selected + // this is so people don't wig out when their avatar moves without animating + if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) + { + LLSelectMgr::getInstance()->deselectAll(); + } - if (gMenuHolder != NULL) - { - // Hide all popup menus - gMenuHolder->hideMenus(); - } + if (gMenuHolder != NULL) + { + // Hide all popup menus + gMenuHolder->hideMenus(); } if (change_camera && !gSavedSettings.getBOOL("FreezeTime")) diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index d520debc31..ed24febf41 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -37,6 +37,8 @@ #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" +#include "llsdutil.h" +#include "llsdutil_math.h" LLAgentListener::LLAgentListener(LLAgent &agent) : LLEventAPI("LLAgent", @@ -53,6 +55,15 @@ LLAgentListener::LLAgentListener(LLAgent &agent) add("requestStand", "Ask to stand up", &LLAgentListener::requestStand); + add("resetAxes", + "Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])", + &LLAgentListener::resetAxes); + add("getAxes", + "Send information about the agent's orientation on [\"reply\"]:\n" + "[\"euler\"]: map of {roll, pitch, yaw}\n" + "[\"quat\"]: array of [x, y, z, w] quaternion values", + &LLAgentListener::getAxes, + LLSDMap("reply", LLSD())); } void LLAgentListener::requestTeleport(LLSD const & event_data) const @@ -64,7 +75,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const params.append(event_data["x"]); params.append(event_data["y"]); params.append(event_data["z"]); - LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, true); + LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "clicked", true); // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat" // should we just compose LLCommandHandler and LLDispatchListener? } @@ -74,7 +85,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const LLVector3(event_data["x"].asReal(), event_data["y"].asReal(), event_data["z"].asReal())).getSLURLString(); - LLURLDispatcher::dispatch(url, NULL, false); + LLURLDispatcher::dispatch(url, "clicked", NULL, false); } } @@ -104,3 +115,28 @@ void LLAgentListener::requestStand(LLSD const & event_data) const mAgent.setControlFlags(AGENT_CONTROL_STAND_UP); } +void LLAgentListener::resetAxes(const LLSD& event) const +{ + if (event.has("lookat")) + { + mAgent.resetAxes(ll_vector3_from_sd(event["lookat"])); + } + else + { + // no "lookat", default call + mAgent.resetAxes(); + } +} + +void LLAgentListener::getAxes(const LLSD& event) const +{ + LLQuaternion quat(mAgent.getQuat()); + F32 roll, pitch, yaw; + quat.getEulerAngles(&roll, &pitch, &yaw); + // The official query API for LLQuaternion's [x, y, z, w] values is its + // public member mQ... + sendReply(LLSDMap + ("quat", llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ))) + ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)), + event); +} diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h index 9b585152f4..0aa58d0b16 100644 --- a/indra/newview/llagentlistener.h +++ b/indra/newview/llagentlistener.h @@ -44,6 +44,8 @@ private: void requestTeleport(LLSD const & event_data) const; void requestSit(LLSD const & event_data) const; void requestStand(LLSD const & event_data) const; + void resetAxes(const LLSD& event) const; + void getAxes(const LLSD& event) const; private: LLAgent & mAgent; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 1cf552e42c..f9e850899a 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -110,6 +110,12 @@ public: { // support secondlife:///app/appearance/show, but for now we just // make all secondlife:///app/appearance SLapps behave this way + if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAppearance")) + { + LLNotificationsUtil::add("NoAppearance", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD()); return true; } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4985524f00..9de2941c4a 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -78,7 +78,6 @@ #include "llvoicechannel.h" #include "llvoavatarself.h" #include "llsidetray.h" -#include "llfeaturemanager.h" #include "llurlmatch.h" #include "lltextutil.h" #include "lllogininstance.h" @@ -756,7 +755,7 @@ bool LLAppViewer::init() // // Various introspection concerning the libs we're using - particularly - // the libs involved in getting to a full login screen. + // the libs involved in getting to a full login screen. // LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL; LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL; @@ -925,7 +924,7 @@ bool LLAppViewer::init() } // If we don't have the right GL requirements, exit. - if (!gGLManager.mHasRequirements && !gNoRender) + if (!gGLManager.mHasRequirements) { // can't use an alert here since we're exiting and // all hell breaks lose. @@ -1215,7 +1214,8 @@ bool LLAppViewer::mainLoop() } // Render scene. - if (!LLApp::isExiting()) + // *TODO: Should we run display() even during gHeadlessClient? DK 2011-02-18 + if (!LLApp::isExiting() && !gHeadlessClient) { pingMainloopTimeout("Main:Display"); gGLActive = TRUE; @@ -1243,8 +1243,7 @@ bool LLAppViewer::mainLoop() } // yield cooperatively when not running as foreground window - if ( gNoRender - || (gViewerWindow && !gViewerWindow->mWindow->getVisible()) + if ( (gViewerWindow && !gViewerWindow->mWindow->getVisible()) || !gFocusMgr.getAppHasFocus()) { // Sleep if we're not rendering, or the window is minimized. @@ -2468,6 +2467,14 @@ bool LLAppViewer::initConfiguration() } } + // If automatic login from command line with --login switch + // init StartSLURL location. In interactive login, LLPanelLogin + // will take care of it. + if ((clp.hasOption("login") || clp.hasOption("autologin")) && !clp.hasOption("url") && !clp.hasOption("slurl")) + { + LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation"))); + } + if (!gSavedSettings.getBOOL("AllowMultipleViewers")) { // @@ -2732,12 +2739,26 @@ void LLAppViewer::checkForCrash(void) } +// +// This function decides whether the client machine meets the minimum requirements to +// run in a maximized window, per the consensus of davep, boa and nyx on 3/30/2011. +// +bool LLAppViewer::meetsRequirementsForMaximizedStart() +{ + bool maximizedOk = (LLFeatureManager::getInstance()->getGPUClass() >= GPU_CLASS_2); + + const U32 one_gigabyte_kb = 1024 * 1024; + maximizedOk &= (gSysMemory.getPhysicalMemoryKB() >= one_gigabyte_kb); + + return maximizedOk; +} + bool LLAppViewer::initWindow() { LL_INFOS("AppInit") << "Initializing window..." << LL_ENDL; // store setting in a global for easy access and modification - gNoRender = gSavedSettings.getBOOL("DisableRendering"); + gHeadlessClient = gSavedSettings.getBOOL("HeadlessClient"); // always start windowed BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth"); @@ -2751,7 +2772,8 @@ bool LLAppViewer::initWindow() const S32 NEVER_SUBMIT_REPORT = 2; bool use_watchdog = false; int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled"); - if(watchdog_enabled_setting == -1){ + if(watchdog_enabled_setting == -1) + { use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled"); } else @@ -2773,28 +2795,25 @@ bool LLAppViewer::initWindow() gViewerWindow->mWindow->maximize(); } - if (!gNoRender) + // + // Initialize GL stuff + // + + if (mForceGraphicsDetail) { - // - // Initialize GL stuff - // + LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false); + } + + // Set this flag in case we crash while initializing GL + gSavedSettings.setBOOL("RenderInitError", TRUE); + gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); - if (mForceGraphicsDetail) - { - LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false); - } - - // Set this flag in case we crash while initializing GL - gSavedSettings.setBOOL("RenderInitError", TRUE); - gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); - - gPipeline.init(); - stop_glerror(); - gViewerWindow->initGLDefaults(); + gPipeline.init(); + stop_glerror(); + gViewerWindow->initGLDefaults(); - gSavedSettings.setBOOL("RenderInitError", FALSE); - gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); - } + gSavedSettings.setBOOL("RenderInitError", FALSE); + gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); //If we have a startup crash, it's usually near GL initialization, so simulate that. if(gCrashOnStartup) @@ -2802,6 +2821,21 @@ bool LLAppViewer::initWindow() LLAppViewer::instance()->forceErrorLLError(); } + // + // Determine if the window should start maximized on initial run based + // on graphics capability + // + if (gSavedSettings.getBOOL("FirstLoginThisInstall") && meetsRequirementsForMaximizedStart()) + { + LL_INFOS("AppInit") << "This client met the requirements for a maximized initial screen." << LL_ENDL; + gSavedSettings.setBOOL("WindowMaximized", TRUE); + } + + if (gSavedSettings.getBOOL("WindowMaximized")) + { + gViewerWindow->mWindow->maximize(); + } + LLUI::sWindow = gViewerWindow->getWindow(); // Show watch cursor @@ -2836,12 +2870,9 @@ void LLAppViewer::cleanupSavedSettings() gSavedSettings.setBOOL("ShowObjectUpdates", gShowObjectUpdates); - if (!gNoRender) + if (gDebugView) { - if (gDebugView) - { - gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible()); - } + gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible()); } // save window position if not maximized @@ -3824,7 +3855,7 @@ void LLAppViewer::badNetworkHandler() // is destroyed. void LLAppViewer::saveFinalSnapshot() { - if (!mSavedFinalSnapshot && !gNoRender) + if (!mSavedFinalSnapshot) { gSavedSettings.setVector3d("FocusPosOnLogout", gAgentCamera.calcFocusPositionTargetGlobal()); gSavedSettings.setVector3d("CameraPosOnLogout", gAgentCamera.calcCameraPositionTargetGlobal()); @@ -4228,34 +4259,31 @@ void LLAppViewer::idle() // // Update weather effects // - if (!gNoRender) - { - LLWorld::getInstance()->updateClouds(gFrameDTClamped); - gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets + LLWorld::getInstance()->updateClouds(gFrameDTClamped); + gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets - // Update wind vector - LLVector3 wind_position_region; - static LLVector3 average_wind; + // Update wind vector + LLVector3 wind_position_region; + static LLVector3 average_wind; - LLViewerRegion *regionp; - regionp = LLWorld::getInstance()->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position - if (regionp) - { - gWindVec = regionp->mWind.getVelocity(wind_position_region); + LLViewerRegion *regionp; + regionp = LLWorld::getInstance()->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position + if (regionp) + { + gWindVec = regionp->mWind.getVelocity(wind_position_region); - // Compute average wind and use to drive motion of water - - average_wind = regionp->mWind.getAverage(); - F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region); - - gSky.setCloudDensityAtAgent(cloud_density); - gSky.setWind(average_wind); - //LLVOWater::setWind(average_wind); - } - else - { - gWindVec.setVec(0.0f, 0.0f, 0.0f); - } + // Compute average wind and use to drive motion of water + + average_wind = regionp->mWind.getAverage(); + F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region); + + gSky.setCloudDensityAtAgent(cloud_density); + gSky.setWind(average_wind); + //LLVOWater::setWind(average_wind); + } + else + { + gWindVec.setVec(0.0f, 0.0f, 0.0f); } ////////////////////////////////////// @@ -4264,13 +4292,10 @@ void LLAppViewer::idle() // Here, particles are updated and drawables are moved. // - if (!gNoRender) - { - LLFastTimer t(FTM_WORLD_UPDATE); - gPipeline.updateMove(); + LLFastTimer t(FTM_WORLD_UPDATE); + gPipeline.updateMove(); - LLWorld::getInstance()->updateParticles(); - } + LLWorld::getInstance()->updateParticles(); if (LLViewerJoystick::getInstance()->getOverrideCamera()) { @@ -4636,12 +4661,9 @@ void LLAppViewer::disconnectViewer() gSavedSettings.setBOOL("FlyingAtExit", gAgent.getFlying() ); // Un-minimize all windows so they don't get saved minimized - if (!gNoRender) + if (gFloaterView) { - if (gFloaterView) - { - gFloaterView->restoreAll(); - } + gFloaterView->restoreAll(); } if (LLSelectMgr::getInstance()) diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 0226211735..61ee6a7cf1 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -187,6 +187,7 @@ protected: virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this. + virtual bool meetsRequirementsForMaximizedStart(); // Used on first login to decide to launch maximized private: diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 898cc1c0ba..523c2e3adf 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -233,7 +233,7 @@ gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **succ std::string url = slurl; LLMediaCtrl* web = NULL; const bool trusted_browser = false; - if (LLURLDispatcher::dispatch(url, web, trusted_browser)) + if (LLURLDispatcher::dispatch(url, "", web, trusted_browser)) { // bring window to foreground, as it has just been "launched" from a URL // todo: hmm, how to get there from here? diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 1cd80986d8..c2916717bd 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -500,7 +500,7 @@ OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn) LLMediaCtrl* web = NULL; const bool trusted_browser = false; - LLURLDispatcher::dispatch(url, web, trusted_browser); + LLURLDispatcher::dispatch(url, "", web, trusted_browser); } return(result); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index afa8b62c74..cbbdcb2983 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -279,7 +279,7 @@ bool LLAvatarActions::isCalling(const LLUUID &id) //static bool LLAvatarActions::canCall() { - return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); + return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); } // static @@ -300,40 +300,27 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids) make_ui_sound("UISndStartIM"); } +static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name) +{ + std::string username = av_name.mUsername; + if (username.empty()) + { + username = LLCacheName::buildUsername(av_name.mDisplayName); + } + + llinfos << "opening web profile for " << username << llendl; + std::string url = getProfileURL(username); + + // PROFILES: open in webkit window + LLWeb::loadWebURLInternal(url, "", agent_id.asString()); +} + // static void LLAvatarActions::showProfile(const LLUUID& id) { if (id.notNull()) { - LLSD params; - params["id"] = id; - params["open_tab_name"] = "panel_profile"; - - // PROFILES: open in webkit window - std::string full_name; - if (gCacheName->getFullName(id,full_name)) - { - std::string agent_name = LLCacheName::buildUsername(full_name); - llinfos << "opening web profile for " << agent_name << llendl; - std::string url = getProfileURL(agent_name); - LLWeb::loadWebURLInternal(url, "", id.asString()); - } - else - { - llwarns << "no name info for agent id " << id << llendl; - } -#if 0 - //Show own profile - if(gAgent.getID() == id) - { - LLSideTray::getInstance()->showPanel("panel_me", params); - } - //Show other user profile - else - { - LLSideTray::getInstance()->showPanel("panel_profile_view", params); - } -#endif + LLAvatarNameCache::get(id, boost::bind(&on_avatar_name_show_profile, _1, _2)); } } diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index 99aeb4cbad..b1cd83a1fb 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -160,6 +160,12 @@ void LLAvatarPropertiesProcessor::sendAvatarClassifiedsRequest(const LLUUID& ava void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props) { + if (!gAgent.isInitialized() || (gAgent.getID() == LLUUID::null)) + { + llwarns << "Sending avatarinfo update DENIED - invalid agent" << llendl; + return; + } + llinfos << "Sending avatarinfo update" << llendl; // This value is required by sendAvatarPropertiesUpdate method. @@ -168,20 +174,21 @@ void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* LLMessageSystem *msg = gMessageSystem; - msg->newMessageFast(_PREHASH_AvatarPropertiesUpdate); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast( _PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - msg->nextBlockFast(_PREHASH_PropertiesData); + msg->newMessageFast (_PREHASH_AvatarPropertiesUpdate); + msg->nextBlockFast (_PREHASH_AgentData); + msg->addUUIDFast (_PREHASH_AgentID, gAgent.getID() ); + msg->addUUIDFast (_PREHASH_SessionID, gAgent.getSessionID() ); + msg->nextBlockFast (_PREHASH_PropertiesData); - msg->addUUIDFast( _PREHASH_ImageID, avatar_props->image_id); - msg->addUUIDFast( _PREHASH_FLImageID, avatar_props->fl_image_id); - msg->addStringFast( _PREHASH_AboutText, avatar_props->about_text); - msg->addStringFast( _PREHASH_FLAboutText, avatar_props->fl_about_text); + msg->addUUIDFast (_PREHASH_ImageID, avatar_props->image_id); + msg->addUUIDFast (_PREHASH_FLImageID, avatar_props->fl_image_id); + msg->addStringFast (_PREHASH_AboutText, avatar_props->about_text); + msg->addStringFast (_PREHASH_FLAboutText, avatar_props->fl_about_text); msg->addBOOL(_PREHASH_AllowPublish, avatar_props->allow_publish); msg->addBOOL(_PREHASH_MaturePublish, mature); msg->addString(_PREHASH_ProfileURL, avatar_props->profile_url); + gAgent.sendReliableMessage(); } diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 0371b7be71..c72cdfd1dc 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -218,7 +218,7 @@ LLBottomTray::LLBottomTray(const LLSD&) mLandingTab(NULL), mCheckForDrag(false) { - // Firstly add ourself to IMSession observers, so we catch session events + // Firstly add our self to IMSession observers, so we catch session events // before chiclets do that. LLIMMgr::getInstance()->addSessionObserver(this); @@ -378,12 +378,13 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b } // We have to enable/disable right and left parts of speak button separately (EXT-4648) - mSpeakBtn->setSpeakBtnEnabled(enable); + getChild<LLButton>("speak_btn")->setEnabled(enable); + // skipped to avoid button blinking if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL) { bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); - mSpeakBtn->setFlyoutBtnEnabled(voice_status); + getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status); if (voice_status) { LLFirstUse::speak(true); @@ -492,26 +493,6 @@ void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask) mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Select_All", in_edit_box); } -void LLBottomTray::showGestureButton(BOOL visible) -{ - setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible); -} - -void LLBottomTray::showMoveButton(BOOL visible) -{ - setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible); -} - -void LLBottomTray::showCameraButton(BOOL visible) -{ - setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible); -} - -void LLBottomTray::showSnapshotButton(BOOL visible) -{ - setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible); -} - void LLBottomTray::showSpeakButton(bool visible) { // Show/hide the button @@ -566,17 +547,27 @@ BOOL LLBottomTray::postBuild() setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); mSpeakPanel = getChild<LLPanel>("speak_panel"); - mSpeakBtn = getChild<LLSpeakButton>("talk"); - LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle()); + mSpeakBtn = findChild<LLSpeakButton>("talk"); + if (mSpeakBtn) + { + LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle()); + + // Localization tool doesn't understand custom buttons like <talk_button> + mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); + mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); + } + else + { + LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn")); + LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_flyout_btn")); + } + // Both parts of speak button should be initially disabled because // it takes some time between logging in to world and connecting to voice channel. - mSpeakBtn->setSpeakBtnEnabled(false); - mSpeakBtn->setFlyoutBtnEnabled(false); + getChild<LLButton>("speak_btn")->setEnabled(false); + getChild<LLButton>("speak_flyout_btn")->setEnabled(false); - // Localization tool doesn't understand custom buttons like <talk_button> - mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); - mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); // Registering Chat Bar to receive Voice client status change notifications. LLVoiceClient::getInstance()->addObserver(this); @@ -760,6 +751,8 @@ void LLBottomTray::updateButtonsOrdersAfterDnD() void LLBottomTray::saveButtonsOrder() { + if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; + std::string user_dir = gDirUtilp->getLindenUserDir(); if (user_dir.empty()) return; @@ -780,6 +773,8 @@ void LLBottomTray::saveButtonsOrder() void LLBottomTray::loadButtonsOrder() { + if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; + // load per-resident sorting information std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME); @@ -872,6 +867,10 @@ void LLBottomTray::draw() getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible); + bool openmic = LLVoiceClient::getInstance()->getUserPTTState(); + bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled(); + getChild<LLButton>("speak_btn")->setToggleState(openmic && voiceenabled); + getChild<LLOutputMonitorCtrl>("chat_zone_indicator")->setIsMuted(!voiceenabled); } @@ -936,15 +935,14 @@ void LLBottomTray::log(LLView* panel, const std::string& descr) { if (NULL == panel) return; LLView* layout = panel->getParent(); - lldebugs << descr << ": " + LL_DEBUGS("Bottom Tray Rects") << descr << ": " << "panel: " << panel->getName() << ", rect: " << panel->getRect() - << "layout: " << layout->getName() + << " layout: " << layout->getName() << ", rect: " << layout->getRect() - << llendl - ; + << LL_ENDL; } void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) @@ -964,7 +962,9 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) if (mNearbyChatBar) log(mNearbyChatBar, "before"); if (mChicletPanel) log(mChicletPanel, "before"); - // stores width size on which bottom tray is less than width required by its children. EXT-991 + // Difference between bottom tray width required to fit its children and the actual width. (see EXT-991) + // Positive value means that bottom tray is not wide enough. + // Negative value means that there is free space. static S32 extra_shrink_width = 0; bool should_be_reshaped = true; @@ -986,11 +986,9 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) // bottom tray is narrowed if (delta_width < 0) { - if (extra_shrink_width > 0) + if (extra_shrink_width > 0) // not enough space { - // is world rect was extra shrunk and decreasing again only update this value - // to delta_width negative - extra_shrink_width -= delta_width; // use "-=" because delta_width is negative + extra_shrink_width += llabs(delta_width); should_be_reshaped = false; } else @@ -1001,13 +999,13 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) width += extra_shrink_width; } } - // bottom tray is widen + // bottom tray is widened else { if (extra_shrink_width > delta_width) { - // Less than minimum width is more than increasing (delta_width) - // only reduce it value and make no reshape + // Still not enough space. + // Only subtract the delta from the required delta and don't reshape. extra_shrink_width -= delta_width; should_be_reshaped = false; } @@ -1047,6 +1045,7 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) { mDesiredNearbyChatWidth = new_width; processChatbarCustomization(new_width); + lldebugs << "Setting nearby chat bar width to " << new_width << " px" << llendl; mChatBarContainer->reshape(new_width, mChatBarContainer->getRect().getHeight()); } needs_restore_custom_state = false; @@ -1058,30 +1057,28 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) { bool still_should_be_processed = true; - const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); - const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom(); // There are four steps of processing width decrease. If in one of them required width was reached, // further are not needed. // 1. Decreasing width of chiclet panel. - if (chiclet_panel_width > chiclet_panel_min_width) + if (chiclet_panel_shrink_headroom > 0) { // we have some space to decrease chiclet panel - S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width; - - S32 delta_panel = llmin(-delta_width, panel_delta_min); + S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom); lldebugs << "delta_width: " << delta_width - << ", panel_delta_min: " << panel_delta_min - << ", delta_panel: " << delta_panel + << ", panel_delta_min: " << chiclet_panel_shrink_headroom + << ", shrink_by: " << shrink_by << llendl; - // is chiclet panel width enough to process resizing? - delta_width += panel_delta_min; + // is chiclet panel wide enough to process resizing? + delta_width += chiclet_panel_shrink_headroom; still_should_be_processed = delta_width < 0; - mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight()); + lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; + mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); log(mChicletPanel, "after processing panel decreasing via chiclet panel"); lldebugs << "RS_CHICLET_PANEL" @@ -1105,7 +1102,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) S32 delta_panel = llmin(-delta_width, panel_delta_min); - // whether chatbar panel width is enough to process resizing? + // is chatbar panel wide enough to process resizing? delta_width += panel_delta_min; still_should_be_processed = delta_width < 0; @@ -1113,6 +1110,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) // chatbar should only be shrunk here, not stretched if(delta_panel > 0) { + lldebugs << "Shrinking nearby chat bar by " << delta_panel << " px " << llendl; mChatBarContainer->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mChatBarContainer->getRect().getHeight()); } @@ -1144,6 +1142,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) { S32 compensative_width = nearby_needed_width > buttons_freed_width ? buttons_freed_width : nearby_needed_width; log(mNearbyChatBar, "before applying compensative width"); + lldebugs << "Extending nearby chat bar by " << compensative_width << " px" << llendl; mChatBarContainer->reshape(mChatBarContainer->getRect().getWidth() + compensative_width, mChatBarContainer->getRect().getHeight() ); log(mNearbyChatBar, "after applying compensative width"); lldebugs << buttons_freed_width << llendl; @@ -1158,52 +1157,46 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) { if (delta_width <= 0) return; - const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); - static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); - - const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width; + // how much room we have to show hidden buttons + S32 available_width = delta_width + getChicletPanelShrinkHeadroom(); - // how many room we have to show hidden buttons - S32 total_available_width = delta_width + available_width_chiclet; + lldebugs << "Distributing (" << getChicletPanelShrinkHeadroom() + << " + " << delta_width << ") = " << available_width << " px" << llendl; - lldebugs << "Processing extending, available width:" - << ", chiclets - " << available_width_chiclet - << ", total - " << total_available_width - << llendl; - - S32 available_width = total_available_width; + // 1. Try showing buttons that have been auto-hidden. + S32 processed_width = processShowButtons(available_width); + lldebugs << "processed_width = " << processed_width << ", delta_width = " << delta_width << llendl; - processShowButtons(available_width); + lldebugs << "Available_width after showing buttons: " << available_width << llendl; - // if we have to show/extend some buttons but resized delta width is not enough... - S32 processed_width = total_available_width - available_width; + // If the newly shown buttons have consumed more than delta_width pixels, + // shrink the chiclet panel. if (processed_width > delta_width) { - // ... let's shrink nearby chat & chiclet panels - S32 required_to_process_width = processed_width; - // 1. use delta width of resizing - required_to_process_width -= delta_width; + S32 shrink_by = processed_width - delta_width; // 2. use width available via decreasing of chiclet panel - if (required_to_process_width > 0) + if (shrink_by > 0) { - mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight()); + lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; + mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); log(mChicletPanel, "after applying compensative width for chiclets: "); - lldebugs << required_to_process_width << llendl; + lldebugs << shrink_by << llendl; } + // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels + delta_width -= processed_width; } - // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels - delta_width -= processed_width; - - - // how many space can nearby chatbar take? - S32 chatbar_panel_width_ = mChatBarContainer->getRect().getWidth(); - if (delta_width > 0 && chatbar_panel_width_ < mDesiredNearbyChatWidth) + // 2. Expand the nearby chat bar if needed. + S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth(); + lldebugs << "delta_width = " << delta_width + << ", chatbar_panel_width = " << chatbar_panel_width + << ", mDesiredNearbyChatWidth = " << mDesiredNearbyChatWidth << llendl; + if (delta_width > 0 && chatbar_panel_width < mDesiredNearbyChatWidth) { - S32 delta_panel_max = mDesiredNearbyChatWidth - chatbar_panel_width_; + S32 delta_panel_max = mDesiredNearbyChatWidth - chatbar_panel_width; S32 delta_panel = llmin(delta_width, delta_panel_max); lldebugs << "Unprocesed delta width: " << delta_width << ", can be applied to chatbar: " << delta_panel_max @@ -1211,17 +1204,25 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) << llendl; delta_width -= delta_panel_max; - mChatBarContainer->reshape(chatbar_panel_width_ + delta_panel, mChatBarContainer->getRect().getHeight()); + lldebugs << "Extending nearby chat bar by " << delta_panel << " px " << llendl; + mChatBarContainer->reshape(chatbar_panel_width + delta_panel, mChatBarContainer->getRect().getHeight()); log(mNearbyChatBar, "applied unprocessed delta width"); } + + // 3. Expand buttons that have been auto-shrunk, + // if we haven't yet consumed all the available headroom. if (delta_width > 0) { - processExtendButtons(delta_width); + S32 available_width = delta_width + getChicletPanelShrinkHeadroom(); + processExtendButtons(available_width); } } -void LLBottomTray::processShowButtons(S32& available_width) +S32 LLBottomTray::processShowButtons(S32& available_width) { + lldebugs << "Distributing " << available_width << " px" << llendl; + S32 original_available_width = available_width; + // process buttons from left to right resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); @@ -1234,37 +1235,20 @@ void LLBottomTray::processShowButtons(S32& available_width) // try to show next button processShowButton(*it, available_width); } + + return original_available_width - available_width; } bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width) { - lldebugs << "Trying to show object type: " << shown_object_type << llendl; - - LLPanel* panel = getButtonPanel(shown_object_type); - if (NULL == panel) + // Check if the button was previously auto-hidden (due to lack of space). + if (!isAutoHidden(shown_object_type)) { - lldebugs << "There is no object to process for state: " << shown_object_type << llendl; return false; } - bool can_be_shown = canButtonBeShown(shown_object_type); - if (can_be_shown) - { - //validate if we have enough room to show this button - const S32 required_width = panel->getRect().getWidth(); - can_be_shown = available_width >= required_width; - if (can_be_shown) - { - available_width -= required_width; - setTrayButtonVisible(shown_object_type, true); - - lldebugs << "processed object type: " << shown_object_type - << ", rest available width: " << available_width - << llendl; - mResizeState &= ~shown_object_type; - } - } - return can_be_shown; + // Ok. Try showing the button. + return showButton(shown_object_type, available_width); } void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_width) @@ -1289,7 +1273,6 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& re LLPanel* panel = getButtonPanel(processed_object_type); if (NULL == panel) { - lldebugs << "There is no object to process for state: " << processed_object_type << llendl; return; } @@ -1304,7 +1287,7 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& re setTrayButtonVisible(processed_object_type, false); - mResizeState |= processed_object_type; + setAutoHidden(processed_object_type, true); lldebugs << "processing object type: " << processed_object_type << ", buttons_freed_width: " << buttons_freed_width @@ -1345,7 +1328,11 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_ if (possible_shrink_width > 0) { - mSpeakBtn->setLabelVisible(false); + if (mSpeakBtn) + { + mSpeakBtn->setLabelVisible(false); + } + mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight()); required_width += possible_shrink_width; @@ -1369,7 +1356,6 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& LLPanel* panel = getButtonPanel(processed_object_type); if (NULL == panel) { - lldebugs << "There is no object to process for type: " << processed_object_type << llendl; return; } @@ -1414,122 +1400,130 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& void LLBottomTray::processExtendButtons(S32& available_width) { // do not allow extending any buttons if we have some buttons hidden via resize - if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return; + if (isAutoHidden(RS_BUTTONS_CAN_BE_HIDDEN)) return; - // process buttons from left to right - resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); - const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); + lldebugs << "Distributing " << available_width << " px" << llendl; - // iterate through buttons in the mButtonsProcessOrder first - for (; it != it_end; ++it) + // First try extending the Speak button. + if (available_width > 0) { - // is there available space? - if (available_width <= 0) break; - - // try to extend next button - processExtendButton(*it, available_width); + if (!processExtendSpeakButton(available_width)) + { + // The Speak button needs extension but lacks some space. + // Don't extend other buttons in this case: the Speak button + // should consume the available headroom first. + return; + } } - const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); - static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); - const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width; + // Then process the other buttons from left to right. + if (available_width > 0) + { + resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); + const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); + + // iterate through buttons in the mButtonsProcessOrder first + for (; it != it_end; ++it) + { + // is there available space? + if (available_width <= 0) break; - // then try to extend Speak button - if (available_width > 0 || available_width_chiclet > 0) + // try to extend next button + processExtendButton(*it, available_width); + } + } +} + +bool LLBottomTray::processExtendSpeakButton(S32& available_width) +{ + if (available_width <= 0) { - S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK]; - S32 panel_width = mSpeakPanel->getRect().getWidth(); - S32 possible_extend_width = panel_max_width - panel_width; + llassert(available_width > 0); + return true; + } + + const S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK]; + const S32 panel_width = mSpeakPanel->getRect().getWidth(); + const S32 required_headroom = panel_max_width - panel_width; - if (possible_extend_width >= 0 && possible_extend_width <= available_width + available_width_chiclet) // HACK: this button doesn't change size so possible_extend_width will be 0 + if (panel_width < panel_max_width) // if the button isn't extended already + { + if (available_width < required_headroom) // not enough space { - mSpeakBtn->setLabelVisible(true); - mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); - log(mSpeakBtn, "speak button is extended"); + lldebugs << "Need (" << required_headroom << " - " << available_width << ") = " + << (required_headroom - available_width) << " more px" + << " to extend the Speak button"<< llendl; - if( available_width > possible_extend_width) - { - available_width -= possible_extend_width; - } - else - { - S32 required_width = possible_extend_width - available_width; - available_width = 0; - mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_width, mChicletPanel->getParent()->getRect().getHeight()); - } - lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName() - << ", extended width: " << possible_extend_width - << ", rest width to process: " << available_width - << llendl; + return false; // Don't extend other buttons until we extend Speak. } + + // Reshape the Speak button to its maximum width. + if (mSpeakBtn) mSpeakBtn->setLabelVisible(true); + mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); + + available_width -= required_headroom; + llassert(available_width >= 0); + + lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName() + << ", extended width: " << required_headroom + << ", rest width to process: " << available_width + << llendl; } + + return true; } void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width) { + llassert(available_width >= 0); + LLPanel* panel = getButtonPanel(processed_object_type); if (NULL == panel) { - lldebugs << "There is no object to process for type: " << processed_object_type << llendl; return; } if (!panel->getVisible()) return; + // Widen the button up to its maximum width, but by not more than <available_width> px. S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type]; S32 panel_width = panel->getRect().getWidth(); - S32 possible_extend_width = panel_max_width - panel_width; + S32 required_headroom = panel_max_width - panel_width; - if (possible_extend_width > 0) + S32 extend_by = llmin(available_width, required_headroom); + if (extend_by > 0) { - // let calculate real width to extend + panel->reshape(panel_width + extend_by, panel->getRect().getHeight()); - // 1. apply all possible width - available_width -= possible_extend_width; - - // 2. it it is too much... - if (available_width < 0) - { - // reduce applied extended width to the excessive value. - possible_extend_width += available_width; - available_width = 0; - } - panel->reshape(panel_width + possible_extend_width, panel->getRect().getHeight()); + // Decrease amount of headroom available for other panels. + available_width -= extend_by; - lldebugs << "Extending panel: " << panel->getName() - << ", extended width: " << possible_extend_width - << ", rest width to process: " << available_width + lldebugs << "Extending " << panel->getName() + << " by " << extend_by + << " px; remaining available width: " << available_width << llendl; } } bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const { - // 0. Check if passed button was previously hidden on resize - bool can_be_shown = mResizeState & processed_object_type; - if (can_be_shown) - { - // Yes, it was. Lets now check that all buttons before it (that can be hidden on resize) - // are already shown - - // process buttons in direct order (from left to right) - resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); - const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); + // Check that all buttons (that can be hidden on resize) + // to the left of the given one are already shown. - // 1. Find and accumulate all buttons types before one passed into the method. - MASK buttons_before_mask = RS_NORESIZE; - for (; it != it_end; ++it) - { - const EResizeState button_type = *it; - if (button_type == processed_object_type) break; + // process buttons in direct order (from left to right) + resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); + const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - buttons_before_mask |= button_type; - } + MASK buttons_before_mask = RS_NORESIZE; + for (; it != it_end; ++it) + { + const EResizeState button_type = *it; + if (button_type == processed_object_type) break; - // 2. Check if some previous buttons are still hidden on resize - can_be_shown = !(buttons_before_mask & mResizeState); + buttons_before_mask |= button_type; } - return can_be_shown; + + return !isAutoHidden(buttons_before_mask); } void LLBottomTray::initResizeStateContainers() @@ -1539,21 +1533,35 @@ void LLBottomTray::initResizeStateContainers() mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_DESTINATIONS, getChild<LLPanel>("destinations_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_AVATARS, getChild<LLPanel>("avatar_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_1, getChild<LLPanel>("splitter_panel_1"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PEOPLE, getChild<LLPanel>("people_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PROFILE, getChild<LLPanel>("profile_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_2, getChild<LLPanel>("splitter_panel_2"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_HOWTO, getChild<LLPanel>("howto_panel"))); // init an order of processed buttons - mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); - mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); - mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); + mButtonsProcessOrder.push_back(RS_BUTTON_DESTINATIONS); + mButtonsProcessOrder.push_back(RS_BUTTON_AVATARS); mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT); mButtonsProcessOrder.push_back(RS_BUTTON_BUILD); mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH); mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP); mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP); + mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_1); + mButtonsProcessOrder.push_back(RS_BUTTON_PEOPLE); + mButtonsProcessOrder.push_back(RS_BUTTON_PROFILE); + mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_2); + mButtonsProcessOrder.push_back(RS_BUTTON_HOWTO); + mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); + mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); + mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); mButtonsOrder.push_back(RS_BUTTON_SPEAK); mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end()); @@ -1592,6 +1600,7 @@ void LLBottomTray::initButtonsVisibility() setVisibleAndFitWidths(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton")); setVisibleAndFitWidths(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton")); setVisibleAndFitWidths(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton")); + lldebugs << "mResizeState = " << resizeStateMaskToString(mResizeState) << llendl; } void LLBottomTray::setButtonsControlsAndListeners() @@ -1623,12 +1632,53 @@ bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, cons return true; } +bool LLBottomTray::showButton(EResizeState button_type, S32& available_width) +{ + LLPanel* panel = getButtonPanel(button_type); + if (NULL == panel) + { + return false; + } + + if (panel->getVisible()) + { + return false; + } + + // Check if none of the buttons to the left of the given one was auto-hidden. + // (we auto-show the buttons left to right). + if (!canButtonBeShown(button_type)) + { + return false; + } + + // Make sure we have enough room to show this button. + const S32 required_width = panel->getRect().getWidth(); + if (available_width < required_width) + { + lldebugs << "Need " << (required_width - available_width) << " more px to show " << resizeStateToString(button_type) << llendl; + return false; + } + + // All good. Show the button. + setTrayButtonVisible(button_type, true); + + // Let the caller know that there is now less available space. + available_width -= required_width; + + lldebugs << "Showing button " << resizeStateToString(button_type) + << ", remaining available width: " << available_width + << llendl; + setAutoHidden(button_type, false); + + return true; +} + void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) { LLPanel* panel = getButtonPanel(shown_object_type); if (NULL == panel) { - lldebugs << "There is no object to show for state: " << shown_object_type << llendl; return; } @@ -1659,7 +1709,6 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible LLPanel* cur_panel = getButtonPanel(object_type); if (NULL == cur_panel) { - lldebugs << "There is no object to process for state: " << object_type << llendl; return false; } @@ -1668,17 +1717,13 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible if (visible) { // Assume that only chiclet panel can be auto-resized - const S32 available_width = - mChicletPanel->getParent()->getRect().getWidth() - mChicletPanel->getMinWidth(); + const S32 available_width = getChicletPanelShrinkHeadroom(); S32 preferred_width = mObjectDefaultWidthMap[object_type]; S32 current_width = cur_panel->getRect().getWidth(); S32 result_width = 0; bool decrease_width = false; - // Mark this button to be shown - mResizeState |= object_type; - if (preferred_width > 0 && available_width >= preferred_width) { result_width = preferred_width; @@ -1722,7 +1767,11 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible } else { - // Nothing can be done, give up... + lldebugs << "Need " << (minimal_width - available_width - possible_shrunk_width) + << " more px to show " << resizeStateToString(object_type) << llendl; + + // Make the button uppear when we have more available space. + setAutoHidden(object_type, true); return false; } } @@ -1733,7 +1782,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible current_width = result_width; } - is_set = processShowButton(object_type, current_width); + is_set = showButton(object_type, current_width); // Shrink buttons if needed if (is_set && decrease_width) @@ -1748,7 +1797,8 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible setTrayButtonVisible(object_type, false); // Mark button NOT to show while future bottom tray extending - mResizeState &= ~object_type; + lldebugs << "Removing " << resizeStateToString(object_type) << " from mResizeState" << llendl; + setAutoHidden(object_type, false); // Extend other buttons if need if (delta_width) @@ -1805,12 +1855,14 @@ void LLBottomTray::processChatbarCustomization(S32 new_width) if (delta_width == 0) return; + { + static unsigned dbg_cnt = 0; + lldebugs << llformat("*** (%03d) ************************************* %d", delta_width, ++dbg_cnt) << llendl; + } + mDesiredNearbyChatWidth = new_width; - LLView * chiclet_layout_panel = mChicletPanel->getParent(); - const S32 chiclet_min_width = get_panel_min_width(mToolbarStack, chiclet_layout_panel); - const S32 chiclet_panel_width = chiclet_layout_panel->getRect().getWidth(); - const S32 available_chiclet_shrink_width = chiclet_panel_width - chiclet_min_width; + const S32 available_chiclet_shrink_width = getChicletPanelShrinkHeadroom(); llassert(available_chiclet_shrink_width >= 0); if (delta_width > 0) // panel gets narrowly @@ -1829,29 +1881,99 @@ void LLBottomTray::processChatbarCustomization(S32 new_width) } } +S32 LLBottomTray::getChicletPanelShrinkHeadroom() const +{ + static const S32 min_width = mChicletPanel->getMinWidth(); + const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth(); + + S32 shrink_headroom = cur_width - min_width; + llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum + return shrink_headroom; +} + // static std::string LLBottomTray::resizeStateToString(EResizeState state) { + const char *rs_string = "UNKNOWN_BUTTON"; + switch (state) { - case RS_NORESIZE: return "RS_NORESIZE"; - case RS_CHICLET_PANEL: return "RS_CHICLET_PANEL"; - case RS_CHATBAR_INPUT: return "RS_CHATBAR_INPUT"; - case RS_BUTTON_SNAPSHOT: return "RS_BUTTON_SNAPSHOT"; - case RS_BUTTON_CAMERA: return "RS_BUTTON_CAMERA"; - case RS_BUTTON_MOVEMENT: return "RS_BUTTON_MOVEMENT"; - case RS_BUTTON_GESTURES: return "RS_BUTTON_GESTURES"; - case RS_BUTTON_SPEAK: return "RS_BUTTON_SPEAK"; - case RS_IM_WELL: return "RS_IM_WELL"; - case RS_NOTIFICATION_WELL: return "RS_NOTIFICATION_WELL"; - case RS_BUTTON_BUILD: return "RS_BUTTON_BUILD"; - case RS_BUTTON_SEARCH: return "RS_BUTTON_SEARCH"; - case RS_BUTTON_WORLD_MAP: return "RS_BUTTON_WORLD_MAP"; - case RS_BUTTON_MINI_MAP: return "RS_BUTTON_MINI_MAP"; - case RS_BUTTONS_CAN_BE_HIDDEN: return "RS_BUTTONS_CAN_BE_HIDDEN"; - // No default to track additions. - } - return "UNKNOWN_BUTTON"; + case RS_NORESIZE: rs_string = "RS_NORESIZE"; break; + case RS_CHICLET_PANEL: rs_string = "RS_CHICLET_PANEL"; break; + case RS_CHATBAR_INPUT: rs_string = "RS_CHATBAR_INPUT"; break; + case RS_BUTTON_SNAPSHOT: rs_string = "RS_BUTTON_SNAPSHOT"; break; + case RS_BUTTON_CAMERA: rs_string = "RS_BUTTON_CAMERA"; break; + case RS_BUTTON_MOVEMENT: rs_string = "RS_BUTTON_MOVEMENT"; break; + case RS_BUTTON_GESTURES: rs_string = "RS_BUTTON_GESTURES"; break; + case RS_BUTTON_SPEAK: rs_string = "RS_BUTTON_SPEAK"; break; + case RS_IM_WELL: rs_string = "RS_IM_WELL"; break; + case RS_NOTIFICATION_WELL: rs_string = "RS_NOTIFICATION_WELL"; break; + case RS_BUTTON_BUILD: rs_string = "RS_BUTTON_BUILD"; break; + case RS_BUTTON_SEARCH: rs_string = "RS_BUTTON_SEARCH"; break; + case RS_BUTTON_WORLD_MAP: rs_string = "RS_BUTTON_WORLD_MAP"; break; + case RS_BUTTON_MINI_MAP: rs_string = "RS_BUTTON_MINI_MAP"; break; + case RS_BUTTON_DESTINATIONS: rs_string = "RS_BUTTON_DESTINATIONS"; break; + case RS_BUTTON_AVATARS: rs_string = "RS_BUTTON_AVATARS"; break; + case RS_BUTTON_PEOPLE: rs_string = "RS_BUTTON_PEOPLE"; break; + case RS_BUTTON_PROFILE: rs_string = "RS_BUTTON_PROFILE"; break; + case RS_BUTTON_HOWTO: rs_string = "RS_BUTTON_HOWTO"; break; + case RS_BUTTON_SPLITTER_1: rs_string = "RS_BUTTON_SPLITTER_1"; break; + case RS_BUTTON_SPLITTER_2: rs_string = "RS_BUTTON_SPLITTER_2"; break; + case RS_BUTTONS_CAN_BE_HIDDEN: rs_string = "RS_BUTTONS_CAN_BE_HIDDEN"; break; + // No default to track additions. + } + + return rs_string; +} + +// static +std::string LLBottomTray::resizeStateMaskToString(MASK mask) +{ + std::string res; + + bool add_delimiter = false; + for (U32 i = 0; i < 16; i++) + { + EResizeState state = (EResizeState) (1 << i); + if (mask & state) + { + if (!add_delimiter) + { + add_delimiter = true; + } + else + { + res += ", "; + } + + res += resizeStateToString(state); + } + } + + if (res.empty()) + { + res = resizeStateToString(RS_NORESIZE); + } + + res += llformat(" (0x%X)", mask); + return res; +} + +bool LLBottomTray::isAutoHidden(MASK button_types) const +{ + return (mResizeState & button_types) != 0; +} + +void LLBottomTray::setAutoHidden(MASK button_types, bool hide) +{ + if (hide) + { + mResizeState |= button_types; + } + else + { + mResizeState &= ~button_types; + } } //EOF diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 04e5f5e9e0..d9c95d82e5 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -112,10 +112,6 @@ public: void showBottomTrayContextMenu(S32 x, S32 y, MASK mask); - void showGestureButton(BOOL visible); - void showMoveButton(BOOL visible); - void showCameraButton(BOOL visible); - void showSnapshotButton(BOOL visible); void showSpeakButton(bool visible); void toggleMovementControls(); @@ -144,22 +140,29 @@ public: private: - typedef enum e_resize_status_type + typedef enum e_resize_state { - RS_NORESIZE = 0x0000 - , RS_CHICLET_PANEL = 0x0001 - , RS_CHATBAR_INPUT = 0x0002 - , RS_BUTTON_SNAPSHOT = 0x0004 - , RS_BUTTON_CAMERA = 0x0008 - , RS_BUTTON_MOVEMENT = 0x0010 - , RS_BUTTON_GESTURES = 0x0020 - , RS_BUTTON_SPEAK = 0x0040 - , RS_IM_WELL = 0x0080 - , RS_NOTIFICATION_WELL = 0x0100 - , RS_BUTTON_BUILD = 0x0200 - , RS_BUTTON_SEARCH = 0x0400 - , RS_BUTTON_WORLD_MAP = 0x0800 - , RS_BUTTON_MINI_MAP = 0x1000 + RS_NORESIZE = 0x0000, + RS_CHICLET_PANEL = 0x0001, + RS_CHATBAR_INPUT = 0x0002, + RS_BUTTON_SNAPSHOT = 0x0004, + RS_BUTTON_CAMERA = 0x0008, + RS_BUTTON_MOVEMENT = 0x0010, + RS_BUTTON_GESTURES = 0x0020, + RS_BUTTON_SPEAK = 0x0040, + RS_IM_WELL = 0x0080, + RS_NOTIFICATION_WELL = 0x0100, + RS_BUTTON_BUILD = 0x0200, + RS_BUTTON_SEARCH = 0x0400, + RS_BUTTON_WORLD_MAP = 0x0800, + RS_BUTTON_MINI_MAP = 0x1000, + RS_BUTTON_DESTINATIONS = 0x2000, + RS_BUTTON_AVATARS = 0x4000, + RS_BUTTON_PEOPLE = 0x8000, + RS_BUTTON_PROFILE = 0x10000, + RS_BUTTON_HOWTO = 0x20000, + RS_BUTTON_SPLITTER_1 = 0x40000, + RS_BUTTON_SPLITTER_2 = 0x80000, /* Once new button that can be hidden on resize is added don't forget to update related places: @@ -170,10 +173,11 @@ private: /** * Specifies buttons which can be hidden when bottom tray is shrunk. * They are: Gestures, Movement (Move), Camera (View), Snapshot - * new: Build, Search, Map, World Map, Mini-Map. + * new: Build, Search, Map, World Map, Mini-Map, destinations, avatars */ - , RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES + RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES | RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP + | RS_BUTTON_DESTINATIONS | RS_BUTTON_AVATARS }EResizeState; // Below are three methods that were introduced to handle drag'n'drop @@ -240,8 +244,9 @@ private: * * @params[in, out] available_width - reference to available width to be used to show buttons. * @see processShowButton() + * @return consumed pixels (difference in available width). */ - void processShowButtons(S32& available_width); + S32 processShowButtons(S32& available_width); /** * Tries to show panel with specified button using available width. @@ -317,6 +322,20 @@ private: void processExtendButtons(S32& available_width); /** + * Extends the Speak button if there is anough headroom. + * + * Unlike other buttons, the Speak buttons has only two possible widths: + * the minimal one (without label) and the maximal (default) one. + * + * If the button is at its minimum width there is not enough headroom to + * reshape it to the maximum width, the method does nothing. + * + * @param available_width Available headroom. + * @return false if the button requires extension but there's not enough headroom, true otherwise. + */ + bool processExtendSpeakButton(S32& available_width); + + /** * Extends shown button to increase total taken space. * * @params[in] processed_object_type - type of button to be extended. @@ -365,6 +384,16 @@ private: static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility); /** + * Show the button if there is enough space. + * + * @param[in] button_type - type of button to be shown. + * @param[in, out] available_width amount of available space on the bottom bar. + * + * @return true if button was shown, false that's not possible (not enough space, etc) + */ + bool showButton(EResizeState button_type, S32& available_width); + + /** * Sets passed visibility to object specified by resize type. */ void setTrayButtonVisible(EResizeState shown_object_type, bool visible); @@ -417,9 +446,27 @@ private: */ void processChatbarCustomization(S32 new_width); + /** + * @return difference between current chiclet panel width and the minimum. + */ + S32 getChicletPanelShrinkHeadroom() const; + /// Get button name for debugging. static std::string resizeStateToString(EResizeState state); + /// Dump a mask for debugging + static std::string resizeStateMaskToString(MASK mask); + + /// @return true if any of the the passed buttons have been auto-hidden due to lack of available space. + bool isAutoHidden(MASK button_types) const; + + /** + * (Un)Mark the buttons as hidden. + * + * Auto-hidden buttons are those that re-appear as soon as we have enough available space. + */ + void setAutoHidden(MASK button_types, bool hide); + /// Buttons automatically hidden due to lack of space. MASK mResizeState; diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp index 7c205a8b9f..9a8cd5ceae 100644 --- a/indra/newview/llbreastmotion.cpp +++ b/indra/newview/llbreastmotion.cpp @@ -2,31 +2,25 @@ * @file llbreastmotion.cpp * @brief Implementation of LLBreastMotion class. * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * 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. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * 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 * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ diff --git a/indra/newview/llbreastmotion.h b/indra/newview/llbreastmotion.h index 8578d4ad1a..aa0fdf9f8b 100644 --- a/indra/newview/llbreastmotion.h +++ b/indra/newview/llbreastmotion.h @@ -2,31 +2,25 @@ * @file llbreastmotion.h * @brief Implementation of LLBreastMotion class. * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * 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. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * 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 * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 885d553524..3000209aad 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -483,8 +483,9 @@ void LLIMChiclet::setShowSpeaker(bool show) if(needs_resize) { mShowSpeaker = show; - toggleSpeakerControl(); } + + toggleSpeakerControl(); } void LLIMChiclet::enableCounterControl(bool enable) @@ -1183,6 +1184,10 @@ void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id) if(chiclet) { chiclet->setShowSpeaker(true); + if (gSavedSettings.getBOOL("OpenIMOnVoice")) + { + LLIMFloater::show(chiclet->getSessionId()); + } } } diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp index 5744d055a9..586f45fd8f 100644 --- a/indra/newview/llcommanddispatcherlistener.cpp +++ b/indra/newview/llcommanddispatcherlistener.cpp @@ -65,7 +65,7 @@ void LLCommandDispatcherListener::dispatch(const LLSD& params) const trusted_browser = params["trusted"].asBoolean(); } LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL, - trusted_browser); + "clicked", trusted_browser); } void LLCommandDispatcherListener::enumerate(const LLSD& params) const diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp index 1b6ba02aac..19dba3f917 100644 --- a/indra/newview/llcommandhandler.cpp +++ b/indra/newview/llcommandhandler.cpp @@ -35,7 +35,7 @@ // system includes #include <boost/tokenizer.hpp> -#define THROTTLE_PERIOD 5 // required secs between throttled commands +#define THROTTLE_PERIOD 5 // required seconds between throttled commands static LLCommandDispatcherListener sCommandDispatcherListener; @@ -59,6 +59,7 @@ public: const LLSD& params, const LLSD& query_map, LLMediaCtrl* web, + const std::string& nav_type, bool trusted_browser); private: @@ -91,6 +92,7 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, const LLSD& params, const LLSD& query_map, LLMediaCtrl* web, + const std::string& nav_type, bool trusted_browser) { static bool slurl_blocked = false; @@ -120,11 +122,19 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, return true; case LLCommandHandler::UNTRUSTED_THROTTLE: + // if users actually click on a link, we don't need to throttle it + // (throttling mechanism is used to prevent an avalanche of clicks via + // javascript + if ( nav_type == "clicked" ) + { + break; + } + cur_time = LLTimer::getElapsedSeconds(); if (cur_time < last_throttle_time + THROTTLE_PERIOD) { // block request from external browser if it happened - // within THROTTLE_PERIOD secs of the last command + // within THROTTLE_PERIOD seconds of the last command LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL; if (! slurl_throttled) { @@ -166,10 +176,11 @@ bool LLCommandDispatcher::dispatch(const std::string& cmd, const LLSD& params, const LLSD& query_map, LLMediaCtrl* web, + const std::string& nav_type, bool trusted_browser) { return LLCommandHandlerRegistry::instance().dispatch( - cmd, params, query_map, web, trusted_browser); + cmd, params, query_map, web, nav_type, trusted_browser); } static std::string lookup(LLCommandHandler::EUntrustedAccess value); diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h index 1e65b6de23..1e0895565a 100644 --- a/indra/newview/llcommandhandler.h +++ b/indra/newview/llcommandhandler.h @@ -95,6 +95,7 @@ public: const LLSD& params, const LLSD& query_map, LLMediaCtrl* web, + const std::string& nav_type, bool trusted_browser); // Execute a command registered via the above mechanism, // passing string parameters. diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index fcc73a07bc..18ae6107e7 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -32,9 +32,9 @@ #include "llui.h" static S32 DAYS_PER_MONTH_NOLEAP[] = - { 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static S32 DAYS_PER_MONTH_LEAP[] = - { 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static S32 days_from_month(S32 year, S32 month) { diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 5e10f60aba..5501b8c2ac 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -123,10 +123,7 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle { LLTextEditor::reshape(width, height, called_from_parent); - if (getTextPixelHeight() > getRect().getHeight()) - { - showExpandText(); - } + hideOrShowExpandTextAsNeeded(); } void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params) @@ -136,17 +133,7 @@ void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,cons mExpanderVisible = false; LLTextEditor::setText(text, input_params); - // text contents have changed, segments are cleared out - // so hide the expander and determine if we need it - //mExpanderVisible = false; - if (getTextPixelHeight() > getRect().getHeight()) - { - showExpandText(); - } - else - { - hideExpandText(); - } + hideOrShowExpandTextAsNeeded(); } @@ -200,6 +187,22 @@ S32 LLExpandableTextBox::LLTextBoxEx::getTextPixelHeight() return getTextBoundingRect().getHeight(); } +void LLExpandableTextBox::LLTextBoxEx::hideOrShowExpandTextAsNeeded() +{ + // Restore the text box contents to calculate the text height properly, + // otherwise if a part of the text is hidden under "More" link + // getTextPixelHeight() returns only the height of currently visible text + // including the "More" link. See STORM-250. + hideExpandText(); + + // Show the expander a.k.a. "More" link if we need it, depending on text + // contents height. If not, keep it hidden. + if (getTextPixelHeight() > getRect().getHeight()) + { + showExpandText(); + } +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index bce77225c4..f75ef954ff 100644 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -77,6 +77,12 @@ protected: */ void hideExpandText(); + /** + * Shows the "More" link if the text is too high to be completely + * visible without expanding the text box. Hides that link otherwise. + */ + void hideOrShowExpandTextAsNeeded(); + protected: LLTextBoxEx(const Params& p); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index d63685e1af..2c4153688a 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -121,7 +121,11 @@ void LLFirstUse::notMoving(bool enable) { // fire off 2 notifications and rely on filtering to select the relevant one firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); - firstUseNotification("FirstNotMoving", enable, "HintMoveArrows", LLSD(), LLSD().with("target", "bottom_tray").with("direction", "top").with("hint_image", "arrow_keys.png").with("down_arrow", "")); + firstUseNotification("FirstNotMoving", enable, "HintMoveClick", LLSD(), LLSD() + .with("target", "nav_bar") + .with("direction", "bottom") + .with("hint_image", "click_to_move.png") + .with("up_arrow", "")); } // static diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp index 61cf4dad93..eeb81085bb 100644 --- a/indra/newview/llfloaterbump.cpp +++ b/indra/newview/llfloaterbump.cpp @@ -38,13 +38,11 @@ ///---------------------------------------------------------------------------- /// Class LLFloaterBump ///---------------------------------------------------------------------------- -extern BOOL gNoRender; // Default constructor LLFloaterBump::LLFloaterBump(const LLSD& key) : LLFloater(key) { - if(gNoRender) return; } diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index c2c2e7fe22..2679dbb78b 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -413,8 +413,9 @@ LLColor4 get_text_color(const LLChat& chat) if (!chat.mPosAgent.isExactlyZero()) { LLVector3 pos_agent = gAgent.getPositionAgent(); - F32 distance = dist_vec(pos_agent, chat.mPosAgent); - if (distance > gAgent.getNearChatRadius()) + F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent); + F32 dist_near_chat = gAgent.getNearChatRadius(); + if (distance_squared > dist_near_chat * dist_near_chat) { // diminish far-off chat text_color.mV[VALPHA] = 0.8f; diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp index a650886d89..627defd006 100644 --- a/indra/newview/llfloaterhelpbrowser.cpp +++ b/indra/newview/llfloaterhelpbrowser.cpp @@ -50,6 +50,7 @@ BOOL LLFloaterHelpBrowser::postBuild() { mBrowser = getChild<LLMediaCtrl>("browser"); mBrowser->addObserver(this); + mBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); childSetAction("open_browser", onClickOpenWebBrowser, this); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index c7fbdd5745..d76e7885bc 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -325,122 +325,51 @@ void LLFloaterImagePreview::draw() bool LLFloaterImagePreview::loadImage(const std::string& src_filename) { std::string exten = gDirUtilp->getExtension(src_filename); - - U32 codec = IMG_CODEC_INVALID; - std::string temp_str; - if( exten == "bmp") - { - codec = IMG_CODEC_BMP; - } - else if( exten == "tga") - { - codec = IMG_CODEC_TGA; - } - else if( exten == "jpg" || exten == "jpeg") - { - codec = IMG_CODEC_JPEG; - } - else if( exten == "png" ) - { - codec = IMG_CODEC_PNG; - } + U32 codec = LLImageBase::getCodecFromExtension(exten); LLImageDimensionsInfo image_info; - if(!image_info.load(src_filename,codec)) + if (!image_info.load(src_filename,codec)) { mImageLoadError = image_info.getLastError(); return false; } S32 max_width = gSavedSettings.getS32("max_texture_dimension_X"); - S32 max_heigh = gSavedSettings.getS32("max_texture_dimension_Y"); + S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y"); - if(image_info.getWidth() > max_width|| image_info.getHeight() > max_heigh) + if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height)) { LLStringUtil::format_map_t args; args["WIDTH"] = llformat("%d", max_width); - args["HEIGHT"] = llformat("%d", max_heigh); + args["HEIGHT"] = llformat("%d", max_height); mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args); return false; } - + // Load the image + LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec); + if (image.isNull()) + { + return false; + } + if (!image->load(src_filename)) + { + return false; + } + // Decompress or expand it in a raw image structure LLPointer<LLImageRaw> raw_image = new LLImageRaw; - - switch (codec) + if (!image->decode(raw_image, 0.0f)) { - case IMG_CODEC_BMP: - { - LLPointer<LLImageBMP> bmp_image = new LLImageBMP; - - if (!bmp_image->load(src_filename)) - { - return false; - } - - if (!bmp_image->decode(raw_image, 0.0f)) - { - return false; - } - } - break; - case IMG_CODEC_TGA: - { - LLPointer<LLImageTGA> tga_image = new LLImageTGA; - - if (!tga_image->load(src_filename)) - { - return false; - } - - if (!tga_image->decode(raw_image)) - { - return false; - } - - if( (tga_image->getComponents() != 3) && - (tga_image->getComponents() != 4) ) - { - tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." ); - return false; - } - } - break; - case IMG_CODEC_JPEG: - { - LLPointer<LLImageJPEG> jpeg_image = new LLImageJPEG; - - if (!jpeg_image->load(src_filename)) - { - return false; - } - - if (!jpeg_image->decode(raw_image, 0.0f)) - { - return false; - } - } - break; - case IMG_CODEC_PNG: - { - LLPointer<LLImagePNG> png_image = new LLImagePNG; - - if (!png_image->load(src_filename)) - { - return false; - } - - if (!png_image->decode(raw_image, 0.0f)) - { - return false; - } - } - break; - default: return false; } - + // Check the image constraints + if ((image->getComponents() != 3) && (image->getComponents() != 4)) + { + image->setLastError("Image files with less than 3 or more than 4 components are not supported."); + return false; + } + raw_image->biasedScaleToPowerOfTwo(1024); mRawImagep = raw_image; diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index ffbb0efad3..c7fce83b03 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -43,6 +43,7 @@ #include "llcombobox.h" #include "llcommandhandler.h" #include "lldirpicker.h" +#include "lleventtimer.h" #include "llfeaturemanager.h" #include "llfocusmgr.h" //#include "llfirstuse.h" @@ -73,6 +74,7 @@ #include "llviewerwindow.h" #include "llviewermessage.h" #include "llviewershadermgr.h" +#include "llviewerthrottle.h" #include "llvotree.h" #include "llvosky.h" @@ -109,6 +111,7 @@ const F32 MAX_USER_FAR_CLIP = 512.f; const F32 MIN_USER_FAR_CLIP = 64.f; +const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f; //control value for middle mouse as talk2push button const static std::string MIDDLE_MOUSE_CV = "MiddleMouse"; @@ -285,8 +288,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mGotPersonalInfo(false), mOriginalIMViaEmail(false), mLanguageChanged(false), - mDoubleClickActionDirty(false), - mFavoritesRecordMayExist(false) + mAvatarDataInitialized(false), + mDoubleClickActionDirty(false) { //Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); @@ -343,7 +346,7 @@ void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType t if ( APT_PROPERTIES == type ) { const LLAvatarData* pAvatarData = static_cast<const LLAvatarData*>( pData ); - if( pAvatarData && gAgent.getID() == pAvatarData->avatar_id ) + if (pAvatarData && (gAgent.getID() == pAvatarData->avatar_id) && (pAvatarData->avatar_id != LLUUID::null)) { storeAvatarProperties( pAvatarData ); processProfileProperties( pAvatarData ); @@ -353,14 +356,19 @@ void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType t void LLFloaterPreference::storeAvatarProperties( const LLAvatarData* pAvatarData ) { - mAvatarProperties.avatar_id = gAgent.getID(); - mAvatarProperties.image_id = pAvatarData->image_id; - mAvatarProperties.fl_image_id = pAvatarData->fl_image_id; - mAvatarProperties.about_text = pAvatarData->about_text; - mAvatarProperties.fl_about_text = pAvatarData->fl_about_text; - mAvatarProperties.profile_url = pAvatarData->profile_url; - mAvatarProperties.flags = pAvatarData->flags; - mAvatarProperties.allow_publish = pAvatarData->flags & AVATAR_ALLOW_PUBLISH; + if (LLStartUp::getStartupState() == STATE_STARTED) + { + mAvatarProperties.avatar_id = pAvatarData->avatar_id; + mAvatarProperties.image_id = pAvatarData->image_id; + mAvatarProperties.fl_image_id = pAvatarData->fl_image_id; + mAvatarProperties.about_text = pAvatarData->about_text; + mAvatarProperties.fl_about_text = pAvatarData->fl_about_text; + mAvatarProperties.profile_url = pAvatarData->profile_url; + mAvatarProperties.flags = pAvatarData->flags; + mAvatarProperties.allow_publish = pAvatarData->flags & AVATAR_ALLOW_PUBLISH; + + mAvatarDataInitialized = true; + } } void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarData ) @@ -370,15 +378,31 @@ void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarDa void LLFloaterPreference::saveAvatarProperties( void ) { - mAvatarProperties.allow_publish = getChild<LLUICtrl>("online_searchresults")->getValue(); - if ( mAvatarProperties.allow_publish ) + const BOOL allowPublish = getChild<LLUICtrl>("online_searchresults")->getValue(); + + if (allowPublish) { mAvatarProperties.flags |= AVATAR_ALLOW_PUBLISH; } - - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties ); -} + // + // NOTE: We really don't want to send the avatar properties unless we absolutely + // need to so we can avoid the accidental profile reset bug, so, if we're + // logged in, the avatar data has been initialized and we have a state change + // for the "allow publish" flag, then set the flag to its new value and send + // the properties update. + // + // NOTE: The only reason we can not remove this update altogether is because of the + // "allow publish" flag, the last remaining profile setting in the viewer + // that doesn't exist in the web profile. + // + if ((LLStartUp::getStartupState() == STATE_STARTED) && mAvatarDataInitialized && (allowPublish != mAvatarProperties.allow_publish)) + { + mAvatarProperties.allow_publish = allowPublish; + + LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties ); + } +} BOOL LLFloaterPreference::postBuild() { @@ -390,6 +414,8 @@ BOOL LLFloaterPreference::postBuild() gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2)); + gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged)); + gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2)); LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); @@ -543,34 +569,6 @@ void LLFloaterPreference::apply() updateDoubleClickSettings(); mDoubleClickActionDirty = false; } - - if (mFavoritesRecordMayExist && !gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin")) - { - removeFavoritesRecordOfUser(); - } -} - -void LLFloaterPreference::removeFavoritesRecordOfUser() -{ - mFavoritesRecordMayExist = false; - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); - LLSD fav_llsd; - llifstream file; - file.open(filename); - if (!file.is_open()) return; - LLSDSerialize::fromXML(fav_llsd, file); - - LLAvatarName av_name; - LLAvatarNameCache::get( gAgentID, &av_name ); - if (fav_llsd.has(av_name.getLegacyName())) - { - fav_llsd.erase(av_name.getLegacyName()); - } - - llofstream out_file; - out_file.open(filename); - LLSDSerialize::toPrettyXML(fav_llsd, out_file); - } void LLFloaterPreference::cancel() @@ -656,11 +654,6 @@ void LLFloaterPreference::onOpen(const LLSD& key) getChildView("maturity_desired_combobox")->setVisible( false); } - if (LLStartUp::getStartupState() == STATE_STARTED) - { - mFavoritesRecordMayExist = gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"); - } - // Forget previous language changes. mLanguageChanged = false; @@ -1355,6 +1348,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im mOriginalHideOnlineStatus = true; } + getChild<LLUICtrl>("online_searchresults")->setEnabled(TRUE); + getChildView("include_im_in_chat_history")->setEnabled(TRUE); getChildView("show_timestamps_check_im")->setEnabled(TRUE); getChildView("friends_online_notify_checkbox")->setEnabled(TRUE); @@ -1534,10 +1529,56 @@ void LLFloaterPreference::setCacheLocation(const LLStringExplicit& location) cache_location_editor->setToolTip(location); } +//------------------------------Updater--------------------------------------- + +static bool handleBandwidthChanged(const LLSD& newvalue) +{ + gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal()); + return true; +} + +class LLPanelPreference::Updater : public LLEventTimer +{ + +public: + + typedef boost::function<bool(const LLSD&)> callback_t; + + Updater(callback_t cb, F32 period) + :LLEventTimer(period), + mCallback(cb) + { + mEventTimer.stop(); + } + + virtual ~Updater(){} + + void update(const LLSD& new_value) + { + mNewValue = new_value; + mEventTimer.start(); + } + +protected: + + BOOL tick() + { + mCallback(mNewValue); + mEventTimer.stop(); + + return FALSE; + } + +private: + + LLSD mNewValue; + callback_t mCallback; +}; //---------------------------------------------------------------------------- static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference"); LLPanelPreference::LLPanelPreference() -: LLPanel() +: LLPanel(), + mBandWidthUpdater(NULL) { mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2)); mCommitCallbackRegistrar.add("Pref.updateMediaAutoPlayCheckbox", boost::bind(&LLPanelPreference::updateMediaAutoPlayCheckbox, this, _1)); @@ -1607,10 +1648,24 @@ BOOL LLPanelPreference::postBuild() } } + //////////////////////PanelSetup /////////////////// + if (hasChild("max_bandwidth")) + { + mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), BANDWIDTH_UPDATER_TIMEOUT); + gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2)); + } + apply(); return true; } +LLPanelPreference::~LLPanelPreference() +{ + if (mBandWidthUpdater) + { + delete mBandWidthUpdater; + } +} void LLPanelPreference::apply() { // no-op @@ -1734,7 +1789,6 @@ void LLPanelPreferenceGraphics::draw() bool enable = hasDirtyChilds(); button_apply->setEnabled(enable); - } } bool LLPanelPreferenceGraphics::hasDirtyChilds() diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 46014804ec..5fe509fb37 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -159,8 +159,6 @@ public: void buildPopupLists(); static void refreshSkin(void* data); - // Remove record of current user's favorites from file on disk. - void removeFavoritesRecordOfUser(); private: static std::string sSkin; // set true if state of double-click action checkbox or radio-group was changed by user @@ -169,10 +167,9 @@ private: bool mGotPersonalInfo; bool mOriginalIMViaEmail; bool mLanguageChanged; + bool mAvatarDataInitialized; bool mOriginalHideOnlineStatus; - // Record of current user's favorites may be stored in file on disk. - bool mFavoritesRecordMayExist; std::string mDirectoryVisibility; LLAvatarData mAvatarProperties; @@ -184,6 +181,8 @@ public: LLPanelPreference(); /*virtual*/ BOOL postBuild(); + virtual ~LLPanelPreference(); + virtual void apply(); virtual void cancel(); void setControlFalse(const LLSD& user_data); @@ -197,6 +196,7 @@ public: // cancel() can restore them. virtual void saveSettings(); + class Updater; private: //for "Only friends and groups can call or IM me" static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&); @@ -208,6 +208,8 @@ private: typedef std::map<std::string, LLColor4> string_color_map_t; string_color_map_t mSavedColors; + + Updater* mBandWidthUpdater; }; class LLPanelPreferenceGraphics : public LLPanelPreference diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 2041fac8d8..d5806e375c 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -31,6 +31,7 @@ #include "llfloaterreg.h" #include "llfloatersearch.h" #include "llmediactrl.h" +#include "llnotificationsutil.h" #include "lllogininstance.h" #include "lluri.h" #include "llagent.h" @@ -46,6 +47,12 @@ public: LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_THROTTLE) { } bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) { + if (!LLUI::sSettingGroups["config"]->getBOOL("EnableSearch")) + { + LLNotificationsUtil::add("NoSearch", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + const size_t parts = tokens.size(); // get the (optional) category for the search diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp index 94407e6da0..9f15e62d84 100644 --- a/indra/newview/llfloatersidetraytab.cpp +++ b/indra/newview/llfloatersidetraytab.cpp @@ -47,5 +47,6 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab() void LLFloaterSideTrayTab::onClose(bool app_quitting) { - LLSideTray::getInstance()->setTabDocked(getName(), true); + // The floater is already being closed, so don't toggle it once more (that may crash viewer). + LLSideTray::getInstance()->setTabDocked(getName(), /* dock = */ true, /* toggle_floater = */ false); } diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp new file mode 100644 index 0000000000..3903b9b015 --- /dev/null +++ b/indra/newview/llfloatersounddevices.cpp @@ -0,0 +1,90 @@ +/** + * @file llfloatersounddevices.cpp + * @author Leyla Farazha + * @brief Sound Preferences used for minimal skin + * +* $LicenseInfo:firstyear=2011&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 "llfloatersounddevices.h" + +#include "llbottomtray.h" +#include "lldraghandle.h" + +#include "llpanelvoicedevicesettings.h" + +// Library includes +#include "indra_constants.h" + +// protected +LLFloaterSoundDevices::LLFloaterSoundDevices(const LLSD& key) +: LLTransientDockableFloater(NULL, false, key) +{ + LLTransientFloaterMgr::getInstance()->addControlView(this); + + // force docked state since this floater doesn't save it between recreations + setDocked(true); +} + +LLFloaterSoundDevices::~LLFloaterSoundDevices() +{ + LLTransientFloaterMgr::getInstance()->removeControlView(this); +} + +// virtual +BOOL LLFloaterSoundDevices::postBuild() +{ + LLTransientDockableFloater::postBuild(); + + LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn"); + setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP)); + + setIsChrome(TRUE); + if (mDragHandle) + mDragHandle->setTitleVisible(TRUE); + updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) + + LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel"); + if (panel) + { + panel->setUseTuningMode(false); + } + return TRUE; +} + +//virtual +void LLFloaterSoundDevices::setDocked(bool docked, bool pop_on_undock/* = true*/) +{ + LLTransientDockableFloater::setDocked(docked, pop_on_undock); +} + +// virtual +void LLFloaterSoundDevices::setFocus( BOOL b ) +{ + LLTransientDockableFloater::setFocus(b); + + // Force using active floater transparency + // We have to override setFocus() for because selecting an item of the + // combobox causes the floater to lose focus and thus become transparent. + updateTransparency(TT_ACTIVE); +} diff --git a/indra/newview/llfloatersounddevices.h b/indra/newview/llfloatersounddevices.h new file mode 100644 index 0000000000..f09ee3b069 --- /dev/null +++ b/indra/newview/llfloatersounddevices.h @@ -0,0 +1,49 @@ +/** + * @file llfloatersounddevices.h + * @author Leyla Farazha + * @brief Sound Preferences used for minimal skin + * +* $LicenseInfo:firstyear=2011&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_LLFLOATERSOUNDDEVICES_H +#define LL_LLFLOATERSOUNDDEVICES_H + +#include "lltransientdockablefloater.h" + +class LLFloaterSoundDevices : public LLTransientDockableFloater +{ +public: + + LOG_CLASS(LLFloaterSoundDevices); + + LLFloaterSoundDevices(const LLSD& key); + ~LLFloaterSoundDevices(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true); + /*virtual*/ void setFocus( BOOL b ); +}; + + +#endif //LL_LLFLOATERSOUNDDEVICES_H + diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 03cf0332a9..f8a4ce7ad0 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -73,6 +73,7 @@ #include "llslider.h" #include "message.h" #include "llwindow.h" // copyTextToClipboard() +#include <algorithm> //--------------------------------------------------------------------------- // Constants @@ -85,6 +86,16 @@ static const F32 MAP_ZOOM_TIME = 0.2f; // Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window. static const S32 MAX_VISIBLE_REGIONS = 512; +// It would be more logical to have this inside the method where it is used but to compile under gcc this +// struct has to be here. +struct SortRegionNames +{ + inline bool operator ()(std::pair <U64, LLSimInfo*> const& _left, std::pair <U64, LLSimInfo*> const& _right) + { + return(LLStringUtil::compareInsensitive(_left.second->getName(), _right.second->getName()) < 0); + } +}; + enum EPanDirection { PAN_UP, @@ -1483,10 +1494,13 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) S32 name_length = mCompletingRegionName.length(); LLSD match; - + S32 num_results = 0; - std::map<U64, LLSimInfo*>::const_iterator it; - for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) + + std::vector<std::pair <U64, LLSimInfo*> > sim_info_vec(LLWorldMap::getInstance()->getRegionMap().begin(), LLWorldMap::getInstance()->getRegionMap().end()); + std::sort(sim_info_vec.begin(), sim_info_vec.end(), SortRegionNames()); + + for (std::vector<std::pair <U64, LLSimInfo*> >::const_iterator it = sim_info_vec.begin(); it != sim_info_vec.end(); ++it) { LLSimInfo* info = it->second; std::string sim_name_lower = info->getName(); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index b3b1ce5743..3884b94b60 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -301,18 +301,6 @@ BOOL LLFolderView::canFocusChildren() const return FALSE; } -void LLFolderView::checkTreeResortForModelChanged() -{ - if (mSortOrder & LLInventoryFilter::SO_DATE && !(mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME)) - { - // This is the case where something got added or removed. If we are date sorting - // everything including folders, then we need to rebuild the whole tree. - // Just set to something not SO_DATE to force the folder most resent date resort. - mSortOrder = mSortOrder & ~LLInventoryFilter::SO_DATE; - setSortOrder(mSortOrder | LLInventoryFilter::SO_DATE); - } -} - static LLFastTimer::DeclareTimer FTM_SORT("Sort Inventory"); void LLFolderView::setSortOrder(U32 order) diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 210ba9eb3c..1464a058d8 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -101,7 +101,6 @@ public: // FolderViews default to sort by name. This will change that, // and resort the items if necessary. void setSortOrder(U32 order); - void checkTreeResortForModelChanged(); void setFilterPermMask(PermissionMask filter_perm_mask); void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; } diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 3c36248c1f..e9d1ad3a9e 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -1835,7 +1835,7 @@ void LLFolderViewFolder::sortBy(U32 order) return; } - // Propegate this change to sub folders + // Propagate this change to sub folders for (folders_t::iterator iter = mFolders.begin(); iter != mFolders.end();) { diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index f658287fb1..2f9856c650 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -33,8 +33,10 @@ #include <algorithm> // library +#include "llaudioengine.h" #include "lldatapacker.h" #include "llinventory.h" +#include "llkeyframemotion.h" #include "llmultigesture.h" #include "llnotificationsutil.h" #include "llstl.h" @@ -526,6 +528,66 @@ void LLGestureMgr::playGesture(LLMultiGesture* gesture) gesture->mPlaying = TRUE; mPlaying.push_back(gesture); + // Load all needed assets to minimize the delays + // when gesture is playing. + for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin(); + steps_it != gesture->mSteps.end(); + ++steps_it) + { + LLGestureStep* step = *steps_it; + switch(step->getType()) + { + case STEP_ANIMATION: + { + LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step; + const LLUUID& anim_id = anim_step->mAnimAssetID; + + // Don't request the animation if this step stops it or if it is already in Static VFS + if (!(anim_id.isNull() + || anim_step->mFlags & ANIM_FLAG_STOP + || gAssetStorage->hasLocalAsset(anim_id, LLAssetType::AT_ANIMATION))) + { + mLoadingAssets.insert(anim_id); + + LLUUID* id = new LLUUID(gAgentID); + gAssetStorage->getAssetData(anim_id, + LLAssetType::AT_ANIMATION, + onAssetLoadComplete, + (void *)id, + TRUE); + } + break; + } + case STEP_SOUND: + { + LLGestureStepSound* sound_step = (LLGestureStepSound*)step; + const LLUUID& sound_id = sound_step->mSoundAssetID; + if (!(sound_id.isNull() + || gAssetStorage->hasLocalAsset(sound_id, LLAssetType::AT_SOUND))) + { + mLoadingAssets.insert(sound_id); + + gAssetStorage->getAssetData(sound_id, + LLAssetType::AT_SOUND, + onAssetLoadComplete, + NULL, + TRUE); + } + break; + } + case STEP_CHAT: + case STEP_WAIT: + case STEP_EOF: + { + break; + } + default: + { + llwarns << "Unknown gesture step type: " << step->getType() << llendl; + } + } + } + // And get it going stepGesture(gesture); @@ -741,7 +803,7 @@ void LLGestureMgr::stepGesture(LLMultiGesture* gesture) { return; } - if (!isAgentAvatarValid()) return; + if (!isAgentAvatarValid() || hasLoadingAssets(gesture)) return; // Of the ones that started playing, have any stopped? @@ -1091,6 +1153,98 @@ void LLGestureMgr::onLoadComplete(LLVFS *vfs, } } +// static +void LLGestureMgr::onAssetLoadComplete(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status) +{ + LLGestureMgr& self = LLGestureMgr::instance(); + + // Complete the asset loading process depending on the type and + // remove the asset id from pending downloads list. + switch(type) + { + case LLAssetType::AT_ANIMATION: + { + LLKeyframeMotion::onLoadComplete(vfs, asset_uuid, type, user_data, status, ext_status); + + self.mLoadingAssets.erase(asset_uuid); + + break; + } + case LLAssetType::AT_SOUND: + { + LLAudioEngine::assetCallback(vfs, asset_uuid, type, user_data, status, ext_status); + + self.mLoadingAssets.erase(asset_uuid); + + break; + } + default: + { + llwarns << "Unexpected asset type: " << type << llendl; + + // We don't want to return from this callback without + // an animation or sound callback being fired + // and *user_data handled to avoid memory leaks. + llassert(type == LLAssetType::AT_ANIMATION || type == LLAssetType::AT_SOUND); + } + } +} + +// static +bool LLGestureMgr::hasLoadingAssets(LLMultiGesture* gesture) +{ + LLGestureMgr& self = LLGestureMgr::instance(); + + for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin(); + steps_it != gesture->mSteps.end(); + ++steps_it) + { + LLGestureStep* step = *steps_it; + switch(step->getType()) + { + case STEP_ANIMATION: + { + LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step; + const LLUUID& anim_id = anim_step->mAnimAssetID; + + if (!(anim_id.isNull() + || anim_step->mFlags & ANIM_FLAG_STOP + || self.mLoadingAssets.find(anim_id) == self.mLoadingAssets.end())) + { + return true; + } + break; + } + case STEP_SOUND: + { + LLGestureStepSound* sound_step = (LLGestureStepSound*)step; + const LLUUID& sound_id = sound_step->mSoundAssetID; + + if (!(sound_id.isNull() + || self.mLoadingAssets.find(sound_id) == self.mLoadingAssets.end())) + { + return true; + } + break; + } + case STEP_CHAT: + case STEP_WAIT: + case STEP_EOF: + { + break; + } + default: + { + llwarns << "Unknown gesture step type: " << step->getType() << llendl; + } + } + } + + return false; +} void LLGestureMgr::stopGesture(LLMultiGesture* gesture) { diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index b9935efeb3..5930841cbc 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -154,9 +154,20 @@ protected: // Used by loadGesture static void onLoadComplete(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status); + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status); + + // Used by playGesture to load an asset file + // required to play a gesture step + static void onAssetLoadComplete(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status); + + // Checks whether all animation and sound assets + // needed to play a gesture are loaded. + static bool hasLoadingAssets(LLMultiGesture* gesture); private: // Active gestures. @@ -172,6 +183,8 @@ private: callback_map_t mCallbackMap; std::vector<LLMultiGesture*> mPlaying; BOOL mValid; + + std::set<LLUUID> mLoadingAssets; }; #endif diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index c4dcaf11f9..e15862e2a4 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -191,6 +191,8 @@ BOOL LLHintPopup::postBuild() LLRect text_bounds = hint_text.getTextBoundingRect(); S32 delta_height = text_bounds.getHeight() - hint_text.getRect().getHeight(); reshape(getRect().getWidth(), getRect().getHeight() + delta_height); + hint_text.reshape(hint_text.getRect().getWidth(), hint_text.getRect().getHeight() + delta_height); +// hint_text.translate(0, -delta_height); return TRUE; } @@ -211,6 +213,24 @@ void LLHintPopup::draw() alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeInTime, 0.f, 1.f); } + LLIconCtrl* hint_icon = findChild<LLIconCtrl>("hint_image"); + + if (hint_icon) + { + LLUIImagePtr hint_image = hint_icon->getImage(); + S32 image_height = hint_image.isNull() ? 0 : hint_image->getHeight(); + S32 image_width = hint_image.isNull() ? 0 : hint_image->getWidth(); + + LLView* layout_stack = hint_icon->getParent()->getParent(); + S32 delta_height = image_height - layout_stack->getRect().getHeight(); + hint_icon->getParent()->reshape(image_width, hint_icon->getParent()->getRect().getHeight()); + layout_stack->reshape(layout_stack->getRect().getWidth(), image_height); + layout_stack->translate(0, -delta_height); + + LLRect hint_rect = getLocalRect(); + reshape(hint_rect.getWidth(), hint_rect.getHeight() + delta_height); + } + { LLViewDrawContext context(alpha); if (mTarget.empty()) diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index 8cf7d23f88..b380b3fe20 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -56,7 +56,7 @@ const S32 PKT_SIZE = 57; // throttle const F32 MAX_SENDS_PER_SEC = 4.f; -const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f; +const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f; const F32 MIN_TARGET_OFFSET_SQUARED = 0.0001f; @@ -416,7 +416,7 @@ BOOL LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec BOOL lookAtChanged = (target_type != mTargetType) || (object != mTargetObject); // lookat position has moved a certain amount and we haven't just sent an update - lookAtChanged = lookAtChanged || ((dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) && + lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) && ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC))); if (lookAtChanged) @@ -587,11 +587,6 @@ void LLHUDEffectLookAt::update() */ bool LLHUDEffectLookAt::calcTargetPosition() { - if (gNoRender) - { - return false; - } - LLViewerObject *target_obj = (LLViewerObject *)mTargetObject; LLVector3 local_offset; diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp index bfb0f150b3..28fe8e1c01 100644 --- a/indra/newview/llhudeffectpointat.cpp +++ b/indra/newview/llhudeffectpointat.cpp @@ -48,7 +48,7 @@ const S32 PKT_SIZE = 57; // throttle const F32 MAX_SENDS_PER_SEC = 4.f; -const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f; +const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f; // timeouts // can't use actual F32_MAX, because we add this to the current frametime @@ -244,7 +244,7 @@ BOOL LLHUDEffectPointAt::setPointAt(EPointAtType target_type, LLViewerObject *ob BOOL targetTypeChanged = (target_type != mTargetType) || (object != mTargetObject); - BOOL targetPosChanged = (dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) && + BOOL targetPosChanged = (dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) && ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)); if (targetTypeChanged || targetPosChanged) diff --git a/indra/newview/llhudmanager.cpp b/indra/newview/llhudmanager.cpp index 5f3178b955..8f14b53db0 100644 --- a/indra/newview/llhudmanager.cpp +++ b/indra/newview/llhudmanager.cpp @@ -38,8 +38,6 @@ #include "llviewercontrol.h" #include "llviewerobjectlist.h" -extern BOOL gNoRender; - // These are loaded from saved settings. LLColor4 LLHUDManager::sParentColor; LLColor4 LLHUDManager::sChildColor; @@ -150,11 +148,6 @@ LLHUDEffect *LLHUDManager::createViewerEffect(const U8 type, BOOL send_to_sim, B //static void LLHUDManager::processViewerEffect(LLMessageSystem *mesgsys, void **user_data) { - if (gNoRender) - { - return; - } - LLHUDEffect *effectp = NULL; LLUUID effect_id; U8 effect_type = 0; diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index f74ae92a7b..50a9c56518 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -56,6 +56,7 @@ #include "llrootview.h" #include "llspeakers.h" #include "llsidetray.h" +#include "llviewerchat.h" static const S32 RECT_PADDING_NOT_INIT = -1; @@ -266,7 +267,9 @@ BOOL LLIMFloater::postBuild() mInputEditor->setMaxTextLength(1023); // enable line history support for instant message bar mInputEditor->setEnableLineHistory(TRUE); - + + LLFontGL* font = LLViewerChat::getChatFont(); + mInputEditor->setFont(font); mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) ); mInputEditor->setFocusLostCallback( boost::bind(onInputEditorFocusLost, _1, this) ); @@ -891,6 +894,7 @@ void LLIMFloater::updateChatHistoryStyle() void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue) { + LLFontGL* font = LLViewerChat::getChatFont(); LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel"); for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) @@ -899,6 +903,7 @@ void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue) if (floater) { floater->updateChatHistoryStyle(); + floater->mInputEditor->setFont(font); } } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 0ef502b81b..38c5ba71bd 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -2696,10 +2696,10 @@ void LLIMMgr::inviteToSession( if (voice_invite) { - if ( // if we're rejecting all incoming call requests - gSavedSettings.getBOOL("VoiceCallsRejectAll") + if ( // if we are rejecting group calls + (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && notify_box_type == "VoiceInviteGroup") || // or we're rejecting non-friend voice calls and this isn't a friend - || (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)) + (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)) ) { // silently decline the call @@ -3183,10 +3183,6 @@ public: //just like a normal IM //this is just replicated code from process_improved_im //and should really go in it's own function -jwolk - if (gNoRender) - { - return; - } LLChat chat; std::string message = message_params["message"].asString(); @@ -3263,11 +3259,6 @@ public: } //end if invitation has instant message else if ( input["body"].has("voice") ) { - if (gNoRender) - { - return; - } - if(!LLVoiceClient::getInstance()->voiceEnabled() || !LLVoiceClient::getInstance()->isVoiceWorking()) { // Don't display voice invites unless the user has voice enabled. diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index e22363c2f6..dee15a1efd 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -510,9 +510,15 @@ void LLInventoryFilter::setHoursAgo(U32 hours) { if (mFilterOps.mHoursAgo != hours) { + bool are_date_limits_valid = mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max(); + + bool is_increasing = hours > mFilterOps.mHoursAgo; + bool is_increasing_from_zero = is_increasing && !mFilterOps.mHoursAgo; + // *NOTE: need to cache last filter time, in case filter goes stale - BOOL less_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours > mFilterOps.mHoursAgo); - BOOL more_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours <= mFilterOps.mHoursAgo); + BOOL less_restrictive = (are_date_limits_valid && ((is_increasing && mFilterOps.mHoursAgo)) || !hours); + BOOL more_restrictive = (are_date_limits_valid && (!is_increasing && hours) || is_increasing_from_zero); + mFilterOps.mHoursAgo = hours; mFilterOps.mMinDate = time_min(); mFilterOps.mMaxDate = time_max(); diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index f488b2ed1b..39e6f797a2 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -66,10 +66,13 @@ public: FILTERLINK_ONLY_LINKS // only show links }; - // REFACTOR: Change this to an enum. - static const U32 SO_DATE = 1; - static const U32 SO_FOLDERS_BY_NAME = 2; - static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4; + enum ESortOrderType + { + SO_NAME = 0, // Sort inventory by name + SO_DATE = 0x1, // Sort inventory by date + SO_FOLDERS_BY_NAME = 0x1 << 1, // Force folder sort by name + SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2 // Force system folders to be on top + }; LLInventoryFilter(const std::string& name); virtual ~LLInventoryFilter(); diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 53835f0166..b1975c7261 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1059,12 +1059,11 @@ void LLInventoryModel::idleNotifyObservers() { return; } - notifyObservers(""); + notifyObservers(); } // Call this method when it's time to update everyone on a new state. -// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328] -void LLInventoryModel::notifyObservers(const std::string service_name) +void LLInventoryModel::notifyObservers() { if (mIsNotifyObservers) { @@ -1081,15 +1080,7 @@ void LLInventoryModel::notifyObservers(const std::string service_name) { LLInventoryObserver* observer = *iter; - if (service_name.empty()) - { - observer->changed(mModifyMask); - } - else - { - observer->mMessageName = service_name; - observer->changed(mModifyMask); - } + observer->changed(mModifyMask); // safe way to increment since changed may delete entries! (@!##%@!@&*!) iter = mObservers.upper_bound(observer); @@ -1187,7 +1178,7 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content) { changes |= gInventory.updateItem(*it); } - gInventory.notifyObservers("fetchinventory"); + gInventory.notifyObservers(); gViewerWindow->getWindow()->decBusyCount(); } @@ -1196,7 +1187,7 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str { llinfos << "fetchInventory::error " << status << ": " << reason << llendl; - gInventory.notifyObservers("fetchinventory"); + gInventory.notifyObservers(); } bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index f6728fd575..15da09990f 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -425,9 +425,8 @@ public: // has been indicated. void idleNotifyObservers(); - // Call to explicitly update everyone on a new state. The optional argument - // 'service_name' is used by Agent Inventory Service [DEV-20328] - void notifyObservers(const std::string service_name=""); + // Call to explicitly update everyone on a new state. + void notifyObservers(); // Allows outsiders to tell the inventory if something has // been changed 'under the hood', but outside the control of the diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index e31360fcbc..7b1ff102e7 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -388,7 +388,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content) titem->setParent(lost_uuid); titem->updateParentOnServer(FALSE); gInventory.updateItem(titem); - gInventory.notifyObservers("fetchDescendents"); + gInventory.notifyObservers(); } } @@ -464,7 +464,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content) fetcher->setAllFoldersFetched(); } - gInventory.notifyObservers("fetchDescendents"); + gInventory.notifyObservers(); } // If we get back an error (not found, etc...), handle it here. @@ -496,7 +496,7 @@ void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::str fetcher->setAllFoldersFetched(); } } - gInventory.notifyObservers("fetchDescendents"); + gInventory.notifyObservers(); } BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat_id) const diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 0fd4b2bee5..6bf19e346d 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -572,16 +572,7 @@ void LLInventoryAddedObserver::changed(U32 mask) // the network, figure out which item was updated. LLMessageSystem* msg = gMessageSystem; - std::string msg_name; - if (mMessageName.empty()) - { - msg_name = msg->getMessageName(); - } - else - { - msg_name = mMessageName; - } - + std::string msg_name = msg->getMessageName(); if (msg_name.empty()) { return; diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index f2a2049a51..2d9021961e 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -63,7 +63,6 @@ public: LLInventoryObserver(); virtual ~LLInventoryObserver(); virtual void changed(U32 mask) = 0; - std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328] }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 33e051bfab..36c5d12897 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -480,10 +480,12 @@ LLLoginInstance::LLLoginInstance() : { mLoginModule->getEventPump().listen("lllogininstance", boost::bind(&LLLoginInstance::handleLoginEvent, this, _1)); - mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1)); - mDispatcher.add("connect", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1)); - mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1)); - mDispatcher.add("indeterminate", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1)); + // This internal use of LLEventDispatcher doesn't really need + // per-function descriptions. + mDispatcher.add("fail.login", "", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1)); + mDispatcher.add("connect", "", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1)); + mDispatcher.add("disconnect", "", boost::bind(&LLLoginInstance::handleDisconnect, this, _1)); + mDispatcher.add("indeterminate", "", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1)); } LLLoginInstance::~LLLoginInstance() @@ -556,6 +558,18 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia requested_options.append("buddy-list"); requested_options.append("newuser-config"); requested_options.append("ui-config"); + + //send this info to login.cgi for stats gathering + //since viewerstats isn't reliable enough + if (gSavedSettings.getString("SessionSettingsFile").empty()) + { + requested_options.append("advanced-mode"); + } + else + { + requested_options.append("basic-mode"); + } + #endif requested_options.append("max-agent-groups"); requested_options.append("map-server-url"); @@ -625,11 +639,7 @@ bool LLLoginInstance::handleLoginEvent(const LLSD& event) // Call the method registered in constructor, if any, for more specific // handling - LLEventDispatcher::Callable method(mDispatcher.get(event["change"])); - if (! method.empty()) - { - method(event); - } + mDispatcher.try_call(event); return false; } diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index f1c7e952d1..6ee095475f 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -1127,7 +1127,7 @@ BOOL LLManipRotate::updateVisiblity() if (gSavedSettings.getBOOL("LimitSelectDistance")) { F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance"); - if (dist_vec(gAgent.getPositionAgent(), center) > max_select_distance) + if (dist_vec_squared(gAgent.getPositionAgent(), center) > (max_select_distance * max_select_distance)) { visible = FALSE; } diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 060677f9f3..9cdc092257 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -217,8 +217,6 @@ void LLManipScale::render() LLVector3 center_agent = gAgent.getPosAgentFromGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal()); - F32 range; - F32 range_from_agent; if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); @@ -226,25 +224,25 @@ void LLManipScale::render() } else { - range = dist_vec(gAgentCamera.getCameraPositionAgent(), center_agent); - range_from_agent = dist_vec(gAgent.getPositionAgent(), center_agent); + F32 range_squared = dist_vec_squared(gAgentCamera.getCameraPositionAgent(), center_agent); + F32 range_from_agent_squared = dist_vec_squared(gAgent.getPositionAgent(), center_agent); // Don't draw manip if object too far away if (gSavedSettings.getBOOL("LimitSelectDistance")) { F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance"); - if (range_from_agent > max_select_distance) + if (range_from_agent_squared > max_select_distance * max_select_distance) { return; } } - if (range > 0.001f) + if (range_squared > 0.001f * 0.001f) { // range != zero F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians - mBoxHandleSize = range * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR; + mBoxHandleSize = fsqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR; } else { diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 9493fddf50..b3ad9efeb2 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -44,6 +44,7 @@ #include "llslurl.h" #include "lluictrlfactory.h" // LLDefaultChildRegistry #include "llkeyboard.h" +#include "llviewermenu.h" // linden library includes #include "llfocusmgr.h" @@ -67,12 +68,12 @@ LLMediaCtrl::Params::Params() : start_url("start_url"), border_visible("border_visible", true), ignore_ui_scale("ignore_ui_scale", true), - hide_loading("hide_loading", false), decouple_texture_size("decouple_texture_size", false), texture_width("texture_width", 1024), texture_height("texture_height", 1024), caret_color("caret_color"), initial_mime_type("initial_mime_type"), + error_page_url("error_page_url"), media_id("media_id"), trusted_content("trusted_content", false), focus_on_click("focus_on_click", true) @@ -95,16 +96,16 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mCurrentNavUrl( "" ), mStretchToFill( true ), mMaintainAspectRatio ( true ), - mHideLoading (false), - mHidingInitialLoad (false), mDecoupleTextureSize ( false ), mTextureWidth ( 1024 ), mTextureHeight ( 1024 ), mClearCache(false), mHomePageMimeType(p.initial_mime_type), + mErrorPageURL(p.error_page_url), mTrusted(p.trusted_content), mWindowShade(NULL), - mHoverTextChanged(false) + mHoverTextChanged(false), + mContextMenu(NULL) { { LLColor4 color = p.caret_color().get(); @@ -117,8 +118,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : setBorderVisible(p.border_visible); - mHideLoading = p.hide_loading; - setDecoupleTextureSize(p.decouple_texture_size); setTextureSize(p.texture_width, p.texture_height); @@ -149,7 +148,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : LLMediaCtrl::~LLMediaCtrl() { - if (mMediaSource) { mMediaSource->remObserver( this ); @@ -304,10 +302,12 @@ BOOL LLMediaCtrl::handleRightMouseUp( S32 x, S32 y, MASK mask ) BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask ) { if (LLPanel::handleRightMouseDown(x, y, mask)) return TRUE; - convertInputCoords(x, y); + + S32 media_x = x, media_y = y; + convertInputCoords(media_x, media_y); if (mMediaSource) - mMediaSource->mouseDown(x, y, mask, 1); + mMediaSource->mouseDown(media_x, media_y, mask, 1); gFocusMgr.setMouseCapture( this ); @@ -316,6 +316,12 @@ BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask ) setFocus( TRUE ); } + if (mContextMenu) + { + mContextMenu->show(x, y); + LLMenuGL::showPopup(this, mContextMenu, x, y); + } + return TRUE; } @@ -378,6 +384,8 @@ void LLMediaCtrl::onFocusLost() // BOOL LLMediaCtrl::postBuild () { + mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>( + "menu_media_ctrl.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2)); return TRUE; } @@ -503,22 +511,6 @@ bool LLMediaCtrl::canNavigateForward() //////////////////////////////////////////////////////////////////////////////// // -void LLMediaCtrl::set404RedirectUrl( std::string redirect_url ) -{ - if(mMediaSource && mMediaSource->hasMedia()) - mMediaSource->getMediaPlugin()->set_status_redirect( 404, redirect_url ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLMediaCtrl::clr404RedirectUrl() -{ - if(mMediaSource && mMediaSource->hasMedia()) - mMediaSource->getMediaPlugin()->set_status_redirect(404, ""); -} - -//////////////////////////////////////////////////////////////////////////////// -// void LLMediaCtrl::clearCache() { if(mMediaSource) @@ -626,6 +618,16 @@ void LLMediaCtrl::setTarget(const std::string& target) } } +void LLMediaCtrl::setErrorPageURL(const std::string& url) +{ + mErrorPageURL = url; +} + +const std::string& LLMediaCtrl::getErrorPageURL() +{ + return mErrorPageURL; +} + //////////////////////////////////////////////////////////////////////////////// // bool LLMediaCtrl::setCaretColor(unsigned int red, unsigned int green, unsigned int blue) @@ -677,11 +679,6 @@ bool LLMediaCtrl::ensureMediaSourceExists() mMediaSource->clearCache(); mClearCache = false; } - - if(mHideLoading) - { - mHidingInitialLoad = true; - } } else { @@ -749,11 +746,11 @@ void LLMediaCtrl::draw() } } - if(mHidingInitialLoad) - { - // If we're hiding loading, don't draw at all. - draw_media = false; - } +// if(mHidingInitialLoad) +// { +// // If we're hiding loading, don't draw at all. +// draw_media = false; +// } bool background_visible = isBackgroundVisible(); bool background_opaque = isBackgroundOpaque(); @@ -976,6 +973,16 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) }; break; + case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE" << LL_ENDL; + if ( mErrorPageURL.length() > 0 ) + { + navigateTo(mErrorPageURL, "text/html"); + }; + }; + break; + case MEDIA_EVENT_CLICK_LINK_HREF: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL; diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 38a74f90d3..28666e620f 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -34,6 +34,7 @@ class LLViewBorder; class LLUICtrlFactory; +class LLContextMenu; //////////////////////////////////////////////////////////////////////////////// // @@ -63,6 +64,7 @@ public: Optional<std::string> initial_mime_type; Optional<std::string> media_id; + Optional<std::string> error_page_url; Params(); }; @@ -113,10 +115,9 @@ public: void setTarget(const std::string& target); - // set/clear URL to visit when a 404 page is reached - void set404RedirectUrl( std::string redirect_url ); - void clr404RedirectUrl(); - + void setErrorPageURL(const std::string& url); + const std::string& getErrorPageURL(); + // Clear the browser cache when the instance gets loaded void clearCache(); @@ -179,6 +180,7 @@ public: std::string mHomePageUrl; std::string mHomePageMimeType; std::string mCurrentNavUrl; + std::string mErrorPageURL; std::string mTarget; bool mIgnoreUIScale; bool mAlwaysRefresh; @@ -194,6 +196,7 @@ public: bool mClearCache; class LLWindowShade* mWindowShade; bool mHoverTextChanged; + LLContextMenu* mContextMenu; }; #endif // LL_LLMediaCtrl_H diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 3b160ddc8e..b8832dfd8e 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -57,6 +57,7 @@ #include "llviewercontrol.h" #include "llfloatermediabrowser.h" #include "llweb.h" +#include "llhints.h" #include "llinventorymodel.h" #include "lllandmarkactions.h" @@ -324,6 +325,8 @@ BOOL LLNavigationBar::postBuild() LLTeleportHistory::getInstance()->setHistoryChangedCallback( boost::bind(&LLNavigationBar::onTeleportHistoryChanged, this)); + LLHints::registerHintTarget("nav_bar", LLView::getHandle()); + return TRUE; } diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 572eeb8fc7..03ebc344f1 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -250,9 +250,13 @@ void LLNearbyChat::getAllowedRect(LLRect& rect) void LLNearbyChat::updateChatHistoryStyle() { mChatHistory->clear(); + + LLSD do_not_log; + do_not_log["do_not_log"] = true; for(std::vector<LLChat>::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it) { - addMessage(*it,false); + // Update the messages without re-writing them to a log file. + addMessage(*it,false, do_not_log); } } diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 162e465fef..d3fd959152 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -47,6 +47,7 @@ #include "llwindow.h" #include "llviewerwindow.h" #include "llrootview.h" +#include "llviewerchat.h" S32 LLNearbyChatBar::sLastSpecialChatChannel = 0; @@ -433,13 +434,26 @@ BOOL LLNearbyChatBar::postBuild() mChatBox->setPassDelete(TRUE); mChatBox->setReplaceNewlinesWithSpaces(FALSE); mChatBox->setEnableLineHistory(TRUE); + mChatBox->setFont(LLViewerChat::getChatFont()); mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator"); mOutputMonitor->setVisible(FALSE); + // Register for font change notifications + LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1)); + return TRUE; } +void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp) +{ + // Update things with the new font whohoo + if (mChatBox) + { + mChatBox->setFont(fontp); + } +} + //static LLNearbyChatBar* LLNearbyChatBar::getInstance() { diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 96ab45071b..efddec942f 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -127,6 +127,7 @@ protected: void sendChat( EChatType type ); void onChatBoxCommit(); + void onChatFontChange(LLFontGL* fontp); static LLWString stripChannelNumber(const LLWString &mesg, S32* channel); EChatType processChatTypeTriggers(EChatType type, std::string &str); diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 981b4dbee3..5fe5c9b1e8 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -330,8 +330,8 @@ void LLNetMap::draw() //localMouse(&local_mouse_x, &local_mouse_y); LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y); mClosestAgentToCursor.setNull(); - F32 closest_dist = F32_MAX; - F32 min_pick_dist = mDotRadius * MIN_PICK_SCALE; + F32 closest_dist_squared = F32_MAX; // value will be overridden in the loop + F32 min_pick_dist_squared = (mDotRadius * MIN_PICK_SCALE) * (mDotRadius * MIN_PICK_SCALE); // Draw avatars for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); @@ -410,11 +410,11 @@ void LLNetMap::draw() } } - F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), + F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y)); - if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist) + if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared) { - closest_dist = dist_to_cursor; + closest_dist_squared = dist_to_cursor_squared; mClosestAgentToCursor = regionp->mMapAvatarIDs.get(i); } } @@ -451,9 +451,9 @@ void LLNetMap::draw() dot_width, dot_width); - F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), + F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y)); - if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist) + if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared) { mClosestAgentToCursor = gAgent.getID(); } diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 903cf4780d..4ac3a248d3 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -81,6 +81,9 @@ const S32 MAX_PASSWORD = 16; LLPanelLogin *LLPanelLogin::sInstance = NULL; BOOL LLPanelLogin::sCapslockDidNotification = FALSE; +// Helper for converting a user name into the canonical "Firstname Lastname" form. +// For new accounts without a last name "Resident" is added as a last name. +static std::string canonicalize_username(const std::string& name); class LLLoginRefreshHandler : public LLCommandHandler { @@ -97,58 +100,6 @@ public: } }; -LLLoginRefreshHandler gLoginRefreshHandler; - - -// helper class that trys to download a URL from a web site and calls a method -// on parent class indicating if the web server is working or not -class LLIamHereLogin : public LLHTTPClient::Responder -{ - private: - LLIamHereLogin( LLPanelLogin* parent ) : - mParent( parent ) - {} - - LLPanelLogin* mParent; - - public: - static boost::intrusive_ptr< LLIamHereLogin > build( LLPanelLogin* parent ) - { - return boost::intrusive_ptr< LLIamHereLogin >( new LLIamHereLogin( parent ) ); - }; - - virtual void setParent( LLPanelLogin* parentIn ) - { - mParent = parentIn; - }; - - // We don't actually expect LLSD back, so need to override completedRaw - virtual void completedRaw(U32 status, const std::string& reason, - const LLChannelDescriptors& channels, - const LLIOPipe::buffer_ptr_t& buffer) - { - completed(status, reason, LLSD()); // will call result() or error() - } - - virtual void result( const LLSD& content ) - { - if ( mParent ) - mParent->setSiteIsAlive( true ); - }; - - virtual void error( U32 status, const std::string& reason ) - { - if ( mParent ) - mParent->setSiteIsAlive( false ); - }; -}; - -// this is global and not a class member to keep crud out of the header file -namespace { - boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0; -}; - - //--------------------------------------------------------------------------- // Public methods //--------------------------------------------------------------------------- @@ -160,7 +111,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mLogoImage(), mCallback(callback), mCallbackData(cb_data), - mHtmlAvailable( TRUE ), mListener(new LLPanelLoginListener(this)) { setBackgroundVisible(FALSE); @@ -190,21 +140,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, buildFromFile( "panel_login.xml"); - // Legacy login web page is hidden under the menu bar. - // Adjust reg-in-client web browser widget to not be hidden. - if (gSavedSettings.getBOOL("RegInClient")) - { - reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT); - } - else - { - reshape(rect.getWidth(), rect.getHeight()); - } + reshape(rect.getWidth(), rect.getHeight()); getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this); // change z sort of clickable text to be behind buttons - //sendChildToBack(getChildView("channel_text")); sendChildToBack(getChildView("forgot_password_text")); if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION) @@ -214,7 +154,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, } updateLocationCombo(false); - gSavedSettings.getControl("SessionSettingsFile")->getSignal()->connect(boost::bind(&onModeChange)); + LLUICtrl& mode_combo = getChildRef<LLUICtrl>("mode_combo"); + mode_combo.setValue(gSavedSettings.getString("SessionSettingsFile")); + mode_combo.setCommitCallback(boost::bind(&LLPanelLogin::onModeChange, this, getChild<LLUICtrl>("mode_combo")->getValue(), _2)); LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo"); server_choice_combo->setCommitCallback(onSelectServer, NULL); @@ -247,16 +189,10 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); web_browser->addObserver(this); - // Clear the browser's cache to avoid any potential for the cache messing up the login screen. - web_browser->clearCache(); - reshapeBrowser(); - // kick off a request to grab the url manually - gResponsePtr = LLIamHereLogin::build( this ); - - LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr ); - + loadLoginPage(); + // Show last logged in user favorites in "Start at" combo. addUsersWithFavoritesToUsername(); getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this)); @@ -300,7 +236,14 @@ void LLPanelLogin::addFavoritesToStartLocation() for (LLSD::map_const_iterator iter = fav_llsd.beginMap(); iter != fav_llsd.endMap(); ++iter) { - if(iter->first != getChild<LLComboBox>("username_combo")->getSimple()) continue; + std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple(); + + // The account name in stored_favorites.xml has Resident last name even if user has + // a single word account name, so it can be compared case-insensitive with the + // user defined "firstname lastname". + S32 res = LLStringUtil::compareInsensitive(canonicalize_username(user_defined_name), iter->first); + if (res != 0) continue; + combo->addSeparator(); LLSD user_llsd = iter->second; for (LLSD::array_const_iterator iter1 = user_llsd.beginArray(); @@ -332,46 +275,10 @@ void LLPanelLogin::reshapeBrowser() reshape( rect.getWidth(), rect.getHeight(), 1 ); } -void LLPanelLogin::setSiteIsAlive( bool alive ) -{ - LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); - // if the contents of the site was retrieved - if ( alive ) - { - if ( web_browser ) - { - loadLoginPage(); - - // mark as available - mHtmlAvailable = TRUE; - } - } - else - // the site is not available (missing page, server down, other badness) - { - if ( web_browser ) - { - // hide browser control (revealing default one) - web_browser->setVisible( FALSE ); - - // mark as unavailable - mHtmlAvailable = FALSE; - } - } -} - - LLPanelLogin::~LLPanelLogin() { LLPanelLogin::sInstance = NULL; - // tell the responder we're not here anymore - if ( gResponsePtr ) - gResponsePtr->setParent( 0 ); - - //// We know we're done with the image, so be rid of it. - //gTextureList.deleteImage( mLogoImage ); - // Controls having keyboard focus by default // must reset it on destroy. (EXT-2748) gFocusMgr.setDefaultKeyboardFocus(NULL); @@ -394,22 +301,13 @@ void LLPanelLogin::draw() S32 width = getRect().getWidth(); S32 height = getRect().getHeight(); - if ( mHtmlAvailable ) + if (getChild<LLView>("login_widgets")->getVisible()) { - if (getChild<LLView>("login_widgets")->getVisible()) - { - // draw a background box in black - gl_rect_2d( 0, height - 264, width, 264, LLColor4::black ); - // draw the bottom part of the background image - // just the blue background to the native client UI - mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight()); - } - } - else - { - // the HTML login page is not available so default to the original screen - S32 offscreen_part = height / 3; - mLogoImage->draw(0, -offscreen_part, width, height+offscreen_part); + // draw a background box in black + gl_rect_2d( 0, height - 264, width, 264, LLColor4::black ); + // draw the bottom part of the background image + // just the blue background to the native client UI + mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight()); }; } glPopMatrix(); @@ -868,23 +766,10 @@ void LLPanelLogin::loadLoginPage() oStr << "&os=" << os_info; curl_free(os_info); - gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid()); - gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); - - // navigate to the "real" page - if (gSavedSettings.getBOOL("RegInClient")) - { - web_browser->setFocus(TRUE); - login_page = sInstance->getString("reg_in_client_url"); - web_browser->navigateTo(login_page, "text/html"); - } - else - { - web_browser->navigateTo( oStr.str(), "text/html" ); - } + web_browser->navigateTo( oStr.str(), "text/html" ); } void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event) @@ -915,10 +800,6 @@ void LLPanelLogin::onClickConnect(void *) { if (sInstance && sInstance->mCallback) { - // tell the responder we're not here anymore - if ( gResponsePtr ) - gResponsePtr->setParent( 0 ); - // JC - Make sure the fields all get committed. sInstance->setFocus(FALSE); @@ -986,24 +867,6 @@ void LLPanelLogin::onClickConnect(void *) } } -/* -// static -bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (0 == option) - { - llinfos << "Going to account creation URL" << llendl; - LLWeb::loadURLExternal( LLNotifications::instance().getGlobalString("CREATE_ACCOUNT_URL")); - } - else - { - sInstance->setFocus(TRUE); - } - return false; -} -*/ - // static void LLPanelLogin::onClickNewAccount(void*) { @@ -1159,25 +1022,53 @@ void LLPanelLogin::updateLoginPanelLinks() sInstance->getChildView("forgot_password_text")->setVisible( system_grid); } -//static -void LLPanelLogin::onModeChange() +void LLPanelLogin::onModeChange(const LLSD& original_value, const LLSD& new_value) { - LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&onModeChangeConfirm, _1, _2)); + if (original_value.asString() != new_value.asString()) + { + LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&LLPanelLogin::onModeChangeConfirm, this, original_value, new_value, _1, _2)); + } } -//static -void LLPanelLogin::onModeChangeConfirm(const LLSD& notification, const LLSD& response) +void LLPanelLogin::onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); switch (option) { case 0: - LLAppViewer::instance()->requestQuit(); + gSavedSettings.getControl("SessionSettingsFile")->set(new_value); + LLAppViewer::instance()->forceQuit(); break; case 1: - // do nothing + // revert to original value + getChild<LLUICtrl>("mode_combo")->setValue(original_value); break; default: break; } } + +std::string canonicalize_username(const std::string& name) +{ + std::string cname = name; + LLStringUtil::trim(cname); + + // determine if the username is a first/last form or not. + size_t separator_index = cname.find_first_of(" ._"); + std::string first = cname.substr(0, separator_index); + std::string last; + if (separator_index != cname.npos) + { + last = cname.substr(separator_index+1, cname.npos); + LLStringUtil::trim(last); + } + else + { + // ...on Linden grids, single username users as considered to have + // last name "Resident" + last = "Resident"; + } + + // Username in traditional "firstname lastname" form. + return first + ' ' + last; +} diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 1430bec832..11273453ba 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -89,7 +89,6 @@ private: void addUsersWithFavoritesToUsername(); static void onClickConnect(void*); static void onClickNewAccount(void*); -// static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response); static void onClickVersion(void*); static void onClickForgotPassword(void*); static void onClickHelp(void*); @@ -98,8 +97,8 @@ private: static void onServerComboLostFocus(LLFocusableElement*); static void updateServerCombo(); static void updateStartSLURL(); - static void onModeChange(); - static void onModeChangeConfirm(const LLSD& notification, const LLSD& response); + void onModeChange(const LLSD& original_value, const LLSD& new_value); + void onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response); static void updateLoginPanelLinks(); @@ -114,7 +113,6 @@ private: static LLPanelLogin* sInstance; static BOOL sCapslockDidNotification; - BOOL mHtmlAvailable; }; std::string load_password_from_disk(void); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 0c3f2f3e31..f79a1bb5ab 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -81,7 +81,6 @@ public: BOOL getCheckSinceLogoff(); static void onTimeAgo(LLUICtrl*, void *); - static void onCheckSinceLogoff(LLUICtrl*, void *); static void onCloseBtn(void* user_data); static void selectAllTypes(void* user_data); static void selectNoTypes(void* user_data); @@ -140,6 +139,7 @@ BOOL LLPanelMainInventory::postBuild() mActivePanel->getFilter()->markDefault(); mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2)); + mResortActivePanel = true; } LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); if (recent_items_panel) @@ -529,6 +529,17 @@ void LLPanelMainInventory::draw() { mFilterEditor->setText(mFilterSubString); } + if (mActivePanel && mResortActivePanel) + { + // EXP-756: Force resorting of the list the first time we draw the list: + // In the case of date sorting, we don't have enough information at initialization time + // to correctly sort the folders. Later manual resort doesn't do anything as the order value is + // set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order. + U32 order = mActivePanel->getSortOrder(); + mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME); + mActivePanel->setSortOrder(order); + mResortActivePanel = false; + } LLPanel::draw(); updateItemcountText(); } @@ -619,20 +630,6 @@ LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* invento updateElementsFromFilter(); } - -void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - - bool since_logoff= self->getChild<LLUICtrl>("check_since_logoff")->getValue(); - - if (!since_logoff && - !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) ) - { - self->mSpinSinceHours->set(1.0f); - } -} BOOL LLFloaterInventoryFinder::postBuild() { const LLRect& viewrect = mPanelMainInventory->getRect(); @@ -647,9 +644,6 @@ BOOL LLFloaterInventoryFinder::postBuild() mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago"); childSetCommitCallback("spin_days_ago", onTimeAgo, this); - // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff"); - childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this); - childSetAction("Close", onCloseBtn, this); updateElementsFromFilter(); @@ -660,12 +654,10 @@ void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; if (!self) return; - bool since_logoff=true; if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) { - since_logoff = false; + self->getChild<LLUICtrl>("check_since_logoff")->setValue(false); } - self->getChild<LLUICtrl>("check_since_logoff")->setValue(since_logoff); } void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter) diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index c2b78ff9ea..2b2ee1c0c9 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -121,6 +121,7 @@ private: LLTabContainer* mFilterTabs; LLHandle<LLFloater> mFinderHandle; LLInventoryPanel* mActivePanel; + bool mResortActivePanel; LLSaveFolderState* mSavedFolderState; std::string mFilterText; std::string mFilterSubString; diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index d3c9c3e131..1347a02a52 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -67,8 +67,6 @@ BOOL LLPanelMe::postBuild() { LLPanelProfile::postBuild(); - getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this); - return TRUE; } @@ -135,7 +133,11 @@ void LLPanelMe::buildEditPanel() if (NULL == mEditPanel) { mEditPanel = new LLPanelMyProfileEdit(); - mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this); + + // Note: Remove support for editing profile through this method. + // All profile editing should go through the web. + //mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this); + mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this); } } @@ -147,22 +149,6 @@ void LLPanelMe::onEditProfileClicked() togglePanel(mEditPanel, getAvatarId()); // open } -void LLPanelMe::onSaveChangesClicked() -{ - LLAvatarData data = LLAvatarData(); - data.avatar_id = gAgent.getID(); - data.image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_SECOND_LIFE)->getImageAssetID(); - data.fl_image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_FIRST_LIFE)->getImageAssetID(); - data.about_text = mEditPanel->getChild<LLUICtrl>("sl_description_edit")->getValue().asString(); - data.fl_about_text = mEditPanel->getChild<LLUICtrl>("fl_description_edit")->getValue().asString(); - data.profile_url = mEditPanel->getChild<LLUICtrl>("homepage_edit")->getValue().asString(); - data.allow_publish = mEditPanel->getChild<LLUICtrl>("show_in_search_checkbox")->getValue(); - - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&data); - togglePanel(mEditPanel); // close - onOpen(getAvatarId()); -} - void LLPanelMe::onCancelClicked() { togglePanel(mEditPanel); // close diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h index d5b2fee869..f27f5a268e 100644 --- a/indra/newview/llpanelme.h +++ b/indra/newview/llpanelme.h @@ -58,7 +58,6 @@ private: void buildEditPanel(); void onEditProfileClicked(); - void onSaveChangesClicked(); void onCancelClicked(); LLPanelMyProfileEdit * mEditPanel; diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index b52f33ec3b..e3a7b749ea 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -158,9 +158,8 @@ protected: const LLVector3d& me_pos = gAgent.getPositionGlobal(); const LLVector3d& item1_pos = mAvatarsPositions.find(item1->getAvatarId())->second; const LLVector3d& item2_pos = mAvatarsPositions.find(item2->getAvatarId())->second; - F32 dist1 = dist_vec(item1_pos, me_pos); - F32 dist2 = dist_vec(item2_pos, me_pos); - return dist1 < dist2; + + return dist_vec_squared(item1_pos, me_pos) < dist_vec_squared(item2_pos, me_pos); } private: id_to_pos_map_t mAvatarsPositions; diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 00ac34efa5..46262832dc 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -91,11 +91,18 @@ public: LLParcelHandler() : LLCommandHandler("parcel", UNTRUSTED_THROTTLE) { } bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) - { + { if (params.size() < 2) { return false; } + + if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePlaceProfile")) + { + LLNotificationsUtil::add("NoPlaceInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + LLUUID parcel_id; if (!parcel_id.set(params[0], FALSE)) { diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index aef870d352..71bb4a5584 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -51,6 +51,7 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings() mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); mDevicesUpdated = FALSE; + mUseTuningMode = true; // grab "live" mic volume level mMicVolume = gSavedSettings.getF32("AudioLevelMic"); @@ -96,7 +97,7 @@ void LLPanelVoiceDeviceSettings::draw() // let user know that volume indicator is not yet available bool is_in_tuning_mode = LLVoiceClient::getInstance()->inTuningMode(); - getChildView("wait_text")->setVisible( !is_in_tuning_mode); + getChildView("wait_text")->setVisible( !is_in_tuning_mode && mUseTuningMode); LLPanel::draw(); @@ -292,14 +293,20 @@ void LLPanelVoiceDeviceSettings::initialize() LLVoiceClient::getInstance()->refreshDeviceLists(); // put voice client in "tuning" mode - LLVoiceClient::getInstance()->tuningStart(); - LLVoiceChannel::suspend(); + if (mUseTuningMode) + { + LLVoiceClient::getInstance()->tuningStart(); + LLVoiceChannel::suspend(); + } } void LLPanelVoiceDeviceSettings::cleanup() { - LLVoiceClient::getInstance()->tuningStop(); - LLVoiceChannel::resume(); + if (mUseTuningMode) + { + LLVoiceClient::getInstance()->tuningStop(); + LLVoiceChannel::resume(); + } } void LLPanelVoiceDeviceSettings::onCommitInputDevice() @@ -316,6 +323,6 @@ void LLPanelVoiceDeviceSettings::onCommitOutputDevice() if(LLVoiceClient::getInstance()) { LLVoiceClient::getInstance()->setRenderDevice( - getChild<LLComboBox>("voice_input_device")->getValue().asString()); + getChild<LLComboBox>("voice_output_device")->getValue().asString()); } } diff --git a/indra/newview/llpanelvoicedevicesettings.h b/indra/newview/llpanelvoicedevicesettings.h index 636b8b9948..d09476d469 100644 --- a/indra/newview/llpanelvoicedevicesettings.h +++ b/indra/newview/llpanelvoicedevicesettings.h @@ -45,6 +45,8 @@ public: void cleanup(); /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); + + void setUseTuningMode(bool use) { mUseTuningMode = use; }; protected: void onCommitInputDevice(); @@ -56,6 +58,7 @@ protected: class LLComboBox *mCtrlInputDevices; class LLComboBox *mCtrlOutputDevices; BOOL mDevicesUpdated; + bool mUseTuningMode; }; #endif // LL_LLPANELVOICEDEVICESETTINGS_H diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index ef0c1a3558..30a04109bc 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -2,31 +2,25 @@ * @file llphysicsmotion.cpp * @brief Implementation of LLPhysicsMotion class. * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * 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. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * 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 * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -129,7 +123,7 @@ protected: } void setParamValue(LLViewerVisualParam *param, const F32 new_value_local, - F32 behavior_maxeffect); + F32 behavior_maxeffect); F32 toLocal(const LLVector3 &world); F32 calculateVelocity_local(); diff --git a/indra/newview/llphysicsmotion.h b/indra/newview/llphysicsmotion.h index 0c0087d269..b246fa99bb 100644 --- a/indra/newview/llphysicsmotion.h +++ b/indra/newview/llphysicsmotion.h @@ -1,124 +1,118 @@ -/**
- * @file llphysicsmotion.h
- * @brief Implementation of LLPhysicsMotion class.
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLPHYSICSMOTIONCONTROLLER_H
-#define LL_LLPHYSICSMOTIONCONTROLLER_H
-
-//-----------------------------------------------------------------------------
-// Header files
-//-----------------------------------------------------------------------------
-#include "llmotion.h"
-#include "llframetimer.h"
-
-#define PHYSICS_MOTION_FADEIN_TIME 1.0f
-#define PHYSICS_MOTION_FADEOUT_TIME 1.0f
-
-class LLPhysicsMotion;
-
-//-----------------------------------------------------------------------------
-// class LLPhysicsMotion
-//-----------------------------------------------------------------------------
-class LLPhysicsMotionController :
- public LLMotion
-{
-public:
- // Constructor
- LLPhysicsMotionController(const LLUUID &id);
-
- // Destructor
- virtual ~LLPhysicsMotionController();
-
-public:
- //-------------------------------------------------------------------------
- // functions to support MotionController and MotionRegistry
- //-------------------------------------------------------------------------
-
- // static constructor
- // all subclasses must implement such a function and register it
- static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); }
-
-public:
- //-------------------------------------------------------------------------
- // animation callbacks to be implemented by subclasses
- //-------------------------------------------------------------------------
-
- // motions must specify whether or not they loop
- virtual BOOL getLoop() { return TRUE; }
-
- // motions must report their total duration
- virtual F32 getDuration() { return 0.0; }
-
- // motions must report their "ease in" duration
- virtual F32 getEaseInDuration() { return PHYSICS_MOTION_FADEIN_TIME; }
-
- // motions must report their "ease out" duration.
- virtual F32 getEaseOutDuration() { return PHYSICS_MOTION_FADEOUT_TIME; }
-
- // called to determine when a motion should be activated/deactivated based on avatar pixel coverage
- virtual F32 getMinPixelArea();
-
- // motions must report their priority
- virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
-
- virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
-
- // run-time (post constructor) initialization,
- // called after parameters have been set
- // must return true to indicate success and be available for activation
- virtual LLMotionInitStatus onInitialize(LLCharacter *character);
-
- // called when a motion is activated
- // must return TRUE to indicate success, or else
- // it will be deactivated
- virtual BOOL onActivate();
-
- // called per time step
- // must return TRUE while it is active, and
- // must return FALSE when the motion is completed.
- virtual BOOL onUpdate(F32 time, U8* joint_mask);
-
- // called when a motion is deactivated
- virtual void onDeactivate();
-
- LLCharacter* getCharacter() { return mCharacter; }
-
-protected:
- void addMotion(LLPhysicsMotion *motion);
-private:
- LLCharacter* mCharacter;
-
- typedef std::vector<LLPhysicsMotion *> motion_vec_t;
- motion_vec_t mMotions;
-};
-
-#endif // LL_LLPHYSICSMOTION_H
-
+/** + * @file llphysicsmotion.h + * @brief Implementation of LLPhysicsMotion class. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLPHYSICSMOTIONCONTROLLER_H +#define LL_LLPHYSICSMOTIONCONTROLLER_H + +//----------------------------------------------------------------------------- +// Header files +//----------------------------------------------------------------------------- +#include "llmotion.h" +#include "llframetimer.h" + +#define PHYSICS_MOTION_FADEIN_TIME 1.0f +#define PHYSICS_MOTION_FADEOUT_TIME 1.0f + +class LLPhysicsMotion; + +//----------------------------------------------------------------------------- +// class LLPhysicsMotion +//----------------------------------------------------------------------------- +class LLPhysicsMotionController : + public LLMotion +{ +public: + // Constructor + LLPhysicsMotionController(const LLUUID &id); + + // Destructor + virtual ~LLPhysicsMotionController(); + +public: + //------------------------------------------------------------------------- + // functions to support MotionController and MotionRegistry + //------------------------------------------------------------------------- + + // static constructor + // all subclasses must implement such a function and register it + static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); } + +public: + //------------------------------------------------------------------------- + // animation callbacks to be implemented by subclasses + //------------------------------------------------------------------------- + + // motions must specify whether or not they loop + virtual BOOL getLoop() { return TRUE; } + + // motions must report their total duration + virtual F32 getDuration() { return 0.0; } + + // motions must report their "ease in" duration + virtual F32 getEaseInDuration() { return PHYSICS_MOTION_FADEIN_TIME; } + + // motions must report their "ease out" duration. + virtual F32 getEaseOutDuration() { return PHYSICS_MOTION_FADEOUT_TIME; } + + // called to determine when a motion should be activated/deactivated based on avatar pixel coverage + virtual F32 getMinPixelArea(); + + // motions must report their priority + virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; } + + virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; } + + // run-time (post constructor) initialization, + // called after parameters have been set + // must return true to indicate success and be available for activation + virtual LLMotionInitStatus onInitialize(LLCharacter *character); + + // called when a motion is activated + // must return TRUE to indicate success, or else + // it will be deactivated + virtual BOOL onActivate(); + + // called per time step + // must return TRUE while it is active, and + // must return FALSE when the motion is completed. + virtual BOOL onUpdate(F32 time, U8* joint_mask); + + // called when a motion is deactivated + virtual void onDeactivate(); + + LLCharacter* getCharacter() { return mCharacter; } + +protected: + void addMotion(LLPhysicsMotion *motion); +private: + LLCharacter* mCharacter; + + typedef std::vector<LLPhysicsMotion *> motion_vec_t; + motion_vec_t mMotions; +}; + +#endif // LL_LLPHYSICSMOTION_H + diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 6cfb708112..18d6731fcb 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -143,10 +143,7 @@ void LLPreviewTexture::onSaveAsBtn(void* data) void LLPreviewTexture::draw() { - if (mUpdateDimensions) - { - updateDimensions(); - } + updateDimensions(); LLPreview::draw(); @@ -396,27 +393,32 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success, void LLPreviewTexture::updateDimensions() { if (!mImage) + { return; - - if(mImage->getFullWidth() == 0 || mImage->getFullHeight() == 0) + } + if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0) { return; } - mUpdateDimensions = FALSE; - - getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth())); + // Update the width/height display every time + getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth())); getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", mImage->getFullHeight())); - - //reshape floater - reshape(getRect().getWidth(), getRect().getHeight()); + // Reshape the floater only when required + if (mUpdateDimensions) + { + mUpdateDimensions = FALSE; + + //reshape floater + reshape(getRect().getWidth(), getRect().getHeight()); - gFloaterView->adjustToFitScreen(this, FALSE); + gFloaterView->adjustToFitScreen(this, FALSE); - LLRect dim_rect(getChildView("dimensions")->getRect()); - LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect()); - getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft); + LLRect dim_rect(getChildView("dimensions")->getRect()); + LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect()); + getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft); + } } diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 50bc0b4a98..f05892d9b0 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -517,17 +517,15 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id) { BOOL object_found = FALSE; LLTool *tool = NULL; - if (!gNoRender) - { - tool = LLToolMgr::getInstance()->getCurrentTool(); - // It's possible that the tool is editing an object that is not selected - LLViewerObject* tool_editing_object = tool->getEditingObject(); - if( tool_editing_object && tool_editing_object->mID == id) - { - tool->stopEditing(); - object_found = TRUE; - } + tool = LLToolMgr::getInstance()->getCurrentTool(); + + // It's possible that the tool is editing an object that is not selected + LLViewerObject* tool_editing_object = tool->getEditingObject(); + if( tool_editing_object && tool_editing_object->mID == id) + { + tool->stopEditing(); + object_found = TRUE; } // Iterate through selected objects list and kill the object @@ -6570,26 +6568,27 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ, if (update_position) { // calculate the distance of the object closest to the camera origin - F32 min_dist = 1e+30f; + F32 min_dist_squared = F32_MAX; // value will be overridden in the loop + LLVector3 obj_pos; for (LLObjectSelection::root_iterator it = getSelection()->root_begin(); it != getSelection()->root_end(); ++it) { obj_pos = (*it)->getObject()->getPositionEdit(); - F32 obj_dist = dist_vec(obj_pos, LLViewerCamera::getInstance()->getOrigin()); - if (obj_dist < min_dist) + F32 obj_dist_squared = dist_vec_squared(obj_pos, LLViewerCamera::getInstance()->getOrigin()); + if (obj_dist_squared < min_dist_squared) { - min_dist = obj_dist; + min_dist_squared = obj_dist_squared; } } - // factor the distance inside the displacement vector. This will get us + // factor the distance into the displacement vector. This will get us // equally visible movements for both close and far away selections. - min_dist = sqrt(min_dist) / 2; - displ_global.setVec(displ.mV[0]*min_dist, - displ.mV[1]*min_dist, - displ.mV[2]*min_dist); + F32 min_dist = sqrt(fsqrtf(min_dist_squared)) / 2; + displ_global.setVec(displ.mV[0] * min_dist, + displ.mV[1] * min_dist, + displ.mV[2] * min_dist); // equates to: Displ_global = Displ * M_cam_axes_in_global_frame displ_global = LLViewerCamera::getInstance()->rotateToAbsolute(displ_global); diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index fcd200d24a..631b244785 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -53,6 +53,8 @@ #include "llsidepanelappearance.h" +#include "llsidetraylistener.h" + //#include "llscrollcontainer.h" using namespace std; @@ -71,6 +73,8 @@ static const std::string TAB_PANEL_CAPTION_TITLE_BOX = "sidetray_tab_title"; LLSideTray* LLSideTray::sInstance = 0; +static LLSideTrayListener sSideTrayListener(LLSideTray::getInstance); + // static LLSideTray* LLSideTray::getInstance() { @@ -123,8 +127,6 @@ protected: void undock(LLFloater* floater_tab); LLSideTray* getSideTray(); - - void onFloaterClose(LLSD::Boolean app_quitting); public: virtual ~LLSideTrayTab(); @@ -142,7 +144,7 @@ public: void onOpen (const LLSD& key); - void toggleTabDocked(); + void toggleTabDocked(bool toggle_floater = true); void setDocked(bool dock); bool isDocked() const; @@ -156,7 +158,6 @@ private: std::string mDescription; LLView* mMainPanel; - boost::signals2::connection mFloaterCloseConn; }; LLSideTrayTab::LLSideTrayTab(const Params& p) @@ -192,8 +193,8 @@ BOOL LLSideTrayTab::postBuild() title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle); - getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this)); - getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this)); + getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false)); + getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true)); return true; } @@ -249,14 +250,16 @@ LLSideTray* LLSideTrayTab::getSideTray() return side_tray; } -void LLSideTrayTab::toggleTabDocked() +void LLSideTrayTab::toggleTabDocked(bool toggle_floater /* = true */) { + // *FIX: Calling this method twice per frame would crash the viewer. + std::string tab_name = getName(); LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); if (!floater_tab) return; - bool docking = LLFloater::isShown(floater_tab); + bool docking = !isDocked(); // Hide the "Tear Off" button when a tab gets undocked // and show "Dock" button instead. @@ -274,7 +277,10 @@ void LLSideTrayTab::toggleTabDocked() // Open/close the floater *after* we reparent the tab panel, // so that it doesn't receive redundant visibility change notifications. - LLFloaterReg::toggleInstance("side_bar_tab", tab_name); + if (toggle_floater) + { + LLFloaterReg::toggleInstance("side_bar_tab", tab_name); + } } // Same as toggleTabDocked() apart from making sure that we do exactly what we want. @@ -294,18 +300,6 @@ bool LLSideTrayTab::isDocked() const return dynamic_cast<LLSideTray*>(getParent()) != NULL; } -void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting) -{ - // If user presses Ctrl-Shift-W, handle that gracefully by docking all - // undocked tabs before their floaters get destroyed (STORM-1016). - - // Don't dock on quit for the current dock state to be correctly saved. - if (app_quitting) return; - - lldebugs << "Forcibly docking tab " << getName() << llendl; - setDocked(true); -} - BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks) { // Let children handle the event @@ -329,7 +323,6 @@ void LLSideTrayTab::dock(LLFloater* floater_tab) return; } - mFloaterCloseConn.disconnect(); setRect(side_tray->getLocalRect()); reshape(getRect().getWidth(), getRect().getHeight()); @@ -378,7 +371,6 @@ void LLSideTrayTab::undock(LLFloater* floater_tab) } floater_tab->addChild(this); - mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2)); floater_tab->setTitle(mTabTitle); floater_tab->setName(getName()); @@ -454,6 +446,11 @@ LLSideTrayTab* LLSideTrayTab::createInstance () return tab; } +// Now that we know the definition of LLSideTrayTab, we can implement +// tab_cast. +template <> +LLPanel* tab_cast<LLPanel*>(LLSideTrayTab* tab) { return tab; } + ////////////////////////////////////////////////////////////////////////////// // LLSideTrayButton // Side Tray tab button with "tear off" handling. @@ -501,7 +498,7 @@ public: LLSideTrayTab* tab = side_tray->getTab(getName()); if (!tab) return FALSE; - tab->toggleTabDocked(); + tab->setDocked(false); LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName()); if (!floater_tab) return FALSE; @@ -567,6 +564,8 @@ LLSideTray::LLSideTray(const Params& params) // register handler function to process data from the xml. // panel_name should be specified via "parameter" attribute. commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null)); + commit.add("SideTray.Toggle", boost::bind(&LLSideTray::onToggleCollapse, this)); + commit.add("SideTray.Collapse", boost::bind(&LLSideTray::collapseSideBar, this)); LLTransientFloaterMgr::getInstance()->addControlView(this); LLView* side_bar_tabs = gViewerWindow->getRootView()->getChildView("side_bar_tabs"); if (side_bar_tabs != NULL) @@ -670,7 +669,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters")) { - tab->toggleTabDocked(); + tab->setDocked(false); tab_attached = false; } @@ -1091,7 +1090,7 @@ void LLSideTray::detachTabs() if (!is_visible) continue; llassert(isTabAttached(tab->getName())); - tab->toggleTabDocked(); + tab->setDocked(false); } } @@ -1181,6 +1180,38 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent) arrange(); } +// This is just LLView::findChildView specialized to restrict the search to LLPanels. +// Optimization for EXT-4068 to avoid searching down to the individual item level +// when inventories are large. +LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) +{ + for (LLView::child_list_const_iter_t child_it = panel->beginChild(); + child_it != panel->endChild(); ++child_it) + { + LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); + if (!child_panel) + continue; + if (child_panel->getName() == name) + return child_panel; + } + if (recurse) + { + for (LLView::child_list_const_iter_t child_it = panel->beginChild(); + child_it != panel->endChild(); ++child_it) + { + LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); + if (!child_panel) + continue; + LLPanel *found_panel = findChildPanel(child_panel,name,recurse); + if (found_panel) + { + return found_panel; + } + } + } + return NULL; +} + /** * Activate tab with "panel_name" panel * if no such tab - return false, otherwise true. @@ -1210,23 +1241,50 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para return new_panel; } -void LLSideTray::hidePanel(const std::string& panel_name) +bool LLSideTray::hidePanel(const std::string& panel_name) { + bool panelHidden = false; + LLPanel* panelp = getPanel(panel_name); + if (panelp) { - if(isTabAttached(panel_name)) + LLView* parentp = panelp->getParent(); + + // Collapse the side bar if the panel or the panel's parent is an attached tab + if (isTabAttached(panel_name) || (parentp && isTabAttached(parentp->getName()))) { collapseSideBar(); + panelHidden = true; } else { - LLFloaterReg::hideInstance("side_bar_tab", panel_name); + panelHidden = LLFloaterReg::hideInstance("side_bar_tab", panel_name); + + if (!panelHidden) + { + // Look up the panel in the list of detached tabs. + for (child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) + { + LLPanel *detached_panel = dynamic_cast<LLPanel*>(*child_it); + + if (detached_panel) + { + // Hide this detached panel if it is a parent of our panel + if (findChildPanel(detached_panel, panel_name, true) != NULL) + { + panelHidden = LLFloaterReg::hideInstance("side_bar_tab", detached_panel->getName()); + break; + } + } + } + } } } + + return panelHidden; } - void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params) { if(!sub_panel) @@ -1244,38 +1302,6 @@ void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, } } -// This is just LLView::findChildView specialized to restrict the search to LLPanels. -// Optimization for EXT-4068 to avoid searching down to the individual item level -// when inventories are large. -LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) -{ - for (LLView::child_list_const_iter_t child_it = panel->beginChild(); - child_it != panel->endChild(); ++child_it) - { - LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); - if (!child_panel) - continue; - if (child_panel->getName() == name) - return child_panel; - } - if (recurse) - { - for (LLView::child_list_const_iter_t child_it = panel->beginChild(); - child_it != panel->endChild(); ++child_it) - { - LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); - if (!child_panel) - continue; - LLPanel *found_panel = findChildPanel(child_panel,name,recurse); - if (found_panel) - { - return found_panel; - } - } - } - return NULL; -} - LLPanel* LLSideTray::getPanel(const std::string& panel_name) { // Look up the panel in the list of detached tabs. @@ -1316,8 +1342,9 @@ bool LLSideTray::isPanelActive(const std::string& panel_name) return (panel->getName() == panel_name); } -void LLSideTray::setTabDocked(const std::string& tab_name, bool dock) +void LLSideTray::setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater /* = true*/) { + // Lookup tab by name. LLSideTrayTab* tab = getTab(tab_name); if (!tab) { // not a docked tab, look through detached tabs @@ -1334,20 +1361,12 @@ void LLSideTray::setTabDocked(const std::string& tab_name, bool dock) } - if (tab) - { - bool tab_attached = isTabAttached(tab_name); - LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); - if (!floater_tab) return; + llassert(tab != NULL); - if (dock && !tab_attached) - { - tab->dock(floater_tab); - } - else if (!dock && tab_attached) - { - tab->undock(floater_tab); - } + // Toggle its dock state. + if (tab && tab->isDocked() != dock) + { + tab->toggleTabDocked(toggle_floater); } } diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 2516b5689f..24882411f4 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -33,6 +33,13 @@ class LLAccordionCtrl; class LLSideTrayTab; +// Deal with LLSideTrayTab being opaque. Generic do-nothing cast... +template <class T> +T tab_cast(LLSideTrayTab* tab) { return tab; } +// specialized for implementation in presence of LLSideTrayTab definition +template <> +LLPanel* tab_cast<LLPanel*>(LLSideTrayTab* tab); + // added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions // while disconnecting viewer in LLAppViewer::disconnectViewer(). // LLDestroyClassList::instance().fireCallbacks() calls destroyClass method. See EXT-245. @@ -97,7 +104,7 @@ public: */ LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD()); - void hidePanel (const std::string& panel_name); + bool hidePanel (const std::string& panel_name); /** * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel. @@ -114,7 +121,7 @@ public: LLPanel* getActivePanel (); bool isPanelActive (const std::string& panel_name); - void setTabDocked(const std::string& tab_name, bool dock); + void setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater = true); /* * get the panel of given type T (don't show it or do anything else with it) @@ -221,6 +228,9 @@ private: } private: + // Since we provide no public way to query mTabs and mDetachedTabs, give + // LLSideTrayListener friend access. + friend class LLSideTrayListener; LLPanel* mButtonsPanel; typedef std::map<std::string,LLButton*> button_map_t; button_map_t mTabButtons; diff --git a/indra/newview/llsidetraylistener.cpp b/indra/newview/llsidetraylistener.cpp new file mode 100644 index 0000000000..cd6fa28948 --- /dev/null +++ b/indra/newview/llsidetraylistener.cpp @@ -0,0 +1,179 @@ +/** + * @file llsidetraylistener.cpp + * @author Nat Goodspeed + * @date 2011-02-15 + * @brief Implementation for llsidetraylistener. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" +// associated header +#include "llsidetraylistener.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "llsidetray.h" +#include "llsdutil.h" + +LLSideTrayListener::LLSideTrayListener(const Getter& getter): + LLEventAPI("LLSideTray", + "Operations on side tray (e.g. query state, query tabs)"), + mGetter(getter) +{ + add("getCollapsed", "Send on [\"reply\"] an [\"open\"] Boolean", + &LLSideTrayListener::getCollapsed, LLSDMap("reply", LLSD())); + add("getTabs", + "Send on [\"reply\"] a map of tab names and info about them", + &LLSideTrayListener::getTabs, LLSDMap("reply", LLSD())); + add("getPanels", + "Send on [\"reply\"] data about panels available with SideTray.ShowPanel", + &LLSideTrayListener::getPanels, LLSDMap("reply", LLSD())); +} + +void LLSideTrayListener::getCollapsed(const LLSD& event) const +{ + sendReply(LLSDMap("open", ! mGetter()->getCollapsed()), event); +} + +void LLSideTrayListener::getTabs(const LLSD& event) const +{ + LLSD reply; + + LLSideTray* tray = mGetter(); + LLSD::Integer ord(0); + for (LLSideTray::child_list_const_iter_t chi(tray->beginChild()), chend(tray->endChild()); + chi != chend; ++chi, ++ord) + { + LLView* child = *chi; + // How much info is important? Toss in as much as seems reasonable for + // each tab. But to me, at least for the moment, the most important + // item is the tab name. + LLSD info; + // I like the idea of returning a map keyed by tab name. But as + // compared to an array of maps, that loses sequence information. + // Address that by indicating the original order in each map entry. + info["ord"] = ord; + info["visible"] = bool(child->getVisible()); + info["enabled"] = bool(child->getEnabled()); + info["available"] = child->isAvailable(); + reply[child->getName()] = info; + } + + sendReply(reply, event); +} + +static LLSD getTabInfo(LLPanel* tab) +{ + LLSD panels; + for (LLPanel::tree_iterator_t ti(tab->beginTreeDFS()), tend(tab->endTreeDFS()); + ti != tend; ++ti) + { + // *ti is actually an LLView*, which had better not be NULL + LLView* view(*ti); + if (! view) + { + LL_ERRS("LLSideTrayListener") << "LLSideTrayTab '" << tab->getName() + << "' has a NULL child LLView*" << LL_ENDL; + } + + // The logic we use to decide what "panel" names to return is heavily + // based on LLSideTray::showPanel(): the function that actually + // implements the "SideTray.ShowPanel" operation. showPanel(), in + // turn, depends on LLSideTray::openChildPanel(): when + // openChildPanel() returns non-NULL, showPanel() stops searching + // attached and detached LLSideTrayTab tabs. + + // For each LLSideTrayTab, openChildPanel() first calls + // findChildView(panel_name, true). In other words, panel_name need + // not be a direct LLSideTrayTab child, it's sought recursively. + // That's why we use (begin|end)TreeDFS() in this loop. + + // But this tree_iterator_t loop will actually traverse every widget + // in every panel. Returning all those names will not help our caller: + // passing most such names to openChildPanel() would not do what we + // want. Even though the code suggests that passing ANY valid + // side-panel widget name to openChildPanel() will open the tab + // containing that widget, results could get confusing since followup + // (onOpen()) logic wouldn't be invoked, and showPanel() wouldn't stop + // searching because openChildPanel() would return NULL. + + // We must filter these LLView items, using logic that (sigh!) mirrors + // openChildPanel()'s own. + + // openChildPanel() returns a non-NULL LLPanel* when either: + // - the LLView is a direct child of an LLSideTrayPanelContainer + // - the LLView is itself an LLPanel. + // But as LLSideTrayPanelContainer can directly contain LLView items + // that are NOT themselves LLPanels (e.g. "sidebar_me" contains an + // LLButton called "Jump Right Arrow"), we'd better focus only on + // LLSideTrayPanelContainer children that are themselves LLPanel + // items. Which means that the second test completely subsumes the + // first. + LLPanel* panel(dynamic_cast<LLPanel*>(view)); + if (panel) + { + // Maybe it's overkill to construct an LLSD::Map for each panel, but + // the possibility remains that we might want to deliver more info + // about each panel than just its name. + panels.append(LLSDMap("name", panel->getName())); + } + } + + return LLSDMap("panels", panels); +} + +void LLSideTrayListener::getPanels(const LLSD& event) const +{ + LLSD reply; + + LLSideTray* tray = mGetter(); + // Iterate through the attached tabs. + LLSD::Integer ord(0); + for (LLSideTray::child_vector_t::const_iterator + ati(tray->mTabs.begin()), atend(tray->mTabs.end()); + ati != atend; ++ati) + { + // We don't have access to LLSideTrayTab: the class definition is + // hidden in llsidetray.cpp. But as LLSideTrayTab isa LLPanel, use the + // LLPanel API. Unfortunately, without the LLSideTrayTab definition, + // the compiler doesn't even know this LLSideTrayTab* is an LLPanel*. + // Persuade it. + LLPanel* tab(tab_cast<LLPanel*>(*ati)); + reply[tab->getName()] = getTabInfo(tab).with("attached", true).with("ord", ord); + } + + // Now iterate over the detached tabs. These can also be opened via + // SideTray.ShowPanel. + ord = 0; + for (LLSideTray::child_vector_t::const_iterator + dti(tray->mDetachedTabs.begin()), dtend(tray->mDetachedTabs.end()); + dti != dtend; ++dti) + { + LLPanel* tab(tab_cast<LLPanel*>(*dti)); + reply[tab->getName()] = getTabInfo(tab).with("attached", false).with("ord", ord); + } + + sendReply(reply, event); +} diff --git a/indra/newview/llsidetraylistener.h b/indra/newview/llsidetraylistener.h new file mode 100644 index 0000000000..51e2137762 --- /dev/null +++ b/indra/newview/llsidetraylistener.h @@ -0,0 +1,53 @@ +/** + * @file llsidetraylistener.h + * @author Nat Goodspeed + * @date 2011-02-15 + * @brief + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#if ! defined(LL_LLSIDETRAYLISTENER_H) +#define LL_LLSIDETRAYLISTENER_H + +#include "lleventapi.h" +#include <boost/function.hpp> + +class LLSideTray; +class LLSD; + +class LLSideTrayListener: public LLEventAPI +{ + typedef boost::function<LLSideTray*()> Getter; + +public: + LLSideTrayListener(const Getter& getter); + +private: + void getCollapsed(const LLSD& event) const; + void getTabs(const LLSD& event) const; + void getPanels(const LLSD& event) const; + + Getter mGetter; +}; + +#endif /* ! defined(LL_LLSIDETRAYLISTENER_H) */ diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 8adb8c30e0..94784f3f49 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1635,8 +1635,6 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32 mSlopRatio = 0.25f; mInfiniteFarClip = FALSE; - LLGLNamePool::registerPool(&sQueryPool); - mOctree = new LLSpatialGroup::OctreeRoot(LLVector3d(0,0,0), LLVector3d(1,1,1), NULL); diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index d52e0a6c86..d3e96f8dfb 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -54,26 +54,6 @@ LLSpeakButton::Params::Params() // See widgets/talk_button.xml } -void LLSpeakButton::draw() -{ - // LLVoiceClient::getInstance() is the authoritative global source of info regarding our open-mic state, we merely reflect that state. - bool openmic = LLVoiceClient::getInstance()->getUserPTTState(); - bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled(); - mSpeakBtn->setToggleState(openmic && voiceenabled); - mOutputMonitor->setIsMuted(!voiceenabled); - LLUICtrl::draw(); -} -void LLSpeakButton::setSpeakBtnEnabled(bool enabled) -{ - LLButton* speak_btn = getChild<LLButton>("speak_btn"); - speak_btn->setEnabled(enabled); -} -void LLSpeakButton::setFlyoutBtnEnabled(bool enabled) -{ - LLButton* show_btn = getChild<LLBottomtrayButton>("speak_flyout_btn"); - show_btn->setEnabled(enabled); -} - LLSpeakButton::LLSpeakButton(const Params& p) : LLUICtrl(p) , mOutputMonitor(NULL) diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index 2fdf80c1f2..7db01112ef 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -53,12 +53,7 @@ public: }; /*virtual*/ ~LLSpeakButton(); - /*virtual*/ void draw(); - // methods for enabling/disabling right and left parts of speak button separately(EXT-4648) - void setSpeakBtnEnabled(bool enabled); - void setFlyoutBtnEnabled(bool enabled); - // *HACK: Need to put tooltips in a translatable location, // the panel that contains this button. void setSpeakToolTip(const std::string& msg); diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 40aea05839..c588bd8fb4 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -920,7 +920,7 @@ void LLLocalSpeakerMgr::updateSpeakerList() if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY) { LLVOAvatar* avatarp = (LLVOAvatar*)gObjectList.findObject(speaker_id); - if (!avatarp || dist_vec(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS) + if (!avatarp || dist_vec_squared(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS_SQUARED) { setSpeakerNotInChannel(speakerp); } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 8fccb35886..ca908ef822 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -354,11 +354,8 @@ bool idle_startup() LLStringUtil::setLocale (LLTrans::getString(system)); - if (!gNoRender) - { - //note: Removing this line will cause incorrect button size in the login screen. -- bao. - gTextureList.updateImages(0.01f) ; - } + //note: Removing this line will cause incorrect button size in the login screen. -- bao. + gTextureList.updateImages(0.01f) ; if ( STATE_FIRST == LLStartUp::getStartupState() ) { @@ -673,6 +670,7 @@ bool idle_startup() { gUserCredential = gLoginHandler.initializeLoginInfo(); } + // Previous initializeLoginInfo may have generated user credentials. Re-check them. if (gUserCredential.isNull()) { show_connect_box = TRUE; @@ -722,6 +720,8 @@ bool idle_startup() timeout_count = 0; + initialize_edit_menu(); + if (show_connect_box) { // Load all the name information out of the login view @@ -731,15 +731,13 @@ bool idle_startup() { gUserCredential = gLoginHandler.initializeLoginInfo(); } - if (gNoRender) + if (gHeadlessClient) { - LL_ERRS("AppInit") << "Need to autologin or use command line with norender!" << LL_ENDL; + LL_WARNS("AppInit") << "Waiting at connection box in headless client. Did you mean to add autologin params?" << LL_ENDL; } // Make sure the process dialog doesn't hide things gViewerWindow->setShowProgress(FALSE); - initialize_edit_menu(); - // Show the login dialog login_show(); // connect dialog is already shown, so fill in the names @@ -940,10 +938,7 @@ bool idle_startup() gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT); - if (!gNoRender) - { - init_start_screen(agent_location_id); - } + init_start_screen(agent_location_id); // Display the startup progress bar. gViewerWindow->setShowProgress(TRUE); @@ -974,11 +969,6 @@ bool idle_startup() // Setting initial values... LLLoginInstance* login = LLLoginInstance::getInstance(); login->setNotificationsInterface(LLNotifications::getInstance()); - if(gNoRender) - { - // HACK, skip optional updates if you're running drones - login->setSkipOptionalUpdate(true); - } login->setSerialNumber(LLAppViewer::instance()->getSerialNumber()); login->setLastExecEvent(gLastExecEvent); @@ -1264,14 +1254,11 @@ bool idle_startup() gLoginMenuBarView->setVisible( FALSE ); gLoginMenuBarView->setEnabled( FALSE ); - if (!gNoRender) - { - // direct logging to the debug console's line buffer - LLError::logToFixedBuffer(gDebugView->mDebugConsolep); - - // set initial visibility of debug console - gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole")); - } + // direct logging to the debug console's line buffer + LLError::logToFixedBuffer(gDebugView->mDebugConsolep); + + // set initial visibility of debug console + gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole")); // // Set message handlers @@ -1299,7 +1286,7 @@ bool idle_startup() //gCacheName is required for nearby chat history loading //so I just moved nearby history loading a few states further - if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory")) + if (gSavedPerAccountSettings.getBOOL("LogShowHistory")) { LLNearbyChat* nearby_chat = LLNearbyChat::getInstance(); if (nearby_chat) nearby_chat->loadHistory(); @@ -1351,18 +1338,15 @@ bool idle_startup() gAgentCamera.resetCamera(); // Initialize global class data needed for surfaces (i.e. textures) - if (!gNoRender) - { - LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL; - // Initialize all of the viewer object classes for the first time (doing things like texture fetches. - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); + LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL; + // Initialize all of the viewer object classes for the first time (doing things like texture fetches. + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); - gSky.init(initial_sun_direction); + gSky.init(initial_sun_direction); - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); - } + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); LL_DEBUGS("AppInit") << "Decoding images..." << LL_ENDL; // For all images pre-loaded into viewer cache, decode them. @@ -1722,46 +1706,43 @@ bool idle_startup() LLUIColorTable::instance().saveUserSettings(); }; - if (!gNoRender) - { - // JC: Initializing audio requests many sounds for download. - init_audio(); - - // JC: Initialize "active" gestures. This may also trigger - // many gesture downloads, if this is the user's first - // time on this machine or -purge has been run. - LLSD gesture_options - = LLLoginInstance::getInstance()->getResponse("gestures"); - if (gesture_options.isDefined()) + // JC: Initializing audio requests many sounds for download. + init_audio(); + + // JC: Initialize "active" gestures. This may also trigger + // many gesture downloads, if this is the user's first + // time on this machine or -purge has been run. + LLSD gesture_options + = LLLoginInstance::getInstance()->getResponse("gestures"); + if (gesture_options.isDefined()) + { + LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size() + << LL_ENDL; + uuid_vec_t item_ids; + for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(), + end = gesture_options.endArray(); resp_it != end; ++resp_it) { - LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size() - << LL_ENDL; - uuid_vec_t item_ids; - for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(), - end = gesture_options.endArray(); resp_it != end; ++resp_it) - { - // If the id is not specifed in the LLSD, - // the LLSD operator[]() will return a null LLUUID. - LLUUID item_id = (*resp_it)["item_id"]; - LLUUID asset_id = (*resp_it)["asset_id"]; + // If the id is not specifed in the LLSD, + // the LLSD operator[]() will return a null LLUUID. + LLUUID item_id = (*resp_it)["item_id"]; + LLUUID asset_id = (*resp_it)["asset_id"]; - if (item_id.notNull() && asset_id.notNull()) - { - // Could schedule and delay these for later. - const BOOL no_inform_server = FALSE; - const BOOL no_deactivate_similar = FALSE; - LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id, - no_inform_server, - no_deactivate_similar); - // We need to fetch the inventory items for these gestures - // so we have the names to populate the UI. - item_ids.push_back(item_id); - } + if (item_id.notNull() && asset_id.notNull()) + { + // Could schedule and delay these for later. + const BOOL no_inform_server = FALSE; + const BOOL no_deactivate_similar = FALSE; + LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id, + no_inform_server, + no_deactivate_similar); + // We need to fetch the inventory items for these gestures + // so we have the names to populate the UI. + item_ids.push_back(item_id); } - // no need to add gesture to inventory observer, it's already made in constructor - LLGestureMgr::instance().setFetchIDs(item_ids); - LLGestureMgr::instance().startFetch(); } + // no need to add gesture to inventory observer, it's already made in constructor + LLGestureMgr::instance().setFetchIDs(item_ids); + LLGestureMgr::instance().startFetch(); } gDisplaySwapBuffers = TRUE; @@ -1782,13 +1763,6 @@ bool idle_startup() // JC - 7/20/2002 gViewerWindow->sendShapeToSim(); - - // Ignore stipend information for now. Money history is on the web site. - // if needed, show the L$ history window - //if (stipend_since_login && !gNoRender) - //{ - //} - // The reason we show the alert is because we want to // reduce confusion for when you log in and your provided // location is not your expected location. So, if this is @@ -2717,7 +2691,7 @@ bool LLStartUp::dispatchURL() || (dx*dx > SLOP*SLOP) || (dy*dy > SLOP*SLOP) ) { - LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(), + LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(), "clicked", NULL, false); } return true; @@ -3214,7 +3188,7 @@ bool process_login_success_response() void transition_back_to_login_panel(const std::string& emsg) { - if (gNoRender) + if (gHeadlessClient && gSavedSettings.getBOOL("AutoLogin")) { LL_WARNS("AppInit") << "Failed to login!" << LL_ENDL; LL_WARNS("AppInit") << emsg << LL_ENDL; diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index 6fc8153b77..bccabe21a8 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -340,11 +340,6 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction) S32 i; LLSurfacePatch *patchp, *neighbor_patchp; - if (gNoRender) - { - return; - } - mNeighbors[direction] = neighborp; neighborp->mNeighbors[gDirOpposite[direction]] = this; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index e7b5c13860..cb49976e5f 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -310,7 +310,7 @@ void LLIMWellWindow::RowPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& S32 new_text_left = mChiclet->getRect().mRight + CHICLET_HPAD; LLRect text_rect = text->getRect(); text_rect.mLeft = new_text_left; - text->setRect(text_rect); + text->setShape(text_rect); } //--------------------------------------------------------------------------------- diff --git a/indra/newview/lltexturestats.cpp b/indra/newview/lltexturestats.cpp index dd35d5cf83..f820ae65df 100644 --- a/indra/newview/lltexturestats.cpp +++ b/indra/newview/lltexturestats.cpp @@ -37,7 +37,7 @@ void send_texture_stats_to_sim(const LLSD &texture_stats) { LLSD texture_stats_report; // Only send stats if the agent is connected to a region. - if (!gAgent.getRegion() || gNoRender) + if (!gAgent.getRegion()) { return; } diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 8b2f066d41..0f337825e9 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -220,7 +220,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal } static LLUIColor alert_caution_text_color = LLUIColorTable::instance().getColor("AlertCautionTextColor"); - static LLUIColor alert_text_color = LLUIColorTable::instance().getColor("AlertTextColor"); if (mCaution) { LLIconCtrl* icon = LLUICtrlFactory::getInstance()->createFromFile<LLIconCtrl>("alert_icon.xml", this, LLPanel::child_registry_t::instance()); @@ -233,10 +232,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal msg_x += 32 + HPAD; msg_box->setColor( alert_caution_text_color ); } - else - { - msg_box->setColor( alert_text_color ); - } LLRect rect; rect.setLeftTopAndSize( msg_x, msg_y, text_rect.getWidth(), text_rect.getHeight() ); diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 1c745906aa..ba243f258a 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1386,6 +1386,10 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL worn = TRUE; } break; + case LLAssetType::AT_CALLINGCARD: + // Calling Cards in object are disabled for now + // because of incomplete LSL support. See STORM-1117. + return ACCEPT_NO; default: break; } diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 9549f180df..9ec4d33036 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -37,7 +37,7 @@ #include "llavatarnamecache.h" #include "llviewercontrol.h" #include "llfocusmgr.h" -//#include "llfirstuse.h" +#include "llfirstuse.h" #include "llfloaterland.h" #include "llfloaterreg.h" #include "llfloaterscriptdebug.h" @@ -528,42 +528,17 @@ void LLToolPie::selectionPropertiesReceived() BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) { - if (!mMouseOutsideSlop - && mMouseButtonDown - && gSavedSettings.getBOOL("ClickToWalk")) - { - S32 delta_x = x - mMouseDownX; - S32 delta_y = y - mMouseDownY; - S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold"); - if (delta_x * delta_x + delta_y * delta_y > threshold * threshold) - { - startCameraSteering(); - } - } - mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE); - - if (inCameraSteerMode()) - { - steerCameraWithMouse(x, y); - gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); - return TRUE; - } - - // perform a separate pick that detects transparent objects since they respond to 1-click actions - LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE); - - // Show screen-space highlight glow effect - bool show_highlight = false; LLViewerObject *parent = NULL; LLViewerObject *object = mHoverPick.getObject(); - if (object) { parent = object->getRootEdit(); } - LLViewerObject* click_action_object = click_action_pick.getObject(); + // Show screen-space highlight glow effect + bool show_highlight = false; + if (handleMediaHover(mHoverPick)) { // *NOTE: If you think the hover glow conflicts with the media outline, you @@ -572,37 +547,68 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) // cursor set by media object lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } - else if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit())) + else if (!mMouseOutsideSlop + && mMouseButtonDown + && gSavedSettings.getBOOL("ClickToWalk")) { - show_highlight = true; - ECursorType cursor = cursorFromObject(click_action_object); - gViewerWindow->setCursor(cursor); - lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + S32 delta_x = x - mMouseDownX; + S32 delta_y = y - mMouseDownY; + S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold"); + if (delta_x * delta_x + delta_y * delta_y > threshold * threshold) + { + startCameraSteering(); + steerCameraWithMouse(x, y); + gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); + } + else + { + gViewerWindow->setCursor(UI_CURSOR_ARROW); + } } - - else if ((object && !object->isAvatar() && object->usePhysics()) - || (parent && !parent->isAvatar() && parent->usePhysics())) + else if (inCameraSteerMode()) { - show_highlight = true; + steerCameraWithMouse(x, y); gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); - lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; - } - else if ( (object && object->flagHandleTouch()) - || (parent && parent->flagHandleTouch())) - { - show_highlight = true; - gViewerWindow->setCursor(UI_CURSOR_HAND); - lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } else { - gViewerWindow->setCursor(UI_CURSOR_ARROW); - lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + // perform a separate pick that detects transparent objects since they respond to 1-click actions + LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE); - if(!object) + LLViewerObject* click_action_object = click_action_pick.getObject(); + + if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit())) + { + show_highlight = true; + ECursorType cursor = cursorFromObject(click_action_object); + gViewerWindow->setCursor(cursor); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + } + + else if ((object && !object->isAvatar() && object->usePhysics()) + || (parent && !parent->isAvatar() && parent->usePhysics())) { - LLViewerMediaFocus::getInstance()->clearHover(); + show_highlight = true; + gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } + else if ( (object && object->flagHandleTouch()) + || (parent && parent->flagHandleTouch())) + { + show_highlight = true; + gViewerWindow->setCursor(UI_CURSOR_HAND); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + } + else + { + gViewerWindow->setCursor(UI_CURSOR_ARROW); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; + } + } + + if(!object) + { + LLViewerMediaFocus::getInstance()->clearHover(); } static LLCachedControl<bool> enable_highlight( @@ -633,6 +639,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) if (click_action == CLICK_ACTION_NONE // not doing 1-click action && gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled && !gAgent.getFlying() // don't auto-navigate while flying until that works + && !gAgentAvatarp->isSitting() && !mBlockClickToWalk // another behavior hasn't cancelled click to walk && !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick && (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land @@ -662,6 +669,8 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) mAutoPilotDestination->setDuration(3.f); handle_go_to(); + LLFirstUse::notMoving(false); + mBlockClickToWalk = false; return TRUE; @@ -679,6 +688,15 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) return LLTool::handleMouseUp(x, y, mask); } +void LLToolPie::stopClickToWalk() +{ + mPick.mPosGlobal = gAgent.getPositionGlobal(); + handle_go_to(); + if(mAutoPilotDestination) + { + mAutoPilotDestination->markDead(); + } +} BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) { @@ -1430,6 +1448,7 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick) { // Make sure keyboard focus is set to the media focus object. gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); + LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl(); media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(TRUE)); mMediaMouseCaptureID = mep->getMediaID(); @@ -1709,8 +1728,13 @@ void LLToolPie::showVisualContextMenuEffect() effectp->setDuration(0.25f); } +typedef enum e_near_far +{ + NEAR_INTERSECTION, + FAR_INTERSECTION +} ENearFar; -bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, LLVector3& intersection_pt) +bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, e_near_far near_far, LLVector3& intersection_pt) { // do ray/sphere intersection by solving quadratic equation LLVector3 sphere_to_ray_start_vec = ray_pt - sphere_center; @@ -1718,10 +1742,11 @@ bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_di F32 C = sphere_to_ray_start_vec.lengthSquared() - (sphere_radius * sphere_radius); F32 discriminant = B*B - 4.f*C; - if (discriminant > 0.f) + if (discriminant >= 0.f) { // intersection detected, now find closest one F32 t0 = (-B - sqrtf(discriminant)) / 2.f; - if (t0 > 0.f) + + if (t0 > 0.f && near_far == NEAR_INTERSECTION) { intersection_pt = ray_pt + ray_dir * t0; } @@ -1732,12 +1757,15 @@ bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_di } return true; } - - return false; + else + { // no intersection + return false; + } } void LLToolPie::startCameraSteering() { + LLFirstUse::notMoving(false); mMouseOutsideSlop = true; mBlockClickToWalk = true; @@ -1786,64 +1814,80 @@ void LLToolPie::startCameraSteering() void LLToolPie::steerCameraWithMouse(S32 x, S32 y) { - const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f; - + const LLViewerCamera& camera = LLViewerCamera::instance(); + const LLCoordFrame& rotation_frame = gAgent.getFrameAgent(); const LLVector3 pick_pos = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal); - const LLVector3 rotation_center = gAgent.getFrameAgent().getOrigin(); - // FIXME: get this to work with camera tilt (i.e. sitting on a rotating object) - const LLVector3 rotation_up_axis(LLVector3::z_axis); - - LLVector3 object_rotation_center = rotation_center + parallel_component(pick_pos - rotation_center, rotation_up_axis); - F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(rotation_center, LLViewerCamera::instance().getOrigin());; - F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, object_rotation_center), min_rotation_radius, F32_MAX); + const LLVector3 pick_rotation_center = rotation_frame.getOrigin() + parallel_component(pick_pos - rotation_frame.getOrigin(), rotation_frame.getUpAxis()); + const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f; + const F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(pick_rotation_center, camera.getOrigin());; + const F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, pick_rotation_center), min_rotation_radius, F32_MAX); + const LLVector3 camera_to_rotation_center = pick_rotation_center - camera.getOrigin(); + const LLVector3 adjusted_camera_pos = LLViewerCamera::instance().getOrigin() + projected_vec(camera_to_rotation_center, rotation_frame.getUpAxis()); + const F32 camera_distance_from_rotation_center = dist_vec(adjusted_camera_pos, pick_rotation_center); - LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_up_axis); + LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_frame.getUpAxis()); mouse_ray.normalize(); - LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_up_axis); + LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_frame.getUpAxis()); old_mouse_ray.normalize(); - LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent(); - LLVector3 camera_to_rotation_center = object_rotation_center - camera_pos; - LLVector3 adjusted_camera_pos = camera_pos + projected_vec(camera_to_rotation_center, rotation_up_axis); - LLVector3 rotation_fwd_axis = LLViewerCamera::instance().getAtAxis() - projected_vec(LLViewerCamera::instance().getAtAxis(), rotation_up_axis); - rotation_fwd_axis.normalize(); - F32 pick_dist = dist_vec(pick_pos, adjusted_camera_pos); - + F32 yaw_angle; + F32 old_yaw_angle; LLVector3 mouse_on_sphere; - bool mouse_hit_sphere = intersect_ray_with_sphere(adjusted_camera_pos + (mouse_ray * pick_dist * 1.1f), - -1.f * mouse_ray, - object_rotation_center, - pick_distance_from_rotation_center, - mouse_on_sphere); - LLVector3 old_mouse_on_sphere; - intersect_ray_with_sphere(adjusted_camera_pos + (old_mouse_ray * pick_dist * 1.1f), - -1.f * old_mouse_ray, - object_rotation_center, - pick_distance_from_rotation_center, - old_mouse_on_sphere); - if (mouse_hit_sphere) + if (intersect_ray_with_sphere( + adjusted_camera_pos, + mouse_ray, + pick_rotation_center, + pick_distance_from_rotation_center, + FAR_INTERSECTION, + mouse_on_sphere)) { - // calculate rotation frame in screen space - LLVector3 screen_rotation_up_axis = orthogonal_component(rotation_up_axis, LLViewerCamera::instance().getAtAxis()); - screen_rotation_up_axis.normalize(); - - LLVector3 screen_rotation_left_axis = screen_rotation_up_axis % LLViewerCamera::instance().getAtAxis(); + LLVector3 mouse_sphere_offset = mouse_on_sphere - pick_rotation_center; + yaw_angle = atan2f(mouse_sphere_offset * rotation_frame.getLeftAxis(), mouse_sphere_offset * rotation_frame.getAtAxis()); + } + else + { + yaw_angle = F_PI_BY_TWO + asinf(pick_distance_from_rotation_center / camera_distance_from_rotation_center); + if (mouse_ray * rotation_frame.getLeftAxis() < 0.f) + { + yaw_angle *= -1.f; + } + } - LLVector3 rotation_furthest_pt = object_rotation_center + pick_distance_from_rotation_center * rotation_fwd_axis; - F32 mouse_lateral_distance = llclamp(((mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f); - F32 old_mouse_lateral_distance = llclamp(((old_mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f); + if (intersect_ray_with_sphere( + adjusted_camera_pos, + old_mouse_ray, + pick_rotation_center, + pick_distance_from_rotation_center, + FAR_INTERSECTION, + old_mouse_on_sphere)) + { + LLVector3 mouse_sphere_offset = old_mouse_on_sphere - pick_rotation_center; + old_yaw_angle = atan2f(mouse_sphere_offset * rotation_frame.getLeftAxis(), mouse_sphere_offset * rotation_frame.getAtAxis()); + } + else + { + old_yaw_angle = F_PI_BY_TWO + asinf(pick_distance_from_rotation_center / camera_distance_from_rotation_center); - F32 yaw_angle = asinf(mouse_lateral_distance); - F32 old_yaw_angle = asinf(old_mouse_lateral_distance); + if (mouse_ray * rotation_frame.getLeftAxis() < 0.f) + { + old_yaw_angle *= -1.f; + } + } - F32 delta_angle = yaw_angle - old_yaw_angle; - if (!mClockwise) delta_angle *= -1.f; + const F32 delta_angle = yaw_angle - old_yaw_angle; + if (mClockwise) + { gAgent.yaw(delta_angle); - mMouseSteerX = x; - mMouseSteerY = y; } + else + { + gAgent.yaw(-delta_angle); + } + + mMouseSteerX = x; + mMouseSteerY = y; } diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 22359a6db8..d7c79ee223 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -67,6 +67,7 @@ public: LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; } void resetSelection(); void blockClickToWalk() { mBlockClickToWalk = true; } + void stopClickToWalk(); static void selectionPropertiesReceived(); diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp index 4d6eac4958..6b2cd71d40 100644 --- a/indra/newview/lluilistener.cpp +++ b/indra/newview/lluilistener.cpp @@ -34,9 +34,11 @@ // std headers // external library headers // other Linden headers +#include "llui.h" // getRootView(), resolvePath() #include "lluictrl.h" #include "llerror.h" + LLUIListener::LLUIListener(): LLEventAPI("UI", "LLUICtrl::CommitCallbackRegistry listener.\n" @@ -47,6 +49,12 @@ LLUIListener::LLUIListener(): "as if from a user gesture on a menu -- or a button click.", &LLUIListener::call, LLSD().with("function", LLSD())); + + add("getValue", + "For the UI control identified by the path in [\"path\"], return the control's\n" + "current value as [\"value\"] reply.", + &LLUIListener::getValue, + LLSDMap("path", LLSD())("reply", LLSD())); } void LLUIListener::call(const LLSD& event) const @@ -71,3 +79,23 @@ void LLUIListener::call(const LLSD& event) const (*func)(NULL, event["parameter"]); } } + +void LLUIListener::getValue(const LLSD&event) const +{ + LLSD reply = LLSD::emptyMap(); + + const LLView* root = LLUI::getRootView(); + const LLView* view = LLUI::resolvePath(root, event["path"].asString()); + const LLUICtrl* ctrl(dynamic_cast<const LLUICtrl*>(view)); + + if (ctrl) + { + reply["value"] = ctrl->getValue(); + } + else + { + // *TODO: ??? return something indicating failure to resolve + } + + sendReply(reply, event); +} diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h index e7847f01e8..08724024dc 100644 --- a/indra/newview/lluilistener.h +++ b/indra/newview/lluilistener.h @@ -41,6 +41,7 @@ public: private: void call(const LLSD& event) const; + void getValue(const LLSD&event) const; }; #endif /* ! defined(LL_LLUILISTENER_H) */ diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index ebbb045f0a..ed4d278e90 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -53,6 +53,7 @@ class LLURLDispatcherImpl { public: static bool dispatch(const LLSLURL& slurl, + const std::string& nav_type, LLMediaCtrl* web, bool trusted_browser); // returns true if handled or explicitly blocked. @@ -61,6 +62,7 @@ public: private: static bool dispatchCore(const LLSLURL& slurl, + const std::string& nav_type, bool right_mouse, LLMediaCtrl* web, bool trusted_browser); @@ -71,6 +73,7 @@ private: // Returns true if handled. static bool dispatchApp(const LLSLURL& slurl, + const std::string& nav_type, bool right_mouse, LLMediaCtrl* web, bool trusted_browser); @@ -78,7 +81,7 @@ private: // by showing panel in Search floater. // Returns true if handled or explicitly blocked. - static bool dispatchRegion(const LLSLURL& slurl, bool right_mouse); + static bool dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse); // handles secondlife://Ahern/123/45/67/ // Returns true if handled. @@ -97,6 +100,7 @@ private: // static bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl, + const std::string& nav_type, bool right_mouse, LLMediaCtrl* web, bool trusted_browser) @@ -105,9 +109,9 @@ bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl, switch(slurl.getType()) { case LLSLURL::APP: - return dispatchApp(slurl, right_mouse, web, trusted_browser); + return dispatchApp(slurl, nav_type, right_mouse, web, trusted_browser); case LLSLURL::LOCATION: - return dispatchRegion(slurl, right_mouse); + return dispatchRegion(slurl, nav_type, right_mouse); default: return false; } @@ -122,11 +126,12 @@ bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl, // static bool LLURLDispatcherImpl::dispatch(const LLSLURL& slurl, + const std::string& nav_type, LLMediaCtrl* web, bool trusted_browser) { const bool right_click = false; - return dispatchCore(slurl, right_click, web, trusted_browser); + return dispatchCore(slurl, nav_type, right_click, web, trusted_browser); } // static @@ -135,11 +140,12 @@ bool LLURLDispatcherImpl::dispatchRightClick(const LLSLURL& slurl) const bool right_click = true; LLMediaCtrl* web = NULL; const bool trusted_browser = false; - return dispatchCore(slurl, right_click, web, trusted_browser); + return dispatchCore(slurl, "clicked", right_click, web, trusted_browser); } // static bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl, + const std::string& nav_type, bool right_mouse, LLMediaCtrl* web, bool trusted_browser) @@ -147,7 +153,7 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl, llinfos << "cmd: " << slurl.getAppCmd() << " path: " << slurl.getAppPath() << " query: " << slurl.getAppQuery() << llendl; const LLSD& query_map = LLURI::queryMap(slurl.getAppQuery()); bool handled = LLCommandDispatcher::dispatch( - slurl.getAppCmd(), slurl.getAppPath(), query_map, web, trusted_browser); + slurl.getAppCmd(), slurl.getAppPath(), query_map, web, nav_type, trusted_browser); // alert if we didn't handle this secondlife:///app/ SLURL // (but still return true because it is a valid app SLURL) @@ -159,7 +165,7 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl, } // static -bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse) +bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse) { if(slurl.getType() != LLSLURL::LOCATION) { @@ -287,10 +293,11 @@ LLTeleportHandler gTeleportHandler; // static bool LLURLDispatcher::dispatch(const std::string& slurl, + const std::string& nav_type, LLMediaCtrl* web, bool trusted_browser) { - return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser); + return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), nav_type, web, trusted_browser); } // static @@ -310,7 +317,7 @@ bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl) // *TODO: Make this trust model more refined. JC const bool trusted_browser = true; LLMediaCtrl* web = NULL; - return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser); + return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), "clicked", web, trusted_browser); } diff --git a/indra/newview/llurldispatcher.h b/indra/newview/llurldispatcher.h index b07db4da3f..6309a97af5 100644 --- a/indra/newview/llurldispatcher.h +++ b/indra/newview/llurldispatcher.h @@ -33,6 +33,7 @@ class LLURLDispatcher public: static bool dispatch(const std::string& slurl, + const std::string& nav_type, LLMediaCtrl* web, bool trusted_browser); // At startup time and on clicks in internal web browsers, @@ -41,6 +42,8 @@ public: // secondlife://RegionName/123/45/67/ // secondlife:///app/agent/3d6181b0-6a4b-97ef-18d8-722652995cf1/show // sl://app/foo/bar + // @param nav_type + // type of navigation type (see LLQtWebKit::LLWebPage::acceptNavigationRequest) // @param web // Pointer to LLMediaCtrl sending URL, can be NULL // @param trusted_browser diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp index d0441d7bfa..c7b9afafef 100644 --- a/indra/newview/llurldispatcherlistener.cpp +++ b/indra/newview/llurldispatcherlistener.cpp @@ -61,7 +61,7 @@ void LLURLDispatcherListener::dispatch(const LLSD& params) const // But for testing, allow a caller to specify untrusted. trusted_browser = params["trusted"].asBoolean(); } - LLURLDispatcher::dispatch(params["url"], NULL, trusted_browser); + LLURLDispatcher::dispatch(params["url"], "clicked", NULL, trusted_browser); } void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index 286b16bab2..e7a0d17c3a 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -36,6 +36,7 @@ #include "llinstantmessage.h" //SYSTEM_FROM // LLViewerChat +LLViewerChat::font_change_signal_t LLViewerChat::sChatFontChangedSignal; //static void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color) @@ -89,8 +90,9 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color) if (!chat.mPosAgent.isExactlyZero()) { LLVector3 pos_agent = gAgent.getPositionAgent(); - F32 distance = dist_vec(pos_agent, chat.mPosAgent); - if (distance > gAgent.getNearChatRadius()) + F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent); + F32 dist_near_chat = gAgent.getNearChatRadius(); + if (distance_squared > dist_near_chat * dist_near_chat) { // diminish far-off chat r_color.mV[VALPHA] = 0.8f; @@ -154,8 +156,9 @@ void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F if (!chat.mPosAgent.isExactlyZero()) { LLVector3 pos_agent = gAgent.getPositionAgent(); - F32 distance = dist_vec(pos_agent, chat.mPosAgent); - if (distance > gAgent.getNearChatRadius()) + F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent); + F32 dist_near_chat = gAgent.getNearChatRadius(); + if (distance_squared > dist_near_chat * dist_near_chat) { // diminish far-off chat r_color_alpha = 0.8f; @@ -256,3 +259,16 @@ std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args) return url; } + +//static +boost::signals2::connection LLViewerChat::setFontChangedCallback(const font_change_signal_t::slot_type& cb) +{ + return sChatFontChangedSignal.connect(cb); +} + +//static +void LLViewerChat::signalChatFontChanged() +{ + // Notify all observers that our font has changed + sChatFontChangedSignal(getChatFont()); +} diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h index 0f15d29f04..c05caf0a95 100644 --- a/indra/newview/llviewerchat.h +++ b/indra/newview/llviewerchat.h @@ -35,6 +35,8 @@ class LLViewerChat { public: + typedef boost::signals2::signal<void (LLFontGL*)> font_change_signal_t; + static void getChatColor(const LLChat& chat, LLColor4& r_color); static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha); static LLFontGL* getChatFont(); @@ -42,8 +44,12 @@ public: static void formatChatMsg(const LLChat& chat, std::string& formated_msg); static std::string getSenderSLURL(const LLChat& chat, const LLSD& args); + static boost::signals2::connection setFontChangedCallback(const font_change_signal_t::slot_type& cb); + static void signalChatFontChanged(); + private: static std::string getObjectImSLURL(const LLChat& chat, const LLSD& args); + static font_change_signal_t sChatFontChangedSignal; }; diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index ffe607f912..06c1520314 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -239,12 +239,6 @@ static bool handleVideoMemoryChanged(const LLSD& newvalue) return true; } -static bool handleBandwidthChanged(const LLSD& newvalue) -{ - gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal()); - return true; -} - static bool handleChatFontSizeChanged(const LLSD& newvalue) { if(gConsole) @@ -562,7 +556,6 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2)); gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _2)); gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _2)); - gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _2)); gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _2)); gSavedSettings.getControl("RenderFogRatio")->getSignal()->connect(boost::bind(&handleFogRatioChanged, _2)); gSavedSettings.getControl("RenderMaxPartCount")->getSignal()->connect(boost::bind(&handleMaxPartCountChanged, _2)); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 41b7c13826..8593c4cf79 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -115,8 +115,7 @@ void display_startup() { if ( !gViewerWindow->getActive() || !gViewerWindow->mWindow->getVisible() - || gViewerWindow->mWindow->getMinimized() - || gNoRender ) + || gViewerWindow->mWindow->getMinimized() ) { return; } @@ -294,7 +293,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // Logic for forcing window updates if we're in drone mode. // - if (gNoRender) + // *TODO: Investigate running display() during gHeadlessClient. See if this early exit is needed DK 2011-02-18 + if (gHeadlessClient) { #if LL_WINDOWS static F32 last_update_time = 0.f; @@ -1066,8 +1066,8 @@ bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::mat F32 scale_y = (F32)gViewerWindow->getWorldViewHeightScaled() / (F32)screen_region.getHeight(); mat.set_scale(glh::vec3f(scale_x, scale_y, 1.f)); mat.set_translate( - glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), - clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y), + glh::vec3f(clamp_rescale((F32)(screen_region.getCenterX() - screen_region.mLeft), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), + clamp_rescale((F32)(screen_region.getCenterY() - screen_region.mBottom), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y), 0.f)); proj *= mat; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index dca1e33e60..6dc85799ce 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -91,6 +91,7 @@ #include "llfloatersettingsdebug.h" #include "llfloatersidetraytab.h" #include "llfloatersnapshot.h" +#include "llfloatersounddevices.h" #include "llfloatertelehub.h" #include "llfloatertestinspectors.h" #include "llfloatertestlistview.h" @@ -239,6 +240,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater); LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>); LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>); + LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>); LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>); LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>); LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 519514d99c..9e58acdcd3 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -183,6 +183,12 @@ public: return false; } + if (!LLUI::sSettingGroups["config"]->getBOOL("EnableInventory")) + { + LLNotificationsUtil::add("NoInventory", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + // support secondlife:///app/inventory/show if (params[0].asString() == "show") { @@ -1450,6 +1456,9 @@ private: void saveFavoritesSLURLs(); + // Remove record of current user's favorites from file on disk. + void removeFavoritesRecordOfUser(); + void onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark); void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl); @@ -1534,6 +1543,10 @@ void LLFavoritesOrderStorage::destroyClass() { LLFavoritesOrderStorage::instance().saveFavoritesSLURLs(); } + else + { + LLFavoritesOrderStorage::instance().removeFavoritesRecordOfUser(); + } } void LLFavoritesOrderStorage::load() @@ -1602,6 +1615,28 @@ void LLFavoritesOrderStorage::saveFavoritesSLURLs() LLSDSerialize::toPrettyXML(fav_llsd, file); } +void LLFavoritesOrderStorage::removeFavoritesRecordOfUser() +{ + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); + LLSD fav_llsd; + llifstream file; + file.open(filename); + if (!file.is_open()) return; + LLSDSerialize::fromXML(fav_llsd, file); + + LLAvatarName av_name; + LLAvatarNameCache::get( gAgentID, &av_name ); + if (fav_llsd.has(av_name.getLegacyName())) + { + fav_llsd.erase(av_name.getLegacyName()); + } + + llofstream out_file; + out_file.open(filename); + LLSDSerialize::toPrettyXML(fav_llsd, out_file); + +} + void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark) { if (!landmark) return; diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 499165135a..037e22584f 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2543,23 +2543,7 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask) // Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it... if( MASK_CONTROL & mask ) { - if( 'C' == key ) - { - mMediaSource->copy(); - result = true; - } - else - if( 'V' == key ) - { - mMediaSource->paste(); - result = true; - } - else - if( 'X' == key ) - { - mMediaSource->cut(); - result = true; - } + result = true; } if(!result) @@ -3000,7 +2984,8 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla { LL_DEBUGS("Media") << "MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is: " << plugin->getClickURL() << LL_ENDL; std::string url = plugin->getClickURL(); - LLURLDispatcher::dispatch(url, NULL, mTrustedBrowser); + std::string nav_type = plugin->getClickNavType(); + LLURLDispatcher::dispatch(url, nav_type, NULL, mTrustedBrowser); } break; case MEDIA_EVENT_CLICK_LINK_HREF: diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index de52aa17d1..4543a1ba9a 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -113,6 +113,11 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac media_impl->focus(true); gFocusMgr.setKeyboardFocus(this); + LLViewerMediaImpl* impl = getFocusedMediaImpl(); + if (impl) + { + LLEditMenuHandler::gEditMenuHandler = impl; + } // We must do this before processing the media HUD zoom, or it may zoom to the wrong face. update(); @@ -139,6 +144,13 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac { gFocusMgr.setKeyboardFocus(NULL); } + + LLViewerMediaImpl* impl = getFocusedMediaImpl(); + if (LLEditMenuHandler::gEditMenuHandler == impl) + { + LLEditMenuHandler::gEditMenuHandler = NULL; + } + mFocusedImplID = LLUUID::null; if (objectp.notNull()) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index bd46ee1b67..d958551a0a 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -856,40 +856,36 @@ void toggle_destination_and_avatar_picker(const LLSD& show) LLButton* avatar_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("avatar_btn"); LLButton* destination_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("destination_btn"); - switch(panel_idx) - { - case 0: - if (!destinations->getVisible()) - { - container->setVisible(true); - destinations->setVisible(true); - avatar_picker->setVisible(false); - LLFirstUse::notUsingDestinationGuide(false); - avatar_btn->setToggleState(false); - destination_btn->setToggleState(true); - return; - } - break; - case 1: - if (!avatar_picker->getVisible()) - { - container->setVisible(true); - destinations->setVisible(false); - avatar_picker->setVisible(true); - avatar_btn->setToggleState(true); - destination_btn->setToggleState(false); - return; - } - break; - default: - break; + if (panel_idx == 0 + && !destinations->getVisible()) + { // opening destinations guide + container->setVisible(true); + destinations->setVisible(true); + avatar_picker->setVisible(false); + LLFirstUse::notUsingDestinationGuide(false); + avatar_btn->setToggleState(false); + destination_btn->setToggleState(true); + gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 0); + } + else if (panel_idx == 1 + && !avatar_picker->getVisible()) + { // opening avatar picker + container->setVisible(true); + destinations->setVisible(false); + avatar_picker->setVisible(true); + avatar_btn->setToggleState(true); + destination_btn->setToggleState(false); + gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 1); + } + else + { // toggling off dest guide or avatar picker + container->setVisible(false); + destinations->setVisible(false); + avatar_picker->setVisible(false); + avatar_btn->setToggleState(false); + destination_btn->setToggleState(false); + gSavedSettings.setS32("DestinationsAndAvatarsVisibility", -1); } - - container->setVisible(false); - destinations->setVisible(false); - avatar_picker->setVisible(false); - avatar_btn->setToggleState(false); - destination_btn->setToggleState(false); }; @@ -5595,6 +5591,14 @@ class LLToggleHelp : public view_listener_t } }; +class LLToggleSpeak : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLVoiceClient::getInstance()->toggleUserPTTState(); + return true; + } +}; class LLShowSidetrayPanel : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -6416,12 +6420,12 @@ class LLToolsSelectedScriptAction : public view_listener_t else if (action == "start") { name = "start_queue"; - msg = "Running"; + msg = "SetRunning"; } else if (action == "stop") { name = "stop_queue"; - msg = "RunningNot"; + msg = "SetRunningNot"; } LLUUID id; id.generate(); @@ -8191,6 +8195,7 @@ void initialize_menus() commit.add("BuyCurrency", boost::bind(&handle_buy_currency)); view_listener_t::addMenu(new LLShowHelp(), "ShowHelp"); view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp"); + view_listener_t::addMenu(new LLToggleSpeak(), "ToggleSpeak"); view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL"); view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile"); view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile"); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index fda291f3c1..2cf8dbec89 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -493,6 +493,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, LLSD args; std::string exten = gDirUtilp->getExtension(src_filename); + U32 codec = LLImageBase::getCodecFromExtension(exten); LLAssetType::EType asset_type = LLAssetType::AT_NONE; std::string error_message; @@ -510,66 +511,20 @@ void upload_new_resource(const std::string& src_filename, std::string name, upload_error(error_message, "NoFileExtension", filename, args); return; } - else if( exten == "bmp") + else if (codec != IMG_CODEC_INVALID) { + // It's an image file, the upload procedure is the same for all asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_BMP )) + if (!LLViewerTextureList::createUploadFile(src_filename, filename, codec )) { error_message = llformat( "Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); + src_filename.c_str(), LLImage::getLastError().c_str()); args["FILE"] = src_filename; args["ERROR"] = LLImage::getLastError(); upload_error(error_message, "ProblemWithFile", filename, args); return; } } - else if( exten == "tga") - { - asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_TGA )) - { - error_message = llformat("Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); - args["FILE"] = src_filename; - args["ERROR"] = LLImage::getLastError(); - upload_error(error_message, "ProblemWithFile", filename, args); - return; - } - } - else if( exten == "jpg" || exten == "jpeg") - { - asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_JPEG )) - { - error_message = llformat("Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); - args["FILE"] = src_filename; - args["ERROR"] = LLImage::getLastError(); - upload_error(error_message, "ProblemWithFile", filename, args); - return; - } - } - else if( exten == "png") - { - asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_PNG )) - { - error_message = llformat("Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); - args["FILE"] = src_filename; - args["ERROR"] = LLImage::getLastError(); - upload_error(error_message, "ProblemWithFile", filename, args); - return; - } - } else if(exten == "wav") { asset_type = LLAssetType::AT_SOUND; // tag it as audio diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 8b52d478e6..0b8e5cf303 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -122,6 +122,7 @@ // const F32 BIRD_AUDIBLE_RADIUS = 32.0f; const F32 SIT_DISTANCE_FROM_TARGET = 0.25f; +const F32 CAMERA_POSITION_THRESHOLD_SQUARED = 0.001f * 0.001f; static const F32 LOGOUT_REPLY_TIME = 3.f; // Wait this long after LogoutReply before quitting. // Determine how quickly residents' scripts can issue question dialogs @@ -343,12 +344,11 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data) { LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender()); - if (!regionp || gNoRender) + if(!regionp) { + llwarns << "Invalid region for layer data." << llendl; return; } - - S32 size; S8 type; @@ -2168,10 +2168,6 @@ void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string m void process_improved_im(LLMessageSystem *msg, void **user_data) { - if (gNoRender) - { - return; - } LLUUID from_id; BOOL from_group; LLUUID to_id; @@ -3960,7 +3956,9 @@ void send_agent_update(BOOL force_send, BOOL send_reliable) // LBUTTON and ML_LBUTTON so that using the camera (alt-key) doesn't // trigger a control event. U32 control_flags = gAgent.getControlFlags(); + MASK key_mask = gKeyboard->currentMask(TRUE); + if (key_mask & MASK_ALT || key_mask & MASK_CONTROL) { control_flags &= ~( AGENT_CONTROL_LBUTTON_DOWN | @@ -4279,7 +4277,7 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data) gSky.setSunPhase(phase); gSky.setSunTargetDirection(sun_direction, sun_ang_velocity); - if (!gNoRender && !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun())) + if ( !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun()) ) { gSky.setSunDirection(sun_direction, sun_ang_velocity); } @@ -4753,7 +4751,7 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) BOOL force_mouselook; mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_ForceMouselook, force_mouselook); - if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > 0.0001f) + if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > CAMERA_POSITION_THRESHOLD_SQUARED) { gAgentCamera.setSitCamera(sitObjectID, camera_eye, camera_at); } @@ -5529,10 +5527,19 @@ void process_alert_core(const std::string& message, BOOL modal) } else { - LLSD args; - std::string new_msg =LLNotifications::instance().getGlobalString(message); - args["MESSAGE"] = new_msg; - LLNotificationsUtil::add("SystemMessageTip", args); + // Hack fix for EXP-623 (blame fix on RN :)) to avoid a sim deploy + const std::string AUTOPILOT_CANCELED_MSG("Autopilot canceled"); + if (message.find(AUTOPILOT_CANCELED_MSG) == std::string::npos ) + { + LLSD args; + std::string new_msg =LLNotifications::instance().getGlobalString(message); + + std::string localized_msg; + bool is_message_localized = LLTrans::findString(localized_msg, new_msg); + + args["MESSAGE"] = is_message_localized ? localized_msg : new_msg; + LLNotificationsUtil::add("SystemMessageTip", args); + } } } @@ -5541,21 +5548,12 @@ time_t gLastDisplayedTime = 0; void handle_show_mean_events(void *) { - if (gNoRender) - { - return; - } LLFloaterReg::showInstance("bumps"); //LLFloaterBump::showInstance(); } void mean_name_callback(const LLUUID &id, const std::string& full_name, bool is_group) { - if (gNoRender) - { - return; - } - static const U32 max_collision_list_size = 20; if (gMeanCollisionList.size() > max_collision_list_size) { @@ -6478,9 +6476,12 @@ void process_script_dialog(LLMessageSystem* msg, void**) LLSD payload; LLUUID object_id; + LLUUID owner_id; + msg->getUUID("Data", "ObjectID", object_id); + msg->getUUID("OwnerData", "OwnerID", owner_id); - if (LLMuteList::getInstance()->isMuted(object_id)) + if (LLMuteList::getInstance()->isMuted(object_id) || LLMuteList::getInstance()->isMuted(owner_id)) { return; } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 32cd8dbb39..e8828e63a9 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -469,11 +469,6 @@ void LLViewerObject::initVOClasses() // Initialized shared class stuff first. LLVOAvatar::initClass(); LLVOTree::initClass(); - if (gNoRender) - { - // Don't init anything else in drone mode - return; - } llinfos << "Viewer Object size: " << sizeof(LLViewerObject) << llendl; LLVOGrass::initClass(); LLVOWater::initClass(); @@ -2150,12 +2145,6 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) } } - if (gNoRender) - { - // Skip drawable stuff if not rendering. - return TRUE; - } - updateDrawable(FALSE); return TRUE; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 979d91cfcb..da95bacc41 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -636,19 +636,16 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) } - if (!gNoRender) + // Slam priorities for textures that we care about (hovered, selected, and focused) + // Hovered + // Assumes only one level deep of parenting + LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode(); + if (nodep) { - // Slam priorities for textures that we care about (hovered, selected, and focused) - // Hovered - // Assumes only one level deep of parenting - LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode(); - if (nodep) + objectp = nodep->getObject(); + if (objectp) { - objectp = nodep->getObject(); - if (objectp) - { - objectp->boostTexturePriority(); - } + objectp->boostTexturePriority(); } } @@ -1100,7 +1097,7 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset) // We need to update many object caches, I'll document this more as I dig through the code // cleaning things out... - if (gNoRender || 0 == offset.magVecSquared()) + if (0 == offset.magVecSquared()) { return; } @@ -1568,11 +1565,6 @@ void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port) { - if (gNoRender) - { - return; - } - if (objectp->isDead()) { llwarns << "Trying to find orphans for dead obj " << objectp->mID diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 40f0b43313..dfa35edef4 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -539,6 +539,12 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent }; break; + case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE" << LL_ENDL; + }; + break; + case MEDIA_EVENT_CLICK_LINK_HREF: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL; diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index fccd1156d3..e84e4a859a 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1383,11 +1383,6 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos) // static void LLViewerParcelMgr::processParcelOverlay(LLMessageSystem *msg, void **user) { - if (gNoRender) - { - return; - } - // Extract the packed overlay information S32 packed_overlay_size = msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_Data); diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index d07e06f6a7..26765bdd01 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -833,7 +833,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines () U8* colorp; bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build"); - const F32 PROPERTY_LINE_CLIP_DIST = 256.f; + const F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f; for (i = 0; i < mVertexCount; i += vertex_per_edge) { @@ -844,7 +844,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines () vertex.mV[VY] = *(vertexp+1); vertex.mV[VZ] = *(vertexp+2); - if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST*PROPERTY_LINE_CLIP_DIST) + if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST_SQUARED) { continue; } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index e1d3e8a0b3..c53fdc3393 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -73,8 +73,6 @@ #pragma warning(disable:4355) #endif -extern BOOL gNoRender; - const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region const S16 MAX_MAP_DIST = 10; @@ -111,7 +109,7 @@ public: } // Process the SLapp as if it was a secondlife://{PLACE} SLurl - LLURLDispatcher::dispatch(url, web, true); + LLURLDispatcher::dispatch(url, "clicked", web, true); return true; } }; @@ -235,28 +233,19 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, updateRenderMatrix(); mLandp = new LLSurface('l', NULL); - if (!gNoRender) - { - // Create the composition layer for the surface - mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge); - mCompositionp->setSurface(mLandp); - - // Create the surfaces - mLandp->setRegion(this); - mLandp->create(grids_per_region_edge, - grids_per_patch_edge, - mOriginGlobal, - mWidth); - } - if (!gNoRender) - { - mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters); - } - else - { - mParcelOverlay = NULL; - } + // Create the composition layer for the surface + mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge); + mCompositionp->setSurface(mLandp); + + // Create the surfaces + mLandp->setRegion(this); + mLandp->create(grids_per_region_edge, + grids_per_patch_edge, + mOriginGlobal, + mWidth); + + mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters); setOriginGlobal(from_region_handle(handle)); calculateCenterGlobal(); diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 874519a59f..fa60e572ac 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -711,7 +711,7 @@ void send_stats() // but that day is not today. // Only send stats if the agent is connected to a region. - if (!gAgent.getRegion() || gNoRender) + if (!gAgent.getRegion()) { return; } diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index cf7f3f80ad..f5fb074992 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1415,63 +1415,61 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) // mRawImage->getWidth(), mRawImage->getHeight(),mRawImage->getDataSize()) // << mID.getString() << llendl; BOOL res = TRUE; - if (!gNoRender) - { - // store original size only for locally-sourced images - if (mUrl.compare(0, 7, "file://") == 0) - { - mOrigWidth = mRawImage->getWidth(); - mOrigHeight = mRawImage->getHeight(); - // leave black border, do not scale image content - mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); - - mFullWidth = mRawImage->getWidth(); - mFullHeight = mRawImage->getHeight(); - setTexelsPerImage(); - } - else - { - mOrigWidth = mFullWidth; - mOrigHeight = mFullHeight; - } + // store original size only for locally-sourced images + if (mUrl.compare(0, 7, "file://") == 0) + { + mOrigWidth = mRawImage->getWidth(); + mOrigHeight = mRawImage->getHeight(); - bool size_okay = true; + // leave black border, do not scale image content + mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); - U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel; - U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel; - if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE ) - { - llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl; - size_okay = false; - } - - if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) - { - // A non power-of-two image was uploaded (through a non standard client) - llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl; - size_okay = false; - } - - if( !size_okay ) - { - // An inappropriately-sized image was uploaded (through a non standard client) - // We treat these images as missing assets which causes them to - // be renderd as 'missing image' and to stop requesting data - setIsMissingAsset(); - destroyRawImage(); - return FALSE; - } - - if(!(res = insertToAtlas())) - { - res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); - resetFaceAtlas() ; - } - setActive() ; + mFullWidth = mRawImage->getWidth(); + mFullHeight = mRawImage->getHeight(); + setTexelsPerImage(); + } + else + { + mOrigWidth = mFullWidth; + mOrigHeight = mFullHeight; + } + + bool size_okay = true; + + U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel; + U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel; + if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE ) + { + llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl; + size_okay = false; + } + + if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) + { + // A non power-of-two image was uploaded (through a non standard client) + llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl; + size_okay = false; + } + + if( !size_okay ) + { + // An inappropriately-sized image was uploaded (through a non standard client) + // We treat these images as missing assets which causes them to + // be renderd as 'missing image' and to stop requesting data + setIsMissingAsset(); + destroyRawImage(); + return FALSE; + } + + if(!(res = insertToAtlas())) + { + res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); + resetFaceAtlas() ; } + setActive() ; - if (!mForceToSaveRawImage) + if (!needsToSaveRawImage()) { mNeedsAux = FALSE; destroyRawImage(); diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 10126219f8..5afed721ac 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -91,11 +91,6 @@ void LLViewerTextureList::init() sNumImages = 0; mMaxResidentTexMemInMegaBytes = 0; mMaxTotalTextureMemInMegaBytes = 0 ; - if (gNoRender) - { - // Don't initialize GL stuff if we're not rendering. - return; - } mUpdateStats = TRUE; @@ -345,13 +340,6 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& LLGLenum primary_format, const LLUUID& force_id) { - if (gNoRender) - { - // Never mind that this ignores image_set_id; - // getImage() will handle that later. - return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); - } - // generate UUID based on hash of filename LLUUID new_id; if (force_id.notNull()) @@ -741,7 +729,7 @@ static LLFastTimer::DeclareTimer FTM_IMAGE_CREATE("Create Images"); F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time) { - if (gNoRender || gGLManager.mIsDisabled) return 0.0f; + if (gGLManager.mIsDisabled) return 0.0f; // // Create GL textures for all textures that need them (images which have been @@ -876,7 +864,6 @@ void LLViewerTextureList::updateImagesUpdateStats() void LLViewerTextureList::decodeAllImages(F32 max_time) { LLTimer timer; - if(gNoRender) return; // Update texture stats and priorities std::vector<LLPointer<LLViewerFetchedTexture> > image_list; @@ -940,99 +927,43 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) BOOL LLViewerTextureList::createUploadFile(const std::string& filename, const std::string& out_filename, const U8 codec) -{ - // First, load the image. +{ + // Load the image + LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec); + if (image.isNull()) + { + return FALSE; + } + if (!image->load(filename)) + { + return FALSE; + } + // Decompress or expand it in a raw image structure LLPointer<LLImageRaw> raw_image = new LLImageRaw; - - switch (codec) + if (!image->decode(raw_image, 0.0f)) { - case IMG_CODEC_BMP: - { - LLPointer<LLImageBMP> bmp_image = new LLImageBMP; - - if (!bmp_image->load(filename)) - { - return FALSE; - } - - if (!bmp_image->decode(raw_image, 0.0f)) - { - return FALSE; - } - } - break; - case IMG_CODEC_TGA: - { - LLPointer<LLImageTGA> tga_image = new LLImageTGA; - - if (!tga_image->load(filename)) - { - return FALSE; - } - - if (!tga_image->decode(raw_image)) - { - return FALSE; - } - - if( (tga_image->getComponents() != 3) && - (tga_image->getComponents() != 4) ) - { - tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." ); - return FALSE; - } - } - break; - case IMG_CODEC_JPEG: - { - LLPointer<LLImageJPEG> jpeg_image = new LLImageJPEG; - - if (!jpeg_image->load(filename)) - { - return FALSE; - } - - if (!jpeg_image->decode(raw_image, 0.0f)) - { - return FALSE; - } - } - break; - case IMG_CODEC_PNG: - { - LLPointer<LLImagePNG> png_image = new LLImagePNG; - - if (!png_image->load(filename)) - { - return FALSE; - } - - if (!png_image->decode(raw_image, 0.0f)) - { - return FALSE; - } - } - break; - default: - return FALSE; + return FALSE; } - - LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image); - - if( !compressedImage->save(out_filename) ) + // Check the image constraints + if ((image->getComponents() != 3) && (image->getComponents() != 4)) { - llinfos << "Couldn't create output file " << out_filename << llendl; + image->setLastError("Image files with less than 3 or more than 4 components are not supported."); return FALSE; } - - // test to see if the encode and save worked. + // Convert to j2c (JPEG2000) and save the file locally + LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image); + if (!compressedImage->save(out_filename)) + { + llinfos << "Couldn't create output file : " << out_filename << llendl; + return FALSE; + } + // Test to see if the encode and save worked LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; - if( !integrity_test->loadAndValidate( out_filename ) ) + if (!integrity_test->loadAndValidate( out_filename )) { - llinfos << "Image: " << out_filename << " is corrupt." << llendl; + llinfos << "Image file : " << out_filename << " is corrupt" << llendl; return FALSE; } - return TRUE; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8e049e76df..e020296842 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -925,7 +925,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi { if (drop) { - LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), NULL, true ); + LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), "clicked", NULL, true ); return LLWindowCallbacks::DND_MOVE; } return LLWindowCallbacks::DND_COPY; @@ -1251,8 +1251,9 @@ void LLViewerWindow::handleMenuSelect(LLWindow *window, S32 menu_item) BOOL LLViewerWindow::handlePaint(LLWindow *window, S32 x, S32 y, S32 width, S32 height) { + // *TODO: Enable similar information output for other platforms? DK 2011-02-18 #if LL_WINDOWS - if (gNoRender) + if (gHeadlessClient) { HWND window_handle = (HWND)window->getPlatformWindow(); PAINTSTRUCT ps; @@ -1282,7 +1283,7 @@ BOOL LLViewerWindow::handlePaint(LLWindow *window, S32 x, S32 y, S32 width, S len = temp_str.length(); TextOutA(hdc, 0, 25, temp_str.c_str(), len); - TextOutA(hdc, 0, 50, "Set \"DisableRendering FALSE\" in settings.ini file to reenable", 61); + TextOutA(hdc, 0, 50, "Set \"HeadlessClient FALSE\" in settings.ini file to reenable", 61); EndPaint(window_handle, &ps); return TRUE; } @@ -1316,7 +1317,8 @@ void LLViewerWindow::handleDataCopy(LLWindow *window, S32 data_type, void *data) std::string url = (const char*)data; LLMediaCtrl* web = NULL; const bool trusted_browser = false; - if (LLURLDispatcher::dispatch(url, web, trusted_browser)) + // don't treat slapps coming from external browsers as "clicks" as this would bypass throttling + if (LLURLDispatcher::dispatch(url, "", web, trusted_browser)) { // bring window to foreground, as it has just been "launched" from a URL mWindow->bringToFront(); @@ -1430,9 +1432,9 @@ LLViewerWindow::LLViewerWindow( mWindow = LLWindowManager::createWindow(this, title, name, x, y, width, height, 0, fullscreen, - gNoRender, + gHeadlessClient, gSavedSettings.getBOOL("DisableVerticalSync"), - !gNoRender, + !gHeadlessClient, ignore_pixel_depth, gSavedSettings.getBOOL("RenderUseFBO") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled @@ -1801,19 +1803,18 @@ void LLViewerWindow::initWorldUI() LLMediaCtrl* avatar_picker = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("avatar_picker_contents"); if (destinations) { + destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); destinations->navigateTo(gSavedSettings.getString("DestinationGuideURL"), "text/html"); } if (avatar_picker) { + avatar_picker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html"); } - if (gSavedSettings.getBOOL("FirstLoginThisInstall")) - { - toggle_destination_and_avatar_picker(0); - gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE); - } + // show destinations by default + toggle_destination_and_avatar_picker(gSavedSettings.getS32("DestinationsAndAvatarsVisibility")); } // Destroy the UI @@ -1895,11 +1896,8 @@ void LLViewerWindow::shutdownGL() LLVertexBuffer::cleanupClass(); llinfos << "Stopping GL during shutdown" << llendl; - if (!gNoRender) - { - stopGL(FALSE); - stop_glerror(); - } + stopGL(FALSE); + stop_glerror(); gGL.shutdown(); } @@ -1963,11 +1961,6 @@ void LLViewerWindow::reshape(S32 width, S32 height) // may have been destructed. if (!LLApp::isExiting()) { - if (gNoRender) - { - return; - } - gWindowResized = TRUE; // update our window rectangle @@ -2604,12 +2597,8 @@ void LLViewerWindow::updateUI() S32 x = mCurrentMousePoint.mX; S32 y = mCurrentMousePoint.mY; - MASK mask = gKeyboard->currentMask(TRUE); - if (gNoRender) - { - return; - } + MASK mask = gKeyboard->currentMask(TRUE); if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST)) { @@ -3000,7 +2989,8 @@ void LLViewerWindow::updateLayout() } // Update the location of the blue box tool popup LLCoordGL select_center_screen; - gFloaterTools->updatePopup( select_center_screen, gKeyboard->currentMask(TRUE) ); + MASK mask = gKeyboard->currentMask(TRUE); + gFloaterTools->updatePopup( select_center_screen, mask ); } else { @@ -3126,7 +3116,8 @@ void LLViewerWindow::updateKeyboardFocus() // sync all floaters with their focus state gFloaterView->highlightFocusedFloater(); gSnapshotFloaterView->highlightFocusedFloater(); - if ((gKeyboard->currentMask(TRUE) & MASK_CONTROL) == 0) + MASK mask = gKeyboard->currentMask(TRUE); + if ((mask & MASK_CONTROL) == 0) { // control key no longer held down, finish cycle mode gFloaterView->setCycleMode(FALSE); @@ -3439,11 +3430,6 @@ BOOL LLViewerWindow::clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewe void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent) { - if (gNoRender) - { - return; - } - BOOL in_build_mode = LLFloaterReg::instanceVisible("build"); if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha) { @@ -3479,11 +3465,6 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info) void LLViewerWindow::performPick() { - if (gNoRender) - { - return; - } - if (!mPicks.empty()) { std::vector<LLPickInfo>::iterator pick_it; @@ -3515,11 +3496,6 @@ void LLViewerWindow::returnEmptyPicks() // Performs the GL object/land pick. LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_transparent) { - if (gNoRender) - { - return LLPickInfo(); - } - BOOL in_build_mode = LLFloaterReg::instanceVisible("build"); if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha) { @@ -3529,7 +3505,8 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_trans } // shortcut queueing in mPicks and just update mLastPick in place - mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), gKeyboard->currentMask(TRUE), pick_transparent, TRUE, NULL); + MASK key_mask = gKeyboard->currentMask(TRUE); + mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, TRUE, NULL); mLastPick.fetchResults(); return mLastPick; @@ -3991,7 +3968,9 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p return rawSnapshot(raw, preview_width, preview_height, FALSE, FALSE, show_ui, do_rebuild, type); } -// Saves the image from the screen to the specified filename and path. +// Saves the image from the screen to a raw image +// Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy +// the results over to the final raw image. BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size) { @@ -4009,8 +3988,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // Hide all the UI widgets first and draw a frame BOOL prev_draw_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI) ? TRUE : FALSE; - show_ui = show_ui ? TRUE : FALSE; - if ( prev_draw_ui != show_ui) { LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI); @@ -4030,55 +4007,49 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // from window LLRect window_rect = show_ui ? getWindowRectRaw() : getWorldViewRectRaw(); - S32 snapshot_width = window_rect.getWidth(); + S32 snapshot_width = window_rect.getWidth(); S32 snapshot_height = window_rect.getHeight(); // SNAPSHOT - S32 window_width = snapshot_width; + S32 window_width = snapshot_width; S32 window_height = snapshot_height; + // Note: Scaling of the UI is currently *not* supported so we limit the output size if UI is requested if (show_ui) { - image_width = llmin(image_width, window_width); + // If the user wants the UI, limit the output size to the available screen size + image_width = llmin(image_width, window_width); image_height = llmin(image_height, window_height); } F32 scale_factor = 1.0f ; - if(!keep_window_aspect) //image cropping - { + if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height)) + { + // if image cropping or need to enlarge the scene, compute a scale_factor F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; - snapshot_width = (S32)(ratio * image_width) ; + snapshot_width = (S32)(ratio * image_width) ; snapshot_height = (S32)(ratio * image_height) ; scale_factor = llmax(1.0f, 1.0f / ratio) ; } - else //the scene(window) proportion needs to be maintained. - { - if(image_width > window_width || image_height > window_height) //need to enlarge the scene - { - F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; - snapshot_width = (S32)(ratio * image_width) ; - snapshot_height = (S32)(ratio * image_height) ; - scale_factor = llmax(1.0f, 1.0f / ratio) ; - } - } if (show_ui && scale_factor > 1.f) { + // Note: we should never get there... llwarns << "over scaling UI not supported." << llendl; } - S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f); + S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f); S32 buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f); - S32 image_buffer_x = llfloor(snapshot_width*scale_factor) ; - S32 image_buffer_y = llfloor(snapshot_height *scale_factor) ; + S32 image_buffer_x = llfloor(snapshot_width * scale_factor) ; + S32 image_buffer_y = llfloor(snapshot_height * scale_factor) ; - if(image_buffer_x > max_size || image_buffer_y > max_size) //boundary check to avoid memory overflow + if ((image_buffer_x > max_size) || (image_buffer_y > max_size)) // boundary check to avoid memory overflow { scale_factor *= llmin((F32)max_size / image_buffer_x, (F32)max_size / image_buffer_y) ; - image_buffer_x = llfloor(snapshot_width*scale_factor) ; - image_buffer_y = llfloor(snapshot_height *scale_factor) ; + image_buffer_x = llfloor(snapshot_width * scale_factor) ; + image_buffer_y = llfloor(snapshot_height * scale_factor) ; } - if(image_buffer_x > 0 && image_buffer_y > 0) + if ((image_buffer_x > 0) && (image_buffer_y > 0)) { raw->resize(image_buffer_x, image_buffer_y, 3); } @@ -4086,7 +4057,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { return FALSE ; } - if(raw->isBufferInvalid()) + if (raw->isBufferInvalid()) { return FALSE ; } @@ -4094,6 +4065,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei BOOL high_res = scale_factor >= 2.f; // Font scaling is slow, only do so if rez is much higher if (high_res && show_ui) { + // Note: we should never get there... llwarns << "High res UI snapshot not supported. " << llendl; /*send_agent_pause(); //rescale fonts @@ -4108,6 +4080,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei gObjectList.generatePickList(*LLViewerCamera::getInstance()); + // Subimages are in fact partial rendering of the final view. This happens when the final view is bigger than the screen. + // In most common cases, scale_factor is 1 and there's no more than 1 iteration on x and y for (int subimage_y = 0; subimage_y < scale_factor; ++subimage_y) { S32 subimage_y_offset = llclamp(buffer_y_offset - (subimage_y * window_height), 0, window_height);; @@ -4121,69 +4095,70 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei gDisplaySwapBuffers = FALSE; gDepthDirty = TRUE; - const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor)); - - if (LLPipeline::sRenderDeferred) - { - display(do_rebuild, scale_factor, subfield, TRUE); - } - else - { - display(do_rebuild, scale_factor, subfield, TRUE); - // Required for showing the GUI in snapshots and performing bloom composite overlay - // Call even if show_ui is FALSE - render_ui(scale_factor, subfield); - } - S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width); // handle fractional rows U32 read_width = llmax(0, (window_width - subimage_x_offset) - llmax(0, (window_width * (subimage_x + 1)) - (buffer_x_offset + raw->getWidth()))); - for(U32 out_y = 0; out_y < read_height ; out_y++) + + // Skip rendering and sampling altogether if either width or height is degenerated to 0 (common in cropping cases) + if (read_width && read_height) { - S32 output_buffer_offset = ( - (out_y * (raw->getWidth())) // ...plus iterated y... - + (window_width * subimage_x) // ...plus subimage start in x... - + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y... - - output_buffer_offset_x // ...minus buffer padding x... - - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y... - ) * raw->getComponents(); + const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor)); + display(do_rebuild, scale_factor, subfield, TRUE); - // Ping the wathdog thread every 100 lines to keep us alive (arbitrary number, feel free to change) - if (out_y % 100 == 0) + if (!LLPipeline::sRenderDeferred) { - LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot"); + // Required for showing the GUI in snapshots and performing bloom composite overlay + // Call even if show_ui is FALSE + render_ui(scale_factor, subfield); } - if (type == SNAPSHOT_TYPE_COLOR) - { - glReadPixels( - subimage_x_offset, out_y + subimage_y_offset, - read_width, 1, - GL_RGB, GL_UNSIGNED_BYTE, - raw->getData() + output_buffer_offset - ); - } - else // SNAPSHOT_TYPE_DEPTH + for (U32 out_y = 0; out_y < read_height ; out_y++) { - LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values - glReadPixels( - subimage_x_offset, out_y + subimage_y_offset, - read_width, 1, - GL_DEPTH_COMPONENT, GL_FLOAT, - depth_line_buffer->getData()// current output pixel is beginning of buffer... - ); - - for (S32 i = 0; i < (S32)read_width; i++) + S32 output_buffer_offset = ( + (out_y * (raw->getWidth())) // ...plus iterated y... + + (window_width * subimage_x) // ...plus subimage start in x... + + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y... + - output_buffer_offset_x // ...minus buffer padding x... + - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y... + ) * raw->getComponents(); + + // Ping the watchdog thread every 100 lines to keep us alive (arbitrary number, feel free to change) + if (out_y % 100 == 0) { - F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32))); - - F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2)); - U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar()); - //write converted scanline out to result image - for(S32 j = 0; j < raw->getComponents(); j++) + LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot"); + } + + if (type == SNAPSHOT_TYPE_COLOR) + { + glReadPixels( + subimage_x_offset, out_y + subimage_y_offset, + read_width, 1, + GL_RGB, GL_UNSIGNED_BYTE, + raw->getData() + output_buffer_offset + ); + } + else // SNAPSHOT_TYPE_DEPTH + { + LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values + glReadPixels( + subimage_x_offset, out_y + subimage_y_offset, + read_width, 1, + GL_DEPTH_COMPONENT, GL_FLOAT, + depth_line_buffer->getData()// current output pixel is beginning of buffer... + ); + + for (S32 i = 0; i < (S32)read_width; i++) { - *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte; + F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32))); + + F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2)); + U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar()); + // write converted scanline out to result image + for (S32 j = 0; j < raw->getComponents(); j++) + { + *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte; + } } } } @@ -4785,12 +4760,9 @@ bool LLViewerWindow::onAlert(const LLSD& notify) { LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); - if (gNoRender) + if (gHeadlessClient) { llinfos << "Alert: " << notification->getName() << llendl; - notification->respond(LLSD::emptyMap()); - LLNotifications::instance().cancel(notification); - return false; } // If we're in mouselook, the mouse is hidden and so the user can't click diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp index 0b52948680..1fe5fc9800 100644 --- a/indra/newview/llviewerwindowlistener.cpp +++ b/indra/newview/llviewerwindowlistener.cpp @@ -65,7 +65,6 @@ LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow): void LLViewerWindowListener::saveSnapshot(const LLSD& event) const { - LLReqID reqid(event); typedef std::map<LLSD::String, LLViewerWindow::ESnapshotType> TypeMap; TypeMap types; #define tp(name) types[#name] = LLViewerWindow::SNAPSHOT_TYPE_##name @@ -98,9 +97,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const type = found->second; } bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, rebuild, type); - LLSD response(reqid.makeResponse()); - response["ok"] = ok; - LLEventPumps::instance().obtain(event["reply"]).post(response); + sendReply(LLSDMap("ok", ok), event); } void LLViewerWindowListener::requestReshape(LLSD const & event_data) const diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 2c5e728c87..f1934933b5 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1302,18 +1302,8 @@ void LLVOAvatar::initInstance(void) } - if (gNoRender) - { - return; - } - buildCharacter(); - if (gNoRender) - { - return; - } - // preload specific motions here createMotion( ANIM_AGENT_CUSTOMIZE); createMotion( ANIM_AGENT_CUSTOMIZE_DONE); @@ -1755,12 +1745,6 @@ void LLVOAvatar::buildCharacter() BOOL status = loadAvatar(); stop_glerror(); - if (gNoRender) - { - // Still want to load the avatar skeleton so visual parameters work. - return; - } - // gPrintMessagesThisFrame = TRUE; lldebugs << "Avatar load took " << timer.getElapsedTimeF32() << " seconds." << llendl; @@ -2231,7 +2215,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) setPixelAreaAndAngle(gAgent); // force asynchronous drawable update - if(mDrawable.notNull() && !gNoRender) + if(mDrawable.notNull()) { LLFastTimer t(FTM_JOINT_UPDATE); @@ -2288,11 +2272,6 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) LLVector3 root_pos_last = mRoot.getWorldPosition(); BOOL detailed_update = updateCharacter(agent); - if (gNoRender) - { - return TRUE; - } - static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false); bool voice_enabled = (visualizers_in_calls || LLVoiceClient::getInstance()->inProximalChannel()) && LLVoiceClient::getInstance()->getVoiceEnabled(mID); @@ -3265,17 +3244,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) } } - if (gNoRender) - { - // Hack if we're running drones... - if (isSelf()) - { - gAgent.setPositionAgent(getPositionAgent()); - } - return FALSE; - } - - LLVector3d root_pos_global; if (!mIsBuilt) @@ -4202,7 +4170,7 @@ void LLVOAvatar::updateTextures() { BOOL render_avatar = TRUE; - if (mIsDummy || gNoRender) + if (mIsDummy) { return; } @@ -4476,11 +4444,6 @@ void LLVOAvatar::processAnimationStateChanges() { LLMemType mt(LLMemType::MTYPE_AVATAR); - if (gNoRender) - { - return; - } - if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) ) { startMotion(ANIM_AGENT_WALK_ADJUST); @@ -4875,7 +4838,7 @@ void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_age LLVector3d z_vec(0.0f, 0.0f, 1.0f); LLVector3d p0_global, p1_global; - if (gNoRender || mIsDummy) + if (mIsDummy) { outNorm.setVec(z_vec); out_pos_agent = in_pos_agent; @@ -5447,11 +5410,6 @@ BOOL LLVOAvatar::loadLayersets() //----------------------------------------------------------------------------- void LLVOAvatar::updateVisualParams() { - if (gNoRender) - { - return; - } - setSex( (getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE ); LLCharacter::updateVisualParams(); @@ -6182,8 +6140,6 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const void LLVOAvatar::updateMeshTextures() { // llinfos << "updateMeshTextures" << llendl; - if (gNoRender) return; - // if user has never specified a texture, assign the default for (U32 i=0; i < getNumTEs(); i++) { @@ -6837,11 +6793,6 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) } } - if (gNoRender) - { - return; - } - ESex old_sex = getSex(); // llinfos << "LLVOAvatar::processAvatarAppearance()" << llendl; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 799ed433d7..3b4066e3ca 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -2513,10 +2513,6 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const //------------------------------------------------------------------------ BOOL LLVOAvatarSelf::needsRenderBeam() { - if (gNoRender) - { - return FALSE; - } LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); BOOL is_touching_or_grabbing = (tool == LLToolGrab::getInstance() && LLToolGrab::getInstance()->isEditing()); diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 08e242af8e..08581be38b 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -5088,7 +5088,7 @@ void LLVivoxVoiceClient::enforceTether(void) } } - if(dist_vec(mCameraPosition, tethered) > 0.1) + if(dist_vec_squared(mCameraPosition, tethered) > 0.01) { mCameraPosition = tethered; mSpatialCoordsDirty = true; @@ -5150,7 +5150,7 @@ void LLVivoxVoiceClient::setCameraPosition(const LLVector3d &position, const LLV void LLVivoxVoiceClient::setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot) { - if(dist_vec(mAvatarPosition, position) > 0.1) + if(dist_vec_squared(mAvatarPosition, position) > 0.01) { mAvatarPosition = position; mSpatialCoordsDirty = true; diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index d239347810..4b3a9a4dc3 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -72,6 +72,8 @@ LLWaterParamManager::LLWaterParamManager() : mWave1Dir(.5f, .5f, "wave1Dir"), mWave2Dir(.5f, .5f, "wave2Dir"), mDensitySliderValue(1.0f), + mPrevFogDensity(16.0f), // 2^4 + mPrevFogColor(22.f/255.f, 43.f/255.f, 54.f/255.f, 0.0f), mWaterFogKS(1.0f) { } @@ -265,6 +267,20 @@ void LLWaterParamManager::update(LLViewerCamera * cam) // update the shaders and the menu propagateParameters(); + // If water fog color has been changed, save it. + if (mPrevFogColor != mFogColor) + { + gSavedSettings.setColor4("WaterFogColor", mFogColor); + mPrevFogColor = mFogColor; + } + + // If water fog density has been changed, save it. + if (mPrevFogDensity != mFogDensity) + { + gSavedSettings.setF32("WaterFogDensity", mFogDensity); + mPrevFogDensity = mFogDensity; + } + // sync menus if they exist LLFloaterWater* waterfloater = LLFloaterReg::findTypedInstance<LLFloaterWater>("env_water"); if(waterfloater) @@ -449,7 +465,24 @@ LLWaterParamManager * LLWaterParamManager::instance() sInstance->loadAllPresets(LLStringUtil::null); sInstance->getParamSet("Default", sInstance->mCurParams); + sInstance->initOverrides(); } return sInstance; } + +void LLWaterParamManager::initOverrides() +{ + // Override fog color from the current preset with the saved setting. + LLColor4 fog_color_override = gSavedSettings.getColor4("WaterFogColor"); + mFogColor = fog_color_override; + mPrevFogColor = fog_color_override; + mCurParams.set("waterFogColor", fog_color_override); + + // Do the same with fog density. + F32 fog_density = gSavedSettings.getF32("WaterFogDensity"); + mPrevFogDensity = fog_density; + mFogDensity = fog_density; + mCurParams.set("waterFogDensity", fog_density); + setDensitySliderValue(mFogDensity.mExp); +} diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h index c479f1861c..f465034c39 100644 --- a/indra/newview/llwaterparammanager.h +++ b/indra/newview/llwaterparammanager.h @@ -284,6 +284,9 @@ public: // singleton pattern implementation static LLWaterParamManager * instance(); +private: + void initOverrides(); + public: LLWaterParamSet mCurParams; @@ -314,6 +317,9 @@ private: LLVector4 mWaterPlane; F32 mWaterFogKS; + LLColor4 mPrevFogColor; + F32 mPrevFogDensity; + // our parameter manager singleton instance static LLWaterParamManager * sInstance; }; diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 8f7197c607..8f50041474 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -98,11 +98,6 @@ LLWorld::LLWorld() : mEdgeWaterObjects[i] = NULL; } - if (gNoRender) - { - return; - } - LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,4); U8 *default_texture = raw->getData(); *(default_texture++) = MAX_WATER_COLOR.mV[0]; @@ -626,10 +621,7 @@ void LLWorld::updateVisibilities() if (LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius)) { regionp->calculateCameraDistance(); - if (!gNoRender) - { - regionp->getLand().updatePatchVisibilities(gAgent); - } + regionp->getLand().updatePatchVisibilities(gAgent); } else { @@ -1446,6 +1438,8 @@ static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3 void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const { + F32 radius_squared = radius * radius; + if(avatar_ids != NULL) { avatar_ids->clear(); @@ -1454,59 +1448,52 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi { positions->clear(); } - for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); - iter != LLWorld::getInstance()->getRegionList().end(); ++iter) + // get the list of avatars from the character list first, so distances are correct + // when agent is above 1020m and other avatars are nearby + for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); + iter != LLCharacter::sInstances.end(); ++iter) { - LLViewerRegion* regionp = *iter; - const LLVector3d& origin_global = regionp->getOriginGlobal(); - S32 count = regionp->mMapAvatars.count(); - for (S32 i = 0; i < count; i++) + LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter; + if(!pVOAvatar->isDead() && !pVOAvatar->isSelf()) { - LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global); - if(dist_vec(pos_global, relative_to) <= radius) + LLUUID uuid = pVOAvatar->getID(); + if(!uuid.isNull()) { - if(positions != NULL) + LLVector3d pos_global = pVOAvatar->getPositionGlobal(); + if(dist_vec_squared(pos_global, relative_to) <= radius_squared) { - positions->push_back(pos_global); - } - if(avatar_ids != NULL) - { - avatar_ids->push_back(regionp->mMapAvatarIDs.get(i)); + if(positions != NULL) + { + positions->push_back(pos_global); + } + if(avatar_ids !=NULL) + { + avatar_ids->push_back(uuid); + } } } } } - // retrieve the list of close avatars from viewer objects as well - // for when we are above 1000m, only do this when we are retrieving - // uuid's too as there could be duplicates - if(avatar_ids != NULL) + // region avatars added for situations where radius is greater than RenderFarClip + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { - for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); - iter != LLCharacter::sInstances.end(); ++iter) + LLViewerRegion* regionp = *iter; + const LLVector3d& origin_global = regionp->getOriginGlobal(); + S32 count = regionp->mMapAvatars.count(); + for (S32 i = 0; i < count; i++) { - LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter; - if(pVOAvatar->isDead() || pVOAvatar->isSelf()) - continue; - LLUUID uuid = pVOAvatar->getID(); - if(uuid.isNull()) - continue; - LLVector3d pos_global = pVOAvatar->getPositionGlobal(); - if(dist_vec(pos_global, relative_to) <= radius) + LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global); + if(dist_vec_squared(pos_global, relative_to) <= radius_squared) { - bool found = false; - uuid_vec_t::iterator sel_iter = avatar_ids->begin(); - for (; sel_iter != avatar_ids->end(); sel_iter++) - { - if(*sel_iter == uuid) - { - found = true; - break; - } - } - if(!found) + LLUUID uuid = regionp->mMapAvatarIDs.get(i); + // if this avatar doesn't already exist in the list, add it + if(uuid.notNull() && avatar_ids!=NULL && std::find(avatar_ids->begin(), avatar_ids->end(), uuid) == avatar_ids->end()) { if(positions != NULL) + { positions->push_back(pos_global); + } avatar_ids->push_back(uuid); } } diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 8ef3a3b839..8cdb615686 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1745,7 +1745,7 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) // Invoke the event details floater if someone is clicking on an event. LLSD params(LLSD::emptyArray()); params.append(event_id); - LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, true); + LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, "clicked", true); break; } case MAP_ITEM_LAND_FOR_SALE: diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 58dc90ccd9..6dc8f28265 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1228,10 +1228,6 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable) U32 LLPipeline::addObject(LLViewerObject *vobj) { LLMemType mt_ao(LLMemType::MTYPE_PIPELINE_ADD_OBJECT); - if (gNoRender) - { - return 0; - } if (gSavedSettings.getBOOL("RenderDelayCreation")) { diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 75aec21f93..a19eccf748 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -115,9 +115,6 @@ name="AlertCautionTextColor" reference="LtYellow" /> <color - name="AlertTextColor" - value="0.58 0.66 0.84 1" /> - <color name="AvatarListItemIconDefaultColor" reference="White" /> <color @@ -763,4 +760,21 @@ <color name="MenuBarProjectBgColor" reference="MdBlue" /> + + <!-- Generic color names (legacy) --> + <color + name="white" + value="1 1 1 1"/> + <color + name="black" + value="0 0 0 1"/> + <color + name="red" + value="1 0 0 1"/> + <color + name="green" + value="0 1 0 1"/> + <color + name="blue" + value="0 0 1 1"/> </colors> diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml index 760f60c996..af9ee0bd06 100644 --- a/indra/newview/skins/default/xui/da/floater_tos.xml +++ b/indra/newview/skins/default/xui/da/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Henter %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Fortsæt" label_selected="Fortsæt" name="Continue"/> <button label="Annullér" label_selected="Annullér" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index a3c4897ee1..30b54d3eb2 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -748,6 +748,7 @@ Prøv venligst igen senere. [OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME]. </notification> <notification name="OfferTeleport"> + Tilbyd en teleport til din position med følgende besked? <form name="form"> <input name="message"> Mød mig i [REGION] diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index 3705a5902a..ed499619f6 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -29,7 +29,8 @@ <check_box label="IM chats" name="EnableIMChatPopups" tool_tip="Vælg for at se popup vindue når personlige beskeder (IM) modtages"/> <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_lifetime"/> <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/> - <check_box label="Benyt maskin-oversættelse ved chat (håndteret af Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Benyt maskin-oversættelse ved chat (håndteret af Google)</text> <text name="translate_language_text" width="110"> Oversæt chat til : </text> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml index 5810cc21e7..067463be02 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml @@ -4,7 +4,8 @@ Midterste museknap </panel.string> <slider label="Generel" name="System Volume"/> - <check_box initial_value="true" label="Sluk lyd når minimeret" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Sluk lyd når minimeret</text> <slider label="Knapper" name="UI Volume"/> <slider label="Omgivelser" name="Wind Volume"/> <slider label="Lyd effekter" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml index 6e83e0419b..1a052bd814 100644 --- a/indra/newview/skins/default/xui/de/floater_beacons.xml +++ b/indra/newview/skins/default/xui/de/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Nur berühren" name="touch_only"/> <check_box label="Soundquellen" name="sounds"/> <check_box label="Partikelquellen" name="particles"/> + <check_box label="Medienquellen" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml index 1f3ef2f0b4..ba329371f8 100644 --- a/indra/newview/skins/default/xui/de/floater_tos.xml +++ b/indra/newview/skins/default/xui/de/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wird geladen %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EServicebedingungen%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Weiter" label_selected="Weiter" name="Continue"/> <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml index 40557b7ad8..c49f4b198b 100644 --- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Unterhemd" name="Self Undershirt"/> <menu_item_call label="Unterhose" name="Self Underpants"/> <menu_item_call label="Tätowierung" name="Self Tattoo"/> + <menu_item_call label="Physik" name="Self Physics"/> <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Alle Kleider" name="All Clothes"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_bottomtray.xml b/indra/newview/skins/default/xui/de/menu_bottomtray.xml index 660cd2eaf3..da36be59d0 100644 --- a/indra/newview/skins/default/xui/de/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/de/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Voice aktiviert" name="EnableVoiceChat"/> + <menu_item_check label="Schaltfläche „Sprechen“" name="EnableVoiceChat"/> <menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/> <menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/> <menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/> diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml index 43722e0dcf..9fcd41e62a 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Neue Unterhose" name="New Underpants"/> <menu_item_call label="Neue Alpha-Maske" name="New Alpha Mask"/> <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> + <menu_item_call label="Neue Physik" name="New Physics"/> </menu> <menu label="Neue Körperteile" name="New Body Parts"> <menu_item_call label="Neue Form/Gestalt" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/de/menu_inventory_add.xml b/indra/newview/skins/default/xui/de/menu_inventory_add.xml index dccee6712d..165e9a9264 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Neue Unterhose" name="New Underpants"/> <menu_item_call label="Neues Alpha" name="New Alpha"/> <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> + <menu_item_call label="Neue Physik" name="New Physics"/> </menu> <menu label="Neue Körperteile" name="New Body Parts"> <menu_item_call label="Neue Form/Gestalt" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/de/menu_media_ctrl.xml b/indra/newview/skins/default/xui/de/menu_media_ctrl.xml new file mode 100644 index 0000000000..781796670a --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Ausschneiden" name="Cut"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml index 897154ec56..d56c93533c 100644 --- a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/> <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/> <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> <menu_item_call label="Neue Unterhose" name="New Underpants"/> <menu_item_call label="Neues Alpha" name="New Alpha"/> + <menu_item_call label="Neue Physik" name="New Physics"/> <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> </menu> <menu label="Neue Körperteile" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Outfit neu benennen" name="rename"/> <menu_item_call label="Outfit löschen" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 17bcb013cc..9d5a69105d 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -413,6 +413,7 @@ <menu_item_call label="Rock" name="Skirt"/> <menu_item_call label="Alpha" name="Alpha"/> <menu_item_call label="Tätowierung" name="Tattoo"/> + <menu_item_call label="Physik" name="Physics"/> <menu_item_call label="Alle Kleider" name="All Clothes"/> </menu> <menu label="Hilfe" name="Help"> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 3c63c093d2..c172f7ea2d 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -2853,6 +2853,13 @@ Alle stummschalten? <notification label="Stehen" name="HintSit"> Um aufzustehen, klicken Sie auf die Schaltfläche „Stehen“. </notification> + <notification label="Sprechen" name="HintSpeak"> + Auf Schaltfläche „Sprechen“ klicken, um das Mikrofon ein- und auszuschalten. + +Auf den Pfeil nach oben klicken, um die Sprachsteuerung zu sehen. + +Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deaktiviert. + </notification> <notification label="Welt erkunden" name="HintDestinationGuide"> Im Reiseführer finden Sie Tausende von interessanten Orten. Wählen Sie einfach einen Ort aus und klicken Sie auf „Teleportieren“. </notification> @@ -2862,12 +2869,14 @@ Alle stummschalten? <notification label="Bewegen" name="HintMove"> Um zu gehen oder zu rennen, öffnen Sie das Bedienfeld „Bewegen“ und klicken Sie auf die Pfeile. Sie können auch die Pfeiltasten auf Ihrer Tastatur verwenden. </notification> + <notification label="" name="HintMoveClick"> + 1. Zum Gehen klicken: Auf beliebige Stelle am Boden klicken, um zu dieser Stelle zu gehen. + +2. Zum Drehen der Anzeige klicken und ziehen: Auf beliebige Stelle in der Welt klicken und ziehen, um Ihre Ansicht zu ändern. + </notification> <notification label="Anzeigename" name="HintDisplayName"> Hier können Sie Ihren anpassbaren Anzeigenamen festlegen. Der Anzeigename unterscheidet sich von Ihrem eindeutigen Benutzernamen, der nicht geändert werden kann. In den Einstellungen können Sie festlegen, welcher Name von anderen Einwohnern angezeigt wird. </notification> - <notification label="Bewegen" name="HintMoveArrows"> - Verwenden Sie zum Gehen die Pfeiltasten auf Ihrer Tastatur. Drücken Sie die Nach-oben-Taste zweimal, um zu rennen. - </notification> <notification label="Ansicht" name="HintView"> Um die Kameraansicht zu ändern, verwenden Sie die Schwenk- und Kreissteuerungen. Um die Ansicht zurückzusetzen, drücken Sie die Esc-Taste oder laufen Sie einfach. </notification> diff --git a/indra/newview/skins/default/xui/de/panel_edit_physics.xml b/indra/newview/skins/default/xui/de/panel_edit_physics.xml new file mode 100644 index 0000000000..bd9c84577a --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Brust – Hüpfen"/> + <accordion_tab name="physics_breasts_inout_tab" title="Brust – Dekolleté"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Brust – Schwingen"/> + <accordion_tab name="physics_belly_tab" title="Bauch – Hüpfen"/> + <accordion_tab name="physics_butt_tab" title="Po – Hüpfen"/> + <accordion_tab name="physics_butt_leftright_tab" title="Po – Wiegen"/> + <accordion_tab name="physics_advanced_tab" title="Erweiterte Parameter"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml index 271db4c15c..94a79a0bbd 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Tätowierung bearbeiten </string> + <string name="edit_physics_title"> + Physik bearbeiten + </string> <string name="shape_desc_text"> Form: </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tätowierung: </string> + <string name="physics_desc_text"> + Physik: + </string> <labeled_back_button label="Speichern" name="back_btn" tool_tip="Zurück zu Outfit bearbeiten"/> <text name="edit_wearable_title" value="Form bearbeiten"/> <panel label="Hemd" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 8086128dd7..ca8af27f58 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -29,7 +29,10 @@ <check_box label="IM-Chats" name="EnableIMChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Instant Message eintrifft"/> <spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/> <spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/> - <check_box label="Bei Chat Maschinenübersetzung verwenden (Service von Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label"> + Beim Chatten Maschinenübersetzung verwenden (von Google bereitgestellt) + </text> <text name="translate_language_text"> Chat übersetzen in: </text> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index 63161c954e..78cb03a50a 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -39,6 +39,10 @@ <combo_box.item label="Alle Avatare und Objekte" name="3"/> <combo_box.item label="Alles" name="4"/> </combo_box> + <slider label="Avatar-Physik:" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Niedrig + </text> <slider label="Sichtweite:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml index 0f029d8664..c118e4e4dd 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml @@ -4,7 +4,10 @@ Mittlere Maustaste </panel.string> <slider label="Master-Lautstärke" name="System Volume"/> - <check_box initial_value="true" label="Stummschalten, wenn minimiert" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label"> + Stummschalten, wenn minimiert + </text> <slider label="Schaltflächen" name="UI Volume"/> <slider label="Umgebung" name="Wind Volume"/> <slider label="Soundeffekte" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..990193574e --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[BESCHR]" name="param slider"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 0c621db6b0..f32eb21dd3 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -876,6 +876,9 @@ <string name="tattoo"> Tätowierung </string> + <string name="physics"> + Physik + </string> <string name="invalid"> ungültig </string> @@ -915,6 +918,9 @@ <string name="tattoo_not_worn"> Tätowierung nicht getragen </string> + <string name="physics_not_worn"> + Physik nicht getragen + </string> <string name="invalid_not_worn"> ungültig </string> @@ -963,6 +969,9 @@ <string name="create_new_tattoo"> Neue Tätowierung erstellen </string> + <string name="create_new_physics"> + Neue Physik erstellen + </string> <string name="create_new_invalid"> ungültig </string> @@ -2247,6 +2256,114 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="Bulbous Nose"> Knollennase </string> + <string name="Breast Physics Mass"> + Brust – Masse + </string> + <string name="Breast Physics Smoothing"> + Brust – Glättung + </string> + <string name="Breast Physics Gravity"> + Brust – Schwerkraft + </string> + <string name="Breast Physics Drag"> + Brust – Luftwiderstand + </string> + <string name="Breast Physics InOut Max Effect"> + Max. Effekt + </string> + <string name="Breast Physics InOut Spring"> + Federn + </string> + <string name="Breast Physics InOut Gain"> + Verstärkung + </string> + <string name="Breast Physics InOut Damping"> + Dämpfung + </string> + <string name="Breast Physics UpDown Max Effect"> + Max. Effekt + </string> + <string name="Breast Physics UpDown Spring"> + Federn + </string> + <string name="Breast Physics UpDown Gain"> + Verstärkung + </string> + <string name="Breast Physics UpDown Damping"> + Dämpfung + </string> + <string name="Breast Physics LeftRight Max Effect"> + Max. Effekt + </string> + <string name="Breast Physics LeftRight Spring"> + Federn + </string> + <string name="Breast Physics LeftRight Gain"> + Verstärkung + </string> + <string name="Breast Physics LeftRight Damping"> + Dämpfung + </string> + <string name="Belly Physics Mass"> + Bauch – Masse + </string> + <string name="Belly Physics Smoothing"> + Bauch – Glättung + </string> + <string name="Belly Physics Gravity"> + Bauch – Schwerkraft + </string> + <string name="Belly Physics Drag"> + Bauch – Luftwiderstand + </string> + <string name="Belly Physics UpDown Max Effect"> + Max. Effekt + </string> + <string name="Belly Physics UpDown Spring"> + Federn + </string> + <string name="Belly Physics UpDown Gain"> + Verstärkung + </string> + <string name="Belly Physics UpDown Damping"> + Dämpfung + </string> + <string name="Butt Physics Mass"> + Po – Masse + </string> + <string name="Butt Physics Smoothing"> + Po – Glättung + </string> + <string name="Butt Physics Gravity"> + Po – Schwerkraft + </string> + <string name="Butt Physics Drag"> + Po – Luftwiderstand + </string> + <string name="Butt Physics UpDown Max Effect"> + Max. Effekt + </string> + <string name="Butt Physics UpDown Spring"> + Federn + </string> + <string name="Butt Physics UpDown Gain"> + Verstärkung + </string> + <string name="Butt Physics UpDown Damping"> + Dämpfung + </string> + <string name="Butt Physics LeftRight Max Effect"> + Max. Effekt + </string> + <string name="Butt Physics LeftRight Spring"> + Federn + </string> + <string name="Butt Physics LeftRight Gain"> + Verstärkung + </string> + <string name="Butt Physics LeftRight Damping"> + Dämpfung + </string> <string name="Bushy Eyebrows"> Buschige Augenbrauen </string> @@ -2256,6 +2373,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="Butt Size"> Hintern, Größe </string> + <string name="Butt Gravity"> + Po – Schwerkraft + </string> <string name="bustle skirt"> Tournürenrock </string> @@ -3764,6 +3884,9 @@ Missbrauchsbericht <string name="New Tattoo"> Neue Tätowierung </string> + <string name="New Physics"> + Neue Physik + </string> <string name="Invalid Wearable"> Ungültiges Objekt </string> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index f5365be11f..6a1a600696 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -150,7 +150,6 @@ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (U jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. -Pth Copyright (C) 1999-2006 Ralf S. Engelschall <rse@gnu.org> SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml index babbf0f5ca..92001534e7 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml @@ -34,7 +34,7 @@ layout="topleft" name="contains_text" width="276"> - [NAME] contains: + <nolink>[NAME]</nolink> contains: </text> <scroll_list background_visible="true" diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 8eee8f44b5..dcfa8bc060 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -45,7 +45,7 @@ name="pref core" tab_group="1" tab_position="left" - tab_width="115" + tab_width="140" tab_padding_right="0" top="21" width="658"> @@ -96,7 +96,7 @@ filename="panel_preferences_colors.xml" label="Colors" layout="topleft" - help_topic="preferences_im_tab" + help_topic="preferences_colors_tab" name="colors" /> <panel class="panel_preference" diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml index a17cf8eea8..9f6199fada 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml @@ -120,14 +120,14 @@ font.style="BOLD" name="key_label" top_pad="10" - width="150"> + width="130"> Shortcut Key: </text> <combo_box height="20" label="None" layout="topleft" - left_delta="154" + left_delta="135" name="modifier_combo" top_delta="-4" width="55" /> diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml new file mode 100644 index 0000000000..c7c7a05af2 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + border_visible="false" + border="false" + legacy_header_height="18" + can_minimize="true" + can_resize="false" + can_close="false" + save_dock_state="true" + save_visibility="true" + save_rect="true" + single_instance="true" + bevel_style="in" + height="140" + layout="topleft" + name="floater_sound_devices" + title="Sound Devices" + width="315"> + <panel + layout="topleft" + follows="all" + filename="panel_sound_devices.xml" + name="device_settings_panel" + width="400" + left="2" + top="26" + class="panel_voice_device_settings"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index e5ae0b950a..3ead67ca57 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -8,12 +8,6 @@ tab_stop="false" name="main_view" width="1024"> - <panel top="0" - follows="all" - height="768" - mouse_opaque="false" - name="login_panel_holder" - width="1024"/> <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -133,7 +127,14 @@ user_resize="false" visible="false" width="333"/> - </layout_stack> + </layout_stack> + <panel top="0" + follows="all" + height="500" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> + <panel follows="all" height="500" left="0" @@ -171,6 +172,7 @@ top="0" width="1024" visible="false"/> + <view mouse_opaque="false" follows="all" name="menu_bar_holder" diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml new file mode 100644 index 0000000000..c39c26f25f --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + name="media ctrl context menu"> + <menu_item_call + label="Cut" + layout="topleft" + name="Cut"> + <menu_item_call.on_click + function="Edit.Cut" /> + <menu_item_call.on_enable + function="Edit.EnableCut" /> + </menu_item_call> + <menu_item_call + label="Copy" + layout="topleft" + name="Copy"> + <menu_item_call.on_click + function="Edit.Copy" /> + <menu_item_call.on_enable + function="Edit.EnableCopy" /> + </menu_item_call> + <menu_item_call + label="Paste" + layout="topleft" + name="Paste"> + <menu_item_call.on_click + function="Edit.Paste" /> + <menu_item_call.on_enable + function="Edit.EnablePaste" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_text_editor.xml b/indra/newview/skins/default/xui/en/menu_text_editor.xml index ecd96088e7..fe8489166b 100644 --- a/indra/newview/skins/default/xui/en/menu_text_editor.xml +++ b/indra/newview/skins/default/xui/en/menu_text_editor.xml @@ -4,8 +4,7 @@ <menu_item_call label="Cut" layout="topleft" - name="Cut" - shortcut="control|X"> + name="Cut"> <menu_item_call.on_click function="Edit.Cut" /> <menu_item_call.on_enable @@ -14,8 +13,7 @@ <menu_item_call label="Copy" layout="topleft" - name="Copy" - shortcut="control|C"> + name="Copy"> <menu_item_call.on_click function="Edit.Copy" /> <menu_item_call.on_enable @@ -24,8 +22,7 @@ <menu_item_call label="Paste" layout="topleft" - name="Paste" - shortcut="control|V"> + name="Paste"> <menu_item_call.on_click function="Edit.Paste" /> <menu_item_call.on_enable @@ -34,8 +31,7 @@ <menu_item_call label="Delete" layout="topleft" - name="Delete" - shortcut="Del"> + name="Delete"> <menu_item_call.on_click function="Edit.Delete" /> <menu_item_call.on_enable @@ -44,8 +40,7 @@ <menu_item_call label="Select All" layout="topleft" - name="Select All" - shortcut="control|A"> + name="Select All"> <menu_item_call.on_click function="Edit.SelectAll" /> <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 51610c0ae0..8a85a331e5 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2696,7 +2696,7 @@ <menu_item_call label="Web Content Browser" name="Web Content Browser" - shortcut="control|alt|W"> + shortcut="control|shift|Z"> <menu_item_call.on_click function="Advanced.WebContentTest" parameter="http://google.com"/> @@ -3113,6 +3113,16 @@ function="ToggleControl" parameter="ImagePipelineUseHTTP" /> </menu_item_check> + <menu_item_check + label="HTTP Inventory" + name="HTTP Inventory"> + <menu_item_check.on_check + function="CheckControl" + parameter="UseHTTPInventory" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="UseHTTPInventory" /> + </menu_item_check> <menu_item_call label="Compress Images" name="Compress Images"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 433f623273..c64d492612 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7022,22 +7022,27 @@ Hiding the Speak button will disable the voice feature. </notification> <notification - name="HintDisplayName" - label="Display Name" + name="HintMoveClick" + label="" type="hint" unique="true"> - Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences. +1. Click to Walk +Click anywhere on the ground to walk to that spot. + +2. Click and Drag to Rotate View +Click and drag anywhere on the world to rotate your view + <tag>custom_skin</tag> </notification> <notification - name="HintMoveArrows" - label="Move" + name="HintDisplayName" + label="Display Name" type="hint" unique="true"> - To walk, use the directional keys on your keyboard. You can run by pressing the Up arrow twice. - <tag>custom_skin</tag> + Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences. </notification> + <notification name="HintView" label="View" @@ -7141,6 +7146,20 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' </notification> <notification + name="NoPlaceInfo" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Viewing place profile is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification name="NoPicks" label="" type="alertmodal" @@ -7209,7 +7228,49 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' yestext="Quit" notext="Don't Quit"/> </notification> - + + <notification + name="NoInventory" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Viewing inventory is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoAppearance" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + The appearance editor is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification + name="NoSearch" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Search is only available in Advanced mode. Would you like to logout and change modes? + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + <global name="UnsupportedCPU"> - Your CPU speed does not meet the minimum requirements. </global> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index a92cc886e7..c8f8d07701 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -5,121 +5,121 @@ bg_opaque_color="DkGray" chrome="true" follows="left|bottom|right" - focus_root="true" + focus_root="true" height="33" layout="topleft" left="0" name="bottom_tray" top="28" width="1310"> - <string + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off" /> - <string + <string name="SpeakBtnToolTip" value="Turns microphone on/off" /> - <string + <string name="VoiceControlBtnToolTip" value="Shows/hides voice control panel" /> - <layout_stack + <layout_stack border_size="0" clip="false" follows="all" height="28" - layout="topleft" - left="0" + layout="topleft" + left="0" mouse_opaque="false" name="toolbar_stack" orientation="horizontal" top="0" width="1310"> - <layout_panel + <layout_panel auto_resize="false" - user_resize="false" + user_resize="false" min_width="2" width="2" /> - <layout_panel + <layout_panel auto_resize="false" layout="topleft" max_width="320" min_width="214" - height="28" + height="28" mouse_opaque="false" - name="chat_bar_layout_panel" + name="chat_bar_layout_panel" user_resize="true" - width="310" > + width="310" > <panel name="chat_bar" filename="panel_nearby_chat_bar.xml" left="0" height="28" - width="308" + width="308" top="0" mouse_opaque="false" follows="left|right" /> - </layout_panel> - <!-- + </layout_panel> + <!-- This 5px Panel is an indicator of where the resize handle is. The panel provides a gap between the resize handle icon and a button to the right. --> - <layout_panel - auto_resize="false" - layout="topleft" - max_width="5" - min_width="5" - name="chat_bar_resize_handle_panel" - user_resize="false" - width="5"> - <icon - follows="top|right" - height="25" - image_name="ChatBarHandle" - layout="topleft" - left="-7" - name="resize_handle" - top="4" - width="5" /> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="59" - mouse_opaque="false" - name="speak_panel" - top_delta="0" - user_resize="false" - width="108"> - <talk_button - follows="left|right" - height="23" - layout="topleft" - left="0" - name="talk" - top="5" - width="105"> - <show_button - tab_stop="true"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="voice_controls" /> - </show_button> - <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. + <layout_panel + auto_resize="false" + layout="topleft" + max_width="5" + min_width="5" + name="chat_bar_resize_handle_panel" + user_resize="false" + width="5"> + <icon + follows="top|right" + height="25" + image_name="ChatBarHandle" + layout="topleft" + left="-7" + name="resize_handle" + top="4" + width="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="59" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="108"> + <talk_button + follows="left|right" + height="23" + layout="topleft" + left="0" + name="talk" + top="5" + width="105"> + <show_button + tab_stop="true"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="voice_controls" /> + </show_button> + <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. & pad_right is default value for long label which can be right aligned. See EXT-6318 --> - <speak_button - halign="center" - label="Speak" - label_selected="Speak" - name="speak_btn" - pad_right="20" - tab_stop="true" - use_ellipses="true" /> - </talk_button> - </layout_panel> - <layout_panel + <speak_button + halign="center" + label="Speak" + label_selected="Speak" + name="speak_btn" + pad_right="20" + tab_stop="true" + use_ellipses="true" /> + </talk_button> + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -131,7 +131,7 @@ top_delta="0" user_resize="false" width="85"> - <gesture_combo_list + <gesture_combo_list follows="left|right" height="23" label="Gesture" @@ -141,46 +141,46 @@ tool_tip="Shows/hides gestures" top="5" width="82"> - <combo_button + <combo_button pad_right="10" use_ellipses="true" /> - <combo_list + <combo_list page_lines="17" /> - </gesture_combo_list> - </layout_panel> - <layout_panel + </gesture_combo_list> + </layout_panel> + <layout_panel auto_resize="false" - follows="right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="movement_panel" - user_resize="false" - width="83"> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Move" - layout="topleft" - name="movement_btn" - tool_tip="Shows/hides movement controls" - top="5" - use_ellipses="true" - width="80"> - <init_callback - function="Button.SetDockableFloaterToggle" - parameter="moveview" /> - </bottomtray_button> + follows="right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="movement_panel" + user_resize="false" + width="83"> + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Move" + layout="topleft" + name="movement_btn" + tool_tip="Shows/hides movement controls" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="moveview" /> + </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" + </layout_panel> + <layout_panel + auto_resize="false" follows="left|right" height="28" layout="topleft" @@ -190,7 +190,7 @@ name="cam_panel" user_resize="false" width="83"> - <bottomtray_button + <bottomtray_button follows="left|right" height="23" image_pressed="PushButton_Press" @@ -205,83 +205,83 @@ top="5" use_ellipses="true" width="80"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="camera" /> - </bottomtray_button> - </layout_panel> - <layout_panel + </bottomtray_button> + </layout_panel> + <layout_panel auto_resize="false" follows="left|right" height="28" layout="topleft" - min_width="40" - mouse_opaque="false" - name="snapshot_panel" - user_resize="false" - width="39"> - <bottomtray_button - follows="left|right" - height="23" - image_overlay="Snapshot_Off" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - layout="topleft" - left="0" - name="snapshots" - tool_tip="Take snapshot" - top="5" - width="36"> - <init_callback - function="Button.SetFloaterToggle" - parameter="snapshot" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" - min_height="28" - min_width="52" - mouse_opaque="false" - name="build_btn_panel" - user_resize="false" - width="83"> -<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. + min_width="40" + mouse_opaque="false" + name="snapshot_panel" + user_resize="false" + width="39"> + <bottomtray_button + follows="left|right" + height="23" + image_overlay="Snapshot_Off" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + layout="topleft" + left="0" + name="snapshots" + tool_tip="Take snapshot" + top="5" + width="36"> + <init_callback + function="Button.SetFloaterToggle" + parameter="snapshot" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="build_btn_panel" + user_resize="false" + width="83"> + <!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. Disabled for now. --> - <bottomtray_button - follows="left|right" - height="23" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" - image_selected="PushButton_Selected_Press" - is_toggle="true" - label="Build" - layout="topleft" - left="0" - name="build_btn" - tool_tip="Shows/hides Build Tools" - top="5" - use_ellipses="true" - width="80"> - <commit_callback - function="Build.Toggle" - parameter="build" /> - </bottomtray_button> - </layout_panel> - <layout_panel - auto_resize="false" - follows="left|right" - height="28" - layout="topleft" + <bottomtray_button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Build" + layout="topleft" + left="0" + name="build_btn" + tool_tip="Shows/hides Build Tools" + top="5" + use_ellipses="true" + width="80"> + <commit_callback + function="Build.Toggle" + parameter="build" /> + </bottomtray_button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" min_height="28" - min_width="52" + min_width="52" mouse_opaque="false" - name="search_btn_panel" + name="search_btn_panel" user_resize="false" width="83"> <bottomtray_button @@ -341,7 +341,7 @@ Disabled for now. height="28" layout="topleft" min_height="28" - min_width="52" + min_width="52" mouse_opaque="false" name="mini_map_btn_panel" user_resize="false" @@ -378,7 +378,7 @@ Disabled for now. width="189"> <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> - <chiclet_panel + <chiclet_panel chiclet_padding="4" follows="left|right" height="24" @@ -389,7 +389,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. name="chiclet_list" top="7" width="189"> - <button + <button auto_resize="true" follows="right" height="29" @@ -406,7 +406,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="-28" visible="false" width="7" /> - <button + <button auto_resize="true" follows="right" height="29" @@ -423,13 +423,13 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="-28" visible="false" width="7" /> - </chiclet_panel> - </layout_panel> - <layout_panel auto_resize="false" - user_resize="false" + </chiclet_panel> + </layout_panel> + <layout_panel auto_resize="false" + user_resize="false" width="4" min_width="4"/> - <layout_panel + <layout_panel auto_resize="false" follows="right" height="28" @@ -440,7 +440,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. top="0" user_resize="false" width="37"> - <chiclet_im_well + <chiclet_im_well follows="right" height="28" layout="topleft" @@ -449,7 +449,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. name="im_well" top="0" width="35"> - <!-- + <!-- Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button xml attribute Description image_unselected "Unlit" - there are no new messages @@ -457,7 +457,7 @@ image_selected "Unlit" + "Selected" - there are no new messages and the image_pressed "Lit" - there are new messages image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open --> - <button + <button auto_resize="true" follows="right" halign="center" @@ -472,13 +472,13 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="Unread IM messages" tool_tip="Conversations" width="34"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="im_well_window" /> - </button> - </chiclet_im_well> - </layout_panel> - <layout_panel + </button> + </chiclet_im_well> + </layout_panel> + <layout_panel auto_resize="false" follows="right" height="28" @@ -489,7 +489,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well top="0" user_resize="false" width="37"> - <chiclet_notification + <chiclet_notification follows="right" height="23" layout="topleft" @@ -498,7 +498,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="notification_well" top="5" width="35"> - <button + <button auto_resize="true" bottom_pad="3" follows="right" @@ -514,17 +514,17 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="Unread" tool_tip="Notifications" width="34"> - <init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="notification_well_window" /> - </button> - </chiclet_notification> - </layout_panel> - <layout_panel - auto_resize="false" - user_resize="false" - min_width="4" - name="DUMMY2" - width="8" /> - </layout_stack> + </button> + </chiclet_notification> + </layout_panel> + <layout_panel + auto_resize="false" + user_resize="false" + min_width="4" + name="DUMMY2" + width="8" /> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml index e2e9d0aef0..f7434f0330 100644 --- a/indra/newview/skins/default/xui/en/panel_hint.xml +++ b/indra/newview/skins/default/xui/en/panel_hint.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel width="205" - height="100"> + height="34"> <text name="hint_title" font="SansSerifMedium" left="8" @@ -15,8 +15,8 @@ left="8" right="197" top="26" - bottom="92" - follows="all" + bottom="26" + follows="left|right|bottom" text_color="Black" wrap="true"/> <button right="197" diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml index 00b6e42497..df05d50dc5 100644 --- a/indra/newview/skins/default/xui/en/panel_hint_image.xml +++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml @@ -1,33 +1,43 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - width="205" - height="140" + width="305" + height="40" layout="topleft"> <text name="hint_title" font="SansSerifMedium" left="8" - right="180" + right="290" top="8" bottom="20" follows="left|right|top" text_color="Black" wrap="false"/> - <icon name="hint_image" - left="42" - top="25" - width="115" - height="86" - image_name="arrow_keys.png" - /> + <layout_stack left="0" + top="25" + width="305" + height="0" + follows="left|top|right" + orientation="horizontal"> + <layout_panel auto_resize="true" width="100"/> + <layout_panel auto_resize="true" width="0"> + <icon name="hint_image" + top="0" + left="0" + height="0" + width="0" + follows="all"/> + </layout_panel> + <layout_panel auto_resize="true" width="100"/> + </layout_stack> <text name="hint_text" left="8" - right="197" - top_pad="5" - bottom="120" - follows="all" + right="297" + top="30" + bottom="30" + follows="left|right|bottom" text_color="Black" wrap="true"/> - <button right="197" + <button right="297" top="8" width="16" height="16" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 4c2faddfe4..8d0f1437e6 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -133,7 +133,6 @@ label="Remember password" max_chars="128" tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features." top_pad="0" - control_name="SessionSettingsFile" name="mode_combo" width="110"> <combo_box.item diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index 559df5bec9..714dca7fac 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -67,7 +67,7 @@ image_overlay="Arrow_Up" hover_glow_amount="0.15" layout="topleft" - left="180" + left="200" name="enable_this_popup" top_pad="5" width="40"> @@ -81,7 +81,7 @@ image_overlay="Arrow_Down" hover_glow_amount="0.15" layout="topleft" - left_pad="40" + left_pad="20" name="disable_this_popup" top_delta="0" width="40"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index a1082d9c32..cdc462109c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -150,7 +150,7 @@ top_pad="20" left="30" height="10" - width="180"> + width="400"> Enable incoming chat popups: </text> <check_box @@ -208,15 +208,27 @@ <check_box control_name="TranslateChat" enabled="true" - height="16" - label="Use machine translation while chatting (powered by Google)" + height="16" layout="topleft" left="30" name="translate_chat_checkbox" - bottom_delta="30" + top_pad="5" width="400" /> + <!-- *HACK + After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "translate_chat_checkbox" check_box's label.--> + <text + follows="top|left" + height="15" + layout="topleft" + left="50" + name="translate_chb_label" + top_delta="1" + width="450" + wrap="true"> + Use machine translation while chatting (powered by Google) + </text> <text - bottom_delta="30" + top_pad="20" name="translate_language_text" follows="left|top" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 36f8f99178..9c718fdb87 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -307,17 +307,6 @@ tool_tip="Check to use display names in chat, IM, name tags, etc." top_pad="3"/> - <check_box - control_name="EnableUIHints" - follows="top|left" - height="16" - label="Enable Viewer UI Hints" - layout="topleft" - left="27" - name="viewer_hints_check" - top_pad="5" - width="237"/> - <text type="string" length="1" @@ -326,7 +315,7 @@ layout="topleft" left="30" name="inworld_typing_rg_label" - top_pad="6" + top_pad="1" width="400"> Pressing letter keys: </text> @@ -348,9 +337,9 @@ width="150" /> <radio_item label="Affects movement (i.e. WASD)" - left_pad="0" + left="0" layout="topleft" - top_delta="0" + top="18" height="16" name="radio_move" value="0" @@ -365,7 +354,7 @@ layout="topleft" left="30" name="title_afk_text" - top_pad="4" + top_pad="15" width="190"> Away timeout: </text> @@ -408,7 +397,7 @@ left="30" mouse_opaque="false" name="text_box3" - top_pad="5" + top_pad="3" width="240"> Busy mode response: </text> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml index d2fc6ea09a..04412bdb9c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml @@ -120,12 +120,13 @@ type="string" length="1" follows="left|top" - height="10" + height="15" layout="topleft" left_delta="3" name=" Mouse Sensitivity" top_pad="10" - width="160"> + width="160" + wrap="true"> Mouselook mouse sensitivity: </text> <slider @@ -139,7 +140,7 @@ max_val="15" name="mouse_sensitivity" top_delta="-1" - width="145" /> + width="115" /> <check_box control_name="InvertMouse" height="16" @@ -158,7 +159,7 @@ left="78" name="arrow_keys_move_avatar_check" width="237" - top_pad="1"/> + top_pad="10"/> <check_box control_name="AllowTapTapHoldRun" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index ef25588ca3..30be5bc853 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -42,7 +42,7 @@ </text> <check_box height="16" - enabled="true" + enabled="false" label="Show me in Search results" layout="topleft" left="30" @@ -82,8 +82,8 @@ control_name="ShowFavoritesOnLogin" enabled="false" height="16" - label="Show my Favorite Landmarks at Login (via 'Start At' drop-down menu)" layout="topleft" + label="Show my Favorite Landmarks at Login (via 'Start At' drop-down menu)" left="30" name="favorites_on_login_check" top_pad="10" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 26af8dc29d..e374c89f21 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -50,12 +50,24 @@ control_name="MuteWhenMinimized" height="15" initial_value="true" - label="Mute when minimized" layout="topleft" name="mute_when_minimized" top_delta="3" left_pad="5" - width="235" /> + width="20" /> + <!-- *HACK + After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "mute_when_minimized" check_box's label.--> + <text + follows="top|left" + height="15" + layout="topleft" + left_pad="0" + name="mute_chb_label" + top_delta="0" + width="150" + wrap="true"> + Mute when minimized + </text> <slider control_name="AudioLevelUI" disabled_control="MuteAudio" @@ -467,163 +479,12 @@ width="190"> </button> <panel - background_visible="false" - bg_alpha_color="DkGray" + layout="topleft" + filename="panel_sound_devices.xml" visiblity_control="ShowDeviceSettings" - border="false" - follows="top|left" - height="100" - label="Device Settings" - layout="topleft" - left_delta="-2" name="device_settings_panel" - class="panel_voice_device_settings" - width="470" - top_pad="0"> - <panel.string - name="default_text"> - Default - </panel.string> - <panel.string - name="default system device"> - Default system device - </panel.string> - <panel.string - name="no device"> - No device - </panel.string> - <icon - height="18" - image_name="Microphone_On" - left_delta="4" - name="microphone_icon" - mouse_opaque="false" - top="7" - visible="true" - width="18" /> - <text - type="string" - length="1" - font.style="BOLD" - follows="left|top" - height="16" - layout="topleft" - left_pad="3" - name="Input" - width="70"> - Input - </text> - <combo_box - height="23" - control_name="VoiceInputAudioDevice" - layout="topleft" - left_pad="0" - max_chars="128" - name="voice_input_device" - top_delta="-5" - width="200" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="-70" - name="My volume label" - top_pad="4" - width="200"> - My volume: - </text> - <slider_bar - control_name="AudioLevelMic" - follows="left|top" - height="17" - increment="0.025" - initial_value="1.0" - layout="topleft" - left_delta="-6" - max_val="2" - name="mic_volume_slider" - tool_tip="Change the volume using this slider" - top_pad="-1" - width="220" /> - <text - type="string" - text_color="EmphasisColor" - length="1" - follows="left|top" - height="18" - layout="topleft" - left_pad="5" - name="wait_text" - top_delta="-1" - width="110"> - Please wait - </text> - <locate - height="20" - layout="topleft" - left_delta="0" - name="bar0" - top_delta="-2" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar1" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar2" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar3" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar4" - top_delta="0" - width="20" /> - <icon - height="18" - image_name="Parcel_Voice_Light" - left="5" - name="speaker_icon" - mouse_opaque="false" - top_pad="3" - visible="true" - width="22" /> - <text - font.style="BOLD" - type="string" - length="1" - follows="left|top" - height="15" - layout="topleft" - left_pad="0" - name="Output" - width="70"> - Output - </text> - <combo_box - control_name="VoiceOutputAudioDevice" - height="23" - layout="topleft" - left_pad="0" - max_chars="128" - name="voice_output_device" - top_delta="-3" - width="200" /> - </panel> + top="314" + width="345" + left="18" + class="panel_voice_device_settings"/> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index d36220385d..cb701e03da 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -453,23 +453,6 @@ </layout_panel> </layout_stack> </layout_panel> - <layout_panel - follows="bottom|left" - height="30" - layout="topleft" - name="profile_me_buttons_panel" - visible="false" - width="313"> - <button - follows="bottom|right" - height="23" - left="20" - top="0" - label="Edit Profile" - name="edit_profile_btn" - tool_tip="Edit your personal information" - width="130" /> - </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml new file mode 100644 index 0000000000..9812281323 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -0,0 +1,163 @@ +<panel + background_visible="false" + bg_alpha_color="DkGray" + follows="all" + height="200" + label="Device Settings" + layout="topleft" + name="device_settings_panel" + width="360"> + <panel.string + name="default_text"> + Default + </panel.string> + <panel.string + name="default system device"> + Default system device + </panel.string> + <panel.string + name="no device"> + No device + </panel.string> + <icon + height="18" + image_name="Microphone_On" + left_delta="4" + name="microphone_icon" + mouse_opaque="false" + top="7" + layout="topleft" + visible="true" + width="18" /> + <text + type="string" + length="1" + font.style="BOLD" + follows="left|top" + height="16" + layout="topleft" + left_pad="3" + name="Input" + width="70"> + Input + </text> + <combo_box + height="23" + control_name="VoiceInputAudioDevice" + follows="left|top" + layout="topleft" + left_pad="0" + max_chars="128" + name="voice_input_device" + top_delta="-5" + width="200" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="-70" + name="My volume label" + top_pad="4" + width="200"> + My volume: + </text> + <slider_bar + control_name="AudioLevelMic" + follows="top|right|left" + height="17" + increment="0.025" + initial_value="1.0" + layout="topleft" + left_delta="-6" + max_val="2" + name="mic_volume_slider" + tool_tip="Change the volume using this slider" + top_pad="-1" + width="220" /> + <text + type="string" + text_color="EmphasisColor" + length="1" + follows="right|top" + height="18" + layout="topleft" + left_pad="5" + name="wait_text" + top_delta="-1" + width="110"> + Please wait + </text> + <locate + follows="right|top" + height="20" + layout="topleft" + left_delta="0" + name="bar0" + top_delta="-2" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar1" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar2" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar3" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar4" + top_delta="0" + width="20" /> + <icon + height="18" + image_name="Parcel_Voice_Light" + left="5" + name="speaker_icon" + mouse_opaque="false" + top_pad="3" + visible="true" + width="22" /> + <text + font.style="BOLD" + type="string" + length="1" + follows="left|top" + height="15" + layout="topleft" + left_pad="0" + name="Output" + width="70"> + Output + </text> + <combo_box + control_name="VoiceOutputAudioDevice" + height="23" + follows="left|top" + layout="topleft" + left_pad="0" + max_chars="128" + name="voice_output_device" + top_delta="-3" + width="200" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 27295150c5..b0ede60fa0 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3214,6 +3214,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. The session initialization is timed out </string> + <string name="Home position set.">Home position set.</string> + <string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string> <!-- Financial operations strings --> diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml index a1e32e44de..4d69dda7eb 100644 --- a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml +++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <avatar_icon + name="avatar_icon" default_icon_name="Generic_Person_Large" use_draw_context_alpha="false"> </avatar_icon> 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 99807d4717..d27c14f4e7 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 @@ -21,6 +21,7 @@ width="20" /> <chiclet_im_p2p.avatar_icon bottom="3" + color="white" follows="left|top|bottom" height="20" left="2" diff --git a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml index 6040d24128..ea1d89c975 100644 --- a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml +++ b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml @@ -3,6 +3,20 @@ follows="left|top" mouse_opaque="false" name="loading_indicator" - rotations_per_sec="1.0" - tab_stop="false" -/> + images_per_sec="1.0" + tab_stop="false"> + <images> + <image name="Progress_1"/> + <image name="Progress_2"/> + <image name="Progress_3"/> + <image name="Progress_4"/> + <image name="Progress_5"/> + <image name="Progress_6"/> + <image name="Progress_7"/> + <image name="Progress_8"/> + <image name="Progress_9"/> + <image name="Progress_10"/> + <image name="Progress_11"/> + <image name="Progress_12"/> + </images> +</loading_indicator>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml index 830ea12e41..e6d4bff8b5 100644 --- a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml +++ b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml @@ -6,20 +6,24 @@ track_color="ScrollbarTrackColor" thumb_color="ScrollbarThumbColor" thickness="15"> - <up_button image_unselected="ScrollArrow_Up" + <up_button name="up_button" + image_unselected="ScrollArrow_Up" image_selected="ScrollArrow_Up" scale_image="true" hover_glow_amount="0.35"/> - <down_button image_unselected="ScrollArrow_Down" + <down_button name="down_button" + image_unselected="ScrollArrow_Down" image_selected="ScrollArrow_Down" scale_image="true" hover_glow_amount="0.35"/> - <left_button image_unselected="ScrollArrow_Left" + <left_button name="left_button" + image_unselected="ScrollArrow_Left" image_selected="ScrollArrow_Left" scale_image="true" hover_glow_amount="0.35"/> - <right_button image_unselected="ScrollArrow_Right" - image_selected="ScrollArrow_Right" - scale_image="true" - hover_glow_amount="0.35"/> + <right_button name="right_button" + image_unselected="ScrollArrow_Right" + image_selected="ScrollArrow_Right" + scale_image="true" + hover_glow_amount="0.35"/> </scroll_bar> diff --git a/indra/newview/skins/default/xui/es/floater_beacons.xml b/indra/newview/skins/default/xui/es/floater_beacons.xml index b86967755c..49f990c84d 100644 --- a/indra/newview/skins/default/xui/es/floater_beacons.xml +++ b/indra/newview/skins/default/xui/es/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Sólo tocar" name="touch_only"/> <check_box label="Origen de sonidos" name="sounds"/> <check_box label="Origen de partículas" name="particles"/> + <check_box label="Fuentes de media" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml index c58eb227aa..bd13262dcd 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml @@ -30,15 +30,15 @@ <text name="trigger_label"> Palabra clave: </text> - <text left="208" name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'Quise decir hola' por 'Quise decir qué tal' en cuanto realice el gesto."> + <text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'Quise decir hola' por 'Quise decir qué tal' en cuanto realice el gesto."> Reemplazar por: </text> <line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'Quise decir hola' por 'Quise decir qué tal' en cuanto realice el gesto."/> <text name="key_label"> Atajo de teclado: </text> - <combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/> - <combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/> + <combo_box label="Ninguno" name="modifier_combo" width="76"/> + <combo_box label="Ninguno" name="key_combo" width="50"/> <text name="library_label"> Biblioteca: </text> @@ -55,20 +55,20 @@ <button label="Arriba" name="up_btn"/> <button label="Abajo" name="down_btn"/> <button label="Quitar" name="delete_btn"/> - <text left="230" name="options_text" width="200"> + <text name="options_text" width="200"> (opciones) </text> <radio_group name="animation_trigger_type"> <radio_item label="Empezar" name="start"/> <radio_item label="Parar" name="stop"/> </radio_group> - <check_box bottom_delta="34" label="hasta que las animaciones estén hechas" name="wait_anim_check"/> - <check_box bottom_delta="-30" label="tiempo en segundos:" name="wait_time_check"/> - <line_editor left_delta="130" name="wait_time_editor"/> + <check_box label="hasta que las animaciones estén hechas" name="wait_anim_check"/> + <check_box label="tiempo en segundos:" name="wait_time_check"/> + <line_editor name="wait_time_editor"/> <text name="help_label"> Todos los pasos suceden a la vez, a menos que añadas pasos de espera. </text> - <check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/> - <button label="Vista previa" name="preview_btn" width="85"/> + <check_box label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/> + <button label="Vista previa" name="preview_btn" width="82"/> <button label="Guardar" name="save_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml index f4a0897d73..89092201d9 100644 --- a/indra/newview/skins/default/xui/es/floater_tos.xml +++ b/indra/newview/skins/default/xui/es/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Cargando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Elas%20Condiciones%20del%20servicio%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Continuar" label_selected="Continuar" name="Continue"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml index a2d86d78c1..268d6f70ab 100644 --- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Camiseta" name="Self Undershirt"/> <menu_item_call label="Ropa interior" name="Self Underpants"/> <menu_item_call label="Tatuaje" name="Self Tattoo"/> + <menu_item_call label="Física" name="Self Physics"/> <menu_item_call label="Alfa" name="Self Alpha"/> <menu_item_call label="Toda la ropa" name="All Clothes"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_bottomtray.xml b/indra/newview/skins/default/xui/es/menu_bottomtray.xml index a16da5ae9e..40058a1749 100644 --- a/indra/newview/skins/default/xui/es/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Voz activada" name="EnableVoiceChat"/> + <menu_item_check label="Botón Hablar" name="EnableVoiceChat"/> <menu_item_check label="Botón Gestos" name="ShowGestureButton"/> <menu_item_check label="Botón Moverse" name="ShowMoveButton"/> <menu_item_check label="Botón Vista" name="ShowCameraButton"/> diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml index c8a7858ddb..85210d5c49 100644 --- a/indra/newview/skins/default/xui/es/menu_favorites.xml +++ b/indra/newview/skins/default/xui/es/menu_favorites.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> - <menu_item_call label="Teleportarse" name="Teleport To Landmark"/> + <menu_item_call label="Teleportar" name="Teleport To Landmark"/> <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/> <menu_item_call label="Copiar la SLurl" name="Copy slurl"/> <menu_item_call label="Mostrar en el mapa" name="Show On Map"/> diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml index bee4c61da2..82fc8ddd39 100644 --- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml @@ -4,7 +4,7 @@ <menu_item_call label="Añadir como amigo" name="add_friend"/> <menu_item_call label="MI" name="im"/> <menu_item_call label="Llamada" name="call"/> - <menu_item_call label="Teleportarse" name="teleport"/> + <menu_item_call label="Teleportar" name="teleport"/> <menu_item_call label="Invitar al grupo" name="invite_to_group"/> <menu_item_call label="Ignorar" name="block"/> <menu_item_call label="Designorar" name="unblock"/> diff --git a/indra/newview/skins/default/xui/es/menu_inventory.xml b/indra/newview/skins/default/xui/es/menu_inventory.xml index 94ee162bbc..e873d31580 100644 --- a/indra/newview/skins/default/xui/es/menu_inventory.xml +++ b/indra/newview/skins/default/xui/es/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Ropa interior nueva" name="New Underpants"/> <menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/> <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> + <menu_item_call label="Nueva física" name="New Physics"/> </menu> <menu label="Nuevas partes del cuerpo" name="New Body Parts"> <menu_item_call label="Forma nueva" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/es/menu_inventory_add.xml b/indra/newview/skins/default/xui/es/menu_inventory_add.xml index ba106e8335..615a1a09b7 100644 --- a/indra/newview/skins/default/xui/es/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/es/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Ropa interior nueva" name="New Underpants"/> <menu_item_call label="Nueva Alfa" name="New Alpha"/> <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> + <menu_item_call label="Nueva física" name="New Physics"/> </menu> <menu label="Nuevas partes del cuerpo" name="New Body Parts"> <menu_item_call label="Forma nueva" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/es/menu_media_ctrl.xml b/indra/newview/skins/default/xui/es/menu_media_ctrl.xml new file mode 100644 index 0000000000..8ea9286d8e --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml index 3b11bceecf..558ff6afd3 100644 --- a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear"/> <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/> <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Camiseta nueva" name="New Undershirt"/> <menu_item_call label="Ropa interior nueva" name="New Underpants"/> <menu_item_call label="Nueva Alfa" name="New Alpha"/> + <menu_item_call label="Nueva física" name="New Physics"/> <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> </menu> <menu label="Nuevas partes del cuerpo" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Renombrar el vestuario" name="rename"/> <menu_item_call label="Borrar el vestuario" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml index ed33c55aca..c482907812 100644 --- a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Teleport History Item Context Menu"> - <menu_item_call label="Teleportarse" name="Teleport"/> + <menu_item_call label="Teleportar" name="Teleport"/> <menu_item_call label="Más información" name="More Information"/> <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index c48203f95c..138bbd9412 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -336,4 +336,9 @@ </menu> <menu_item_call label="God Tools" name="God Tools"/> </menu> + <menu label="Admin" name="Deprecated"> + <menu label="Take Off Clothing" name="Take Off Clothing"> + <menu_item_call label="Física" name="Physics"/> + </menu> + </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 1379f710c3..91a03023a1 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -2841,6 +2841,13 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi <notification label="Levantarme" name="HintSit"> Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme. </notification> + <notification label="Hablar" name="HintSpeak"> + Pulsa en el botón: Hablar para conectar y desconectar el micrófono. + +Pulsa en el cursor arriba para ver el panel de control de voz. + +Al ocultar el botón Hablar se desactiva la función de voz. + </notification> <notification label="Explora el mundo" name="HintDestinationGuide"> La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración. </notification> @@ -2850,12 +2857,14 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi <notification label="Mover" name="HintMove"> Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado. </notification> + <notification label="" name="HintMoveClick"> + 1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él. + +2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista. + </notification> <notification label="Nombre mostrado" name="HintDisplayName"> Configura y personaliza aquí tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias. </notification> - <notification label="Mover" name="HintMoveArrows"> - Para caminar, utiliza las flechas de dirección del teclado. Para correr, pulsa dos veces la flecha hacia arriba. - </notification> <notification label="Visión" name="HintView"> Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina. </notification> diff --git a/indra/newview/skins/default/xui/es/panel_edit_physics.xml b/indra/newview/skins/default/xui/es/panel_edit_physics.xml new file mode 100644 index 0000000000..dfb5ab330a --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Rebote de los senos"/> + <accordion_tab name="physics_breasts_inout_tab" title="Canalillo de los senos"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Bamboleo de los senos"/> + <accordion_tab name="physics_belly_tab" title="Rebote de la barriga"/> + <accordion_tab name="physics_butt_tab" title="Rebote del culo"/> + <accordion_tab name="physics_butt_leftright_tab" title="Bamboleo del culo"/> + <accordion_tab name="physics_advanced_tab" title="Parámetros avanzados"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml index 15c683f375..799512968d 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Modificando los tatuajes </string> + <string name="edit_physics_title"> + Modificar la física + </string> <string name="shape_desc_text"> Anatomía: </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tatuaje: </string> + <string name="physics_desc_text"> + Física: + </string> <labeled_back_button label="Guardar" name="back_btn" tool_tip="Regresar a Editar el vestuario"/> <text name="edit_wearable_title" value="Modificando la anatomía"/> <panel label="Camisa" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 0b304fe287..f7bc1f6aad 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -29,7 +29,10 @@ <check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/> <spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/> <spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/> - <check_box label="Usar la traducción automática (con Google) en el chat" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label"> + Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google) + </text> <text name="translate_language_text"> Traducir el chat al: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml index edd417d564..a7fb2d9af8 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml @@ -26,13 +26,13 @@ Propietario </text> <text name="text_box9"> - URL + URLs </text> <text name="bubble_chat"> - Color de fondo de la etiqueta del nombre (afectará también a los bocadillos del chat): + Color de fondo de las etiquetas de nombre (también se aplica a los bocadillos del chat): </text> - <color_swatch name="background" tool_tip="Seleccionar el color de la etiqueta del nombre"/> - <slider label="Opacidad:" name="bubble_chat_opacity" tool_tip="Seleccionar opacidad de la etiqueta del nombre"/> + <color_swatch name="background" tool_tip="Elige el color de las etiquetas de nombre"/> + <slider label="Opacidad:" name="bubble_chat_opacity" tool_tip="Elige la opacidad de las etiquetas de nombre"/> <text name="floater_opacity"> Opacidad de la ventana: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml index c569db3376..1ae5d63ace 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml @@ -39,6 +39,10 @@ <combo_box.item label="Todos los avatares y objetos" name="3"/> <combo_box.item label="Todo" name="4"/> </combo_box> + <slider label="Física del avatar:" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Bajo + </text> <slider label="Distancia de dibujo:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index db3659abcd..8ce8e23138 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -4,7 +4,10 @@ Botón medio del ratón </panel.string> <slider label="Volumen general" name="System Volume"/> - <check_box initial_value="true" label="Silenciar cuando minimice" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label"> + Silenciar cuando minimice + </text> <slider label="Botones" name="UI Volume"/> <slider label="Ambiental" name="Wind Volume"/> <slider label="Efectos de sonido" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/es/panel_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml index 903b826a0b..98b10e4895 100644 --- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml @@ -8,7 +8,7 @@ </text> <spinner label="Nivel del agua" name="water_height_spin"/> <button label="?" name="water_height_help"/> - <spinner label="Límite de elevación del terreno" name="terrain_raise_spin"/> + <spinner label="Límite de elevación del terreno" name="terrain_raise_spin"/> <button label="?" name="terrain_raise_help"/> <spinner label="Límite de bajada del terreno" name="terrain_lower_spin" bottom_delta="-34"/> <button label="?" name="terrain_lower_help"/> diff --git a/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..fa659040ea --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[DESC]" name="param slider"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index cd1fb767c8..75126e74c5 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -855,6 +855,9 @@ <string name="tattoo"> Tatuaje </string> + <string name="physics"> + Física + </string> <string name="invalid"> inválido/a </string> @@ -894,6 +897,9 @@ <string name="tattoo_not_worn"> Tatuaje no puesto </string> + <string name="physics_not_worn"> + Física no puesta + </string> <string name="invalid_not_worn"> no válido/a </string> @@ -942,6 +948,9 @@ <string name="create_new_tattoo"> Crear un tatuaje nuevo </string> + <string name="create_new_physics"> + Crear nueva física + </string> <string name="create_new_invalid"> no válido/a </string> @@ -2178,6 +2187,114 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="Bulbous Nose"> Nariz de porra </string> + <string name="Breast Physics Mass"> + Masa del busto + </string> + <string name="Breast Physics Smoothing"> + Suavizado del busto + </string> + <string name="Breast Physics Gravity"> + Gravedad del busto + </string> + <string name="Breast Physics Drag"> + Aerodinámica del busto + </string> + <string name="Breast Physics InOut Max Effect"> + Efecto máx. + </string> + <string name="Breast Physics InOut Spring"> + Elasticidad + </string> + <string name="Breast Physics InOut Gain"> + Ganancia + </string> + <string name="Breast Physics InOut Damping"> + Amortiguación + </string> + <string name="Breast Physics UpDown Max Effect"> + Efecto máx. + </string> + <string name="Breast Physics UpDown Spring"> + Elasticidad + </string> + <string name="Breast Physics UpDown Gain"> + Ganancia + </string> + <string name="Breast Physics UpDown Damping"> + Amortiguación + </string> + <string name="Breast Physics LeftRight Max Effect"> + Efecto máx. + </string> + <string name="Breast Physics LeftRight Spring"> + Elasticidad + </string> + <string name="Breast Physics LeftRight Gain"> + Ganancia + </string> + <string name="Breast Physics LeftRight Damping"> + Amortiguación + </string> + <string name="Belly Physics Mass"> + Masa de la barriga + </string> + <string name="Belly Physics Smoothing"> + Suavizado de la barriga + </string> + <string name="Belly Physics Gravity"> + Gravedad de la barriga + </string> + <string name="Belly Physics Drag"> + Aerodinámica de la barriga + </string> + <string name="Belly Physics UpDown Max Effect"> + Efecto máx. + </string> + <string name="Belly Physics UpDown Spring"> + Elasticidad + </string> + <string name="Belly Physics UpDown Gain"> + Ganancia + </string> + <string name="Belly Physics UpDown Damping"> + Amortiguación + </string> + <string name="Butt Physics Mass"> + Masa del culo + </string> + <string name="Butt Physics Smoothing"> + Suavizado del culo + </string> + <string name="Butt Physics Gravity"> + Gravedad del culo + </string> + <string name="Butt Physics Drag"> + Aerodinámica del culo + </string> + <string name="Butt Physics UpDown Max Effect"> + Efecto máx. + </string> + <string name="Butt Physics UpDown Spring"> + Elasticidad + </string> + <string name="Butt Physics UpDown Gain"> + Ganancia + </string> + <string name="Butt Physics UpDown Damping"> + Amortiguación + </string> + <string name="Butt Physics LeftRight Max Effect"> + Efecto máx. + </string> + <string name="Butt Physics LeftRight Spring"> + Elasticidad + </string> + <string name="Butt Physics LeftRight Gain"> + Ganancia + </string> + <string name="Butt Physics LeftRight Damping"> + Amortiguación + </string> <string name="Bushy Eyebrows"> Cejijuntas </string> @@ -2187,6 +2304,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="Butt Size"> Culo: tamaño </string> + <string name="Butt Gravity"> + Gravedad del culo + </string> <string name="bustle skirt"> Polisón </string> @@ -3662,6 +3782,9 @@ Denuncia de infracción <string name="New Tattoo"> Tatuaje nuevo </string> + <string name="New Physics"> + Nueva física + </string> <string name="Invalid Wearable"> No se puede poner </string> diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml index d61115a2db..ebd4dab683 100644 --- a/indra/newview/skins/default/xui/fr/floater_beacons.xml +++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Toucher uniquement" name="touch_only"/> <check_box label="Sources sonores" name="sounds"/> <check_box label="Sources des particules" name="particles"/> + <check_box label="Sources des médias" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml index 8a2a1e1d25..6d58cf77ca 100644 --- a/indra/newview/skins/default/xui/fr/floater_tos.xml +++ b/indra/newview/skins/default/xui/fr/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Chargement %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Eles%20Conditions%20d%27utilisation%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Continuer" label_selected="Continuer" name="Continue"/> <button label="Annuler" label_selected="Annuler" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml index 21528cd43b..6310a2177a 100644 --- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Débardeur" name="Self Undershirt"/> <menu_item_call label="Caleçon" name="Self Underpants"/> <menu_item_call label="Tatouage" name="Self Tattoo"/> + <menu_item_call label="Propriétés physiques" name="Self Physics"/> <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Tous les habits" name="All Clothes"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml index ddaea517fc..d0d245b286 100644 --- a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Voix activée" name="EnableVoiceChat"/> + <menu_item_check label="Bouton Parler" name="EnableVoiceChat"/> <menu_item_check label="Bouton Geste" name="ShowGestureButton"/> <menu_item_check label="Bouton Bouger" name="ShowMoveButton"/> <menu_item_check label="Bouton Affichage" name="ShowCameraButton"/> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml index a2279cf0ac..fa0e264d14 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Nouveau caleçon" name="New Underpants"/> <menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/> <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> + <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/> </menu> <menu label="Nouvelles parties du corps" name="New Body Parts"> <menu_item_call label="Nouvelle silhouette" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml index fe096b4a7e..5d2b554dc3 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Nouveau caleçon" name="New Underpants"/> <menu_item_call label="Nouvel alpha" name="New Alpha"/> <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> + <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/> </menu> <menu label="Nouvelles parties du corps" name="New Body Parts"> <menu_item_call label="Nouvelle silhouette" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml b/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml new file mode 100644 index 0000000000..787a5b3af2 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Couper" name="Cut"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml index 5db7f176b5..b5181f4f82 100644 --- a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear"/> <menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/> <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/> <menu_item_call label="Nouveau caleçon" name="New Underpants"/> <menu_item_call label="Nouvel alpha" name="New Alpha"/> + <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/> <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> </menu> <menu label="Nouvelles parties du corps" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Renommer la tenue" name="rename"/> <menu_item_call label="Supprimer la tenue" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index ee1ab8c601..1dd6da9d6f 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -412,6 +412,7 @@ <menu_item_call label="Jupe" name="Skirt"/> <menu_item_call label="Alpha" name="Alpha"/> <menu_item_call label="Tatouage" name="Tattoo"/> + <menu_item_call label="Propriétés physiques" name="Physics"/> <menu_item_call label="Tous les habits" name="All Clothes"/> </menu> <menu label="Aide" name="Help"> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index e984ea66ed..78890caabb 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -2838,6 +2838,13 @@ Ignorer les autres ? <notification label="Se lever" name="HintSit"> Pour passer d'une position assise à une position debout, cliquez sur le bouton Me lever. </notification> + <notification label="Parler" name="HintSpeak"> + Cliquez sur le bouton Parler pour activer/désactiver le micro. + +Cliquez sur la flèche vers le haut pour afficher le panneau de contrôle de la voix. + +Si vous masquez le bouton Parler, la fonction Voix sera désactivée. + </notification> <notification label="Explorer le monde" name="HintDestinationGuide"> Le Guide des destinations comprend des milliers d'endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l'explorer. </notification> @@ -2847,12 +2854,16 @@ Ignorer les autres ? <notification label="Bouger" name="HintMove"> Pour marcher ou courir, cliquez sur le bouton Bouger, puis naviguez à l'aide des flèches directionnelles. Vous pouvez également utiliser les touches fléchées de votre clavier. </notification> + <notification label="" name="HintMoveClick"> + 1. Cliquer pour marcher +Cliquez n'importe où sur le sol pour vous diriger vers ce point en marchant. + +2. Cliquer et faire glisser pour faire pivoter la vue +Cliquez sur un point dans le monde et faites glisser votre souris pour faire tourner la caméra. + </notification> <notification label="Nom d'affichage" name="HintDisplayName"> Définissez ici votre nom d'affichage personnalisable. Cette fonctionnalité vous est fournie en plus de votre nom d'utilisateur unique qui, lui, ne peut être changé. Vous pouvez modifier l'apparence des noms des autres résidents dans vos préférences. </notification> - <notification label="Bouger" name="HintMoveArrows"> - Pour marcher, utilisez les touches fléchées de votre clavier. Pour courir, appuyez deux fois sur la flèche vers le haut. - </notification> <notification label="Affichage" name="HintView"> Pour changer d'angle de vision, utilisez les contrôles Faire tourner et Faire un panoramique. Pour réinitialiser la vue, appuyez sur Échap ou marchez. </notification> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_physics.xml b/indra/newview/skins/default/xui/fr/panel_edit_physics.xml new file mode 100644 index 0000000000..d79f7df90a --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Rebond des seins"/> + <accordion_tab name="physics_breasts_inout_tab" title="Décolleté"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Balancement des seins"/> + <accordion_tab name="physics_belly_tab" title="Rebond du ventre"/> + <accordion_tab name="physics_butt_tab" title="Rebond des fesses"/> + <accordion_tab name="physics_butt_leftright_tab" title="Balancement des fesses"/> + <accordion_tab name="physics_advanced_tab" title="Paramètres avancés"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml index d7a3d3bd85..def158cf68 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Modification du tatouage </string> + <string name="edit_physics_title"> + Modification des propriétés physiques + </string> <string name="shape_desc_text"> Silhouette : </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tatouage : </string> + <string name="physics_desc_text"> + Propriétés physiques : + </string> <labeled_back_button label="Enregistrer" name="back_btn" tool_tip="Revenir à Modifier la tenue"/> <text name="edit_wearable_title" value="Modification de la silhouette"/> <panel label="Chemise" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 4b3fc35150..e9e6e6350f 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -29,7 +29,10 @@ <check_box label="Chats IM" name="EnableIMChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message instantané."/> <spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/> <spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/> - <check_box label="Utiliser la traduction automatique lors des chats (fournie par Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label"> + Utiliser la traduction automatique lors des chats (fournie par Google) + </text> <text name="translate_language_text"> Traduire le chat en : </text> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml index 4e7d75e1b9..abdffd232a 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Couleurs" name="colors_panel"> <text name="effects_color_textbox"> - Mes effets (faisceau de sélection lumineux) : + Mes effets (faisceau de sélection) : </text> <color_swatch name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs."/> <text name="font_colors"> - Couleurs de la police du chat : + Couleurs pour le chat : </text> <text name="text_box1"> Moi diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml index c90edd443e..025a72a1d2 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml @@ -39,6 +39,10 @@ <combo_box.item label="Tous les objets et avatars" name="3"/> <combo_box.item label="Tout" name="4"/> </combo_box> + <slider label="Propriétés physiques de l'avatar :" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Faible + </text> <slider label="Limite d'affichage :" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m @@ -77,7 +81,7 @@ Faible </text> <text name="AvatarRenderingText"> - Rendu de l'avatar : + Rendu de l'avatar : </text> <check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/> <check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/> 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 48630918d7..a404aae483 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -4,7 +4,10 @@ Bouton central de la souris </panel.string> <slider label="Volume principal" name="System Volume"/> - <check_box initial_value="true" label="Couper quand minimisé" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label"> + Couper lorsque minimisé + </text> <slider label="Boutons" name="UI Volume"/> <slider label="Ambiant" name="Wind Volume"/> <slider label="Effets sonores" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..fa659040ea --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[DESC]" name="param slider"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index a7c71dc0f0..a3369e6730 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -876,6 +876,9 @@ <string name="tattoo"> Tatouage </string> + <string name="physics"> + Propriétés physiques + </string> <string name="invalid"> non valide </string> @@ -915,6 +918,9 @@ <string name="tattoo_not_worn"> Tatouage non porté </string> + <string name="physics_not_worn"> + Propriétés physiques non portées + </string> <string name="invalid_not_worn"> non valide </string> @@ -963,6 +969,9 @@ <string name="create_new_tattoo"> Créer un nouveau tatouage </string> + <string name="create_new_physics"> + Créer de nouvelles propriétés physiques + </string> <string name="create_new_invalid"> non valide </string> @@ -2247,6 +2256,114 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="Bulbous Nose"> Nez en bulbe </string> + <string name="Breast Physics Mass"> + Masse des seins + </string> + <string name="Breast Physics Smoothing"> + Lissage des seins + </string> + <string name="Breast Physics Gravity"> + Gravité des seins + </string> + <string name="Breast Physics Drag"> + Résistance de l'air sur les seins + </string> + <string name="Breast Physics InOut Max Effect"> + Effet max. + </string> + <string name="Breast Physics InOut Spring"> + Vibration + </string> + <string name="Breast Physics InOut Gain"> + Amplification + </string> + <string name="Breast Physics InOut Damping"> + Amortissement + </string> + <string name="Breast Physics UpDown Max Effect"> + Effet max. + </string> + <string name="Breast Physics UpDown Spring"> + Vibration + </string> + <string name="Breast Physics UpDown Gain"> + Amplification + </string> + <string name="Breast Physics UpDown Damping"> + Amortissement + </string> + <string name="Breast Physics LeftRight Max Effect"> + Effet max. + </string> + <string name="Breast Physics LeftRight Spring"> + Vibration + </string> + <string name="Breast Physics LeftRight Gain"> + Amplification + </string> + <string name="Breast Physics LeftRight Damping"> + Amortissement + </string> + <string name="Belly Physics Mass"> + Masse du ventre + </string> + <string name="Belly Physics Smoothing"> + Lissage du ventre + </string> + <string name="Belly Physics Gravity"> + Gravité du ventre + </string> + <string name="Belly Physics Drag"> + Résistance de l'air sur le ventre + </string> + <string name="Belly Physics UpDown Max Effect"> + Effet max. + </string> + <string name="Belly Physics UpDown Spring"> + Vibration + </string> + <string name="Belly Physics UpDown Gain"> + Amplification + </string> + <string name="Belly Physics UpDown Damping"> + Amortissement + </string> + <string name="Butt Physics Mass"> + Masse des fesses + </string> + <string name="Butt Physics Smoothing"> + Lissage des fesses + </string> + <string name="Butt Physics Gravity"> + Gravité des fesses + </string> + <string name="Butt Physics Drag"> + Résistance de l'air sur les fesses + </string> + <string name="Butt Physics UpDown Max Effect"> + Effet max. + </string> + <string name="Butt Physics UpDown Spring"> + Vibration + </string> + <string name="Butt Physics UpDown Gain"> + Amplification + </string> + <string name="Butt Physics UpDown Damping"> + Amortissement + </string> + <string name="Butt Physics LeftRight Max Effect"> + Effet max. + </string> + <string name="Butt Physics LeftRight Spring"> + Vibration + </string> + <string name="Butt Physics LeftRight Gain"> + Amplification + </string> + <string name="Butt Physics LeftRight Damping"> + Amortissement + </string> <string name="Bushy Eyebrows"> Sourcils touffus </string> @@ -2256,6 +2373,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="Butt Size"> Taille des fesses </string> + <string name="Butt Gravity"> + Gravité des fesses + </string> <string name="bustle skirt"> Jupe gonflante </string> @@ -3764,6 +3884,9 @@ de l'infraction signalée <string name="New Tattoo"> Nouveau tatouage </string> + <string name="New Physics"> + Nouvelles propriétés physiques + </string> <string name="Invalid Wearable"> Objet à porter non valide </string> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml index 7e29db6336..2172b9848b 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml @@ -34,10 +34,10 @@ Sostituisci con: </text> <line_editor name="replace_editor" tool_tip="Sostituisci le parole chiave con questi termini. Per esempio, sostituire la parola chiave 'salve' con 'ciao' modificherà la chat 'Volevo solo dire salve' in 'Volevo solo dire ciao' e avvierà la gesture!"/> - <text name="key_label"> + <text name="key_label" width="147"> Scorciatoia da tastiera: </text> - <combo_box label="Nessuno" name="modifier_combo" /> + <combo_box left_delta="150" label="Nessuno" name="modifier_combo" /> <combo_box label="Nessuno" name="key_combo" /> <text name="library_label"> Libreria: diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 4a1bbdf64a..208dd5ed28 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -56,7 +56,8 @@ <radio_item label="Finestre separate" name="radio" value="0"/> <radio_item label="Schede" name="radio2" value="1"/> </radio_group> - <check_box label="Usa la traduzione meccanica durante le chat (tecnologia Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >Usa la traduzione meccanica durante le chat (tecnologia Google)</text> <text name="translate_language_text" width="110"> Traduci chat in: </text> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml index 6e70a314c5..e2332b63d0 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Suoni" name="Preference Media panel"> <slider label="Vol. principale" name="System Volume"/> - <check_box initial_value="true" label="Disatt. se a icona" name="mute_when_minimized"/> + <check_box initial_value="true" label="" name="mute_when_minimized"/> + <text name="mute_chb_label">Disatt. se a icona</text> <slider label="Pulsanti" name="UI Volume"/> <slider label="Ambiente" name="Wind Volume"/> <slider label="Effetti sonori" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index c260cebef8..ce2a0f35e4 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -56,7 +56,8 @@ <radio_item label="別々のウィンドウ" name="radio" value="0"/> <radio_item label="タブ" name="radio2" value="1"/> </radio_group> - <check_box label="チャット中に内容を機械翻訳する(Google翻訳)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label" >チャット中に内容を機械翻訳する(Google翻訳)</text> <text name="translate_language_text"> 翻訳する言語: </text> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index 9fbbd46220..74696a3b35 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="サウンド" name="Preference Media panel"> <slider label="全体の音量" name="System Volume"/> - <check_box initial_value="true" label="最小化でミュート" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">最小化でミュート</text> <slider label="ボタン" name="UI Volume"/> <slider label="風" name="Wind Volume"/> <slider label="効果音" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml index 2b709bde40..5ded015868 100644 --- a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Geluid" name="Preference Media panel"> <slider label="Hoofd volume" name="System Volume"/> - <check_box initial_value="true" label="Dempen indien geminimaliseerd" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label">Dempen indien geminimaliseerd</text> <slider label="Omliggend" name="Wind Volume"/> <slider label="Knoppen" name="UI Volume"/> <slider label="Media" name="Media Volume"/> diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml index b935615fcb..badff11a59 100644 --- a/indra/newview/skins/default/xui/pl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml @@ -349,6 +349,7 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki. <combo_box.item label="Park i natura" name="item9"/> <combo_box.item label="Mieszkalna" name="item10"/> <combo_box.item label="Zakupy" name="item11"/> + <combo_box.item label="Opłata za wynajęcie" name="item13"/> <combo_box.item label="Inna" name="item12"/> </combo_box> <combo_box name="land category"> @@ -363,6 +364,7 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki. <combo_box.item label="Parki i natura" name="item9"/> <combo_box.item label="Mieszkalna" name="item10"/> <combo_box.item label="Zakupy" name="item11"/> + <combo_box.item label="Opłata za wynajęcie" name="item13"/> <combo_box.item label="Inna" name="item12"/> </combo_box> <check_box label="Treść 'Mature'" name="MatureCheck" tool_tip=""/> @@ -430,7 +432,7 @@ Mediów: (Zdefiniowane przez Majątek) </panel.string> <panel.string name="allow_public_access"> - Udostępnij publicznie ([MATURITY]) + Udostępniaj publicznie ([MATURITY]) (Pamiętaj: w przypadku braku zaznaczenia tej opcji widoczne będą linie bana.) </panel.string> <panel.string name="estate_override"> Jedna lub więcej z tych opcji ustawiona jest z poziomu Posiadłości diff --git a/indra/newview/skins/default/xui/pl/floater_beacons.xml b/indra/newview/skins/default/xui/pl/floater_beacons.xml index 547db2b351..e6286a6ac1 100644 --- a/indra/newview/skins/default/xui/pl/floater_beacons.xml +++ b/indra/newview/skins/default/xui/pl/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Obiekty dotykalne" name="touch_only"/> <check_box label="Źródła dźwięku" name="sounds"/> <check_box label="Źródła cząsteczek" name="particles"/> + <check_box label="Źródła mediów" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_map.xml b/indra/newview/skins/default/xui/pl/floater_map.xml index fd151e91ad..e01c4c8a82 100644 --- a/indra/newview/skins/default/xui/pl/floater_map.xml +++ b/indra/newview/skins/default/xui/pl/floater_map.xml @@ -3,6 +3,9 @@ <floater.string name="ToolTipMsg"> [REGION](Podwójne kliknięcie otwiera Mapę, Shift i przeciągnięcie kursorem zmienia skalę) </floater.string> + <floater.string name="AltToolTipMsg"> + [REGION](Podwójne kliknięcie aktywuje teleportację, wciśnij Shift i przeciągnij aby przesunąć) + </floater.string> <floater.string name="mini_map_caption"> MINIMAPA </floater.string> diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index 337998efc9..9e6fed8387 100644 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml @@ -64,6 +64,8 @@ <radio_item label="Wybierz teksturę" name="radio select face"/> </radio_group> <check_box label="Edytuj połączone części" name="checkbox edit linked parts"/> + <button label="Linkuj" name="link_btn"/> + <button label="Rozlinkuj" name="unlink_btn"/> <text name="RenderingCost" tool_tip="Pokazuje koszt renderowania tego obiektu"> þ: [COUNT] </text> @@ -301,7 +303,7 @@ <combo_box.item label="Kwadrat" name="Square"/> <combo_box.item label="Trójkąt" name="Triangle"/> </combo_box> - <text name="text twist" left_delta="-5" width="160"> + <text left_delta="-5" name="text twist" width="160"> Skręcenie (początek/koniec) </text> <spinner label="P" name="Twist Begin"/> diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml index bb2de773f0..8cdf267f4b 100644 --- a/indra/newview/skins/default/xui/pl/floater_tos.xml +++ b/indra/newview/skins/default/xui/pl/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Ładowanie %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EWarunki%20Serwisu%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/> <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml index c19b0a1c2e..163b3a231e 100644 --- a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml @@ -5,7 +5,7 @@ <menu_item_call label="Odłącz" name="Detach"/> <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/> <menu_item_call label="Wstań" name="Stand Up"/> - <menu_item_call label="Zmień strój" name="Change Outfit"/> + <menu_item_call label="Mój wygląd" name="Change Outfit"/> <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> <menu_item_call label="Moi znajomi" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml index ea151788c6..8eb501c5b8 100644 --- a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Podkoszulek" name="Self Undershirt"/> <menu_item_call label="Bieliznę" name="Self Underpants"/> <menu_item_call label="Tatuaż" name="Self Tattoo"/> + <menu_item_call label="Fizyka" name="Self Physics"/> <menu_item_call label="Ubranie alpha" name="Self Alpha"/> <menu_item_call label="Wszystko" name="All Clothes"/> </context_menu> @@ -21,7 +22,7 @@ <context_menu label="Odłącz" name="Object Detach"/> <menu_item_call label="Odłącz wszystko" name="Detach All"/> </context_menu> - <menu_item_call label="Zmień strój" name="Chenge Outfit"/> + <menu_item_call label="Mój wygląd" name="Chenge Outfit"/> <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> <menu_item_call label="Moi znajomi" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml index a4a6ea484d..1ec5883cfe 100644 --- a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Rozpocznij rozmowę głosową" name="EnableVoiceChat"/> <menu_item_check label="Przycisk gesturki" name="ShowGestureButton"/> <menu_item_check label="Przycisk ruchu" name="ShowMoveButton"/> <menu_item_check label="Przycisk widoku" name="ShowCameraButton"/> <menu_item_check label="Przycisk zdjęć" name="ShowSnapshotButton"/> - <menu_item_check label="Schowek" name="ShowSidebarButton"/> <menu_item_check label="Buduj" name="ShowBuildButton"/> <menu_item_check label="Szukaj" name="ShowSearchButton"/> <menu_item_check label="Mapa" name="ShowWorldMapButton"/> diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml index 5c27d53d90..59560f236c 100644 --- a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> +<toggleable_menu name="Gear Menu"> <menu_item_call label="Zobacz profil" name="view_profile"/> <menu_item_call label="Dodaj znajomość" name="add_friend"/> <menu_item_call label="IM" name="im"/> @@ -11,9 +11,11 @@ <menu_item_call label="Raport" name="report"/> <menu_item_call label="Unieruchom" name="freeze"/> <menu_item_call label="Wyrzuć" name="eject"/> + <menu_item_call label="Kopnij" name="kick"/> + <menu_item_call label="CSR" name="csr"/> <menu_item_call label="Debugowanie tekstur" name="debug"/> <menu_item_call label="Znajdź na mapie" name="find_on_map"/> <menu_item_call label="Przybliż" name="zoom_in"/> <menu_item_call label="Zapłać" name="pay"/> <menu_item_call label="Udostępnij" name="share"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml index 90d71371e8..c4ef9761d9 100644 --- a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml @@ -1,10 +1,31 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="Usiądź tutaj" name="sit_down_here"/> - <menu_item_call label="Wstań" name="stand_up"/> - <menu_item_call label="Zmień strój" name="change_outfit"/> - <menu_item_call label="Mój profil" name="my_profile"/> - <menu_item_call label="Moi znajomi" name="my_friends"/> - <menu_item_call label="Moje grupy" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/> + <menu_item_call label="Wstań" name="Stand Up"/> + <context_menu label="Zdejmij" name="Take Off >"> + <context_menu label="Ubranie" name="Clothes >"> + <menu_item_call label="Bluzka" name="Shirt"/> + <menu_item_call label="Spodnie" name="Pants"/> + <menu_item_call label="Spódnica" name="Skirt"/> + <menu_item_call label="Buty" name="Shoes"/> + <menu_item_call label="Skarpetki" name="Socks"/> + <menu_item_call label="Kurtka" name="Jacket"/> + <menu_item_call label="Rękawiczki" name="Gloves"/> + <menu_item_call label="Podkoszulek" name="Self Undershirt"/> + <menu_item_call label="Bielizna" name="Self Underpants"/> + <menu_item_call label="Tatuaż" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Ubranie" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Odłącz" name="Object Detach"/> + <menu_item_call label="Odłącz wszystko" name="Detach All"/> + </context_menu> + <menu_item_call label="Zmień strój" name="Chenge Outfit"/> + <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> + <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> + <menu_item_call label="Znajomi" name="Friends..."/> + <menu_item_call label="Moje grupy" name="Groups..."/> + <menu_item_call label="Mój profil" name="Profile..."/> <menu_item_call label="Debugowanie tekstur" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml index e47ffa0e18..5492f78b26 100644 --- a/indra/newview/skins/default/xui/pl/menu_inventory.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Nowa bielizna" name="New Underpants"/> <menu_item_call label="Nowa maska alpha" name="New Alpha Mask"/> <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + <menu_item_call label="Nowa fizyka" name="New Physics"/> </menu> <menu label="Nowa Część Ciała" name="New Body Parts"> <menu_item_call label="Nowy kształt" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml index 4a56586aaf..04f9b94f7c 100644 --- a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Nowa bielizna" name="New Underpants"/> <menu_item_call label="Nowa maska alpha" name="New Alpha"/> <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + <menu_item_call label="Nowa fizyka" name="New Physics"/> </menu> <menu label="Nowa Część Ciała" name="New Body Parts"> <menu_item_call label="Nowy kształt" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml index 491b4deeaa..591c3a81d5 100644 --- a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml @@ -3,6 +3,7 @@ <menu_item_call label="Nowe okno Szafy" name="new_window"/> <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/> <menu_item_check label="Porządkuj według daty" name="sort_by_recent"/> + <menu_item_check label="Sortuj foldery zawsze według nazwy" name="sort_folders_by_name"/> <menu_item_check label="Posortuj foldery systemowe od góry" name="sort_system_folders_to_top"/> <menu_item_call label="Pokaż filtry" name="show_filters"/> <menu_item_call label="Zresetuj filtry" name="reset_filters"/> diff --git a/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml b/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml new file mode 100644 index 0000000000..60dc3673a9 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Wytnij" name="Cut"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_object.xml b/indra/newview/skins/default/xui/pl/menu_object.xml index 2173401dd2..3da6c5c890 100644 --- a/indra/newview/skins/default/xui/pl/menu_object.xml +++ b/indra/newview/skins/default/xui/pl/menu_object.xml @@ -16,14 +16,14 @@ <context_menu label="Dołącz" name="Object Attach"/> <context_menu label="Dołącz HUD" name="Object Attach HUD"/> </context_menu> - <context_menu label="Usuń" name="Remove"> + <context_menu label="Zarządzaj" name="Remove"> <menu_item_call label="Raport" name="Report Abuse..."/> <menu_item_call label="Zablokuj" name="Object Mute"/> <menu_item_call label="Zwróć" name="Return..."/> - <menu_item_call label="Usuń" name="Delete"/> </context_menu> <menu_item_call label="Weź" name="Pie Object Take"/> <menu_item_call label="Weź kopię" name="Take Copy"/> <menu_item_call label="Zapłać" name="Pay..."/> <menu_item_call label="Kup" name="Buy..."/> + <menu_item_call label="Skasuj" name="Delete"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml index 1a70e76ec7..c093557e86 100644 --- a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Załóż - Zastąp obecny strój" name="wear"/> <menu_item_call label="Załóż - Dodaj do bieżącego stroju" name="wear_add"/> <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Nowa podkoszulka" name="New Undershirt"/> <menu_item_call label="Nowa bielizna" name="New Underpants"/> <menu_item_call label="Nowa maska alpha" name="New Alpha"/> + <menu_item_call label="Nowa fizyka" name="New Physics"/> <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> </menu> <menu label="Nowe części ciała" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Zmień nazwę stroju" name="rename"/> <menu_item_call label="Usuń strój" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml index 65417cef22..d1f283b7aa 100644 --- a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_folder_gear"> +<toggleable_menu name="menu_folder_gear"> <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Przywróć obiekt" name="restore_item"/> <menu_item_call label="Wytnij" name="cut"/> <menu_item_call label="Kopiuj" name="copy_folder"/> <menu_item_call label="Wklej" name="paste"/> @@ -12,4 +13,4 @@ <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/> <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> <menu_item_check label="Sortuj według daty" name="sort_by_date"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml index 36787dd0aa..0139d3a987 100644 --- a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_ladmark_gear"> +<toggleable_menu name="menu_ladmark_gear"> <menu_item_call label="Teleportuj" name="teleport"/> <menu_item_call label="Więcej informacji" name="more_info"/> <menu_item_call label="Pokaż na mapie" name="show_on_map"/> <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Przywróć obiekt" name="restore_item"/> <menu_item_call label="Wytnij" name="cut"/> <menu_item_call label="Kopiuj landmark" name="copy_landmark"/> <menu_item_call label="Kopiuj SLurl" name="copy_slurl"/> @@ -15,4 +16,4 @@ <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> <menu_item_check label="Sortuj według daty" name="sort_by_date"/> <menu_item_call label="Stwórz Ulubione" name="create_pick"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index e6a9d360c4..e869806d04 100644 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -5,7 +5,7 @@ <menu_item_call label="Dashboard" name="Manage My Account"/> <menu_item_call label="Kup L$" name="Buy and Sell L$"/> <menu_item_call label="Mój Profil" name="Profile"/> - <menu_item_call label="Zmień strój" name="ChangeOutfit"/> + <menu_item_call label="Mój wygląd" name="ChangeOutfit"/> <menu_item_check label="Moja Szafa" name="Inventory"/> <menu_item_check label="Moja Szafa" name="ShowSidetrayInventory"/> <menu_item_check label="Moje gesturki" name="Gestures"/> @@ -33,6 +33,7 @@ <menu label="Świat" name="World"> <menu_item_check label="Mini-Mapa" name="Mini-Map"/> <menu_item_check label="Mapa Świata" name="World Map"/> + <menu_item_check label="Szukaj" name="Search"/> <menu_item_call label="Zrób zdjęcie" name="Take Snapshot"/> <menu_item_call label="Zapamiętaj to miejsce (LM)" name="Create Landmark Here"/> <menu label="Miejsce" name="Land"> @@ -222,7 +223,9 @@ <menu label="Pokaż informacje" name="Display Info"> <menu_item_check label="Pokaż czas" name="Show Time"/> <menu_item_check label="Pokaż informacje o renderowaniu" name="Show Render Info"/> + <menu_item_check label="Pokaż informację o teksturze" name="Show Texture Info"/> <menu_item_check label="Pokaż kolor pod kursorem" name="Show Color Under Cursor"/> + <menu_item_check label="Pokaż pamięć" name="Show Memory"/> <menu_item_check label="Pokaż aktualizacje obiektów" name="Show Updates"/> </menu> <menu label="Reset błędu" name="Force Errors"> @@ -240,6 +243,9 @@ <menu_item_check label="Losowa ilość klatek" name="Randomize Framerate"/> <menu_item_check label="Test klatki obrazu" name="Frame Test"/> </menu> + <menu label="Render Metadata" name="Render Metadata"> + <menu_item_check label="Aktualizuj typ" name="Update Type"/> + </menu> <menu label="Renderowanie" name="Rendering"> <menu_item_check label="Osie" name="Axes"/> <menu_item_check label="Tryb obrazu szkieletowego" name="Wireframe"/> @@ -328,4 +334,9 @@ </menu> <menu_item_call label="Boskie narzędzia" name="God Tools"/> </menu> + <menu label="Admin" name="Deprecated"> + <menu label="Take Off Clothing" name="Take Off Clothing"> + <menu_item_call label="Fizyka" name="Physics"/> + </menu> + </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index 25fa5da3ab..63f976a314 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -72,9 +72,9 @@ Szczegóły błędu: Błąd o nazwie '[_NAME]' nie został odnaleziony <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LoginFailedNoNetwork"> - Brak połączenia z [SECOND_LIFE_GRID]. -'[DIAGNOSTIC]' -Sprawdź stan swojego połączenia sieciowego. + Nie można połączyć z [SECOND_LIFE_GRID]. + '[DIAGNOSTIC]' +Upewnij się, że Twoje połączenie z internetem działa. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MessageTemplateNotFound"> @@ -331,13 +331,6 @@ Potrzebujesz konta aby się zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je <notification name="InvalidCredentialFormat"> Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika a następnie ponownie się zalogować. </notification> - <notification name="AddClassified"> - Ogłoszenia reklamowe ukazują się w zakładce Reklama w wyszukiwarce (Szukaj) oraz na [http://secondlife.com/community/classifieds secondlife.com] przez tydzień. -Napisz treść swojej reklamy, kliknij Zamieść by dodać katalogu ogłoszeń. -Po zamieszczeniu reklamy zostaniesz poproszony o sprecyzowanie opłaty za Reklamę. -Im wyższa opłata tym wyżej Twoja reklama wyświetla się w katalogu i wyszukiwarce po wpisaniu słów kluczowych. - <usetemplate ignoretext="Jak stworzyć nową reklamę?" name="okcancelignore" notext="Anuluj" yestext="OK"/> - </notification> <notification name="DeleteClassified"> Usunąć reklamę '[NAME]'? Pamiętaj! Nie ma rekompensaty za poniesione koszta. @@ -2723,7 +2716,7 @@ Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni. Zaznacz Rezydentów, z którymi chcesz się podzielić. </notification> <notification name="ShareItemsConfirmation"> - Jesteś pewien/pewna, że chcesz udostępnić następujące obiekty: + Czy na pewno chcesz udostępnić następujące obiekty: <nolink>[ITEMS]</nolink> @@ -2814,24 +2807,32 @@ Wyciszyć wszystkich? <notification label="Wstań" name="HintSit"> Aby wstać i opuścić pozycję siedzącą, kliknij przycisk Wstań. </notification> + <notification label="Mów" name="HintSpeak"> + Kliknij przycisk "Mów" aby włączyć i wyłączyć Twój mikrofon. + +Kliknij w strzałkę aby zobaczyć panel kontroli głosu. + +Ukrycie przycisku "Mów" zdezaktywuje głos. + </notification> <notification label="Odkrywaj Świat" name="HintDestinationGuide"> Destination Guide zawiera tysiące nowych miejsc do odkrycia. Wybierz lokalizację i teleportuj się aby rozpocząć zwiedzanie. </notification> - <notification label="Zmień wygląd swojego awatara" name="HintAvatarPicker"> - Czy chcesz inaczej wyglądać? Kliknij poniższy przycisk aby zobaczyć więcej przykładów awatarów. - </notification> <notification label="Schowek" name="HintSidePanel"> Schowek umożliwia szybki dostęp do Twojej Szafy, ubrań, profili i innych w panelu bocznym. </notification> <notification label="Ruch" name="HintMove"> Aby chodzić lub biegać, otwórz panel ruchu i użyj strzałek do nawigacji. Możesz także używać strzałek z klawiatury. </notification> + <notification label="" name="HintMoveClick"> + 1. Kliknij aby chodzić. +Kliknij gdziekolwiek na ziemi aby przejść do wskazanego miejsca. + +2. Kliknij i przeciągnij aby zmienić widok. +Kliknij i przeciągnij gdziekolwiek aby obrócić widok. + </notification> <notification label="Wyświetlana nazwa" name="HintDisplayName"> Ustaw wyświetlaną nazwę, którą możesz zmieniać tutaj. Jest ona dodatkiem do unikatowej nazwy użytkownika, która nie może być zmieniona. Możesz zmienić sposób w jaki widzisz nazwy innych osób w Twoich Ustawieniach. </notification> - <notification label="Ruch" name="HintMoveArrows"> - Użyj przycisków ze strzałkami z klawiatury aby chodzić. Jeśli wciśniesz strzałkę 'do góry' podwójnie, zaczniesz biec. - </notification> <notification label="Widok" name="HintView"> To change your camera view, use the Orbit and Pan controls. Zresetuj widok poprzez wciśnięcie klawisza Esc lub chodzenie. </notification> @@ -2857,6 +2858,38 @@ Wyciszyć wszystkich? <button name="cancel" text="Anuluj"/> </form> </notification> + <notification label="" name="ModeChange"> + Zmiana trybu wymaga restartu. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoClassifieds"> + Tworzenie i edycja reklam jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoGroupInfo"> + Tworzenie i edycja grup jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoPicks"> + Tworzenie i edycja Ulubionych jest możliwa jedynie w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoWorldMap"> + Oglądanie mapy świata jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoVoiceCall"> + Rozmowy głosowe są możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoAvatarShare"> + Udostępnienie jest możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoAvatarPay"> + Płacenie innym Rezydentom jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> <global name="UnsupportedCPU"> - Prędkość Twojego CPU nie spełnia minimalnych wymagań. </global> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_physics.xml b/indra/newview/skins/default/xui/pl/panel_edit_physics.xml new file mode 100644 index 0000000000..a773a52a59 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Podskakiwanie piersi"/> + <accordion_tab name="physics_breasts_inout_tab" title="Rowek między piersiami"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Kołysanie piersi"/> + <accordion_tab name="physics_belly_tab" title="Poskakiwanie brzucha"/> + <accordion_tab name="physics_butt_tab" title="Podksakiwanie pośladków"/> + <accordion_tab name="physics_butt_leftright_tab" title="Kołysanie pośladków"/> + <accordion_tab name="physics_advanced_tab" title="Zaawansowane parametry"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml index d1157b910d..2027b8715b 100644 --- a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Edycja tatuażu </string> + <string name="edit_physics_title"> + Edycja fizyki + </string> <string name="shape_desc_text"> Kształt: </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tatuaż: </string> + <string name="physics_desc_text"> + Fizyka: + </string> <labeled_back_button label="Zapisz" name="back_btn" tool_tip="Powrót do edycji stroju"/> <text name="edit_wearable_title" value="Edycja kształtu"/> <panel label="Koszula" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml index 81da94a659..dc8e7399af 100644 --- a/indra/newview/skins/default/xui/pl/panel_login.xml +++ b/indra/newview/skins/default/xui/pl/panel_login.xml @@ -14,6 +14,13 @@ </text> <check_box label="Zapamiętaj hasło" name="remember_check"/> <button label="Połącz" name="connect_btn"/> + <text name="mode_selection_text"> + Tryb życia: + </text> + <combo_box name="mode_combo" tool_tip="Wybierz tryb życia. Wybierz tryb turystyczny dla łatwego zwiedzania i czatowania. Wybierz tryb zaawansowany aby mieć dostęp do większej ilości opcji."> + <combo_box.item label="Turystyczny" name="Basic"/> + <combo_box.item label="Zaawansowany" name="Advanced"/> + </combo_box> <text name="start_location_text"> Rozpocznij w: </text> diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_media.xml b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml index c9f951f7c6..d77c6d7852 100644 --- a/indra/newview/skins/default/xui/pl/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml @@ -19,7 +19,7 @@ <button label="Zatrzymaj" name="all_nearby_media_disable_btn" tool_tip="Wyłącz wszystkie media w pobliżu"/> <button label="Włącz" name="all_nearby_media_enable_btn" tool_tip="Włącz wszystkie media w pobliżu"/> <button name="open_prefs_btn" tool_tip="Uruchom preferencje medialne"/> - <button label="Więcej >>" label_selected="Mniej <<" name="more_btn" tool_tip="Zaawansowane"/> + <button label="Więcej >>" label_selected="<< Mniej" name="more_btn" tool_tip="Zaawansowane"/> <button label="Więcej >>" label_selected="Mniej <<" name="less_btn" tool_tip="Zaawansowane"/> </panel> <panel name="nearby_media_panel"> diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml index 1bd5b4a912..da9f84cb2e 100644 --- a/indra/newview/skins/default/xui/pl/panel_people.xml +++ b/indra/newview/skins/default/xui/pl/panel_people.xml @@ -18,6 +18,8 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Świata]. <string name="groups_filter_label" value="Filtruj grupy"/> <string name="no_filtered_groups_msg" value="Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/groups/[SEARCH_TERM] Szukaj]."/> <string name="no_groups_msg" value="Chcesz dołączyć do grup? Spróbuj [secondlife:///app/search/groups Szukaj]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie otwiera mapę, wciśnij Shift i przeciągnij aby przesunąć)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie aktywuje teleport, wciśnij Shift i przeciągnij aby przesunąć)"/> <filter_editor label="Filtr" name="filter_input"/> <tab_container name="tabs"> <panel label="W POBLIŻU" name="nearby_panel"> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index c7142c8419..3251099f74 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -29,7 +29,10 @@ <check_box label="Czat IM" name="EnableIMChatPopups" tool_tip="Zaznacz aby widzieć wyskakujące okienka kiedy IM się pojawia"/> <spinner label="Czas widoczności czatu w pobliżu:" name="nearby_toasts_lifetime"/> <spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/> - <check_box label="Używaj translatora podczas rozmowy (wspierany przez Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label"> + Użyj translatora podczas rozmowy (wspierany przez Google) + </text> <text name="translate_language_text"> Przetłumacz czat na: </text> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml index 3d1160882b..3affda57bf 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Kolory" name="colors_panel"> <text name="effects_color_textbox"> - Moje efekty (selection beam): + Moje efekty (opcje wyboru): </text> <color_swatch name="effect_color_swatch" tool_tip="Kliknij aby wybrać kolor"/> <text name="font_colors"> - Kolor czcionki czatu: + Kolory czcionki czatu: </text> <text name="text_box1"> Ja @@ -34,8 +34,8 @@ <color_swatch name="background" tool_tip="Wybierz kolor taga"/> <slider label="Przeźroczystość:" name="bubble_chat_opacity" tool_tip="Wybierz przeźroczystość taga"/> <text name="floater_opacity"> - Przeźroczystość: + Floater Opacity: </text> - <slider label="Aktywny:" name="active"/> - <slider label="Niekatywny:" name="inactive"/> + <slider label="Aktywne:" name="active"/> + <slider label="Nieaktywne:" name="inactive"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml index 0f21aa9dd1..f2beef091a 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml @@ -40,6 +40,10 @@ <combo_box.item label="Awatary i obiekty" name="3"/> <combo_box.item label="Wszystko" name="4"/> </combo_box> + <slider label="Fizyka awatara:" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Niska + </text> <slider label="Pole widzenia:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m @@ -78,7 +82,7 @@ Mało </text> <text name="AvatarRenderingText"> - Rendering awatarów + Rendering awatara: </text> <check_box initial_value="true" label="Impostoryzacja awatarowa" name="AvatarImpostors"/> <check_box initial_value="true" label="Rendering awatara przez GPU" name="AvatarVertexProgram"/> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml index ac93949a1b..46f5ebb8e2 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml @@ -4,12 +4,15 @@ Środkowy przycisk myszy </panel.string> <slider label="Główny" name="System Volume"/> - <check_box initial_value="true" label="Wycisz podczas minimalizacji" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label"> + Wycisz podczas minimalizacji + </text> <slider label="Interfejs" name="UI Volume"/> <slider label="Otoczenie" name="Wind Volume"/> <slider label="Efekty dźwiękowe" name="SFX Volume"/> <slider label="Muzyka strumieniowa" name="Music Volume"/> - <check_box label="Odtwarzaj media audio" name="enable_music"/> + <check_box label="Aktywny" name="enable_music"/> <slider label="Media" name="Media Volume"/> <check_box label="Odtwarzaj media" name="enable_media"/> <slider label="Komunikacja głosowa" name="Voice Volume"/> diff --git a/indra/newview/skins/default/xui/pl/panel_profile.xml b/indra/newview/skins/default/xui/pl/panel_profile.xml index 4152c00386..77dd951bc4 100644 --- a/indra/newview/skins/default/xui/pl/panel_profile.xml +++ b/indra/newview/skins/default/xui/pl/panel_profile.xml @@ -5,6 +5,12 @@ <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> + <string name="name_text_args"> + [NAME] + </string> + <string name="display_name_text_args"> + [DISPLAY_NAME] + </string> <layout_stack name="layout"> <layout_panel name="profile_stack"> <scroll_container name="profile_scroll"> @@ -19,7 +25,7 @@ <text name="title_acc_status_text" value="Konto:"/> <text name="title_partner_text" value="Partner:"/> <panel name="partner_data_panel"> - <name_box initial_value="(przetwarzanie)" name="partner_text"/> + <text initial_value="(przetwarzanie)" name="partner_text"/> </panel> <text name="title_groups_text" value="Grupy:"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_script_ed.xml b/indra/newview/skins/default/xui/pl/panel_script_ed.xml index e18900af68..b05223aa0f 100644 --- a/indra/newview/skins/default/xui/pl/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/pl/panel_script_ed.xml @@ -15,6 +15,9 @@ <panel.string name="Title"> Skrypt: [NAME] </panel.string> + <panel.string name="external_editor_not_set"> + Wybierz edytor poprzez ustawienie zmiennej środowiska LL_SCRIPT_EDITOR lub ustawienie ExternalEditor. + </panel.string> <menu_bar name="script_menu"> <menu label="Plik" name="File"> <menu_item_call label="Zapisz" name="Save"/> diff --git a/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..fa659040ea --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[DESC]" name="param slider"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index e6019bf66d..94708ba448 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -852,6 +852,9 @@ <string name="tattoo"> Tatuaż </string> + <string name="physics"> + Fizyka + </string> <string name="invalid"> niewłaściwa funkcja </string> @@ -891,6 +894,9 @@ <string name="tattoo_not_worn"> Tatuaż nie jest założony </string> + <string name="physics_not_worn"> + Fizyka niezałożona + </string> <string name="invalid_not_worn"> nieważny </string> @@ -939,6 +945,9 @@ <string name="create_new_tattoo"> Nowy tatuaż </string> + <string name="create_new_physics"> + Stwórz nową fizykę + </string> <string name="create_new_invalid"> nieważny </string> @@ -1037,7 +1046,7 @@ </string> <string name="WornOnAttachmentPoint" value=" (założony na [ATTACHMENT_POINT])"/> <string name="ActiveGesture" value="[GESLABEL] (aktywne)"/> - <string name="Chat" value=" Czat :"/> + <string name="Chat Message" value="Czat:"/> <string name="Sound" value=" Dźwięk :"/> <string name="Wait" value=" --- Zaczekaj :"/> <string name="AnimFlagStop" value=" Zatrzymaj animację :"/> @@ -1819,12 +1828,6 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <string name="accel-win-shift"> Shift+ </string> - <string name="Esc"> - Esc - </string> - <string name="Home"> - Miejsce Startu - </string> <string name="FileSaved"> Zapisane pliki </string> @@ -1847,13 +1850,13 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Do przodu </string> <string name="Direction_Left"> - W lewo + Lewo </string> <string name="Direction_Right"> - W prawo + Prawo </string> <string name="Direction_Back"> - Wróć + Wstecz </string> <string name="Direction_North"> Północ @@ -1942,6 +1945,9 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <string name="Other"> Inna </string> + <string name="Rental"> + Wynajem + </string> <string name="Any"> Jakiekolwiek </string> @@ -2178,6 +2184,114 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE]. <string name="Bulbous Nose"> Bulwiasty nos </string> + <string name="Breast Physics Mass"> + Masa piersi + </string> + <string name="Breast Physics Smoothing"> + Wygładzanie piersi + </string> + <string name="Breast Physics Gravity"> + Grawitacja piersi + </string> + <string name="Breast Physics Drag"> + Ściśnięcie piersi + </string> + <string name="Breast Physics InOut Max Effect"> + Efekt max + </string> + <string name="Breast Physics InOut Spring"> + Sprężystość + </string> + <string name="Breast Physics InOut Gain"> + Wzmocnienie + </string> + <string name="Breast Physics InOut Damping"> + Tłumienie + </string> + <string name="Breast Physics UpDown Max Effect"> + Efekt max + </string> + <string name="Breast Physics UpDown Spring"> + Sprężystość + </string> + <string name="Breast Physics UpDown Gain"> + Wzmocnienie + </string> + <string name="Breast Physics UpDown Damping"> + Tłumienie + </string> + <string name="Breast Physics LeftRight Max Effect"> + Efekt max + </string> + <string name="Breast Physics LeftRight Spring"> + Sprężystość + </string> + <string name="Breast Physics LeftRight Gain"> + Wzmocnienie + </string> + <string name="Breast Physics LeftRight Damping"> + Tłumienie + </string> + <string name="Belly Physics Mass"> + Masa brzucha + </string> + <string name="Belly Physics Smoothing"> + Wygładzanie brzucha + </string> + <string name="Belly Physics Gravity"> + Grawitacja brzucha + </string> + <string name="Belly Physics Drag"> + Ściśnięcie brzucha + </string> + <string name="Belly Physics UpDown Max Effect"> + Efekt max + </string> + <string name="Belly Physics UpDown Spring"> + Sprężystość + </string> + <string name="Belly Physics UpDown Gain"> + Wzmocnienie + </string> + <string name="Belly Physics UpDown Damping"> + Tłumienie + </string> + <string name="Butt Physics Mass"> + Masa pośladków + </string> + <string name="Butt Physics Smoothing"> + Wygładzanie pośladków + </string> + <string name="Butt Physics Gravity"> + Grawitacja pośladków + </string> + <string name="Butt Physics Drag"> + Ściśnięcie pośladków + </string> + <string name="Butt Physics UpDown Max Effect"> + Efekt max + </string> + <string name="Butt Physics UpDown Spring"> + Sprężystość + </string> + <string name="Butt Physics UpDown Gain"> + Wzmocnienie + </string> + <string name="Butt Physics UpDown Damping"> + Tłumienie + </string> + <string name="Butt Physics LeftRight Max Effect"> + Efekt max + </string> + <string name="Butt Physics LeftRight Spring"> + Sprężystość + </string> + <string name="Butt Physics LeftRight Gain"> + Wzmocnienie + </string> + <string name="Butt Physics LeftRight Damping"> + Tłumienie + </string> <string name="Bushy Eyebrows"> Bujne brwi </string> @@ -2187,6 +2301,9 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE]. <string name="Butt Size"> Rozmiar pośladków </string> + <string name="Butt Gravity"> + Grawitacja pośladków + </string> <string name="bustle skirt"> Bustle Skirt </string> @@ -3662,6 +3779,9 @@ Raport o Nadużyciu <string name="New Tattoo"> Nowy tatuaż </string> + <string name="New Physics"> + Nowa fizyka + </string> <string name="Invalid Wearable"> Nieaktualne ubranie/część ciała </string> @@ -3861,7 +3981,7 @@ Raport o Nadużyciu <string name="Notices"> Ogłoszenia </string> - <string name="Chat"> + <string name="Chat" value=" Czat :"> Czat </string> <string name="DeleteItems"> @@ -3873,4 +3993,348 @@ Raport o Nadużyciu <string name="EmptyOutfitText"> W tym stroju nie ma elementów </string> + <string name="ExternalEditorNotSet"> + Wybierz edytor używając ustawień ExternalEditor. + </string> + <string name="ExternalEditorNotFound"> + Nie odnaleziono zewnętrzego edytora wskazanego przez Ciebie. +Spróbuj załączyć ścieżkę do edytora w cytowaniu. +(np. "/ścieżka do mojego/edytora" "%s") + </string> + <string name="ExternalEditorCommandParseError"> + Błąd w składni komendy zewnętrznego edytora. + </string> + <string name="ExternalEditorFailedToRun"> + Uruchomienie zewnętrznego edytora nie powiodło się. + </string> + <string name="Esc"> + Esc + </string> + <string name="Space"> + Space + </string> + <string name="Enter"> + Enter + </string> + <string name="Tab"> + Tab + </string> + <string name="Ins"> + Ins + </string> + <string name="Del"> + Del + </string> + <string name="Backsp"> + Backsp + </string> + <string name="Shift"> + Shift + </string> + <string name="Ctrl"> + Ctrl + </string> + <string name="Alt"> + Alt + </string> + <string name="CapsLock"> + CapsLock + </string> + <string name="Home"> + Miejsce Startu + </string> + <string name="End"> + End + </string> + <string name="PgUp"> + PgUp + </string> + <string name="PgDn"> + PgDn + </string> + <string name="F1"> + F1 + </string> + <string name="F2"> + F2 + </string> + <string name="F3"> + F3 + </string> + <string name="F4"> + F4 + </string> + <string name="F5"> + F5 + </string> + <string name="F6"> + F6 + </string> + <string name="F7"> + F7 + </string> + <string name="F8"> + F8 + </string> + <string name="F9"> + F9 + </string> + <string name="F10"> + F10 + </string> + <string name="F11"> + F11 + </string> + <string name="F12"> + F12 + </string> + <string name="Add"> + Dodaj + </string> + <string name="Subtract"> + Odejmij + </string> + <string name="Multiply"> + Mnożenie + </string> + <string name="Divide"> + Podziel + </string> + <string name="PAD_DIVIDE"> + PAD_DIVIDE + </string> + <string name="PAD_LEFT"> + PAD_LEFT + </string> + <string name="PAD_RIGHT"> + PAD_RIGHT + </string> + <string name="PAD_DOWN"> + PAD_DOWN + </string> + <string name="PAD_UP"> + PAD_UP + </string> + <string name="PAD_HOME"> + PAD_HOME + </string> + <string name="PAD_END"> + PAD_END + </string> + <string name="PAD_PGUP"> + PAD_PGUP + </string> + <string name="PAD_PGDN"> + PAD_PGDN + </string> + <string name="PAD_CENTER"> + PAD_CENTER + </string> + <string name="PAD_INS"> + PAD_INS + </string> + <string name="PAD_DEL"> + PAD_DEL + </string> + <string name="PAD_Enter"> + PAD_Enter + </string> + <string name="PAD_BUTTON0"> + PAD_BUTTON0 + </string> + <string name="PAD_BUTTON1"> + PAD_BUTTON1 + </string> + <string name="PAD_BUTTON2"> + PAD_BUTTON2 + </string> + <string name="PAD_BUTTON3"> + PAD_BUTTON3 + </string> + <string name="PAD_BUTTON4"> + PAD_BUTTON4 + </string> + <string name="PAD_BUTTON5"> + PAD_BUTTON5 + </string> + <string name="PAD_BUTTON6"> + PAD_BUTTON6 + </string> + <string name="PAD_BUTTON7"> + PAD_BUTTON7 + </string> + <string name="PAD_BUTTON8"> + PAD_BUTTON8 + </string> + <string name="PAD_BUTTON9"> + PAD_BUTTON9 + </string> + <string name="PAD_BUTTON10"> + PAD_BUTTON10 + </string> + <string name="PAD_BUTTON11"> + PAD_BUTTON11 + </string> + <string name="PAD_BUTTON12"> + PAD_BUTTON12 + </string> + <string name="PAD_BUTTON13"> + PAD_BUTTON13 + </string> + <string name="PAD_BUTTON14"> + PAD_BUTTON14 + </string> + <string name="PAD_BUTTON15"> + PAD_BUTTON15 + </string> + <string name="-"> + - + </string> + <string name="="> + = + </string> + <string name="`"> + ` + </string> + <string name=";"> + ; + </string> + <string name="["> + [ + </string> + <string name="]"> + ] + </string> + <string name="\"> + \ + </string> + <string name="0"> + 0 + </string> + <string name="1"> + 1 + </string> + <string name="2"> + 2 + </string> + <string name="3"> + 3 + </string> + <string name="4"> + 4 + </string> + <string name="5"> + 5 + </string> + <string name="6"> + 6 + </string> + <string name="7"> + 7 + </string> + <string name="8"> + 8 + </string> + <string name="9"> + 9 + </string> + <string name="A"> + A + </string> + <string name="B"> + B + </string> + <string name="C"> + C + </string> + <string name="D"> + D + </string> + <string name="E"> + E + </string> + <string name="F"> + F + </string> + <string name="G"> + G + </string> + <string name="H"> + H + </string> + <string name="I"> + I + </string> + <string name="J"> + J + </string> + <string name="K"> + K + </string> + <string name="L"> + L + </string> + <string name="M"> + M + </string> + <string name="N"> + N + </string> + <string name="O"> + O + </string> + <string name="P"> + P + </string> + <string name="Q"> + Q + </string> + <string name="R"> + R + </string> + <string name="S"> + S + </string> + <string name="T"> + T + </string> + <string name="U"> + U + </string> + <string name="V"> + V + </string> + <string name="W"> + W + </string> + <string name="X"> + X + </string> + <string name="Y"> + Y + </string> + <string name="Z"> + Z + </string> + <string name="BeaconParticle"> + Podgląd lokalizatorów cząsteczek (niebieski) + </string> + <string name="BeaconPhysical"> + Podgląd lokalizatorów fizycznych obiektów (zielony) + </string> + <string name="BeaconScripted"> + Podgląd lokalizatorów obiektów skryptowanych (czerwony) + </string> + <string name="BeaconScriptedTouch"> + Podgląd lokalizatorów obiektów skryptowanych z opcją dotyku (czerwony) + </string> + <string name="BeaconSound"> + Podgląd lokalizatorów dźwięków (żółty) + </string> + <string name="BeaconMedia"> + Podgląd lokalizatorów mediów (biały) + </string> + <string name="ParticleHiding"> + Ukryj cząsteczki + </string> </strings> diff --git a/indra/newview/skins/default/xui/pt/floater_beacons.xml b/indra/newview/skins/default/xui/pt/floater_beacons.xml index b16ff6003e..f8ae3cd2d8 100644 --- a/indra/newview/skins/default/xui/pt/floater_beacons.xml +++ b/indra/newview/skins/default/xui/pt/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Só tocar" name="touch_only"/> <check_box label="Fontes de som" name="sounds"/> <check_box label="Fontes de partículas" name="particles"/> + <check_box label="Fontes de mídia" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml index 26d5710c4a..8094ad376c 100644 --- a/indra/newview/skins/default/xui/pt/floater_pay.xml +++ b/indra/newview/skins/default/xui/pt/floater_pay.xml @@ -6,18 +6,18 @@ <string name="payee_resident"> Pagar residente </string> - <text left="5" name="payee_label" width="110"> + <text left="5" name="payee_label"> Pagar: </text> <icon name="icon_person" tool_tip="Pessoa"/> - <text left="115" name="payee_name"> + <text name="payee_name"> Test Name That Is Extremely Long To Check Clipping </text> - <button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/> + <button label="L$1" label_selected="L$1" name="fastpay 1"/> <button label="L$5" label_selected="L$5" name="fastpay 5"/> - <button label="L$10" label_selected="L$10" left="112" name="fastpay 10"/> + <button label="L$10" label_selected="L$10" name="fastpay 10"/> <button label="L$20" label_selected="L$20" name="fastpay 20"/> - <text left="4" name="amount text"> + <text name="amount text"> Outro valor: </text> <button label="Pagar" label_selected="Pagar" name="pay btn"/> diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml index 2675979783..c4954cb61f 100644 --- a/indra/newview/skins/default/xui/pt/floater_tos.xml +++ b/indra/newview/skins/default/xui/pt/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETermos%20de%20Serviço%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Continuar" label_selected="Continuar" name="Continue"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml index e2fd61745f..e84dcb093d 100644 --- a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Camiseta" name="Self Undershirt"/> <menu_item_call label="Roupa de baixo" name="Self Underpants"/> <menu_item_call label="Tatuagem" name="Self Tattoo"/> + <menu_item_call label="Físico" name="Self Physics"/> <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Todas as roupas" name="All Clothes"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml index bd628c94d3..7585160954 100644 --- a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Voz ativada" name="EnableVoiceChat"/> + <menu_item_check label="Botão Falar" name="EnableVoiceChat"/> <menu_item_check label="Botão de gestos" name="ShowGestureButton"/> <menu_item_check label="Botão de movimento" name="ShowMoveButton"/> <menu_item_check label="Botão de ver" name="ShowCameraButton"/> diff --git a/indra/newview/skins/default/xui/pt/menu_inventory.xml b/indra/newview/skins/default/xui/pt/menu_inventory.xml index 1b1efd3270..7aa3b836a4 100644 --- a/indra/newview/skins/default/xui/pt/menu_inventory.xml +++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Nova roupa de baixo" name="New Underpants"/> <menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/> <menu_item_call label="Nova tatuagem" name="New Tattoo"/> + <menu_item_call label="Novo físico" name="New Physics"/> </menu> <menu label="Nova parte do corpo" name="New Body Parts"> <menu_item_call label="Nova forma" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml index 2723f39287..9f345b5b6e 100644 --- a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml @@ -23,6 +23,7 @@ <menu_item_call label="Novas roupa de baixo" name="New Underpants"/> <menu_item_call label="Novo alpha" name="New Alpha"/> <menu_item_call label="Nova tatuagem" name="New Tattoo"/> + <menu_item_call label="Novo físico" name="New Physics"/> </menu> <menu label="Nova parte do corpo" name="New Body Parts"> <menu_item_call label="Nova forma" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml b/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml new file mode 100644 index 0000000000..44117c8865 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Cortar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml index 11b3e653c6..894f1d741c 100644 --- a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Vestir - Substituir look atual" name="wear"/> <menu_item_call label="Vestir - Adicionar ao look atual" name="wear_add"/> <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Nova camiseta" name="New Undershirt"/> <menu_item_call label="Novas roupa de baixo" name="New Underpants"/> <menu_item_call label="Novo alpha" name="New Alpha"/> + <menu_item_call label="Novo físico" name="New Physics"/> <menu_item_call label="Nova tatuagem" name="New Tattoo"/> </menu> <menu label="Nova parte do corpo" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Renomear look" name="rename"/> <menu_item_call label="Excluir visual" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index 538b20e01f..0a2a2994f6 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -336,4 +336,9 @@ </menu> <menu_item_call label="God Tools" name="God Tools"/> </menu> + <menu label="Admin" name="Deprecated"> + <menu label="Take Off Clothing" name="Take Off Clothing"> + <menu_item_call label="Físico" name="Physics"/> + </menu> + </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 31e29fb6c1..0786a62f13 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -2730,7 +2730,7 @@ O botão será exibido quando houver espaço suficente. Selecione os residentes com quem compartilhar. </notification> <notification name="ShareItemsConfirmation"> - Tem certeza de que quer compartilhar os items abaixo? + Tem certeza de que quer compartilhar os itens abaixo? <nolink>[ITEMS]</nolink> @@ -2822,6 +2822,13 @@ Silenciar todos? <notification label="Levantar-se" name="HintSit"> Para se levantar quando estiver sentado, clique em Levantar-se </notification> + <notification label="Falar" name="HintSpeak"> + Clique no botão Falar para ligar ou desligar o microfone. + +Clique na seta para cima para ver o painel de controles de voz. + +Se o botão Falar for ocultado, o recurso de voz será desabilitado. + </notification> <notification label="Explore o mundo" name="HintDestinationGuide"> O Guia de Destinos traz milhares de lugares novos para você explorar e conhecer. Selecione um lugar, clique em Teletransportar e comece suas descobertas. </notification> @@ -2831,12 +2838,14 @@ Silenciar todos? <notification label="Movimentar" name="HintMove"> Para andar ou correr, clique no botão Movimentar e use as setas para controlar a direção. Ou use as setas do teclado. </notification> + <notification label="" name="HintMoveClick"> + 1. Clique para andar Clique em qualquer lugar no solo para andar até o local. + +2. Clique e arraste para girar a exibição Clique e arraste em qualquer lugar no mundo para girar a exibição + </notification> <notification label="Nome de tela" name="HintDisplayName"> Defina seu nome de tela personalizável. O nome de tele é separado do seu nome de usuário, que não pode ser modificado. Você pode mudar a visualização dos nomes de outras pessoas nas suas preferências. </notification> - <notification label="Movimentar" name="HintMoveArrows"> - Para andar, use as setas do teclado. Para correr, pressione a seta para cima duas vezes. - </notification> <notification label="Exibir" name="HintView"> Para mudar o ângulo de visualização, use os controles Órbita e Pan. Volte à visualização normal pressionando a tecla Escape ou começando a andar. </notification> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_physics.xml b/indra/newview/skins/default/xui/pt/panel_edit_physics.xml new file mode 100644 index 0000000000..967aab8bc3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Seios - movimento vertical"/> + <accordion_tab name="physics_breasts_inout_tab" title="Seios - decote"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Seios - movimento lateral"/> + <accordion_tab name="physics_belly_tab" title="Barriga - movimento vertical"/> + <accordion_tab name="physics_butt_tab" title="Nádegas - movimento vertical"/> + <accordion_tab name="physics_butt_leftright_tab" title="Nádegas - movimento lateral"/> + <accordion_tab name="physics_advanced_tab" title="Parâmetros avançados"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml index 679bb524b4..2e3e3d6305 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Editando tatuagem </string> + <string name="edit_physics_title"> + Editando o físico + </string> <string name="shape_desc_text"> Forma: </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tatuagem: </string> + <string name="physics_desc_text"> + Físico: + </string> <labeled_back_button label="Salvar" name="back_btn" tool_tip="Voltar à edição de look"/> <text name="edit_wearable_title" value="Editando forma"/> <panel label="Camisa" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index 368c474ee9..e5aa42aae0 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -29,7 +29,10 @@ <check_box label="Bate-papos de MI" name="EnableIMChatPopups" tool_tip="Exibir pop-up de mensagens instantâneas novas"/> <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/> <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/> - <check_box label="Traduzir bate-papo automaticamente (via Google)" name="translate_chat_checkbox"/> + <check_box name="translate_chat_checkbox"/> + <text name="translate_chb_label"> + Traduzir bate-papo automaticamente (via Google) + </text> <text name="translate_language_text"> Traduzir bate-papo para: </text> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml index 5f2f341e3f..46d9517a98 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml @@ -14,7 +14,7 @@ Outros </text> <text name="text_box3"> - Objetos + Objects </text> <text name="text_box4"> Sistema diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml index c2efbf0300..4b03c79a9e 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml @@ -40,6 +40,10 @@ rápido <combo_box.item label="Avatares e objetos" name="3"/> <combo_box.item label="Tudo" name="4"/> </combo_box> + <slider label="Físico do avatar:" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Baixo + </text> <slider label="Distancia de desenho:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m @@ -78,7 +82,7 @@ rápido Baixo </text> <text name="AvatarRenderingText"> - Renderização de Avatar: + Renderização do avatar: </text> <check_box initial_value="true" label="Atributos do Avatar" name="AvatarImpostors"/> <check_box initial_value="true" label="Melhoria de Hardware" name="AvatarVertexProgram"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index 3846bfb377..4164147e5c 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -4,7 +4,10 @@ Botão do meio do mouse </panel.string> <slider label="Volume principal" name="System Volume"/> - <check_box initial_value="true" label="Silenciar ao minimizar" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> + <text name="mute_chb_label"> + Silenciar ao minimizar + </text> <slider label="Botões" name="UI Volume"/> <slider label="Ambiente" name="Wind Volume"/> <slider label="Efeitos sonoros" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml new file mode 100644 index 0000000000..0a5a2e2572 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[DESC]:" name="param slider"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 47813604ff..6466f42c75 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -855,6 +855,9 @@ <string name="tattoo"> Tatuagem </string> + <string name="physics"> + Físico + </string> <string name="invalid"> Inválido </string> @@ -894,6 +897,9 @@ <string name="tattoo_not_worn"> Tatuagem não usada </string> + <string name="physics_not_worn"> + Físico não usado + </string> <string name="invalid_not_worn"> inválido </string> @@ -942,6 +948,9 @@ <string name="create_new_tattoo"> Criar nova tatuagem </string> + <string name="create_new_physics"> + Criar novo físico + </string> <string name="create_new_invalid"> inválido </string> @@ -2177,6 +2186,114 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Bulbous Nose"> Nariz em bulbo </string> + <string name="Breast Physics Mass"> + Seios - massa + </string> + <string name="Breast Physics Smoothing"> + Seios - suavização + </string> + <string name="Breast Physics Gravity"> + Seios - gravidade + </string> + <string name="Breast Physics Drag"> + Seios - resistência do ar + </string> + <string name="Breast Physics InOut Max Effect"> + Efeito máximo + </string> + <string name="Breast Physics InOut Spring"> + Vibração + </string> + <string name="Breast Physics InOut Gain"> + Ganho + </string> + <string name="Breast Physics InOut Damping"> + Duração + </string> + <string name="Breast Physics UpDown Max Effect"> + Efeito máximo + </string> + <string name="Breast Physics UpDown Spring"> + Vibração + </string> + <string name="Breast Physics UpDown Gain"> + Ganho + </string> + <string name="Breast Physics UpDown Damping"> + Duração + </string> + <string name="Breast Physics LeftRight Max Effect"> + Efeito máximo + </string> + <string name="Breast Physics LeftRight Spring"> + Vibração + </string> + <string name="Breast Physics LeftRight Gain"> + Ganho + </string> + <string name="Breast Physics LeftRight Damping"> + Duração + </string> + <string name="Belly Physics Mass"> + Barriga - massa + </string> + <string name="Belly Physics Smoothing"> + Barriga - suavização + </string> + <string name="Belly Physics Gravity"> + Barriga - gravidade + </string> + <string name="Belly Physics Drag"> + Barriga - resistência do ar + </string> + <string name="Belly Physics UpDown Max Effect"> + Efeito máximo + </string> + <string name="Belly Physics UpDown Spring"> + Vibração + </string> + <string name="Belly Physics UpDown Gain"> + Ganho + </string> + <string name="Belly Physics UpDown Damping"> + Duração + </string> + <string name="Butt Physics Mass"> + Nádegas - massa + </string> + <string name="Butt Physics Smoothing"> + Nádegas - suavização + </string> + <string name="Butt Physics Gravity"> + Nádegas - gravidade + </string> + <string name="Butt Physics Drag"> + Nádegas - resistência do ar + </string> + <string name="Butt Physics UpDown Max Effect"> + Efeito máximo + </string> + <string name="Butt Physics UpDown Spring"> + Vibração + </string> + <string name="Butt Physics UpDown Gain"> + Ganho + </string> + <string name="Butt Physics UpDown Damping"> + Duração + </string> + <string name="Butt Physics LeftRight Max Effect"> + Efeito máximo + </string> + <string name="Butt Physics LeftRight Spring"> + Vibração + </string> + <string name="Butt Physics LeftRight Gain"> + Ganho + </string> + <string name="Butt Physics LeftRight Damping"> + Duração + </string> <string name="Bushy Eyebrows"> Sobrancelhas grossas </string> @@ -2186,6 +2303,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Butt Size"> Tamanho do traseiro </string> + <string name="Butt Gravity"> + Nádegas - gravidade + </string> <string name="bustle skirt"> Saia armada </string> @@ -3661,6 +3781,9 @@ Denunciar abuso <string name="New Tattoo"> Nova tatuagem </string> + <string name="New Physics"> + Novo físico + </string> <string name="Invalid Wearable"> Item inválido </string> diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png Binary files differnew file mode 100644 index 0000000000..b6e9eef891 --- /dev/null +++ b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..687cb7fb53 --- /dev/null +++ b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png diff --git a/indra/newview/skins/minimal/textures/click_to_move.png b/indra/newview/skins/minimal/textures/click_to_move.png Binary files differnew file mode 100644 index 0000000000..74e3faa8ff --- /dev/null +++ b/indra/newview/skins/minimal/textures/click_to_move.png diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml index 3e2f5cd397..e3ed01721a 100644 --- a/indra/newview/skins/minimal/textures/textures.xml +++ b/indra/newview/skins/minimal/textures/textures.xml @@ -2,7 +2,10 @@ <textures version="101"> <texture name="Button_Separator" file_name="bottomtray/button_separator.png" preload="true" /> <texture name="arrow_keys.png"/> + <texture name="click_to_move" file_name="click_to_move.png"/> <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" /> <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" /> <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" /> -</textures> + <texture name="Speak_Btn_Off" file_name="bottomtray/Speak_Btn_Off.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" /> + <texture name="Speak_Btn_Selected_Press" file_name="bottomtray/Speak_Btn_Selected_Press.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" /> + </textures> diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml index 45ba785c1f..6e8ad9adaf 100644 --- a/indra/newview/skins/minimal/xui/en/main_view.xml +++ b/indra/newview/skins/minimal/xui/en/main_view.xml @@ -8,13 +8,13 @@ tab_stop="false" name="main_view" width="1024"> - <panel top="0" - follows="all" - height="768" - mouse_opaque="false" - name="login_panel_holder" - width="1024"/> - + <panel top="0" + follows="all" + height="768" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> + <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -96,6 +96,7 @@ name="stand_stop_flying_container" visible="false" width="500"/> + <panel follows="all" height="500" left="0" diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml index b55e677276..80cf365c46 100644 --- a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml @@ -25,6 +25,14 @@ <menu_item_call.on_click function="Avatar.SendIM" /> </menu_item_call> + <menu_item_call + label="Call" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableCall" /> + </menu_item_call> <menu_item_separator /> <menu_item_call enabled="false" diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml +++ b/indra/newview/skins/minimal/xui/en/menu_avatar_icon.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml index b76629f401..2c81b5a778 100644 --- a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml @@ -25,6 +25,14 @@ <menu_item_call.on_click function="Avatar.SendIM" /> </menu_item_call> + <menu_item_call + label="Call" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableCall" /> + </menu_item_call> <menu_item_separator /> <menu_item_call enabled="false" diff --git a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/menu_bottomtray.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_favorites.xml b/indra/newview/skins/minimal/xui/en/menu_favorites.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_favorites.xml +++ b/indra/newview/skins/minimal/xui/en/menu_favorites.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_group_plus.xml +++ b/indra/newview/skins/minimal/xui/en/menu_group_plus.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml +++ b/indra/newview/skins/minimal/xui/en/menu_hide_navbar.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_adhoc.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_group.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/minimal/xui/en/menu_imchiclet_p2p.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml index 5a4a059781..a11e367d66 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml @@ -27,6 +27,15 @@ function="InspectAvatar.IM"/> </menu_item_call> <menu_item_call + label="Call" + enabled="true" + name="call"> + <menu_item_call.on_click + function="InspectAvatar.Call"/> + <menu_item_call.on_enable + function="InspectAvatar.Gear.EnableCall"/> + </menu_item_call> + <menu_item_call label="Teleport" name="teleport"> <menu_item_call.on_click diff --git a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inv_offer_chiclet.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory.xml b/indra/newview/skins/minimal/xui/en/menu_inventory.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inventory.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inventory.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inventory_add.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_mini_map.xml +++ b/indra/newview/skins/minimal/xui/en/menu_mini_map.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_navbar.xml b/indra/newview/skins/minimal/xui/en/menu_navbar.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_navbar.xml +++ b/indra/newview/skins/minimal/xui/en/menu_navbar.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml +++ b/indra/newview/skins/minimal/xui/en/menu_nearby_chat.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_object_icon.xml +++ b/indra/newview/skins/minimal/xui/en/menu_object_icon.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_people_groups.xml +++ b/indra/newview/skins/minimal/xui/en/menu_people_groups.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml index 3d64133f54..1840ebd491 100644 --- a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml @@ -36,6 +36,16 @@ <menu_item_call.on_click function="Avatar.IM" /> </menu_item_call> + <menu_item_call + label="Call" + layout="topleft" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_call" /> + </menu_item_call> <menu_item_check label="Block/Unblock" layout="topleft" diff --git a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml +++ b/indra/newview/skins/minimal/xui/en/menu_place_add_button.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml +++ b/indra/newview/skins/minimal/xui/en/menu_script_chiclet.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_slurl.xml b/indra/newview/skins/minimal/xui/en/menu_slurl.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_slurl.xml +++ b/indra/newview/skins/minimal/xui/en/menu_slurl.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml index 9ebab9ef98..d3d9e2ef8a 100644 --- a/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml +++ b/indra/newview/skins/minimal/xui/en/menu_topinfobar.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu/> +<menu visible="false"/> diff --git a/indra/newview/skins/minimal/xui/en/notification_visibility.xml b/indra/newview/skins/minimal/xui/en/notification_visibility.xml index 616b544847..bdd3c3d4a4 100644 --- a/indra/newview/skins/minimal/xui/en/notification_visibility.xml +++ b/indra/newview/skins/minimal/xui/en/notification_visibility.xml @@ -1,12 +1,9 @@ <?xml version="1.0" ?> <notification_visibility> - <respond name="VoiceInviteP2P" response="Decline"/> - <respond name="VoiceInviteAdHoc" response="Decline"/> <respond name="VoiceInviteGroup" response="Decline"/> <!-- group and voice are disabled features --> <hide tag="group"/> - <hide tag="voice"/> <!-- no spammy scripts --> <!-- <hide name="ScriptDialog"/> --> @@ -16,6 +13,7 @@ <hide name="FirstInventory"/> <hide name="HintSidePanel"/> <hide name="HintMove"/> + <hide name="HintSpeak"/> <hide name="HintDisplayName"/> <hide name="HintInventory"/> <hide name="HintLindenDollar"/> diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml index 5730adab8a..39d1a90850 100644 --- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml @@ -42,5 +42,40 @@ show_speaking_indicator="false" width="147" /> </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Call" + name="call_btn" + width="130" + top="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Leave Call" + name="end_call_btn" + top="5"/> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 0145de8be9..237af61717 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -47,7 +47,7 @@ mouse_opaque="false" name="chat_bar_layout_panel" user_resize="true" - width="308" > + width="312" > <panel name="chat_bar" filename="panel_nearby_chat_bar.xml" @@ -59,7 +59,80 @@ follows="left|right" /> </layout_panel> - <layout_panel + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="35" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="85"> + <button + follows="left|right" + height="23" + layout="topleft" + label="Speak" + left="0" + name="speak_btn" + tool_tip="Turn your microphone on and off" + pad_right="30" + halign="center" + use_ellipses="true" + tab_stop="true" + is_toggle="true" + image_selected="Speak_Btn_Selected_Press" + image_unselected="Speak_Btn_Off" + image_pressed="Speak_Btn_Selected_Press" + image_pressed_selected="Speak_Btn_Selected_Press" + top="5" + width="85"> + + <commit_callback + function="ToggleSpeak" + parameter="f1_help" /> + </button> + </layout_panel> + + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="20" + mouse_opaque="false" + name="speak_flyout_panel" + top_delta="0" + user_resize="false" + width="26"> + <button + follows="left|right" + width="20" + top="5" + left="0" + height="23" + name="speak_flyout_btn" + label="" + tab_stop="false" + tool_tip="Change your sound preferences" + is_toggle="true" + image_disabled="ComboButton_UpOff" + image_unselected="ComboButton_UpOff" + image_selected="ComboButton_On" + image_pressed="ComboButton_UpSelected" + image_pressed_selected="ComboButton_Selected"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="sound_devices" /> + </button> + + </layout_panel> + + <layout_panel auto_resize="false" follows="right" height="28" @@ -70,7 +143,7 @@ name="gesture_panel" top_delta="0" user_resize="false" - width="85"> + width="88"> <gesture_combo_list follows="left|right" height="23" @@ -80,7 +153,7 @@ view_all="false" left="0" name="Gesture" - tool_tip="Shows/hides gestures" + tool_tip="Make your avatar do things" top="5" width="82"> <combo_button @@ -101,7 +174,7 @@ mouse_opaque="false" name="cam_panel" user_resize="false" - width="83"> + width="86"> <bottomtray_button can_drag="false" follows="left|right" @@ -114,7 +187,7 @@ layout="topleft" left="0" name="camera_btn" - tool_tip="Shows/hides camera controls" + tool_tip="Control your camera angle" top="5" use_ellipses="true" width="80"> @@ -128,15 +201,15 @@ follows="left|right" height="28" layout="topleft" - min_width="17" - name="splitter_panel" + min_width="8" + name="splitter_panel_1" user_resize="false" - width="17"> + width="8"> <icon follows="left|bottom" height="18" width="2" - left="6" + left="0" image_name="Button_Separator" name="separator" top="7"/> @@ -149,9 +222,9 @@ min_height="28" min_width="83" mouse_opaque="false" - name="avatar_and_destinations_panel" + name="destinations_panel" user_resize="false" - width="103"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -163,7 +236,7 @@ layout="topleft" left="0" name="destination_btn" - tool_tip="Shows people window" + tool_tip="Travel through Second Life" top="5" is_toggle="true" use_ellipses="true" @@ -180,9 +253,9 @@ min_height="28" min_width="73" mouse_opaque="false" - name="avatar_and_destinations_panel" + name="avatar_panel" user_resize="false" - width="103"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -196,6 +269,7 @@ name="avatar_btn" top="5" is_toggle="true" + tool_tip="Change your appearance" use_ellipses="true" width="100"> <bottomtray_button.commit_callback @@ -207,15 +281,15 @@ follows="left|right" height="28" layout="topleft" - min_width="17" - name="splitter_panel" + min_width="8" + name="splitter_panel_2" user_resize="false" - width="17"> + width="8"> <icon follows="left|bottom" height="18" width="2" - left="6" + left="0" image_name="Button_Separator" name="separator" top="7"/> @@ -231,7 +305,7 @@ name="people_panel" top_delta="0" user_resize="false" - width="105"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -243,7 +317,7 @@ layout="topleft" left="0" name="show_people_button" - tool_tip="Shows people window" + tool_tip="Find people in Second Life" top="5" is_toggle="true" use_ellipses="true" @@ -264,7 +338,7 @@ name="profile_panel" top_delta="0" user_resize="false" - width="105"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -276,7 +350,7 @@ layout="topleft" left="0" name="show_profile_btn" - tool_tip="Shows profile window" + tool_tip="View and edit your Profile" is_toggle="true" top="5" use_ellipses="true" @@ -297,7 +371,7 @@ name="howto_panel" top_delta="0" user_resize="false" - width="105"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -309,7 +383,7 @@ layout="topleft" left="0" name="show_help_btn" - tool_tip="Open Second Life How To topics" + tool_tip="View Second Life help info" is_toggle="true" top="5" use_ellipses="true" diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml index 53def54aca..be13bc1bb7 100644 --- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml @@ -23,5 +23,102 @@ orientation="vertical" top_pad="5" width="145"> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="20" + layout="topleft" + left="2" + min_height="20" + width="140" + name="view_profile_btn_panel" + top="0" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Profile" + name="view_profile_btn" + top="0" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="add_friend_btn_panel" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Add Friend" + name="add_friend_btn" + top="5" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="teleport_btn_panel" + user_resize="false"> + <button + auto_resize="false" + follows="left|top|right" + height="23" + label="Teleport" + name="teleport_btn" + tool_tip = "Offer to teleport this person" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="call_btn_panel" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Call" + name="call_btn" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="left|top|right" + height="23" + label="End Call" + name="end_call_btn" + width="140" /> + </layout_panel> + <layout_panel + mouse_opaque="false" + auto_resize="true" + follows="top|left" + height="0" + layout="topleft" + min_height="0" + width="140" + name="spacer" + user_resize="false" /> </layout_stack> </panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_login.xml b/indra/newview/skins/minimal/xui/en/panel_login.xml index ef058e5567..3903658e71 100644 --- a/indra/newview/skins/minimal/xui/en/panel_login.xml +++ b/indra/newview/skins/minimal/xui/en/panel_login.xml @@ -134,7 +134,6 @@ top="20" max_chars="128" top_pad="0" tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features." - control_name="SessionSettingsFile" name="mode_combo" width="120"> <combo_box.item diff --git a/indra/newview/skins/minimal/xui/en/panel_people.xml b/indra/newview/skins/minimal/xui/en/panel_people.xml index 4a72653d76..76baacb091 100644 --- a/indra/newview/skins/minimal/xui/en/panel_people.xml +++ b/indra/newview/skins/minimal/xui/en/panel_people.xml @@ -452,6 +452,27 @@ Looking for people to hang out with? Try the Destinations button below. name="chat_btn_lp" user_resize="false" auto_resize="true" + width="52"> + <button + follows="bottom|left|right" + left="1" + height="23" + label="Call" + layout="topleft" + name="call_btn" + tool_tip="Call this Resident" + top="0" + width="51" /> + </layout_panel> + + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="chat_btn_lp" + user_resize="false" + auto_resize="true" width="77"> <button follows="bottom|left|right" diff --git a/indra/newview/skins/minimal/xui/es/menu_favorites.xml b/indra/newview/skins/minimal/xui/es/menu_favorites.xml index c8a7858ddb..85210d5c49 100644 --- a/indra/newview/skins/minimal/xui/es/menu_favorites.xml +++ b/indra/newview/skins/minimal/xui/es/menu_favorites.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> - <menu_item_call label="Teleportarse" name="Teleport To Landmark"/> + <menu_item_call label="Teleportar" name="Teleport To Landmark"/> <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/> <menu_item_call label="Copiar la SLurl" name="Copy slurl"/> <menu_item_call label="Mostrar en el mapa" name="Show On Map"/> diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml index ebe33cea11..b4b964d096 100644 --- a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml @@ -3,7 +3,7 @@ <menu_item_call label="Ver el perfil" name="view_profile"/> <menu_item_call label="Añadir como amigo" name="add_friend"/> <menu_item_call label="MI" name="im"/> - <menu_item_call label="Teleportarse" name="teleport"/> + <menu_item_call label="Teleportar" name="teleport"/> <menu_item_call label="Ignorar" name="block"/> <menu_item_call label="Designorar" name="unblock"/> <menu_item_call label="Denunciar" name="report"/> diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml index ed33c55aca..c482907812 100644 --- a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml +++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Teleport History Item Context Menu"> - <menu_item_call label="Teleportarse" name="Teleport"/> + <menu_item_call label="Teleportar" name="Teleport"/> <menu_item_call label="Más información" name="More Information"/> <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/> </context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/floater_camera.xml b/indra/newview/skins/minimal/xui/pl/floater_camera.xml new file mode 100644 index 0000000000..5b9dd47616 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_camera.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater" title=""> + <floater.string name="rotate_tooltip"> + Obracaj kamerę wokół obiektu + </floater.string> + <floater.string name="zoom_tooltip"> + Najedź kamerą w kierunku obiektu + </floater.string> + <floater.string name="move_tooltip"> + Poruszaj kamerą w dół/górę oraz w prawo/lewo + </floater.string> + <floater.string name="camera_modes_title"> + Ustawienia + </floater.string> + <floater.string name="pan_mode_title"> + W prawo lub w lewo + </floater.string> + <floater.string name="presets_mode_title"> + Ustaw widok + </floater.string> + <floater.string name="free_mode_title"> + Zobacz obiekt + </floater.string> + <panel name="controls"> + <panel name="preset_views_list"> + <panel_camera_item name="front_view"> + <panel_camera_item.text name="front_view_text"> + Widok z przodu + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="group_view"> + <panel_camera_item.text name="side_view_text"> + Podgląd grupy + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="rear_view"> + <panel_camera_item.text name="rear_view_text"> + Widok z tyłu + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="camera_modes_list"> + <panel_camera_item name="object_view"> + <panel_camera_item.text name="object_view_text"> + Widok obiektu + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="mouselook_view"> + <panel_camera_item.text name="mouselook_view_text"> + Widok panoramiczny + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="zoom" tool_tip="Najedź kamerą w kierunku obiektu"> + <joystick_rotate name="cam_rotate_stick" tool_tip="Obracaj kamerę wokoł osi"/> + <slider_bar name="zoom_slider" tool_tip="Przybliż kamerę do ogniskowej"/> + <joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerą w górę, w dół, w lewo i w prawo"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="presets_btn" tool_tip="Ustaw widok"/> + <button label="" name="pan_btn" tool_tip="Kamera horyzontalna"/> + <button label="" name="avatarview_btn" tool_tip="Ustawienia"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml b/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml new file mode 100644 index 0000000000..66fde04f88 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="POMOC"> + <floater.string name="loading_text"> + Ładowanie... + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml b/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml new file mode 100644 index 0000000000..02b7c6bc2b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="PRZEGLĄDARKA MEDIÓW"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Wstecz" name="back"/> + <button label="Dalej" name="forward"/> + <button label="Odśwież" name="reload"/> + <button label="Idź" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="przewiń" name="rewind"/> + <button label="zatrzymaj" name="stop"/> + <button label="dalej" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Wyślij bieżącą stronę do parceli" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Otwórz w przeglądarce zewnętrznej" name="open_browser"/> + <check_box label="Zawsze otwieraj w przeglądarce zewnętrznej" name="open_always"/> + <button label="Zamknij" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml new file mode 100644 index 0000000000..7dc3e1f22e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="CZAT LOKALNY"> + <check_box label="Tłumaczenie czatu (wspierane przez Google)" name="translate_chat_checkbox"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/floater_web_content.xml b/indra/newview/skins/minimal/xui/pl/floater_web_content.xml new file mode 100644 index 0000000000..e3096f1e54 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="Wstecz"/> + <button name="forward" tool_tip="Dalej"/> + <button name="stop" tool_tip="Zatrzymaj"/> + <button name="reload" tool_tip="Odśwież stronę"/> + <combo_box name="address" tool_tip="Wpisz URL tutaj"/> + <icon name="media_secure_lock_flag" tool_tip="Zabezpieczona przeglądarka"/> + <button name="popexternal" tool_tip="Otwórz bieżący URL w zewnętrznej przeglądarce"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml b/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml new file mode 100644 index 0000000000..5e982c0185 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/inspect_avatar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [SL_PROFILE] + </string> + <text name="user_details"> + To jest mój opis w Second Life. + </text> + <slider name="volume_slider" tool_tip="Poziom głośności" value="0.5"/> + <button label="Dodaj znajomość" name="add_friend_btn"/> + <button label="IM" name="im_btn"/> + <button label="Profil" name="view_profile_btn"/> + <panel name="moderator_panel"> + <button label="Wyłącz komunikację głosową" name="disable_voice"/> + <button label="Włącz komunikację głosową" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/inspect_object.xml b/indra/newview/skins/minimal/xui/pl/inspect_object.xml new file mode 100644 index 0000000000..23d8ce7700 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/inspect_object.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Przez [CREATOR] + </string> + <string name="CreatorAndOwner"> + Twórca [CREATOR] +Właściciel [OWNER] + </string> + <string name="Price"> + L$[AMOUNT] + </string> + <string name="PriceFree"> + Darmowe! + </string> + <string name="Touch"> + Dotknij + </string> + <string name="Sit"> + Usiądź tutaj + </string> + <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/> + <text name="price_text"> + L$30,000 + </text> + <text name="object_description"> + This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really? + </text> + <button label="Kup" name="buy_btn"/> + <button label="Zapłać" name="pay_btn"/> + <button label="Weź kopię" name="take_free_copy_btn"/> + <button label="Dotknij" name="touch_btn"/> + <button label="Usiądź tutaj" name="sit_btn"/> + <button label="Otwórz" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Zabezpiecz przeglądanie"/> + <button label="Więcej" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml new file mode 100644 index 0000000000..7c572b4fc9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_add_wearable_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Add Wearable Gear Menu"> + <menu_item_check label="Porządkuj według daty" name="sort_by_most_recent"/> + <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/> + <menu_item_check label="Porządkuj według typu" name="sort_by_type"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml new file mode 100644 index 0000000000..aacdad97e3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_attachment_other.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Zobacz profil" name="Profile..."/> + <menu_item_call label="Dodaj znajomość" name="Add Friend"/> + <menu_item_call label="IM" name="Send IM..."/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Zaproś do grupy" name="Invite..."/> + <menu_item_call label="Zablokuj" name="Avatar Mute"/> + <menu_item_call label="Raport" name="abuse"/> + <menu_item_call label="Unieruchom" name="Freeze..."/> + <menu_item_call label="Wyrzuć" name="Eject..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> + <menu_item_call label="Przybliż" name="Zoom In"/> + <menu_item_call label="Zapłać" name="Pay..."/> + <menu_item_call label="Sprawdź" name="Object Inspect"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml new file mode 100644 index 0000000000..163b3a231e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_attachment_self.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Attachment Pie"> + <menu_item_call label="Dotknij" name="Attachment Object Touch"/> + <menu_item_call label="Edytuj" name="Edit..."/> + <menu_item_call label="Odłącz" name="Detach"/> + <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/> + <menu_item_call label="Wstań" name="Stand Up"/> + <menu_item_call label="Mój wygląd" name="Change Outfit"/> + <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> + <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> + <menu_item_call label="Moi znajomi" name="Friends..."/> + <menu_item_call label="Moje grupy" name="Groups..."/> + <menu_item_call label="Mój profil" name="Profile..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> + <menu_item_call label="Opuść" name="Drop"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml new file mode 100644 index 0000000000..e8d2b14231 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Profil" name="Show Profile"/> + <menu_item_call label="Czat/IM..." name="Send IM"/> + <menu_item_call label="Dodaj znajomość..." name="Add Friend"/> + <menu_item_call label="Usuń..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml new file mode 100644 index 0000000000..dcf7921bad --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_avatar_other.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Zobacz profil" name="Profile..."/> + <menu_item_call label="Dodaj znajomość" name="Add Friend"/> + <menu_item_call label="IM" name="Send IM..."/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Zaproś do grupy" name="Invite..."/> + <menu_item_call label="Zablokuj" name="Avatar Mute"/> + <menu_item_call label="Raport" name="abuse"/> + <menu_item_call label="Unieruchom" name="Freeze..."/> + <menu_item_call label="Wyrzuć" name="Eject..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> + <menu_item_call label="Przybliż" name="Zoom In"/> + <menu_item_call label="Zapłać" name="Pay..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml new file mode 100644 index 0000000000..d481475803 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_avatar_self.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Self Pie"> + <menu_item_call label="Usiądź tu" name="Sit Down Here"/> + <menu_item_call label="Wstań" name="Stand Up"/> + <context_menu label="Zdejmij" name="Take Off >"> + <context_menu label="Ubrania" name="Clothes >"> + <menu_item_call label="Koszulę" name="Shirt"/> + <menu_item_call label="Spodnie" name="Pants"/> + <menu_item_call label="Spódnicę" name="Skirt"/> + <menu_item_call label="Buty" name="Shoes"/> + <menu_item_call label="Skarpetki" name="Socks"/> + <menu_item_call label="Kurtkę" name="Jacket"/> + <menu_item_call label="Rękawiczki" name="Gloves"/> + <menu_item_call label="Podkoszulek" name="Self Undershirt"/> + <menu_item_call label="Bieliznę" name="Self Underpants"/> + <menu_item_call label="Tatuaż" name="Self Tattoo"/> + <menu_item_call label="Ubranie alpha" name="Self Alpha"/> + <menu_item_call label="Wszystko" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Odłącz" name="Object Detach"/> + <menu_item_call label="Odłącz wszystko" name="Detach All"/> + </context_menu> + <menu_item_call label="Mój wygląd" name="Chenge Outfit"/> + <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> + <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> + <menu_item_call label="Moi znajomi" name="Friends..."/> + <menu_item_call label="Moje grupy" name="Groups..."/> + <menu_item_call label="Mój profil" name="Profile..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml new file mode 100644 index 0000000000..8da40dcedf --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_bottomtray.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Rozmowy głosowe aktywne" name="EnableVoiceChat"/> + <menu_item_check label="Przycisk gesturki" name="ShowGestureButton"/> + <menu_item_check label="Przycisk ruchu" name="ShowMoveButton"/> + <menu_item_check label="Przycisk widoku" name="ShowCameraButton"/> + <menu_item_check label="Przycisk zdjęć" name="ShowSnapshotButton"/> + <menu_item_check label="Buduj" name="ShowBuildButton"/> + <menu_item_check label="Szukaj" name="ShowSearchButton"/> + <menu_item_check label="Mapa" name="ShowWorldMapButton"/> + <menu_item_check label="Mini-Mapa" name="ShowMiniMapButton"/> + <menu_item_call label="Wytnij" name="NearbyChatBar_Cut"/> + <menu_item_call label="Kopiuj" name="NearbyChatBar_Copy"/> + <menu_item_call label="Wklej" name="NearbyChatBar_Paste"/> + <menu_item_call label="Usuń" name="NearbyChatBar_Delete"/> + <menu_item_call label="Zaznacz wszystko" name="NearbyChatBar_Select_All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml new file mode 100644 index 0000000000..4e5407601b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Odłącz" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml new file mode 100644 index 0000000000..ee60d3feb6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Zastąp" name="replace"/> + <menu_item_call label="Edytuj" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml new file mode 100644 index 0000000000..ad43900137 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_cof_clothing.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Zdejmij" name="take_off"/> + <menu_item_call label="Edytuj" name="edit"/> + <menu_item_call label="Zastąp" name="replace"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml new file mode 100644 index 0000000000..9fba39be1a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Nowe ubranie" name="COF.Gear.New_Clothes"/> + <menu label="Nowe części ciała" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_edit.xml b/indra/newview/skins/minimal/xui/pl/menu_edit.xml new file mode 100644 index 0000000000..578e270fed --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Edycja" name="Edit"> + <menu_item_call label="Cofnij" name="Undo"/> + <menu_item_call label="Powtórz" name="Redo"/> + <menu_item_call label="Wytnij" name="Cut"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> + <menu_item_call label="Usuń" name="Delete"/> + <menu_item_call label="Powiel" name="Duplicate"/> + <menu_item_call label="Zaznacz wszystko" name="Select All"/> + <menu_item_call label="Odznacz" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_favorites.xml b/indra/newview/skins/minimal/xui/pl/menu_favorites.xml new file mode 100644 index 0000000000..7310ff5c27 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teleportuj" name="Teleport To Landmark"/> + <menu_item_call label="Zobacz/Edytuj Ulubione miejsce" name="Landmark Open"/> + <menu_item_call label="Kopiuj SLurl" name="Copy slurl"/> + <menu_item_call label="Pokaż na mapie" name="Show On Map"/> + <menu_item_call label="Kopiuj" name="Landmark Copy"/> + <menu_item_call label="Wklej" name="Landmark Paste"/> + <menu_item_call label="Usuń" name="Delete"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml new file mode 100644 index 0000000000..a72dec22fc --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_gesture_gear.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gesture_gear"> + <menu_item_call label="Dodaj/Usuń z Ulubionych" name="activate"/> + <menu_item_call label="Kopiuj" name="copy_gesture"/> + <menu_item_call label="Wklej" name="paste"/> + <menu_item_call label="Kopiuj UUID" name="copy_uuid"/> + <menu_item_call label="Zapisz do obecnego zestawu ubrania" name="save_to_outfit"/> + <menu_item_call label="Edytuj" name="edit_gesture"/> + <menu_item_call label="Sprawdź" name="inspect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml b/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml new file mode 100644 index 0000000000..83be4d38c5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Dołącz do grupy..." name="item_join"/> + <menu_item_call label="Nowa grupa..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml new file mode 100644 index 0000000000..19d9510cd3 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_hide_navbar.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_navbar_menu"> + <menu_item_check label="Pokaż pasek Nawigacji" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Pokaż pasek Ulubionych" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Pokaż pasek mini-lokalizacji" name="ShowMiniLocationPanel"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml new file mode 100644 index 0000000000..207bc2211b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Zamknij wszystkie" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..4ead44878a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_adhoc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet AdHoc Menu"> + <menu_item_call label="Zakończ rozmowę" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml new file mode 100644 index 0000000000..2b9a362123 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet Group Menu"> + <menu_item_call label="O grupie" name="Show Profile"/> + <menu_item_call label="Pokaż sesję" name="Chat"/> + <menu_item_call label="Zakończ rozmowę" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000..8924d6db3e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_imchiclet_p2p.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet P2P Menu"> + <menu_item_call label="Zobacz profil" name="Show Profile"/> + <menu_item_call label="Dodaj znajomość" name="Add Friend"/> + <menu_item_call label="Pokaż sesję" name="Send IM"/> + <menu_item_call label="Zakończ rozmowę" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000..59560f236c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inspect_avatar_gear.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Zobacz profil" name="view_profile"/> + <menu_item_call label="Dodaj znajomość" name="add_friend"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Zadzwoń" name="call"/> + <menu_item_call label="Teleportuj" name="teleport"/> + <menu_item_call label="Zaproś do grupy" name="invite_to_group"/> + <menu_item_call label="Zablokuj" name="block"/> + <menu_item_call label="Odblokuj" name="unblock"/> + <menu_item_call label="Raport" name="report"/> + <menu_item_call label="Unieruchom" name="freeze"/> + <menu_item_call label="Wyrzuć" name="eject"/> + <menu_item_call label="Kopnij" name="kick"/> + <menu_item_call label="CSR" name="csr"/> + <menu_item_call label="Debugowanie tekstur" name="debug"/> + <menu_item_call label="Znajdź na mapie" name="find_on_map"/> + <menu_item_call label="Przybliż" name="zoom_in"/> + <menu_item_call label="Zapłać" name="pay"/> + <menu_item_call label="Udostępnij" name="share"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml new file mode 100644 index 0000000000..c12bd490ff --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inspect_object_gear.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Dotknij" name="touch"/> + <menu_item_call label="Usiądź" name="sit"/> + <menu_item_call label="Zapłać" name="pay"/> + <menu_item_call label="Kup" name="buy"/> + <menu_item_call label="Weź" name="take"/> + <menu_item_call label="Weź kopię" name="take_copy"/> + <menu_item_call label="Otwórz" name="open"/> + <menu_item_call label="Edytuj" name="edit"/> + <menu_item_call label="Ubierz" name="wear"/> + <menu_item_call label="Dodaj" name="add"/> + <menu_item_call label="Raport" name="report"/> + <menu_item_call label="Zablokuj" name="block"/> + <menu_item_call label="Przybliż" name="zoom_in"/> + <menu_item_call label="Usuń" name="remove"/> + <menu_item_call label="Więcej informacji" name="more_info"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml new file mode 100644 index 0000000000..c4ef9761d9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inspect_self_gear.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/> + <menu_item_call label="Wstań" name="Stand Up"/> + <context_menu label="Zdejmij" name="Take Off >"> + <context_menu label="Ubranie" name="Clothes >"> + <menu_item_call label="Bluzka" name="Shirt"/> + <menu_item_call label="Spodnie" name="Pants"/> + <menu_item_call label="Spódnica" name="Skirt"/> + <menu_item_call label="Buty" name="Shoes"/> + <menu_item_call label="Skarpetki" name="Socks"/> + <menu_item_call label="Kurtka" name="Jacket"/> + <menu_item_call label="Rękawiczki" name="Gloves"/> + <menu_item_call label="Podkoszulek" name="Self Undershirt"/> + <menu_item_call label="Bielizna" name="Self Underpants"/> + <menu_item_call label="Tatuaż" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Ubranie" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Odłącz" name="Object Detach"/> + <menu_item_call label="Odłącz wszystko" name="Detach All"/> + </context_menu> + <menu_item_call label="Zmień strój" name="Chenge Outfit"/> + <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/> + <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/> + <menu_item_call label="Znajomi" name="Friends..."/> + <menu_item_call label="Moje grupy" name="Groups..."/> + <menu_item_call label="Mój profil" name="Profile..."/> + <menu_item_call label="Debugowanie tekstur" name="Debug..."/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..5ef0f2f7a4 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Zamknij" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory.xml new file mode 100644 index 0000000000..e47ffa0e18 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inventory.xml @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Kupuj" name="Task Buy"/> + <menu_item_call label="Otwórz" name="Task Open"/> + <menu_item_call label="Odtwarzaj" name="Task Play"/> + <menu_item_call label="Właściwości" name="Task Properties"/> + <menu_item_call label="Zmień nazwę" name="Task Rename"/> + <menu_item_call label="Usuń" name="Task Remove"/> + <menu_item_call label="Opróżnij Kosz" name="Empty Trash"/> + <menu_item_call label="Opróżnij Folder Zgubione i odnalezione" name="Empty Lost And Found"/> + <menu_item_call label="Nowy folder" name="New Folder"/> + <menu_item_call label="Nowy skrypt" name="New Script"/> + <menu_item_call label="Nowa nota" name="New Note"/> + <menu_item_call label="Nowa gesturka" name="New Gesture"/> + <menu label="Nowe Ubranie" name="New Clothes"> + <menu_item_call label="Nowa koszula" name="New Shirt"/> + <menu_item_call label="Nowe spodnie" name="New Pants"/> + <menu_item_call label="Nowe buty" name="New Shoes"/> + <menu_item_call label="Nowe skarpety" name="New Socks"/> + <menu_item_call label="Nowa kurtka" name="New Jacket"/> + <menu_item_call label="Nowa spódnica" name="New Skirt"/> + <menu_item_call label="Nowe rękawiczki" name="New Gloves"/> + <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/> + <menu_item_call label="Nowa bielizna" name="New Underpants"/> + <menu_item_call label="Nowa maska alpha" name="New Alpha Mask"/> + <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + </menu> + <menu label="Nowa Część Ciała" name="New Body Parts"> + <menu_item_call label="Nowy kształt" name="New Shape"/> + <menu_item_call label="Nowa skórka" name="New Skin"/> + <menu_item_call label="Nowe włosy" name="New Hair"/> + <menu_item_call label="Nowe oczy" name="New Eyes"/> + </menu> + <menu label="Zmień Czcionkę" name="Change Type"> + <menu_item_call label="Domyślna" name="Default"/> + <menu_item_call label="Rękawiczki" name="Gloves"/> + <menu_item_call label="Kurtka" name="Jacket"/> + <menu_item_call label="Spodnie" name="Pants"/> + <menu_item_call label="Kształt" name="Shape"/> + <menu_item_call label="Buty" name="Shoes"/> + <menu_item_call label="Koszula" name="Shirt"/> + <menu_item_call label="Spódnica" name="Skirt"/> + <menu_item_call label="Bielizna" name="Underpants"/> + <menu_item_call label="Podkoszulek" name="Undershirt"/> + </menu> + <menu_item_call label="Teleportuj" name="Landmark Open"/> + <menu_item_call label="Otwórz" name="Animation Open"/> + <menu_item_call label="Otwórz" name="Sound Open"/> + <menu_item_call label="Zmień strój" name="Replace Outfit"/> + <menu_item_call label="Dodaj do stroju" name="Add To Outfit"/> + <menu_item_call label="Usuń obiekt" name="Purge Item"/> + <menu_item_call label="Przywróć obiekt" name="Restore Item"/> + <menu_item_call label="Otwórz" name="Open"/> + <menu_item_call label="Otwórz oryginalne" name="Open Original"/> + <menu_item_call label="Właściwości" name="Properties"/> + <menu_item_call label="Zmień nazwę" name="Rename"/> + <menu_item_call label="Kopiuj dane UUID" name="Copy Asset UUID"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> + <menu_item_call label="Wklej jako link" name="Paste As Link"/> + <menu_item_call label="Usuń" name="Remove Link"/> + <menu_item_call label="Usuń" name="Delete"/> + <menu_item_call label="Skasuj folder systemu" name="Delete System Folder"/> + <menu_item_call label="Rozpocznij konferencję czatową" name="Conference Chat Folder"/> + <menu_item_call label="Odtwarzaj" name="Sound Play"/> + <menu_item_call label="O Miejscu" name="About Landmark"/> + <menu_item_call label="Używaj in-world" name="Animation Play"/> + <menu_item_call label="Odtwarzaj lokalnie" name="Animation Audition"/> + <menu_item_call label="Wyślij IM" name="Send Instant Message"/> + <menu_item_call label="Teleportuj..." name="Offer Teleport..."/> + <menu_item_call label="Rozpocznij konferencję czatową" name="Conference Chat"/> + <menu_item_call label="Aktywuj" name="Activate"/> + <menu_item_call label="Deaktywuj" name="Deactivate"/> + <menu_item_call label="Zapisz jako" name="Save As"/> + <menu_item_call label="Odłącz od siebie" name="Detach From Yourself"/> + <menu_item_call label="Załóż" name="Wearable And Object Wear"/> + <menu label="Dołącz do" name="Attach To"/> + <menu label="Dołącz do załączników HUD" name="Attach To HUD"/> + <menu_item_call label="Edytuj" name="Wearable Edit"/> + <menu_item_call label="Dodaj" name="Wearable Add"/> + <menu_item_call label="Zdejmij" name="Take Off"/> + <menu_item_call label="--brak opcji--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml new file mode 100644 index 0000000000..4a56586aaf --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inventory_add.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Załaduj" name="upload"> + <menu_item_call label="obraz (L$[COST])..." name="Upload Image"/> + <menu_item_call label="dźwięk (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="animację (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/> + <menu_item_call label="Ustaw domyślne pozwolenia ładowania" name="perm prefs"/> + </menu> + <menu_item_call label="Nowy folder" name="New Folder"/> + <menu_item_call label="Nowy skrypt" name="New Script"/> + <menu_item_call label="Nowa nota" name="New Note"/> + <menu_item_call label="Nowa gesturka" name="New Gesture"/> + <menu label="Nowe Ubranie" name="New Clothes"> + <menu_item_call label="Nowa koszula" name="New Shirt"/> + <menu_item_call label="Nowe spodnie" name="New Pants"/> + <menu_item_call label="Nowe buty" name="New Shoes"/> + <menu_item_call label="Nowe skarpetki" name="New Socks"/> + <menu_item_call label="Nowa kurtka" name="New Jacket"/> + <menu_item_call label="Nowa spódnica" name="New Skirt"/> + <menu_item_call label="Nowe rękawiczki" name="New Gloves"/> + <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/> + <menu_item_call label="Nowa bielizna" name="New Underpants"/> + <menu_item_call label="Nowa maska alpha" name="New Alpha"/> + <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + </menu> + <menu label="Nowa Część Ciała" name="New Body Parts"> + <menu_item_call label="Nowy kształt" name="New Shape"/> + <menu_item_call label="Nowa skórka" name="New Skin"/> + <menu_item_call label="Nowe włosy" name="New Hair"/> + <menu_item_call label="Nowe oczy" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml new file mode 100644 index 0000000000..591c3a81d5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_inventory_gear_default.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_gear_default"> + <menu_item_call label="Nowe okno Szafy" name="new_window"/> + <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/> + <menu_item_check label="Porządkuj według daty" name="sort_by_recent"/> + <menu_item_check label="Sortuj foldery zawsze według nazwy" name="sort_folders_by_name"/> + <menu_item_check label="Posortuj foldery systemowe od góry" name="sort_system_folders_to_top"/> + <menu_item_call label="Pokaż filtry" name="show_filters"/> + <menu_item_call label="Zresetuj filtry" name="reset_filters"/> + <menu_item_call label="Zamknij wszystkie foldery" name="close_folders"/> + <menu_item_call label="Opróżnij Zagubione i odnalezione" name="empty_lostnfound"/> + <menu_item_call label="Zapisz teksturę jako" name="Save Texture As"/> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Znajdź oryginał" name="Find Original"/> + <menu_item_call label="Znajdź wszystkie linki" name="Find All Links"/> + <menu_item_call label="Opróżnij Kosz" name="empty_trash"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_land.xml b/indra/newview/skins/minimal/xui/pl/menu_land.xml new file mode 100644 index 0000000000..cbfecaee56 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_land.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Land Pie"> + <menu_item_call label="O Posiadłości" name="Place Information..."/> + <menu_item_call label="Usiądź tutaj" name="Sit Here"/> + <menu_item_call label="Kup posiadłość" name="Land Buy"/> + <menu_item_call label="Kup przepustkę" name="Land Buy Pass"/> + <menu_item_call label="Buduj" name="Create"/> + <menu_item_call label="Edytuj teren" name="Edit Terrain"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_landmark.xml b/indra/newview/skins/minimal/xui/pl/menu_landmark.xml new file mode 100644 index 0000000000..aa5808390c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_landmark.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Kopiuj SLurl" name="copy"/> + <menu_item_call label="Usuń" name="delete"/> + <menu_item_call label="Utwórz" name="pick"/> + <menu_item_call label="Dodaj do paska Ulubionych" name="add_to_favbar"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_login.xml b/indra/newview/skins/minimal/xui/pl/menu_login.xml new file mode 100644 index 0000000000..e50b694641 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_login.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Login Menu"> + <menu label="Ja" name="File"> + <menu_item_call label="Ustawienia" name="Preferences..."/> + <menu_item_call label="Wyłącz [APP_NAME]" name="Quit"/> + </menu> + <menu label="Pomoc" name="Help"> + <menu_item_call label="[SECOND_LIFE]: Pomoc" name="Second Life Help"/> + <menu_item_call label="O [APP_NAME]" name="About Second Life"/> + </menu> + <menu_item_check label="Pokaż ustawienia debugowania" name="Show Debug Menu"/> + <menu label="Debug" name="Debug"> + <menu_item_call label="Ustawienia debugowania" name="Debug Settings"/> + <menu_item_call label="Ustawienia UI/kolor" name="UI/Color Settings"/> + <menu label="UI Testy" name="UI Tests"/> + <menu_item_call label="Ustaw rozmiar interfejsu..." name="Set Window Size..."/> + <menu_item_call label="Wyświetl TOS" name="TOS"/> + <menu_item_call label="Wyświetl wiadomość krytyczną" name="Critical"/> + <menu_item_call label="Test przeglądarki mediów" name="Web Browser Test"/> + <menu_item_call label="Test zawartości strony" name="Web Content Floater Test"/> + <menu_item_check label="Pokaż siatkę" name="Show Grid Picker"/> + <menu_item_call label="Pokaż konsolę Zawiadomień" name="Show Notifications Console"/> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml b/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml new file mode 100644 index 0000000000..8f86965416 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_mini_map.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Zoom blisko" name="Zoom Close"/> + <menu_item_call label="Zoom średnio" name="Zoom Medium"/> + <menu_item_call label="Zoom daleko" name="Zoom Far"/> + <menu_item_call label="Zoom domyślny" name="Zoom Default"/> + <menu_item_check label="Obróć mapę" name="Rotate Map"/> + <menu_item_check label="Autocentrowanie" name="Auto Center"/> + <menu_item_call label="Zatrzymaj" name="Stop Tracking"/> + <menu_item_call label="Mapa Świata" name="World Map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_navbar.xml b/indra/newview/skins/minimal/xui/pl/menu_navbar.xml new file mode 100644 index 0000000000..1d434670ee --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_navbar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Pokaż współrzędne" name="Show Coordinates"/> + <menu_item_check label="Pokaż właściwości posiadłości" name="Show Parcel Properties"/> + <menu_item_call label="Landmark" name="Landmark"/> + <menu_item_call label="Wytnij" name="Cut"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> + <menu_item_call label="Usuń" name="Delete"/> + <menu_item_call label="Zaznacz wszystko" name="Select All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml new file mode 100644 index 0000000000..fe5bc6ba6f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="NearBy Chat Menu"> + <menu_item_call label="Pokaż osoby w pobliżu..." name="nearby_people"/> + <menu_item_check label="Pokaż zablokowany tekst" name="muted_text"/> + <menu_item_check label="Wyświetlaj ikonki znajomych" name="show_buddy_icons"/> + <menu_item_check label="Wyświetlaj imiona" name="show_names"/> + <menu_item_check label="Wyświetlaj ikonki i imiona" name="show_icons_and_names"/> + <menu_item_call label="Rozmiar czcionki" name="font_size"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml new file mode 100644 index 0000000000..bd3d42f9b1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Zamknij" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_object.xml b/indra/newview/skins/minimal/xui/pl/menu_object.xml new file mode 100644 index 0000000000..3da6c5c890 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_object.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Object Pie"> + <menu_item_call label="Dotknij" name="Object Touch"> + <menu_item_call.on_enable name="EnableTouch" parameter="Dotknij"/> + </menu_item_call> + <menu_item_call label="Edytuj" name="Edit..."/> + <menu_item_call label="Buduj" name="Build"/> + <menu_item_call label="Otwórz" name="Open"/> + <menu_item_call label="Usiądź tutaj" name="Object Sit"/> + <menu_item_call label="Wstań" name="Object Stand Up"/> + <menu_item_call label="Sprawdź" name="Object Inspect"/> + <menu_item_call label="Przybliż" name="Zoom In"/> + <context_menu label="Załóż na" name="Put On"> + <menu_item_call label="Załóż" name="Wear"/> + <menu_item_call label="Dodaj" name="Add"/> + <context_menu label="Dołącz" name="Object Attach"/> + <context_menu label="Dołącz HUD" name="Object Attach HUD"/> + </context_menu> + <context_menu label="Zarządzaj" name="Remove"> + <menu_item_call label="Raport" name="Report Abuse..."/> + <menu_item_call label="Zablokuj" name="Object Mute"/> + <menu_item_call label="Zwróć" name="Return..."/> + </context_menu> + <menu_item_call label="Weź" name="Pie Object Take"/> + <menu_item_call label="Weź kopię" name="Take Copy"/> + <menu_item_call label="Zapłać" name="Pay..."/> + <menu_item_call label="Kup" name="Buy..."/> + <menu_item_call label="Skasuj" name="Delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml b/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml new file mode 100644 index 0000000000..b499bca2db --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_object_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Object Icon Menu"> + <menu_item_call label="Sprawdź..." name="Object Profile"/> + <menu_item_call label="Zablokuj..." name="Block"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml new file mode 100644 index 0000000000..1a70e76ec7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_outfit_gear.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Załóż - Zastąp obecny strój" name="wear"/> + <menu_item_call label="Załóż - Dodaj do bieżącego stroju" name="wear_add"/> + <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/> + <menu label="Nowe ubranie" name="New Clothes"> + <menu_item_call label="Nowa koszula" name="New Shirt"/> + <menu_item_call label="Nowe spodnie" name="New Pants"/> + <menu_item_call label="Nowe buty" name="New Shoes"/> + <menu_item_call label="Nowe skarpetki" name="New Socks"/> + <menu_item_call label="Nowa kurtka" name="New Jacket"/> + <menu_item_call label="Nowa spódnica" name="New Skirt"/> + <menu_item_call label="Nowe rękawiczki" name="New Gloves"/> + <menu_item_call label="Nowa podkoszulka" name="New Undershirt"/> + <menu_item_call label="Nowa bielizna" name="New Underpants"/> + <menu_item_call label="Nowa maska alpha" name="New Alpha"/> + <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> + </menu> + <menu label="Nowe części ciała" name="New Body Parts"> + <menu_item_call label="Nowy kształt" name="New Shape"/> + <menu_item_call label="Nowa skórka" name="New Skin"/> + <menu_item_call label="Nowe włosy" name="New Hair"/> + <menu_item_call label="Nowe oczy" name="New Eyes"/> + </menu> + <menu_item_call label="Zmień nazwę stroju" name="rename"/> + <menu_item_call label="Usuń strój" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml new file mode 100644 index 0000000000..998e25f38e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Załóż - Zastąp obecny strój" name="wear_replace"/> + <menu_item_call label="Załóż - Dodaj do obecnego stroju" name="wear_add"/> + <menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/> + <menu_item_call label="Edytuj strój" name="edit"/> + <menu_item_call label="Zmień nazwę stroju" name="rename"/> + <menu_item_call label="Usuń strój" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml b/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml new file mode 100644 index 0000000000..9e59102788 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_participant_list.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Participant List Context Menu"> + <menu_item_check label="Sortuj według imienia" name="SortByName"/> + <menu_item_check label="Sortuj według ostatniego mówcy" name="SortByRecentSpeakers"/> + <menu_item_call label="Zobacz profil" name="View Profile"/> + <menu_item_call label="Dodaj znajomość" name="Add Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Zapłać" name="Pay"/> + <menu_item_check label="Przeglądaj ikonki" name="View Icons"/> + <menu_item_check label="Zablokuj głos" name="Block/Unblock"/> + <menu_item_check label="Zablokuj tekst" name="MuteText"/> + <context_menu label="Opcje Moderatora" name="Moderator Options"> + <menu_item_check label="Czat/IM dozwolony" name="AllowTextChat"/> + <menu_item_call label="Wycisz tego uczestnika" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Odblokuj wyciszenie tego uczestnika" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Wycisz wszystkich" name="ModerateVoiceMute"/> + <menu_item_call label="Cofnij wyciszenie wszystkim" name="ModerateVoiceUnmute"/> + </context_menu> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000..b62b85d30a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_friends_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Porządkuj według nazwy" name="sort_name"/> + <menu_item_check label="Porządkuj według statusu" name="sort_status"/> + <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/> + <menu_item_check label="Zobacz udzielone prawa" name="view_permissions"/> + <menu_item_call label="Pokaż zablokowanych Rezydentów & obiekty" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml b/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml new file mode 100644 index 0000000000..ace5ebf888 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Zobacz info" name="View Info"/> + <menu_item_call label="Czat" name="Chat"/> + <menu_item_call label="Rozmowa" name="Call"/> + <menu_item_call label="Aktywuj" name="Activate"/> + <menu_item_call label="Opuść" name="Leave"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000..c70ea2315f --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_groups_view_sort.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Wyświetlaj ikonki grupy" name="Display Group Icons"/> + <menu_item_call label="Opuść zaznaczone grupy" name="Leave Selected Group"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml new file mode 100644 index 0000000000..0111e0fd51 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_nearby.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Avatar Context Menu"> + <menu_item_call label="Zobacz profil" name="View Profile"/> + <menu_item_call label="Dodaj do znajomych" name="Add Friend"/> + <menu_item_call label="Usuń z listy znajomych" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Zapłać" name="Pay"/> + <menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/> + <menu_item_call label="Teleportuj" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000..dcfc48fb60 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_multiselect.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Multi-Selected People Context Menu"> + <menu_item_call label="Dodaj znajomych" name="Add Friends"/> + <menu_item_call label="Usuń znajomych" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Zadzwoń" name="Call"/> + <menu_item_call label="Udostępnij" name="Share"/> + <menu_item_call label="Zapłać" name="Pay"/> + <menu_item_call label="Teleportuj" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000..8ec3820f84 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_nearby_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Porządkuj według ostatnich rozmówców" name="sort_by_recent_speakers"/> + <menu_item_check label="Porządkuj według nazwy" name="sort_name"/> + <menu_item_check label="Porządkuj według odległości" name="sort_distance"/> + <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/> + <menu_item_call label="Pokaż zablokowanych Rezydentów & obiekty" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000..b474a556bd --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_people_recent_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Porządkuj według daty" name="sort_most"/> + <menu_item_check label="Porządkuj według nazwy" name="sort_name"/> + <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/> + <menu_item_call label="Pokaż zablokowanych Rezydentów & obiekty" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_picks.xml b/indra/newview/skins/minimal/xui/pl/menu_picks.xml new file mode 100644 index 0000000000..6f6e4b7fa8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Info" name="pick_info"/> + <menu_item_call label="Edytuj" name="pick_edit"/> + <menu_item_call label="Teleportuj" name="pick_teleport"/> + <menu_item_call label="Mapa" name="pick_map"/> + <menu_item_call label="Usuń" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml new file mode 100644 index 0000000000..e9c00f51a9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_picks_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="picks_plus_menu"> + <menu_item_call label="Stwórz" name="create_pick"/> + <menu_item_call label="Nowa reklama" name="create_classified"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_place.xml b/indra/newview/skins/minimal/xui/pl/menu_place.xml new file mode 100644 index 0000000000..c3b72d6abb --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Zapisz landmark" name="landmark"/> + <menu_item_call label="Utwórz" name="pick"/> + <menu_item_call label="Kup przepustkę" name="pass"/> + <menu_item_call label="Edytuj" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml new file mode 100644 index 0000000000..3d0c1c87fb --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_place_add_button.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml new file mode 100644 index 0000000000..d1f283b7aa --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_places_gear_folder.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_folder_gear"> + <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> + <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Przywróć obiekt" name="restore_item"/> + <menu_item_call label="Wytnij" name="cut"/> + <menu_item_call label="Kopiuj" name="copy_folder"/> + <menu_item_call label="Wklej" name="paste"/> + <menu_item_call label="Zmień nazwę" name="rename"/> + <menu_item_call label="Usuń" name="delete"/> + <menu_item_call label="Rozwiń" name="expand"/> + <menu_item_call label="Schowaj" name="collapse"/> + <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/> + <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> + <menu_item_check label="Sortuj według daty" name="sort_by_date"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..0139d3a987 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_places_gear_landmark.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_ladmark_gear"> + <menu_item_call label="Teleportuj" name="teleport"/> + <menu_item_call label="Więcej informacji" name="more_info"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Dodaj do landmarków" name="add_landmark"/> + <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Przywróć obiekt" name="restore_item"/> + <menu_item_call label="Wytnij" name="cut"/> + <menu_item_call label="Kopiuj landmark" name="copy_landmark"/> + <menu_item_call label="Kopiuj SLurl" name="copy_slurl"/> + <menu_item_call label="Wklej" name="paste"/> + <menu_item_call label="Zmień nazwę" name="rename"/> + <menu_item_call label="Usuń" name="delete"/> + <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/> + <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> + <menu_item_check label="Sortuj według daty" name="sort_by_date"/> + <menu_item_call label="Stwórz Ulubione" name="create_pick"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml new file mode 100644 index 0000000000..ef836c8ecf --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_profile_overflow.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Mapa" name="show_on_map"/> + <menu_item_call label="Zapłać" name="pay"/> + <menu_item_call label="Udostępnij" name="share"/> + <menu_item_call label="Zablokuj" name="block"/> + <menu_item_call label="Odblokuj" name="unblock"/> + <menu_item_call label="Wyrzuć" name="kick"/> + <menu_item_call label="Unieruchom" name="freeze"/> + <menu_item_call label="Uruchom" name="unfreeze"/> + <menu_item_call label="CSR" name="csr"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml new file mode 100644 index 0000000000..4bc65eca38 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Zapisz" name="save_outfit"/> + <menu_item_call label="Zapisz jako" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml new file mode 100644 index 0000000000..256500a402 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Zamknij" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_slurl.xml b/indra/newview/skins/minimal/xui/pl/menu_slurl.xml new file mode 100644 index 0000000000..862f538aa7 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="O miejscu" name="about_url"/> + <menu_item_call label="Teleportuj do miejsca" name="teleport_to_url"/> + <menu_item_call label="Mapa" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml new file mode 100644 index 0000000000..0e58592d46 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Teleport History Gear Context Menu"> + <menu_item_call label="Rozwiń wszystkie foldery" name="Expand all folders"/> + <menu_item_call label="Schowaj wszystkie foldery" name="Collapse all folders"/> + <menu_item_call label="Wyczyść historię teleportacji" name="Clear Teleport History"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml new file mode 100644 index 0000000000..cd36c116b0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Teleportuj" name="Teleport"/> + <menu_item_call label="Więcej szczegółów" name="More Information"/> + <menu_item_call label="Kopiuj do schowka" name="CopyToClipboard"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml new file mode 100644 index 0000000000..b12df08d6a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_teleport_history_tab.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Otwórz" name="TabOpen"/> + <menu_item_call label="Zamknij" name="TabClose"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml b/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml new file mode 100644 index 0000000000..812f87bc1a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_text_editor.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Text editor context menu"> + <menu_item_call label="Wytnij" name="Cut"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> + <menu_item_call label="Usuń" name="Delete"/> + <menu_item_call label="Zaznacz wszystko" name="Select All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml new file mode 100644 index 0000000000..53536c8f1c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_topinfobar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_topinfobar"> + <menu_item_check label="Pokaż współprzędne" name="Show Coordinates"/> + <menu_item_check label="Pokaż O Posiadłości" name="Show Parcel Properties"/> + <menu_item_call label="Landmark" name="Landmark"/> + <menu_item_call label="Kopiuj" name="Copy"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml b/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml new file mode 100644 index 0000000000..db729be725 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż profil Rezydenta" name="show_agent"/> + <menu_item_call label="Kopiuj nazwę do schowka" name="url_copy_label"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_group.xml b/indra/newview/skins/minimal/xui/pl/menu_url_group.xml new file mode 100644 index 0000000000..f340b3296a --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż szczegóły o grupie" name="show_group"/> + <menu_item_call label="Kopiuj grupę do schowka" name="url_copy_label"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_http.xml b/indra/newview/skins/minimal/xui/pl/menu_url_http.xml new file mode 100644 index 0000000000..e73f7b6745 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Otwórz przeglądarkę internetową" name="url_open"/> + <menu_item_call label="Otwórz w wewnętrzenej przeglądarce" name="url_open_internal"/> + <menu_item_call label="Otwórz w zewnętrznej przeglądarce" name="url_open_external"/> + <menu_item_call label="Kopiuj URL do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml new file mode 100644 index 0000000000..e36fa0dd2b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_inventory.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż obiekt w szafie" name="show_item"/> + <menu_item_call label="Kopiuj nazwę do schowka" name="url_copy_label"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_map.xml b/indra/newview/skins/minimal/xui/pl/menu_url_map.xml new file mode 100644 index 0000000000..179ab1f676 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_map.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml new file mode 100644 index 0000000000..7576208a9e --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_objectim.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż szczegóły o obiekcie" name="show_object"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Teleportuj to miejsca obiektu" name="teleport_to_object"/> + <menu_item_call label="Kopiuj nazwę obiektu do schowka" name="url_copy_label"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml new file mode 100644 index 0000000000..1b8dd62137 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_parcel.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż szczegóły o miejscu" name="show_parcel"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml new file mode 100644 index 0000000000..eb83245c48 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_slapp.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Uruchom tę komendę" name="run_slapp"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml new file mode 100644 index 0000000000..4d4a5b4c4d --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_slurl.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Pokaż szczegóły o miejscu" name="show_place"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml new file mode 100644 index 0000000000..e225546930 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_url_teleport.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Teleportuj do tego miejsca" name="teleport"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_viewer.xml b/indra/newview/skins/minimal/xui/pl/menu_viewer.xml new file mode 100644 index 0000000000..0196dc8613 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_viewer.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Main Menu"> + <menu label="Pomoc" name="Help"> + <menu_item_call label="[SECOND_LIFE] Portal Pomocy" name="Second Life Help"/> + </menu> + <menu label="Zaawansowane" name="Advanced"> + <menu label="Skróty" name="Shortcuts"> + <menu_item_check label="Zacznij latać" name="Fly"/> + <menu_item_call label="Zamknij okno" name="Close Window"/> + <menu_item_call label="Zamknij wszystkie okna" name="Close All Windows"/> + <menu_item_call label="Reset widoku" name="Reset View"/> + </menu> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml new file mode 100644 index 0000000000..bf85246be8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_wearable_list_item.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Zastąp" name="wear_replace"/> + <menu_item_call label="Załóż" name="wear_wear"/> + <menu_item_call label="Dodaj" name="wear_add"/> + <menu_item_call label="Zdejmij/Odłącz" name="take_off_or_detach"/> + <menu_item_call label="Odłącz" name="detach"/> + <context_menu label="Dołącz do" name="wearable_attach_to"/> + <context_menu label="Dołącz do załączników HUD" name="wearable_attach_to_hud"/> + <menu_item_call label="Zdejmij" name="take_off"/> + <menu_item_call label="Edytuj" name="edit"/> + <menu_item_call label="Profil obiektu" name="object_profile"/> + <menu_item_call label="Pokaż oryginalny" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml new file mode 100644 index 0000000000..47cafdbd99 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_wearing_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Wearing"> + <menu_item_call label="Edytuj strój" name="edit"/> + <menu_item_call label="Zdejmij" name="takeoff"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml new file mode 100644 index 0000000000..7531437043 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/menu_wearing_tab.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Wearing"> + <menu_item_call label="Zdejmij" name="take_off"/> + <menu_item_call label="Odłącz" name="detach"/> + <menu_item_call label="Edytuj strój" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/pl/notifications.xml b/indra/newview/skins/minimal/xui/pl/notifications.xml new file mode 100644 index 0000000000..6e62478ed0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/notifications.xml @@ -0,0 +1,2907 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <global name="skipnexttime"> + Nie pokazuj tej opcji następnym razem + </global> + <global name="alwayschoose"> + Pozwalaj na wybór tej opcji + </global> + <global name="implicitclosebutton"> + Zamknij + </global> + <template name="okbutton"> + <form> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> + </form> + </template> + <template name="okcancelbuttons"> + <form> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$canceltext"/> + </form> + </template> + <template name="okhelpbuttons"> + <form> + <button name="OK_okhelpbuttons" text="$yestext"/> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="Nieznany rodzaj komunikatu" name="MissingAlert"> + Twoja wersja klienta [APP_NAME] nie może wyświetlić odebranej wiadomości. Upewnij się, że posiadasz najnowszą wersję klienta. + +Szczegóły błędu: Błąd o nazwie '[_NAME]' nie został odnaleziony w pliku notifications.xml. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FloaterNotFound"> + Błąd: nie można znaleźć następujących elementów: + +[CONTROLS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TutorialNotFound"> + Brak samouczka na ten temat + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GenericAlert"> + [MESSAGE] + </notification> + <notification name="GenericAlertYesCancel"> + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/> + </notification> + <notification name="BadInstallation"> + Podczas aktualizacji [APP_NAME] wystąpił błąd. Proszę odwiedzić stronę [http://get.secondlife.com pobierz najnowsza wersję] aby ściągnąć ostatnią wersję klienta. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LoginFailedNoNetwork"> + Nie można połączyć z [SECOND_LIFE_GRID]. + '[DIAGNOSTIC]' +Upewnij się, że Twoje połączenie z internetem działa. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MessageTemplateNotFound"> + Wzór komunikatu dla [PATH] nie został odnaleziony. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="WearableSave"> + Zapisać zmiany dotyczące ubrania/części ciała? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/> + </notification> + <notification name="CompileQueueSaveText"> + W trakcie ładwania tekstu dla skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut. + </notification> + <notification name="CompileQueueSaveBytecode"> + W trakcie ładowania skompilowanego skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut. + </notification> + <notification name="WriteAnimationFail"> + Problem w zapisywaniu danych animacji. Spróbuj ponownie za kilka minut. + </notification> + <notification name="UploadAuctionSnapshotFail"> + W trakcie ładwania obrazu aukcji pojawił się problem z następującego powodu: [REASON]. + </notification> + <notification name="UnableToViewContentsMoreThanOne"> + Nie można przeglądać zawartości więcej niż jednego obiektu naraz. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + </notification> + <notification name="SaveClothingBodyChanges"> + Zapisać wszystkie zmiany dotyczące ubrania/cześci ciała? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie zapisuj" yestext="Zapisz"/> + </notification> + <notification name="FriendsAndGroupsOnly"> + Osoby spoza listy znajomych, których rozmowy głosowe i IM są ignorowane, nie wiedzą o tym. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FavoritesOnLogin"> + Pamiętaj: kiedy wyłączysz tą opcję, każdy kto używa tego komputera, może zobaczyć Twoją listę ulubionych miejsc. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GrantModifyRights"> + Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą! +Czy chcesz udzielić prawa do modyfikacji [NAME]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="GrantModifyRightsMultiple"> + Udzielenie praw modyfikacji innym Rezydentom umożliwia im modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą! +Czy chcesz dać prawa modyfikacji wybranym osobom? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="RevokeModifyRights"> + Czy chcesz odebrać prawa do modyfikacji [NAME]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="RevokeModifyRightsMultiple"> + Czy chcesz odebrać prawa modyfikacji wybranym Rezydentom? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="UnableToCreateGroup"> + Założenie grupy nie jest możliwe. +[MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PanelGroupApply"> + [NEEDS_APPLY_MESSAGE] +[WANT_APPLY_MESSAGE] + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Ignoruj zmiany" yestext="Zastosuj zmiany"/> + </notification> + <notification name="MustSpecifyGroupNoticeSubject"> + Aby wysłać ogłoszenie do grupy musisz nadać mu tytuł. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AddGroupOwnerWarning"> + Dodajesz członków do funkcji [ROLE_NAME]. +Ta funkcja nie może być odebrana. +Członkowie muszą sami zrezygnować z pełnienia tej funkcji. +Chcesz kontynuować? + <usetemplate ignoretext="Przed dodaniem nowego właściciela do grupy, proszę potwierdzić swoją decyzję." name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="AssignDangerousActionWarning"> + Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME]. + +*UWAGA* +Członek w funkcji z tym przywilejem może przypisać siebie i innych członków nie będących właścicielami do funkcji dających więcej przywilejów niż posiadane obecnie potencjalnie dające możliwości zbliżone do możliwości właściciela. +Udzielaj tego przywileju z rozwagą." + +Dodać ten przywilej do funkcji [ROLE_NAME]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="AssignDangerousAbilityWarning"> + Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME] + +*UWAGA* +Członek w funkcji z tym przywilejem może przypisać sobie i innychm członkom nie będącym właścicielami wszystkie przywileje potencjalnie dające możliwości zbliżone do możliwości właściciela. +Udzielaj tego przywileju z rozwagą. + +Dodać ten przywilej do funkcji [ROLE_NAME]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="AttachmentDrop"> + Wybrałeś opcję opuszczenia swojego załącznika. + Czy chcesz kontynuować? + <usetemplate ignoretext="Potwierdź przed zdjęciem załącznika." name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="JoinGroupCanAfford"> + Dołączenie do tej grupy kosztuje [COST]L$. +Chcesz kontynuować? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz"/> + </notification> + <notification name="JoinGroupNoCost"> + Dołączasz do grupy [NAME]. +Czy chcesz kontynuować? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Akceptuj"/> + </notification> + <notification name="JoinGroupCannotAfford"> + Członkostwo w tej grupie kosztuje [COST]L$ +Masz za mało L$ żeby zostać członkiem. + </notification> + <notification name="CreateGroupCost"> + Stworzenie tej grupy kosztuje 100L$. +W grupie powinien być więcej niż jeden członek, albo zostanie na zawsze skasowana. +Zaproś proszę członków w ciągu 48 godzin. + <usetemplate canceltext="Anuluj" name="okcancelbuttons" notext="Anuluj" yestext="Stwórz grupę za 100L$"/> + </notification> + <notification name="LandBuyPass"> + Za [COST]L$ możesz odwiedzić tą posiadłość ('[PARCEL_NAME]') na [TIME] godzin. Chcesz kupić przepustkę? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SalePriceRestriction"> + Cena sprzedaży musi być wyższa niż 0L$ jeżeli sprzedajesz komukolwiek. +Musisz wybrać kupca jeżeli chcesz sprzedać za 0L$. + </notification> + <notification name="ConfirmLandSaleChange"> + Posiadłość o powierzchni [LAND_SIZE] m zostaje wystawiona na sprzedaż. +Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME]. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmLandSaleToAnyoneChange"> + UWAGA: Wybierając opcję "Sprzedaj Każdemu" udostępniasz swoją posiadłość do sprzedaży dla jakiegokolwiek Rezydenta [SECOND_LIFE] , nawet osób nieobecnych w tym regionie. + +Posiadłość o powierzchni [LAND_SIZE] m² zostaje wystawiona na sprzedaż. +Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME]. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsDeededToGroup"> + Czy na pewno chcesz zwrócić wszystkie obiekty udostępnione grupie [NAME] na tej posiadłości do szafy ich poprzednich właścicieli? + +*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów +udostępnionych grupie, które nie mają praw transferu! + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedByUser"> + Czy na pewno chcesz zwrócić wszystkie obiekty należące do Rezydenta [NAME] znajdujące się na tej posiadłości do szafy właściciela? + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedBySelf"> + Czy na pewno chcesz zwrócić wszystkie Twoje obiekty znajdujące się na tej posiadłości do swojej szafy? + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedBySelf"> + Czy na pewno chcesz zwrócić wszystkie obiekty, których nie jesteś właścicielem znajdujące się na tej posiadłości do szaf właścicieli? Wszystkie obiekty udostępnione grupie z prawem transferu, zostaną zwrócone poprzednim właścicielom. + +*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu! + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByUser"> + Czy na pewno chcesz zwrócić wszystkie obiekty, które nie należą do [NAME] znajdujące się na tej posiadłości do szaf właścicieli? Wszystkie obiekty udostępnione grupie z prawem transferu, zostaną zwrócone poprzednim właścicielom. + +*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu! + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnAllTopObjects"> + Czy na pewno chcesz zwrócić wszystkie wymienione obiekty znajdujące się na tej posiadłości do szaf ich właścicieli? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DisableAllTopObjects"> + Czy na pewno chcesz deaktywować wszystkie obiekty w tym Regionie? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByGroup"> + Zwrócić obiekty z tej posiadłości, które nie są udosępnione grupie [NAME] do ich właścicieli? + +Obiekty: [N] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="UnableToDisableOutsideScripts"> + Nie można deaktywować skryptów. +Ten region pozwala na uszkodzenia. +Skrypty muszą pozostać aktywne dla prawidłowego działania broni. + </notification> + <notification name="MultipleFacesSelected"> + Obecnie zaznaczono wiele powierzchni. +Jeśli działanie będzie kontynuowane, oddzielne media będą ustawione na wielu powierzchniach obiektu. +W celu umieszczenia mediów tylko na jednej powierzchni skorzystaj z Wybierz powierzchnię i kliknij na wybranej powierzchni obiektu oraz kliknij Dodaj. + <usetemplate ignoretext="Media zostaną ustawione na wielu zaznaczonych powierzchniach" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="MustBeInParcel"> + Musisz znajdować się wewnątrz posiadłości żeby wybrać punkt lądowania. + </notification> + <notification name="PromptRecipientEmail"> + Proszę wpisać adres emailowy odbiorcy. + </notification> + <notification name="PromptSelfEmail"> + Proszę wpisać swój adres emailowy. + </notification> + <notification name="PromptMissingSubjMsg"> + Wysłać widokówkę z domyślnym tematem i wiadomością? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ErrorProcessingSnapshot"> + Błąd w trakcie przetwarzania danych zdjęcia. + </notification> + <notification name="ErrorEncodingSnapshot"> + Błąd w kodowaniu zdjęcia. + </notification> + <notification name="ErrorUploadingPostcard"> + W trakcie ładowania zdjęcia pojawił się problem z następującego powodu: [REASON] + </notification> + <notification name="ErrorUploadingReportScreenshot"> + W trakcie ładowania zdjęcia ekranu do raportu pojawił się problem z następującego powodu: [REASON] + </notification> + <notification name="MustAgreeToLogIn"> + Musisz zaakceptować Warunki Umowy (Terms of Service) by kontynuować logowanie się do [SECOND_LIFE]. + </notification> + <notification name="CouldNotPutOnOutfit"> + Założenie stroju nie powiodło się. +Folder stroju nie zawiera żadnego ubrania, części ciała ani załączników. + </notification> + <notification name="CannotWearTrash"> + Nie możesz założyć ubrania, które znajduje się w koszu. + </notification> + <notification name="MaxAttachmentsOnOutfit"> + Nie można dołączyć obiektu. +Limit [MAX_ATTACHMENTS] załączników został przekroczony. Proszę najpierw odłączyć inny obiekt. + </notification> + <notification name="CannotWearInfoNotComplete"> + Nie możesz założyć tego artkułu ponieważ nie załadował się poprawnie. Spróbuj ponownie za kilka minut. + </notification> + <notification name="MustHaveAccountToLogIn"> + Oops! Brakuje czegoś. +Należy wprowadzić nazwę użytkownika. + +Potrzebujesz konta aby się zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je teraz? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="InvalidCredentialFormat"> + Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika a następnie ponownie się zalogować. + </notification> + <notification name="DeleteClassified"> + Usunąć reklamę '[NAME]'? +Pamiętaj! Nie ma rekompensaty za poniesione koszta. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DeleteMedia"> + Wybrano usunięcie mediów związanych z tą powierzchnią. +Czy na pewno chcesz kontynuować? + <usetemplate ignoretext="Potwierdź przed usunięciem mediów z obiektu" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="ClassifiedSave"> + Zapisać zmiany w reklamie [NAME]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/> + </notification> + <notification name="ClassifiedInsufficientFunds"> + Nie posiadasz wystarczających środków aby dodać reklamę. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DeleteAvatarPick"> + Usuń zdjęcie <nolink>[PICK]</nolink>? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DeleteOutfits"> + Skasować wybrane stroje? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="PromptGoToEventsPage"> + Odwiedzić internetową stronę Imprez [SECOND_LIFE]? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SelectProposalToView"> + Wybierz propozycję, którą chcesz zobaczyć. + </notification> + <notification name="SelectHistoryItemToView"> + Wybierz obiekt z historii, który chcesz zobaczyć. + </notification> + <notification name="CacheWillClear"> + Bufor danych zostanie wyczyszczony po restarcie aplikacji [APP_NAME]. + </notification> + <notification name="CacheWillBeMoved"> + Bufor danych zostanie przeniesiony po restarcie aplikacji [APP_NAME]. +Pamiętaj: Opcja ta wyczyszcza bufor danych. + </notification> + <notification name="ChangeConnectionPort"> + Ustawienia portu zostają zaktualizowane po restarcie aplikacji [APP_NAME]. + </notification> + <notification name="ChangeSkin"> + Nowa skórka zostanie wczytana po restarcie aplikacji [APP_NAME]. + </notification> + <notification name="ChangeLanguage"> + Zmiana języka zadziała po restarcie [APP_NAME]. + </notification> + <notification name="GoToAuctionPage"> + Odwiedzić stronę internetową [SECOND_LIFE] żeby zobaczyć szczgóły aukcji lub zrobić ofertę? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SaveChanges"> + Zapisać zmiany? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie zapisuj" yestext="Zapisz"/> + </notification> + <notification name="GestureSaveFailedTooManySteps"> + Nie można zapisać gesturki. +Ta gesturka ma zbyt wiele etapów. +Usuń kilka etapów i zapisz jeszcze raz. + </notification> + <notification name="GestureSaveFailedTryAgain"> + Zapis gesturki nie powiódł się. Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="GestureSaveFailedObjectNotFound"> + Nie można zapisać gesturki ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony. +Obiekt może znajdować się zbyt daleko albo został usunięty. + </notification> + <notification name="GestureSaveFailedReason"> + Nie można zapisać gesturki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później. + </notification> + <notification name="SaveNotecardFailObjectNotFound"> + Nie można zapisać notki ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony. +Obiekt może znajdować się zbyt daleko albo został usunięty. + </notification> + <notification name="SaveNotecardFailReason"> + Nie można zapisać notki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później. + </notification> + <notification name="ScriptCannotUndo"> + Nie można cofnąć wszystkich zmian w Twojej wersji skryptu. +Czy chcesz załadować ostatnią wersję zapisaną na serwerze? +(*UWAGA* Ta operacja jest nieodwracalna.) + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SaveScriptFailReason"> + Nie można zapisać skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później. + </notification> + <notification name="SaveScriptFailObjectNotFound"> + Nie można zapisać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony. +Obiekt może znajdować się zbyt daleko albo został usunięty. + </notification> + <notification name="SaveBytecodeFailReason"> + Nie można zapisać skompilowanego skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej. + </notification> + <notification name="StartRegionEmpty"> + Oops, Twoje miejsce startu nie zostało określone. +Wpisz proszę nazwę regionu w lokalizację startu w polu Lokalizacja Startu lub wybierz Moja ostatnia lokalizacja albo Miejsce Startu. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CouldNotStartStopScript"> + Nie można uruchomić lub zatrzymać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony. +Obiekt może znajdować się zbyt daleko albo został usunięty. + </notification> + <notification name="CannotDownloadFile"> + Nie można załadować pliku + </notification> + <notification name="CannotWriteFile"> + Nie można zapisać pliku [[FILE]] + </notification> + <notification name="UnsupportedHardware"> + Niestety Twój komputer nie spełnia minimalnych wymogów sprzętowych dla poprawnego działania [APP_NAME]. Możesz odczuwać bardzo niską wydajność operacyjną. Niestety portal pomocy, [SUPPORT_SITE] nie posiada informacji na temat poprawnej konfiguracji technicznej Twojego systemu. + +Po więcej info, odwiedź stronę [_URL] . + <url name="url" option="0"> + http://www.secondlife.com/corporate/sysreqs.php + </url> + <usetemplate ignoretext="Dysk twardy mojego komputera nie jest wspomagany" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="UnknownGPU"> + Twój system jest wyposażony w kartę graficzną, która nie jest rozpoznana przez [APP_NAME]. +Zdarza się to często w przypadku nowego sprzętu, który nie był testowany z [APP_NAME]. Prawdopodobnie wystarczy dostosowanie ustawień grafiki aby działanie było poprawne. +(Ja > Właściwości > Grafika). + <form name="form"> + <ignore name="ignore" text="Karta graficzna nie została zidentyfikowana."/> + </form> + </notification> + <notification name="DisplaySettingsNoShaders"> + [APP_NAME] zawiesił się podczas inicjalizacji sterowników graficznych. +Jakość grafiki została zmniejszona - może to pomóc. +Pewne funkcje graficzne zostały wyłączone. Zalecamy aktualizcje sterowników graficznych. +Możesz podnieść jakość grafiki pod Ustawienia > Grafika. + </notification> + <notification name="RegionNoTerraforming"> + Region [REGION] nie pozwala na formowanie powierzchni ziemi. + </notification> + <notification name="CannotCopyWarning"> + Nie masz pozwolenia na kopiowanie następujących obiektów: +[ITEMS] +i stracisz je w momencie przekazania. Czy na pewno chcesz oddać te obiekty? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="CannotGiveItem"> + Podarowanie obiektu nie powiodło się. + </notification> + <notification name="TransactionCancelled"> + Transakcja anulowana + </notification> + <notification name="TooManyItems"> + Jednorazowo możesz podarować maksymalnie 42 obiekty z szafy. + </notification> + <notification name="NoItems"> + Nie masz praw do transferu wybranych obiektów. + </notification> + <notification name="CannotCopyCountItems"> + Nie masz praw do skopiowania [COUNT] wybranych obiektów. Obiekty znikną z Twojej szafy. +Na pewno chcesz oddać te obiekty? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="CannotGiveCategory"> + Nie masz praw do transferu wybranego foldera. + </notification> + <notification name="FreezeAvatar"> + Unieruchomić tego awatara? +Awatar tymczasowo nie będzie mógł się poruszać, nie będzie mógł używać czatu (IM) i nie będzie w stanie odziaływać na świat. + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Odblokuj" yestext="Unieruchom"/> + </notification> + <notification name="FreezeAvatarFullname"> + Unieruchowmić [AVATAR_NAME]? +Ta osoba tymczasowo nie będzie mógła się poruszać, nie będzie mógł używać czatu (IM) i nie będzie w stanie odziaływać na świat. + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Odblokuj" yestext="Unieruchom"/> + </notification> + <notification name="EjectAvatarFullname"> + Wyrzucić [AVATAR_NAME] z Twojej posiadłości? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wyrzuć i zabroń wstępu (ban)" yestext="Wyrzuć"/> + </notification> + <notification name="EjectAvatarFromGroup"> + Wyrzuć [AVATAR_NAME] z grupy [GROUP_NAME] + </notification> + <notification name="AcquireErrorTooManyObjects"> + BŁĄD OTRZYMYWANIA: Zbyt wiele wybranych obiektów. + </notification> + <notification name="AcquireErrorObjectSpan"> + BŁĄD OTRZYMYWANIA: Obiekty przekraczają granicę regionów. Przemieść wszystkie otrzymywane obiekty do jednego regionu. + </notification> + <notification name="PromptGoToCurrencyPage"> + [EXTRA] + +Odwiedź stronę [_URL] po więcej informacji na temat zakupu L$? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="UnableToLinkObjects"> + Nie można połączyć [COUNT] obiektów. +Maksymalnie można połączyć [MAX] obiektów. + </notification> + <notification name="CannotLinkIncompleteSet"> + Możesz łączyć tylko kompletne zbiory obiektów i musisz wybrać więcej niż jeden obiekt. + </notification> + <notification name="CannotLinkModify"> + Nie możesz połączyć obiektów ponieważ nie masz praw modyfikacji dla wszystkich obiektów. + +Upewnij się, że żaden z obiktów nie jest zablokowany i że wszystkie obiekty należą do Ciebie. + </notification> + <notification name="CannotLinkDifferentOwners"> + Nie możesz połączyć obiektów ponieważ należą one do różnych osób. + +Upewnij sie, że wszystkie wybrane obiekty należą do Ciebie. + </notification> + <notification name="NoFileExtension"> + Niepoprawna końcówka nazwy pliku: '[FILE]' + +Upewnij się, że nazwa pliku ma poprawaną końcówkę. + </notification> + <notification name="InvalidFileExtension"> + Niepoprawna końcówka nazwy pliku - [EXTENSION] +Oczekiwana - [VALIDS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotUploadSoundFile"> + Nie można otworzyć załadowanego pliku dźwiękowego: +[FILE] + </notification> + <notification name="SoundFileNotRIFF"> + Plik nie jest w formacie RIFF WAVE: +[FILE] + </notification> + <notification name="SoundFileNotPCM"> + Plik nie jest w formacie PCM WAVE: +[FILE] + </notification> + <notification name="SoundFileInvalidChannelCount"> + Plik zawiera niewłaściwą liczbę kanałów (musi być mono albo stereo): +[FILE] + </notification> + <notification name="SoundFileInvalidSampleRate"> + Plik zawiera niewłaścią częstotliwość (musi być 44.1k): +[FILE] + </notification> + <notification name="SoundFileInvalidWordSize"> + Plik zawiera niewłaściwą szerokość danych (musi być 8 albo 16 bitów): +[FILE] + </notification> + <notification name="SoundFileInvalidHeader"> + Brak bloku 'data' w nagłówku pliku WAV: +[FILE] + </notification> + <notification name="SoundFileInvalidChunkSize"> + Niewłaściwy rozmiar "chunk" w pliku WAV: +[FILE] + </notification> + <notification name="SoundFileInvalidTooLong"> + Plik audio jest zbyt długi (10 sekund maksimum): +[FILE] + </notification> + <notification name="CannotOpenTemporarySoundFile"> + Nie można otworzyć tymczasowego skompresowango pliku dźwiękowego w celu zapisu: [FILE] + </notification> + <notification name="UnknownVorbisEncodeFailure"> + Nieznany błąd kodowania Vorbis w: [FILE] + </notification> + <notification name="CannotEncodeFile"> + Kodowanie pliku: [FILE] nie powidło się. + </notification> + <notification name="CorruptedProtectedDataStore"> + Nie można wpisać Twojego imienia użytkownika ani hasła. To może się zdarzyć kiedy zmieniasz ustawienia sieci. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CorruptResourceFile"> + Skorumpowany plik zasobów: [FILE] + </notification> + <notification name="UnknownResourceFileVersion"> + Nieznana wersja pliku zasobów Linden w pliku: [FILE] + </notification> + <notification name="UnableToCreateOutputFile"> + Nie można utworzyć pliku wyjściowego: [FILE] + </notification> + <notification name="DoNotSupportBulkAnimationUpload"> + [APP_NAME] obecnie nie wspomaga ładowania grupowego plików animacji. + </notification> + <notification name="CannotUploadReason"> + Ładowanie pliku [FILE] nie powiodło się z powodu: [REASON] +Spróbuj jeszcze raz póżniej. + </notification> + <notification name="LandmarkCreated"> + Dodano "[LANDMARK_NAME]" do folderu [FOLDER_NAME]. + </notification> + <notification name="LandmarkAlreadyExists"> + Posiadasz już landmark dla tej lokalizacji. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotCreateLandmarkNotOwner"> + Nie możesz zapamiętać tego miejsca (LM) ponieważ właściciel posiadłości nie pozwala na to. + </notification> + <notification name="CannotRecompileSelectObjectsNoScripts"> + 'Rekompilacja' nie powiodła się. + +Wybierz obiekty zawierające skrypty. + </notification> + <notification name="CannotRecompileSelectObjectsNoPermission"> + 'Rekompilacja' nie powiodła się. + +Wybierz skryptowane obiekty do których masz prawa modyfikacji. + </notification> + <notification name="CannotResetSelectObjectsNoScripts"> + 'Resetowanie' nie powiodło się. + +Wybierz obiekty zawierające skrypty. + </notification> + <notification name="CannotResetSelectObjectsNoPermission"> + 'Resetowanie' nie powiodło się. + +Wybierz skryptowane obiekty do których masz prawa modyfikacji. + </notification> + <notification name="CannotOpenScriptObjectNoMod"> + Nie można otworzyć skryptu bez prawa do modyfikacji obiektu. + </notification> + <notification name="CannotSetRunningSelectObjectsNoScripts"> + 'Uruchomienie' skryptów nie powiodło się. + +Wybierz obiekty zawierające skrypty. + </notification> + <notification name="CannotSetRunningNotSelectObjectsNoScripts"> + 'Zatrzymanie' skryptów nie powiodło się. + +Wybierz obiekty zawierające skrypty. + </notification> + <notification name="NoFrontmostFloater"> + Brak górnego okna do zapisu. + </notification> + <notification name="SeachFilteredOnShortWords"> + Twoje zapytanie wyszukiwania zostło zmienione - zbyt krótkie słowa zostały usunięte. + +Nowe zapytanie: [FINALQUERY] + </notification> + <notification name="SeachFilteredOnShortWordsEmpty"> + Użyte terminy wyszukiwania były zbyt krótkie - wyszukiwanie zostało anulowane. + </notification> + <notification name="CouldNotTeleportReason"> + Teleportacja nie powiodła się. +[REASON] + </notification> + <notification name="invalid_tport"> + Niestety, pojawił się błąd podczas próby teleportacji. Proponujemy wylogowanie się i spróbowanie teleportacji ponownie. +Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Niestety, pojawił się błąd podczas próby przedostania się na drugi region. Proponujemy wylogowanie się i spróbowanie przedostania się na drugi region ponownie. +Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Przepraszamy, teleportacja jest chwilowo niedostępna. Spróbuj jeszcze raz. +Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj. + </notification> + <notification name="nolandmark_tport"> + Przepraszamy, ale nie możemy znaleźć miejsca docelowego. + </notification> + <notification name="timeout_tport"> + Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz. + </notification> + <notification name="noaccess_tport"> + Przepraszamy, ale nie masz dostępu do miejsca docelowego. + </notification> + <notification name="missing_attach_tport"> + Czekamy na Twoje akcesoria. Możesz poczekać kilka minut lub zrobić relog przed następną próbą teleportacji. + </notification> + <notification name="too_many_uploads_tport"> + Obecnie ten region ma problemy z ładowaniem obiektów w związku z czym teleportacja bardzo sie opóźnia. +Spróbuj jeszcze raz za kilka minut albo teleportuj się do mniej zatłoczonego miejsca. + </notification> + <notification name="expired_tport"> + Przepraszamy, ale nie udało się przeprowadzić teleportacji wystarczająco szybko. Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="expired_region_handoff"> + Przepraszamy, ale nie udało się przeprowadzić zmiany regionu wystarczająco szybko. Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="no_host"> + Nie możemy znaleść miejsca docelowego. To miejsce może być chwilowo nieosiągalne albo przestało istnieć. +Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="no_inventory_host"> + Szafa chwilowo nie działa. + </notification> + <notification name="CannotSetLandOwnerNothingSelected"> + Nie można wybrać właściciela posiadłości. +Posiadłość nie została wybrana. + </notification> + <notification name="CannotSetLandOwnerMultipleRegions"> + Nie można wybrać właściciela posiadłości ponieważ wybrany obszar przekracza granicę regionów. Wybierz mniejszy obszar i spróbuj jeszcze raz. + </notification> + <notification name="ForceOwnerAuctionWarning"> + Ta posiadłość jest wystawiona na aukcję. Wymuszenie własności anuluje aukcję i potencjalnie może zdenerwować zainteresowanych Rezydentów, jeżeli licytacja już się rozpoczęła. +Wymusić własność? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CannotContentifyNothingSelected"> + Nie można sfinalizować: +Posiadłość nie została wybrana. + </notification> + <notification name="CannotContentifyNoRegion"> + Nie można sfinalizować: +Region nie znaleziony. + </notification> + <notification name="CannotReleaseLandNothingSelected"> + Nie można porzucić posiadłości: +Posiadłość nie została wybrana. + </notification> + <notification name="CannotReleaseLandNoRegion"> + Nie można porzucić posiadłości: +Region nie znaleziony. + </notification> + <notification name="CannotBuyLandNothingSelected"> + Nie można kupić posiadłości: +Posiadłość nie została wybrana. + </notification> + <notification name="CannotBuyLandNoRegion"> + Nie można kupić posiadłości: +Region nie znaleziony. + </notification> + <notification name="CannotCloseFloaterBuyLand"> + Okno zakupu landu nie może zostać zamknięte dopóki aplikacja [APP_NAME] nie określi ceny dla tej transkacji. + </notification> + <notification name="CannotDeedLandNothingSelected"> + Nie można przekazać posiadłości: +Posiadłość nie została wybrana. + </notification> + <notification name="CannotDeedLandNoGroup"> + Nie można przekazać posiadłości: +Grupa nie została wybrana. + </notification> + <notification name="CannotDeedLandNoRegion"> + Brak możliwości przepisania posiadłości grupie: +Region, gdzie posiadłość się znajduje nie został odnaleziony. + </notification> + <notification name="CannotDeedLandMultipleSelected"> + Nie można przekazać posiadłości: +Wiele posiadłości jest wybranych. + +Spróbuj wybrać pojedynczą posiadłość. + </notification> + <notification name="CannotDeedLandWaitingForServer"> + Nie można przekazać posiadłości: +Serwer aktualizuje dane własności. + +Spróbuj jeszcze raz póżniej. + </notification> + <notification name="CannotDeedLandNoTransfer"> + Nie możesz przekazać posiadłości: +Region [REGION] nie pozwala na transfer posiadłości. + </notification> + <notification name="CannotReleaseLandWatingForServer"> + Nie można porzucić posiadłości: +Serwer aktualizuje dane posiadłości. + +Spróbuj jeszcze raz póżniej. + </notification> + <notification name="CannotReleaseLandSelected"> + Nie możesz porzucić posiadłości: +Nie jesteś właścicielem wszystkich wybranych posiadłości. + +Wybierz pojedynczą posiadłość. + </notification> + <notification name="CannotReleaseLandDontOwn"> + Nie możesz porzucić posiadłości: +Nie masz praw do porzucenia tej posiadłości. + +Twoje posiadłości są podkreślone na zielono. + </notification> + <notification name="CannotReleaseLandRegionNotFound"> + Brak możliwości porzucenia posiadłości: +Region, gdzie posiadłość się znajduje nie został odnaleziony. + </notification> + <notification name="CannotReleaseLandNoTransfer"> + Nie możesz porzucić posiadłości: +Region [REGION] nie pozwala na transfer posiadłości. + </notification> + <notification name="CannotReleaseLandPartialSelection"> + Nie można porzucić posiadłości: +Musisz wybrać całą posiadłość by ją porzucić. +Wybierz całą posiadłość albo najpierw ją podziel. + </notification> + <notification name="ReleaseLandWarning"> + Porzucasz posiadłość o powierzchni [AREA] m². +Porzucenie tej posiadłości usunie ją z Twoich własności. +Nie otrzymasz za to żadnej opłaty. + +Porzucić posiadłość? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNothingSelected"> + Nie można podzielić posiadłości: + +Posiadłość nie została wybrana. + </notification> + <notification name="CannotDivideLandPartialSelection"> + Nie można podzielić posiadłości: + +Posiadłość została wybrana w całości. +Spróbuj wybrać część posiadłości. + </notification> + <notification name="LandDivideWarning"> + Podział tej posiadłości stworzy dwie posiadłości z których każda będzie mogła mieć indywidualne ustawienia. +Niektóre ustawienia zostaną zmienione na domyślne po tej operacji. + +Podzielić posiadłość? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNoRegion"> + Brak możliwości podziału posiadłości: +Region, gdzie posiadłość się znajduje nie został odnaleziony. + </notification> + <notification name="CannotJoinLandNoRegion"> + Brak możliwości złączenia posiadłości: +Region, gdzie posiadłość się znajduje nie został odnaleziony. + </notification> + <notification name="CannotJoinLandNothingSelected"> + Nie można połączyć posiadłości: +Posiadłości nie zostały wybrane. + </notification> + <notification name="CannotJoinLandEntireParcelSelected"> + Nie można połączyć posiadłości: +Tylko jedna posiadłość została wybrana. + +Wybierz obaszar usytuowany na obu posiadłościach. + </notification> + <notification name="CannotJoinLandSelection"> + Nie można połączyć posiadłości: +Musisz wybrać więcej niż jedną posiadłość. + +Wybierz obaszar usytuowany na obu posiadłościach. + </notification> + <notification name="JoinLandWarning"> + Połączenie tego obszaru utworzy jedną większą posiadłość ze wszystkich posiadłości przecinających wybrany prostokąt. Nazwa i opcje posiadłości bedą musiały zostać skonfigurowane. + +Połączyć posiadłości? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmNotecardSave"> + Ta notka musi być zapisana żeby mogła być skopiowana lub zobaczona. Zapisać notkę? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmItemCopy"> + Skopiować ten obiekt do Twojej szafy? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Skopiuj"/> + </notification> + <notification name="ResolutionSwitchFail"> + Zmiana rozdzielczości do [RESX] x [RESY] nie powidła się + </notification> + <notification name="ErrorUndefinedGrasses"> + Błąd: niezdefiniowane trawy: [SPECIES] + </notification> + <notification name="ErrorUndefinedTrees"> + Bład: niezdefiniowane drzewa: [SPECIES] + </notification> + <notification name="CannotSaveWearableOutOfSpace"> + Nie można zapisać '[NAME]' do pliku stroju. Musisz zwolnić trochę miejsca na Twoim komputerze i zapisać strój jeszcze raz. + </notification> + <notification name="CannotSaveToAssetStore"> + Nie można zapisać [NAME] w centralnym zbiorze danych. +Zazwyczaj jest to tymczasowy problem. Możesz kontynuować modyfikacje i zapisać strój ponownie za kilka minut. + </notification> + <notification name="YouHaveBeenLoggedOut"> + Nastąpiło wylogowanie z [SECOND_LIFE] + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Kontynuuj"/> + </notification> + <notification name="OnlyOfficerCanBuyLand"> + Nie możesz kupić posiadłości dla grupy. +Nie masz praw kupowania posiadłości dla Twojej aktywnej grupy. + </notification> + <notification label="Add Friend" name="AddFriendWithMessage"> + Znajomi mogą pozwalać na odnajdywanie się wzajemnie na mapie i na otrzymywanie notyfikacji o logowaniu do [SECOND_LIFE]. + +Zaproponować znajomość [NAME]? + <form name="form"> + <input name="message"> + Chcesz zawrzeć znajomość? + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zapisz strój" name="SaveOutfitAs"> + Zapisz to co noszę jako nowy strój: + <form name="form"> + <input name="message"> + [DESC] (nowe) + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zapisz część stroju" name="SaveWearableAs"> + Zapisz obiekt w mojej Szafie jako: + <form name="form"> + <input name="message"> + [DESC] (nowy) + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zmień nazwę stroju" name="RenameOutfit"> + Nowa nazwa stroju: + <form name="form"> + <input name="new_name"> + [NAME] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="RemoveFromFriends"> + Czy chcesz usunąć [NAME] z listy znajomych? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="RemoveMultipleFromFriends"> + Chcesz usunąć grupę osób z listy Twoich znajomych? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedPublicObjectsByUser"> + Na pewno chcesz usunąć wszystkie skryptowane obiekty należące do +** [AVATAR_NAME] ** +z posiadłości innych w tym symulatorze? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedObjectsByUser"> + Na pewno chcesz usunąć wszystkie skryptowane obiekty należące do +** [AVATAR_NAME] ** +ze wszystkich posiadłości w tym symulatorze? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="GodDeleteAllObjectsByUser"> + Na pewno chcesz usunąć wszystkie obiekty (skryptowane i nie) należące do +** [AVATAR_NAME] ** +ze wszystkich posiadłości w tym symulatorze? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BlankClassifiedName"> + Musisz nadać tytuł Twojej reklamie. + </notification> + <notification name="MinClassifiedPrice"> + Minimalna cena za publikację wynosi [MIN_PRICE]L$. + +Wybierz wyższą cenę. + </notification> + <notification name="ConfirmItemDeleteHasLinks"> + Co najmiej jeden z elementów, które masz posiada połączone z nim obiekty. Jeśli go usuniesz połączenia zostaną usunięte na stałe. Zaleca się usunięcie połączeń w pierwszej kolejności. + +Jesteś pewnien/pewna, że chcesz usunąć te elementy? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLock"> + Przynajmnie jeden z wybranych obiektów jest zablokowany. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopy"> + Przynajmniej jeden z wybranych obiektów jest niekopiowalny. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoOwn"> + Przynajmniej jeden z wybranych obiektów nie należy do Ciebie. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopy"> + Przynajmnie jeden z wybranych obiektów jest zablokowany. +Przynajmniej jeden z wybranych obiektów jest niekopiwalny. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoOwn"> + Przynajmnie jeden z wybranych obiektów jest zablokowany. +Przynajmniej jeden z wybranych obiektów nie należy do Ciebie. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopyNoOwn"> + Przynajmniej jeden z wybranych obiektów jest niekopiowalny. +Przynajmniej jeden z wybranych obiektów nie należy do Ciebie. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> + Przynajmnie jeden z wybranych obiektów jest zablokowany. +Przynajmniej jeden z wybranych obiektów jest niekopiwalny. +Przynajmniej jeden z wybranych obiektów nie należy do Ciebie. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLock"> + Przynajmnie jeden obiekt jest zablokowany. + +Na pewno chcesz usunąć te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeNoOwn"> + Przynajmniej jeden obiekt nie należy do Ciebie. +Jeżeli będziesz kontynuować prawa następnego właściciela zostaną przypisane co, potencjalnie, może ograniczyć Twoje prawa do modyfikacji lub kopiowania obiektów. + +Na pewno chcesz wziąść te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLockNoOwn"> + Przynajmnie jeden obiekt jest zablokowany. +Przynajmniej jeden obiekt nie należy do Ciebie. +Jeżeli będziesz kontynuować prawa następnego właściciela zostaną przypisane co, potencjalnie, może ograniczyć Twoje prawa do modyfikacji lub kopiowania obiektów. + +Na pewno chcesz wziąść te obiekty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CantBuyLandAcrossMultipleRegions"> + Nie możesz kupić posiadłości ponieważ wybrany obszar przekracza granicę regionów. + +Wybierz mniejszy obszar i spróbuj jeszcze raz. + </notification> + <notification name="DeedLandToGroup"> + Po przekazaniu tej posiadłości grupa będzia musiała mieć i utrzymywać wystarczający kredyt na używanie posiadłości. Cena zakupu posiadłości nie jest zwracana właścicielowi. Jeżeli przekazana posiadłość zostanie sprzedana, cana sprzedaży zostanie podzielona pomiędzy członków grupy. + +Przekazać tą posiadłość o powierzchni [AREA] m² grupie '[GROUP_NAME]'? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DeedLandToGroupWithContribution"> + Po przekazaniu tej posiadłości grupa będzia musiała mieć i utrzymywać wystarczający kredyt na używanie posiadłości. +Przekazanie będzie zawierać równoczesne przypisanie posiadłości do grupy od '[NAME]'. +Cena zakupu posiadłości nie jest zwracana właścicielowi. Jeżeli przekazana posiadłość zostanie sprzedana, cana sprzedaży zostanie podzielona pomiędzy członków grupy. + +Przekazać tą posiadłość o powierzchni [AREA] m² grupie '[GROUP_NAME]'? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="DisplaySetToSafe"> + Ustawienia grafiki zostały zmienione do bezpiecznego poziomu ponieważ opcja -safe została wybrana. + </notification> + <notification name="DisplaySetToRecommended"> + Ustawienia grafiki zostały zmienione do zalecanego poziomu na podstawie konfiguracji Twojego systemu. + </notification> + <notification name="ErrorMessage"> + [ERROR_MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AvatarMovedDesired"> + Miejsce, do którego chcesz się teleportować jest chwilowo nieobecne. +Zostałeś przeniesiony do regionu sąsiedniego. + </notification> + <notification name="AvatarMovedLast"> + Twoje miejsce startu jest obecnie niedostępne. +Zostałeś przeniesiony do sąsiedniego regionu. + </notification> + <notification name="AvatarMovedHome"> + Twoje miejsce startu jest obecnie niedostępne. +Zostałeś przeniesiony do pobliskiego regionu. +Możesz ustawić nowe miejsce startu. + </notification> + <notification name="ClothingLoading"> + Twoje ubranie wciąż się ładuje. +Możesz normalnie używać [SECOND_LIFE], inni użytkownicy będą Cię widzieli poprawnie. + <form name="form"> + <ignore name="ignore" text="Ładowanie ubrań nadal trwa"/> + </form> + </notification> + <notification name="FirstRun"> + Instalacja [APP_NAME] zakończona. + +Jeżeli używasz [SECOND_LIFE] po raz pierwszy to musisz stworzyć konto żeby móc się zalogować. +Czy chcesz przejść na stronę [http://join.secondlife.com secondlife.com] żeby stworzyć nowe konto? + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Nowe konto..."/> + </notification> + <notification name="LoginPacketNeverReceived"> + Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID]. + +Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut lub połączyć się ze stroną pomocy technicznej tutaj [SUPPORT_SITE] lub wybrać Teleportuj by teleportować się do swojego miejsca startu. + <form name="form"> + <button name="OK" text="OK"/> + <button name="Help" text="Pomoc"/> + <button name="Teleport" text="Teleportuj"/> + </form> + </notification> + <notification name="WelcomeChooseSex"> + Twoja postać pojawi się za moment. + +Używaj strzałek żeby sie poruszać. +Naciśnij F1 w dowolnej chwili po pomoc albo żeby dowiedzieć się więcej o [SECOND_LIFE]. +Wybierz awatara właściwej płci. +Ten wybór będzie można później zmienić. + <usetemplate name="okcancelbuttons" notext="Kobieta" yestext="Mężczyzna"/> + </notification> + <notification name="CantTeleportToGrid"> + Nie można teleportować do [SLURL], ponieważ jest na innym gridzie ([GRID]) niż obecny grid ([CURRENT_GRID]). Proszę zamknąć przeglądarkę i spróbować ponownie. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GeneralCertificateError"> + Połączenie z serwerem nie mogło zostać nawiązane. +[REASON] + +SubjectName: [SUBJECT_NAME_STRING] +IssuerName: [ISSUER_NAME_STRING] +Valid From: [VALID_FROM] +Valid To: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TrustCertificateError"> + Wydawca certyfikatu dla tego serwera nie jest znany. + +Informacje o certyfikacie: +SubjectName: [SUBJECT_NAME_STRING] +IssuerName: [ISSUER_NAME_STRING] +Valid From: [VALID_FROM] +Valid To: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + +Czy chcesz zaufać temu wydawcy? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Zaufaj"/> + </notification> + <notification name="NotEnoughCurrency"> + [NAME] [PRICE]L$ Masz za mało L$. + </notification> + <notification name="GrantedModifyRights"> + Masz teraz prawa modyfikacji obiektów należących do [NAME]. + </notification> + <notification name="RevokedModifyRights"> + Prawa modyfikacji obiektów należących do [NAME] zostały Ci odebrane. + </notification> + <notification name="FlushMapVisibilityCaches"> + To spowoduje wyczyszczenie buforów map regionu. +Jest to użyteczne wyłącznie podczas szukania błędów. +(Podczas produkcji poczekaj 5 minut i mapy wszystkich zostaną uaktualnione po relogu.) + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyOneObjectOnly"> + Nie możesz zakupić więcej niż jednego obiektu w tym samym czasie. Proszę wybrać tylko jeden obiekt i spróbować ponowanie. + </notification> + <notification name="OnlyCopyContentsOfSingleItem"> + Nie można kopiować zawartości więcej niż jednego obiektu naraz. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="KickUsersFromRegion"> + Teleportować wszystkich Rezydentów z tego regionu to ich miejsca startu? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="EstateObjectReturn"> + Na pewno chcesz odesłać wszystkie obiekty należące do +[USER_NAME] ? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="InvalidTerrainBitDepth"> + Nie można ustawić tekstur regionu: +Tekstura terenu [TEXTURE_NUM] ma niewłaściwą głębię koloru - [TEXTURE_BIT_DEPTH]. +Zamień teksturę [TEXTURE_NUM] na 24-o bitową teksturę o wymiarze 512x512 lub mniejszą i ponownie kliknij Zastosuj. + </notification> + <notification name="InvalidTerrainSize"> + Nie można ustawić tekstur regionu: +Tekstura terenu [TEXTURE_NUM] jest za duża - [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. +Zamień teksturę [TEXTURE_NUM] na 24-o bitową teksturę o wymiarze 512x512 lub mniejszą i ponownie kliknij Zastosuj. + </notification> + <notification name="RawUploadStarted"> + Ładowanie rozpoczęte. Może potrwać do dwóch minut zależnie od prędkości Twojego połączenia. + </notification> + <notification name="ConfirmBakeTerrain"> + Na pewno chcesz zapisać obecne ukształtowanie terenu jako punkt odniesienia dla górnego i dolnego limitu terenu i jako domyślą wartość dla opcji Odtwórz? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="MaxAllowedAgentOnRegion"> + Maksymalna liczba gości wynosi [MAX_AGENTS]. + </notification> + <notification name="MaxBannedAgentsOnRegion"> + Maksymalna liczba niepożądanych Rezydentów (banów) wynosi [MAX_BANNED]. + </notification> + <notification name="MaxAgentOnRegionBatch"> + Próba dodania [NUM_ADDED] osób nie powiodła się: +[MAX_AGENTS] [LIST_TYPE] limit przekroczony o [NUM_EXCESS]. + </notification> + <notification name="MaxAllowedGroupsOnRegion"> + Możesz mieć maksymalnie [MAX_GROUPS] dozwolonych grup. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Ustal"/> + </notification> + <notification name="MaxManagersOnRegion"> + Możesz mieć maksymalnie [MAX_MANAGER] zarządców Majątku. + </notification> + <notification name="OwnerCanNotBeDenied"> + Nie możesz dodać właściciela majątku do listy 'Niepożądanych Rezydentów (banów)' majątku. + </notification> + <notification name="CanNotChangeAppearanceUntilLoaded"> + Nie możesz zmienić wyglądu podczas ładowania ubrań i kształtów. + </notification> + <notification name="ClassifiedMustBeAlphanumeric"> + Tytuł Twojej reklamy musi zaczynać się od litery (A-Z) albo cyfry. Znaki przestankowe są niedozwolone. + </notification> + <notification name="CantSetBuyObject"> + Nie możesz wybrać Kup obiekt ponieważ obiekt nie jest na sprzedaż. +Wybierz obiekt na sprzedaż i spróbuj jeszcze raz. + </notification> + <notification name="FinishedRawDownload"> + Plik surowego terenu załadowany pod: +[DOWNLOAD_PATH]. + </notification> + <notification name="DownloadWindowsMandatory"> + Nowa wersja [APP_NAME] została opublikowana. +[MESSAGE] +Musisz zainstalować nową wersję żeby używać [APP_NAME]. + <usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="Załaduj"/> + </notification> + <notification name="DownloadWindows"> + Uaktualniona wersja [APP_NAME] została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/> + </notification> + <notification name="DownloadWindowsReleaseForDownload"> + Uaktualniona wersja [APP_NAME] została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/> + </notification> + <notification name="DownloadLinuxMandatory"> + Nowa wersja [APP_NAME] jest dostępna. +[MESSAGE] +Musisz pobrać aktualizację aby korzystać z [APP_NAME]. + <usetemplate name="okcancelbuttons" notext="Wyjdź" yestext="Pobieranie"/> + </notification> + <notification name="DownloadLinux"> + Aktualizacja [APP_NAME] jest dostępna. +[MESSAGE] +Ta aktualizacja nie jest wymagana ale zaleca się jej instalację w celu poprawienia szybkości i stabilności. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + Uaktualniona wersja [APP_NAME]została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/> + </notification> + <notification name="DownloadMacMandatory"> + Nowa wersja [APP_NAME] została opublikowana. +[MESSAGE] +Musisz zainstalować nową wersję żeby używać [APP_NAME]. + +Pobrać i zapisać w folderze Aplikacji? + <usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="Załaduj"/> + </notification> + <notification name="DownloadMac"> + Uaktualniona wersja [APP_NAME] została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + +Pobrać i zapisać w folderze Aplikacji? + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/> + </notification> + <notification name="DownloadMacReleaseForDownload"> + Uaktualniona wersja [APP_NAME] została opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności. + +Pobrać i zapisać w folderze Aplikacji? + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/> + </notification> + <notification name="FailedUpdateInstall"> + Podczas aktualizacji pojawił się błąd. Proszę pobrać i zainstalować najnowszego klienta z http://secondlife.com/download. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FailedRequiredUpdateInstall"> + Nie można zainstalować wymaganej aktualizacji. Nie będzie można zalogować się dopóki [APP_NAME] nie zostanie zaktualizowana. + Proszę pobrać i zainstalować najnowszą wersję z http://secondlife.com/download. + <usetemplate name="okbutton" yestext="Rezygnuj"/> + </notification> + <notification name="UpdaterServiceNotRunning"> + Istnieje obowiązkowa aktualizacja dla Second Life. Możesz ją pobrać z http://www.secondlife.com/downloads lub zainstalować teraz. + <usetemplate name="okcancelbuttons" notext="Opuść Second Life" yestext="Pobierz i zainstaluj teraz"/> + </notification> + <notification name="DownloadBackgroundTip"> + Aktualizacja dla [APP_NAME] została pobrana. +Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o tej aktualizacji] + <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/> + </notification> + <notification name="DownloadBackgroundDialog"> + Aktualizacja [APP_NAME] została pobrana. +Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o aktualizacji] + <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/> + </notification> + <notification name="RequiredUpdateDownloadedVerboseDialog"> + Pobrano wymaganą aktualizację. +Wersja [VERSION] + +W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME]. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RequiredUpdateDownloadedDialog"> + W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME]. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DeedObjectToGroup"> + Przekazanie tego obiektu spowoduje, że grupa: +* Otrzyma L$ zapłacone temu obiektowi + <usetemplate ignoretext="Proszę potwierdzić decyzję przed przepisaniem obiektu do grupy" name="okcancelignore" notext="Anuluj" yestext="Przekaż"/> + </notification> + <notification name="WebLaunchExternalTarget"> + Czy chcesz otworzyć swoją przeglądarkę internetową by zobaczyć zawartość? + <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć stronę internetową" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchJoinNow"> + By dokonać zmian i aktualizacji swojego konta, odwiedź [http://secondlife.com/account/ Dashboard]. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by dokonać zmian w konfiguracji mojego konta" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchSecurityIssues"> + Odwiedź [SECOND_LIFE] Wiki i zobacz jak zgłaszać problemy z bezpieczeństwem danych. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by dowiedzieć się więcej na temat zgłaszania problemów bezpieczeństwa" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchQAWiki"> + Odwiedź [SECOND_LIFE] Wiki pytań i odpowiedzi. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć QA Wiki" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchPublicIssue"> + Odwiedź [SECOND_LIFE] katalog publicznych problemów, gdzie możesz zgłaszać błędy i inne problemy. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by wysłać Błędy klienta" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchSupportWiki"> + Otwórz oficjalny blog Lindenów żeby zobaczyć nowe wiadomości i informacje. + <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć blog" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLGuide"> + Czy chcesz otworzyć samouczek Języka skryptowania? + <usetemplate ignoretext="Uruchom przeglądarkę internetową by samouczek Języka skryptowania" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLWiki"> + Czy napewno chcesz odwiedzić portal LSL Portal? + <usetemplate ignoretext="Uruchom przeglądarkę internetową by LSL Portal" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ReturnToOwner"> + Czy na pewno chcesz zwrócić wybrane obiekty do ich właścicieli? Wszystkie udostępnione obiekty z prawem transferu zostaną zwrócone poprzednim właścicielom. + +*UWAGA* Wszystkie udostępnione obiekty bez prawa transferu zostaną usunięte! + <usetemplate ignoretext="Potwierdź zanim zwrócisz obiekty do ich właścicieli" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="GroupLeaveConfirmMember"> + Jesteś członkiem grupy [GROUP]. +Chcesz opuścić grupę? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmKick"> + Napewno chcesz wyrzucić wszystkich Rezydentów z gridu? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć wszystkich Rezydentów"/> + </notification> + <notification name="MuteLinden"> + Przepraszamy, ale nie możesz zablokować Lindena. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotStartAuctionAlreadyForSale"> + Aukcja nie może zostać rozpoczęta w posiadłości, która została już wcześniej wystawiona na aukcję. Deaktywuj opcję sprzedaży posiadłości jeżeli chcesz rozpocząć aukcję. + </notification> + <notification label="Zablokuj obiekty według wpisanej nazwy" name="MuteByNameFailed"> + Rezydent/obiekt jest już zablokowany. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RemoveItemWarn"> + Pomimo, że jest to dozwolone, usunięcie zawartości może zniszczyć obiekt. Chcesz usunąć? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="CantOfferCallingCard"> + Nie możesz dać wizytówki w tym momencie. Spróbuj jeszcze raz za chwilę. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CantOfferFriendship"> + Nie możesz zaoferować znajomości w tym momencie. Spróbuj jeszcze raz za chwilę. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="BusyModeSet"> + Tryb Pracy jest włączony. +Czat i IM będą ukryte. Wysłane IM będą otrzymywały Twoją odpowiedź Trybu Pracy. Propozycje teleportacji będą odrzucone. +Dodatkowo, wszystkie podarowane dla Ciebie obiekty będą automatycznie zapisywane w folderze "Kosz" w Twojej szafie. + <usetemplate ignoretext="Status zmieniony na Tryb pracy" name="okignore" yestext="OK"/> + </notification> + <notification name="JoinedTooManyGroupsMember"> + Należysz już do maksymalnej ilości grup. Opuść proszę przynajmniej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów. +[NAME] oferuje Ci członkostwo w grupie. + <usetemplate name="okcancelbuttons" notext="Odmów" yestext="Przyjmij"/> + </notification> + <notification name="JoinedTooManyGroups"> + Należysz już do maksymalnej ilości grup. Opuść proszę przynajmiej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="KickUser"> + Wyrzuć tego Rezydenta, wysyłając następujący komunikat. + <form name="form"> + <input name="message"> + Administrator wylogował Cię. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="KickAllUsers"> + Z jakim komunikatem wyrzucić wszystkich użytkowników z regionu? + <form name="form"> + <input name="message"> + Administrator wylogował Cię. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="FreezeUser"> + Unieruchom tego Rezydenta, wysyłając następujący komunikat. + <form name="form"> + <input name="message"> + Unieruchomiono Cię. Nie możesz się ruszać ani rozmawiać. Administrator skontaktuje się z Tobą poprzez IM. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="UnFreezeUser"> + Cofnij unieruchomienie tego Rezydenta, wysyłając następujący komunikat. + <form name="form"> + <input name="message"> + Odblokowano Cię. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="SetDisplayNameSuccess"> + Witaj [DISPLAY_NAME]! + +Podobnie jak w realnym życiu potrzeba trochę czasu zanim wszyscy dowiedzą się o nowej nazwie. Kolejne kilka dni zajmie [http://wiki.secondlife.com/wiki/Setting_your_display_name aktualizacja nazwy] w obiektach, skryptach, wyszukiwarce, etc. + </notification> + <notification name="SetDisplayNameBlocked"> + Przepraszamy, nie można zmienić Twojej wyświetlanej nazwy. Jeśli uważasz ze jest to spowodowane błędem skontaktuj się z obsługą klienta. + </notification> + <notification name="SetDisplayNameFailedLength"> + Przepraszamy, ta nazwa jest zbyt długa. Wyświetlana nazwa może mieć maksymalnie [LENGTH] znaków. + +Proszę wprowadzić krótszą nazwę. + </notification> + <notification name="SetDisplayNameFailedGeneric"> + Przepraszamy, nie można ustawić Twojej wyświetlanej nazwy. Spróbuj ponownie później. + </notification> + <notification name="SetDisplayNameMismatch"> + Podana wyświetlana nazwa nie pasuje. Proszę wprowadzić ją ponownie. + </notification> + <notification name="AgentDisplayNameUpdateThresholdExceeded"> + Przepraszamy, musisz jeszcze poczekać zanim będzie można zmienić Twoją wyświetlaną nazwę. + +Zobacz http://wiki.secondlife.com/wiki/Setting_your_display_name + +Proszę spróbować ponownie później. + </notification> + <notification name="AgentDisplayNameSetBlocked"> + Przepraszamy, nie można ustawić wskazanej nazwy, ponieważ zawiera zabronione słowa. + + Proszę spróbować wprowadzić inną nazwę. + </notification> + <notification name="AgentDisplayNameSetInvalidUnicode"> + Wyświetlana nazwa, którą chcesz ustawić zawiera niepoprawne znaki. + </notification> + <notification name="AgentDisplayNameSetOnlyPunctuation"> + Twoje wyświetlane imię musi zawierać litery inne niż znaki interpunkcyjne. + </notification> + <notification name="DisplayNameUpdate"> + [OLD_NAME] ([SLID]) jest od tej pory znana/znany jako [NEW_NAME]. + </notification> + <notification name="OfferTeleport"> + Zaproponować teleportację do miejsca Twojego pobytu z tą wiadomością? + <form name="form"> + <input name="message"> + Zapraszam do siebie. Region: [REGION] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="OfferTeleportFromGod"> + Wysłać propozycję teleportacji do Twojego miejsca? + <form name="form"> + <input name="message"> + Zapraszam do siebie. Region: [REGION] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="TeleportFromLandmark"> + Na pewno chcesz się teleportować do <nolink>[LOCATION]</nolink>? + <usetemplate ignoretext="Potwierdź próbę teleportacji do zapisanego miejsca" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification name="TeleportToPick"> + Teleportuj do [PICK]? + <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do miejsca w Ulubionych" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification name="TeleportToClassified"> + Teleportuj do [CLASSIFIED]? + <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do lokalizacji z reklamy" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification name="TeleportToHistoryEntry"> + Teleportuj do [HISTORY_ENTRY]? + <usetemplate ignoretext="Potwierdź teleportację do lokalizacji z historii" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification label="Wiadomość do Wszystkich w Twoim Majątku" name="MessageEstate"> + Wpisz krótką wiadomość która zostanie wysłana do wszystkich osób w Twoim majątku. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zmiana Majątku Lindenów" name="ChangeLindenEstate"> + Czy napewno chcesz zmienić ustawienia majątku Linden (mainland, teen grid, orientacja, itp). + +Jest to wyjątkowo niebezpieczna decyzja, odczuwalna przez wszystkich Rezydentów. Dla mainland, spowoduje to zmianę tysięcy regionów oraz ich przestrzeń serwerową. + +Kontynuować? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification label="Zmiana Dostępu do Majątku Lindenów" name="ChangeLindenAccess"> + Dokonujesz zmiany w liście dostępu Regionu głównego należącego do Lindenów (Regiony Główne, Teen Grid, Orientacja). + +Żądana operacja jest wyjątkowo niebezpieczna dla wszystkich Rezydentów przebywających w regionie i powinna być używana wyłącznie w celu zablokowania opcji pozwalającej na przeniesienie obiektów/L$ do/z sieci. +Dodatkowo, zmiany dokonane w Regionie Głównym mogą spowodować problemy przestrzeni serwerowej innych regionów. + +Kontynuować? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification label="Wybierz Majątek" name="EstateAllowedAgentAdd"> + Dodać do listy dostępu do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateAllowedAgentRemove"> + Usunąć z listy dostępu do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateAllowedGroupAdd"> + Dodać do listy dostępu grup do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateAllowedGroupRemove"> + Usunąć z listy dostępu grup do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateBannedAgentAdd"> + Zablokować dostęp do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateBannedAgentRemove"> + Zdjąć tego Rezydenta z listy niepożądanych (bany) dla tego majątku czy dla [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateManagerAdd"> + Dodać zarządce majątku do tego majątku czy do [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Wybierz Majątek" name="EstateManagerRemove"> + Usunąć zarządce majątku z tego majątku czy z [ALL_ESTATES]? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/> + </notification> + <notification label="Potwierdź Wyrzucenie" name="EstateKickUser"> + Wyrzucić [EVIL_USER] z tego majątku? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="EstateChangeCovenant"> + Na pewno chcesz zminić treść umowy dla tego majątku? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked"> + Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku. + +Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked_KB"> + Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. + +Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <url name="url"> + https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + </url> + <usetemplate ignoretext="Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/> + </notification> + <notification name="RegionEntryAccessBlocked_Notify"> + Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. + </notification> + <notification name="RegionEntryAccessBlocked_Change"> + Nie masz zezwolenia na przebywanie w tym Regionie z powodu Twojego statusu ustawień wieku. + +W celu uzyskania dostępu do tego regiony zmień proszę swój status ustawień wieku. Będziesz mógł/mogła szukać i mieć dostęp do treści [REGIONMATURITY]. W celu cofnięcia zmian wybierz z menu Ja > Ustawienia > Ogólne. + <form name="form"> + <button name="OK" text="Zmień ustawienia"/> + <button default="true" name="Cancel" text="Zamknij"/> + <ignore name="ignore" text="Moje ustawienia wieku nie dopuszczają do regionu"/> + </form> + </notification> + <notification name="PreferredMaturityChanged"> + Twoja obecna klasyfikacja wieku to [RATING]. + </notification> + <notification name="LandClaimAccessBlocked"> + W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości. Możesz potrzebować weryfikacji wieku bądź instalacji najnowszej wersji klienta. + +Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandClaimAccessBlocked_KB"> + Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości. + +Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <url name="url"> + https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + </url> + <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/> + </notification> + <notification name="LandClaimAccessBlocked_Notify"> + Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości. + </notification> + <notification name="LandClaimAccessBlocked_Change"> + W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości. + +Możesz wybrać 'Zmień Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja > Ustawienia > Główne. + <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/> + </notification> + <notification name="LandBuyAccessBlocked"> + Ze względu na Twój wiek, nie możesz kupić tej posiadłości. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku. + +Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandBuyAccessBlocked_KB"> + Ze względu na Twój wiek, nie możesz kupić tej posiadłości. + +Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + <url name="url"> + https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + </url> + <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/> + </notification> + <notification name="LandBuyAccessBlocked_Notify"> + Ze względu na Twój wiek, nie możesz kupić tej posiadłości. + </notification> + <notification name="LandBuyAccessBlocked_Change"> + W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości. + +Możesz wybrać 'Zmień Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja > Ustawienia > Główne. + <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/> + </notification> + <notification name="TooManyPrimsSelected"> + Zbyt wiele wybranych obiektów. Wybierz [MAX_PRIM_COUNT] lub mniej i spróbuj ponownie + </notification> + <notification name="ProblemImportingEstateCovenant"> + Problem z importem umowy majątku. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemAddingEstateManager"> + Problemy z dodawaniem nowego zarządcy majątku. Jeden lub więcaj majątk może mieć wypełnioną listę zarządców. + </notification> + <notification name="ProblemAddingEstateGeneric"> + Problemy z dodawaniem do listy majątku. Jeden lub więcaj majątk może mieć wypełnioną listę. + </notification> + <notification name="UnableToLoadNotecardAsset"> + Brak możliwości załadowania noty w tej chwili. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="NotAllowedToViewNotecard"> + Niewystarczające prawa do zobaczenia notki przypisanej do wybranego ID. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MissingNotecardAssetID"> + ID notki nie znalezione w bazie danych. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PublishClassified"> + Pamiętaj: Opłaty za reklamę są bezzwrotne. + +Zamieścić tą reklamę za [AMOUNT]L$? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="SetClassifiedMature"> + Czy ta reklama zawiera treść 'Mature'? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="SetGroupMature"> + Czy ta grupa zawiera treść 'Mature'? + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification label="Potwierdź Restart" name="ConfirmRestart"> + Na pewno chcesz zrobić restart tego regionu za 2 minuty? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification label="Wiadomość do Wszystkich w tym Regionie" name="MessageRegion"> + Wpisz krótką wiadomość która zostanie wysłana do wszystkich osób w tym regionie. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification label="Zmienione Restrykcje Wieku dla Regionu" name="RegionMaturityChange"> + Ustawienie restrykcji wieku dla regionu zostało zmienione. +Zazwyczaj musi upłynąć nieco czasu zanim ta zmiana zostanie odzwierciedlona na mapie. + +Aby wejść do regionu Adult, Rezydenci muszą posiadać zweryfikowane konto, albo w wyniku weryfikacji wieku albo płatości. + </notification> + <notification label="Wersja Niezgodna z Systemem Rozmów" name="VoiceVersionMismatch"> + Ta wersja [APP_NAME] nie jest kompatybilna z systemem rozmów w tym Regionie. Musisz zainstalować aktualną wersję [APP_NAME] aby komunikacja głosowa działała poprawnie. + </notification> + <notification label="Nie Można Kupić Obiektów" name="BuyObjectOneOwner"> + Jednorazowo możesz kupować tylko od jednego właściciela. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + </notification> + <notification label="Nie Można Kupić Zawartości" name="BuyContentsOneOnly"> + Jednorazowo możesz kupić zawartość tylko jednego obiektu. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + </notification> + <notification label="Nie Można Kupić Zawartości" name="BuyContentsOneOwner"> + Jednorazowo możesz kupować tylko od jednego właściciela. +Wybierz pojedynczy obiekt i spróbuj jeszcze raz. + </notification> + <notification name="BuyOriginal"> + Kupić oryginalny obiekt od [OWNER] za [PRICE]L$? +Zostaniesz właścicielem tego obiektu z następującymi prawami: + Modyfikacje: [MODIFYPERM] + Kopiowanie: [COPYPERM] + Odsprzedawanie i oddawanie: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyOriginalNoOwner"> + Kupić oryginalny obiekt za [PRICE]L$? +Zostaniesz właścicielem tego obiektu z następującymi prawami: + Modyfikacje: [MODIFYPERM] + Kopiowanie: [COPYPERM] + Odsprzedawanie i oddawanie: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyCopy"> + Kupić kopię obiektu od [OWNER] za [PRICE]L$? +Obiekt zostanie skopiowany do Twojej szafy z następującymi prawami: + Modyfikacje: [MODIFYPERM] + Kopiowanie: [COPYPERM] + Odsprzedawanie i oddawanie: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyCopyNoOwner"> + Kupić kopię obiektu za [PRICE]L$? +Obiekt zostanie skopiowany do Twojej szafy z następującymi prawami: + Modyfikacje: [MODIFYPERM] + Kopiowanie: [COPYPERM] + Odsprzedawanie i oddawanie: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyContents"> + Kupić zawartość od [OWNER] za [PRICE]L$? +Zawartość zostanie skopiowana do Twojej szafy. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BuyContentsNoOwner"> + Kupić zawartość za [PRICE]L$? +Zawartość zostanie skopiowana do Twojej szafy. + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmPurchase"> + Ta transakcja spowoduje: +[ACTION] + +Na pewno chcesz dokonać tego zakupu? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmPurchasePassword"> + Ta transakcja spowoduje: +[ACTION] + +Na pewno chcesz dokonać tego zakupu? +Wpisz hasło ponownie i kliknij OK. + <form name="form"> + <input name="message"/> + <button name="ConfirmPurchase" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="SetPickLocation"> + Uwaga: +Lokalizacja tego wyboru została zaktualizowana ale pozostałe szczegóły zachowają oryginalne wartości. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromObject"> + Wybrane obiekty Szafy nie mają praw kopiowania. +Obiekty zostaną przeniesione do Twojej Szafy, nie zostaną skopiowane. + +Przenieść obiekty Szafy? + <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromScriptedObject"> + Wybrane obiekty Szafy nie mają praw kopiowania. +Obiekty zostaną przeniesione do Twojej Szafy, nie zostaną skopiowane. +Ponieważ obiekty zawierają skrypty, przeniesienie obiektów do Twojej Szafy może spowodować niepoprawne działanie skryptów. + +Przenieść obiekty szafy? + <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu, która może uszkodzić skrypty obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ClickActionNotPayable"> + Uwaga: Opcja Zapłać obiektowi została wybrana, ale żeby ta opcja działała musi być dodany skrypt z funkcją money(). + <form name="form"> + <ignore name="ignore" text="Opcja Zapłać Obiektowi została aktywowana podczas budowania obiektów bez skryptu z funkcją money()."/> + </form> + </notification> + <notification name="OpenObjectCannotCopy"> + W tym obiekcie nie ma elementów które możesz skopiować. + </notification> + <notification name="WebLaunchAccountHistory"> + Przejść na stronę [http://secondlife.com/account/ Dashboard] żeby zobaczyć historię konta? + <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć historię konta" name="okcancelignore" notext="Anuluj" yestext="Idź na stronę"/> + </notification> + <notification name="ConfirmQuit"> + Na pewno chcesz skończyć? + <usetemplate ignoretext="Na pewno chcesz skończyć?" name="okcancelignore" notext="Nie kończ" yestext="Wyłącz"/> + </notification> + <notification name="DeleteItems"> + [QUESTION] + <usetemplate ignoretext="Potwierdź, że na pewno chcesz skasować obiekty" name="okcancelignore" notext="Cofnij" yestext="OK"/> + </notification> + <notification name="HelpReportAbuseEmailLL"> + Używaj tej opcji do zgłaszania nadużyć [http://secondlife.com/corporate/tos.php Warunków Umowy (Terms of Service)] i [http://secondlife.com/corporate/cs.php Standardów Społeczeństwa (Community Standards)]. + +Wszystkie zgłoszone nadużycia są badane i rozwiązywane. + </notification> + <notification name="HelpReportAbuseSelectCategory"> + Wybierz kategorię dla tego raportu o nadużyciu. +Określenie kategorii pomoże nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseAbuserNameEmpty"> + Wprowadź imię i nazwisko osoby popełniającej nadużycie. +Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseAbuserLocationEmpty"> + Wprowadź nazwę miejsca gdzie popełniono nadużycie. +Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseSummaryEmpty"> + Wprowadź opis popełnionego nadużycia. +Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseDetailsEmpty"> + Wprowadź szczgółowy opis popełnionego nadużycia. +Podaj maksymalną ilość szczgółów oraz imiona i nazwiska osób związanych z nadużyciem które zgłaszasz. +Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu. + </notification> + <notification name="HelpReportAbuseContainsCopyright"> + Szanowny Rezydencie, + +Jeżeli składasz raport dotyczący naruszenia praw autorskich proszę się upewnić, że robisz to poprawnie: + +(1) Przypadek Nadużycia. Możesz złożyć raport jeżeli sądzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykład używając CopyBot lub podobnych narzędzi robiących kopie, naruszając prawa autorskie. Komisja Nadużyć bada wykroczenia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami Warunków Umowy [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] i Standardów Społeczeństwa [http://secondlife.com/corporate/cs.php Community Standards]. Komisja Nadużyć nie zajmuje się i nie odpowiada na żądania usunięcia treści ze środowiska [SECOND_LIFE]. + +(2) Przypadek DMCA lub Usuwanie Treści. Aby wystąpić z żądaniem o usunięcie treści ze środowiska [SECOND_LIFE] MUSISZ przedłożyć ważne zawiadomienie o nadużyciu zgodne z naszą polityką DMCA [http://secondlife.com/corporate/dmca.php DMCA Policy]. + +Jeżeli chcesz kontynuować dalej zamknij to okno i dokończ wysyłanie raportu. Może być potrzebny wybór kategorii 'CopyBot albo Nadużycie Przywilejów'. + +Dziękujemy, + +Linden Lab + </notification> + <notification name="FailedRequirementsCheck"> + Brak następujących wymaganych komponentów w [FLOATER]: +[COMPONENTS] + </notification> + <notification label="Zamień Istniejący Dodatek" name="ReplaceAttachment"> + Obecnie masz już dołączony obiekt do tej części Twojego ciała. +Chcesz go zamienić na wybrany obiekt? + <form name="form"> + <ignore name="ignore" save_option="true" text="Obecnie masz już dołączony obiekt do tej części Twojego ciała.Chcesz go zamienić na wybrany obiekt?"/> + <button ignore="Zamień automatycznie" name="Yes" text="OK"/> + <button ignore="Nie zamieniaj" name="No" text="Anuluj"/> + </form> + </notification> + <notification label="Ostrzeżenie Trybu Pracy" name="BusyModePay"> + Jesteś w Trybie pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tą opłatę. + +Chcesz wyłączyć Tryb pracy przed zakończeniem tej tranzakcji? + <form name="form"> + <ignore name="ignore" save_option="true" text="Jesteś w Trybie Pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tą opłatę. Chcesz wyłączyć Tryb Pracy przed zakończeniem tej transakcji?"/> + <button ignore="Zawsz wyłączaj tryb pracy" name="Yes" text="OK"/> + <button ignore="Nie wyłączaj trybu pracy" name="No" text="Anuluj"/> + </form> + </notification> + <notification name="ConfirmDeleteProtectedCategory"> + Ten folder '[FOLDERNAME]' to folder systemowy. Usunięcie foldera systemowego spowoduje niestabilność. Czy na pewno chcesz go skasować? + <usetemplate ignoretext="Potwierdź zanim folder systemu zostanie skasowany" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmEmptyTrash"> + Na pewno chcesz permanentnie usunąć zawartość Kosza? + <usetemplate ignoretext="Potwierdź przed usunięciem zawartości Kosza" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmClearBrowserCache"> + Na pewno chcesz wyczyścić bufor przeglądarki? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="ConfirmClearCookies"> + Na pewno chcesz wyczyścić ciasteczka? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/> + </notification> + <notification name="ConfirmClearMediaUrlList"> + Na pewno chcesz wyczyścić listę zapisanych linków? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/> + </notification> + <notification name="ConfirmEmptyLostAndFound"> + Na pewno chcesz permanentnie usunąć zawartość Twojego foldera Zgubione i odnalezione? + <usetemplate ignoretext="Potwierdź przed usunięciem zawartości foldera Zagubione i odnalezione" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="CopySLURL"> + Następujący link SLURL został skopiowany do schowka: + [SLURL] + +Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do tego miejsca, albo wklej go do panela adresu Twojej przeglądarki żeby go otworzyć. + <form name="form"> + <ignore name="ignore" text="SLurl skopiowany do schowka"/> + </form> + </notification> + <notification name="WLSavePresetAlert"> + Chcesz zmienić zapisane ustawienia? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="WLDeletePresetAlert"> + Chcesz usunąć [SKY]? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="WLNoEditDefault"> + Nie możesz edytować lub usunąć domyślnych ustawień. + </notification> + <notification name="WLMissingSky"> + Ten plik cyklu dziennego używa brakującego pliku nieba: [SKY]. + </notification> + <notification name="PPSaveEffectAlert"> + Efekt post-procesu już istnieje. Chcesz zapisać nowy na jego miejsce? + <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> + </notification> + <notification name="NewSkyPreset"> + Nazwij nowe niebo. + <form name="form"> + <input name="message"> + Nowe ustawienie + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="ExistsSkyPresetAlert"> + Ustawienie już istnieje! + </notification> + <notification name="NewWaterPreset"> + Nazwij nowe ustawienie wody. + <form name="form"> + <input name="message"> + Nowe ustawienie + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="ExistsWaterPresetAlert"> + Ustawienie już istnieje! + </notification> + <notification name="WaterNoEditDefault"> + Domyślne ustawienie nie może być zmienione ani usunięte. + </notification> + <notification name="ChatterBoxSessionStartError"> + Błąd podczas rozpoczynania czatu/IM z [RECIPIENT]. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ChatterBoxSessionEventError"> + [EVENT] +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ForceCloseChatterBoxSession"> + Twój czat/IM z [NAME] zostanie zamknięty. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="Cannot_Purchase_an_Attachment"> + Rzeczy nie mogą być kupione jeżeli są częścią załącznika. + </notification> + <notification label="Prośba o Zgodę na Pobieranie L$" name="DebitPermissionDetails"> + Akceptując tą prośbę wyrażasz zgodę na ciągłe pobieranie Lindenów (L$) z Twojego konta. Żeby cofnąć to pozwolenie właściciel obiektu będzie musiał usunąć ten obiekt albo zresetowć skrypty obieku. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AutoWearNewClothing"> + Czy chcesz automatycznie nosić ubranie które tworzysz? + <usetemplate ignoretext="Załóż ubranie automatycznie będąc w trybie Edycji Wyglądu" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="NotAgeVerified"> + Nie masz dostępu do tej posiadłości ze względu na brak weryfikacji Twojego wieku. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/verification.php + </url> + <usetemplate ignoretext="Brak weryfikacji wieku" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="Cannot enter parcel: no payment info on file"> + Nie masz dostępu do tej posiadłości ze względu na brak danych o Twoim koncie. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/ + </url> + <usetemplate ignoretext="Brak danych o koncie" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="MissingString"> + Zdanie [STRING_NAME] nie znalezione w strings.xml + </notification> + <notification name="SystemMessageTip"> + [MESSAGE] + </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> + <notification name="Cancelled"> + Anulowane + </notification> + <notification name="CancelledSit"> + Siadanie anulowane + </notification> + <notification name="CancelledAttach"> + Dołączenie anulowane + </notification> + <notification name="ReplacedMissingWearable"> + Barkujące ubranie/części ciała zastąpiono domyślnymi obiektami. + </notification> + <notification name="GroupNotice"> + Temat: [SUBJECT], Treść: [MESSAGE] + </notification> + <notification name="FriendOnline"> + [NAME] jest w Second Life + </notification> + <notification name="FriendOffline"> + [NAME] opuszcza Second Life + </notification> + <notification name="AddSelfFriend"> + Nie możesz dodać siebie do listy znajomych. + </notification> + <notification name="UploadingAuctionSnapshot"> + Ładowanie obrazu z Internetu... +(Zajmuje około 5 minut.) + </notification> + <notification name="UploadPayment"> + Ładowanie kosztowało [AMOUNT]L$. + </notification> + <notification name="UploadWebSnapshotDone"> + Ładowanie obrazu z Internetu zakończne pomyślnie. + </notification> + <notification name="UploadSnapshotDone"> + Ładowanie zdjęcia zakończone pomyślnie. + </notification> + <notification name="TerrainDownloaded"> + Plik terrain.raw ściągniety. + </notification> + <notification name="GestureMissing"> + Gesturka [NAME] nie znaleziony w bazie danych. + </notification> + <notification name="UnableToLoadGesture"> + Ładowanie gesturki [NAME] nie powiodło się. + </notification> + <notification name="LandmarkMissing"> + Miejsce (LM) nie znalezione w bazie danych. + </notification> + <notification name="UnableToLoadLandmark"> + Ładowanie miejsca (LM) nie powiodło się. +Spróbuj jeszcze raz. + </notification> + <notification name="CapsKeyOn"> + Twój Caps Lock jest włączony. +Ponieważ to ma wpływ na wpisywane hasło, możesz chcieć go wyłączyć. + </notification> + <notification name="NotecardMissing"> + Notka nie została znaleziona w bazie danych. + </notification> + <notification name="NotecardNoPermissions"> + Nie masz pozwolenia na zobaczenie notki. + </notification> + <notification name="RezItemNoPermissions"> + Nie masz pozwolenia na stworzenie obiektu. + </notification> + <notification name="UnableToLoadNotecard"> + Nie można załadować danych notki w tym momencie. + </notification> + <notification name="ScriptMissing"> + Skrypt nie znaleziony w bazie danych. + </notification> + <notification name="ScriptNoPermissions"> + Nie masz pozwolenia na zobaczenie skryptu. + </notification> + <notification name="UnableToLoadScript"> + Ładowanie skryptu nie powiodło się. +Spróbuj jeszcze raz. + </notification> + <notification name="IncompleteInventory"> + Zawartość obiektów którą chcesz podarować nie jest dostępna lokalnie. Spróbuj podarować te obiekty jeszcze raz za jakiś czas. + </notification> + <notification name="CannotModifyProtectedCategories"> + Nie możesz zmienić chronionych kategorii. + </notification> + <notification name="CannotRemoveProtectedCategories"> + Nie możesz usunąć chronionych kategorii. + </notification> + <notification name="UnableToBuyWhileDownloading"> + Nie można kupować w trakcie ładowania danych obiektu. +Spróbuj jeszcze raz. + </notification> + <notification name="UnableToLinkWhileDownloading"> + Nie można łączyć w trakcie ładowania danych obiektu. +Spróbuj jeszcze raz. + </notification> + <notification name="CannotBuyObjectsFromDifferentOwners"> + Nie możesz jednocześnie kupować obiektów od różnych osób. +Wybierz jeden obiekt. + </notification> + <notification name="ObjectNotForSale"> + Obiekt nie jest na sprzedaż. + </notification> + <notification name="EnteringGodMode"> + Włącznie trybu boskiego, poziom [LEVEL] + </notification> + <notification name="LeavingGodMode"> + Wyłączanie trybu boskiego, poziom [LEVEL] + </notification> + <notification name="CopyFailed"> + Nie masz praw do skopiowania wybranych obiektów. + </notification> + <notification name="InventoryAccepted"> + Podarunek od Ciebie został przyjęty przez [NAME]. + </notification> + <notification name="InventoryDeclined"> + Podarunek od Ciebie został odrzucony przez [NAME]. + </notification> + <notification name="ObjectMessage"> + [NAME]: [MESSAGE] + </notification> + <notification name="CallingCardAccepted"> + Twoja wizytówka została przyjęta. + </notification> + <notification name="CallingCardDeclined"> + Twoja wizytówka została odrzucona. + </notification> + <notification name="TeleportToLandmark"> + Jesteś w Głównym Regionie i możesz się stąd teleportować do innych miejsc jak '[NAME]' wybierając Moja Szafa w prawym dolnym rogu ekranu +i wybierając folder Zapisane Miejsca (LM). +(Kliknij dwa razy na miejsce (LM) i wybierz 'Teleport' żeby tam się przenieść.) + </notification> + <notification name="TeleportToPerson"> + Możesz skontaktować się z Rezydentem '[NAME]' poprzez otworzenie panelu Ludzie po prawej stronie ekranu. +Wybierz Rezydenta z listy, następnie kliknij 'IM' na dole panelu. +(Możesz także kliknąć podwójnie na ich imię na liście, lub prawym przyciskiem i wybrać 'IM'). + </notification> + <notification name="CantSelectLandFromMultipleRegions"> + Nie możesz przekraczać granic serwera wybierając obszar. +Spróbuj wybrać mniejszy obszar. + </notification> + <notification name="SearchWordBanned"> + Pewne frazy podczas wyszukiwania zostały usunięte w związku z restrykcjami zawartymi w Standardach Społecznościowych (Community Standards). + </notification> + <notification name="NoContentToSearch"> + Proszę wybrać przynajmiej jeden z podanych rodzajów treści jaką zawiera region podczas wyszukiwania ('General', 'Moderate', lub 'Adult'). + </notification> + <notification name="SystemMessage"> + [MESSAGE] + </notification> + <notification name="PaymentReceived"> + [MESSAGE] + </notification> + <notification name="PaymentSent"> + [MESSAGE] + </notification> + <notification name="EventNotification"> + Zawiadomienie o imprezie: + +[NAME] +[DATE] + <form name="form"> + <button name="Details" text="Szczegóły"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="TransferObjectsHighlighted"> + Obiekty na tej posiadłości które zostaną przekazane kupcowi tej posiadłości są teraz rozjaśnione. + +* Drzewa i trawy które zostaną przekazne nie są rozjaśnione. + <form name="form"> + <button name="Done" text="Zastosuj"/> + </form> + </notification> + <notification name="DeactivatedGesturesTrigger"> + Zablokowane gesturki z jednakowym aktywowaniem: +[NAMES] + </notification> + <notification name="NoQuickTime"> + Wygląda na to, że QuickTime z Apple nie jest zainstalowany na Twoim komputerze. +Jeżeli chcesz odtwarzać media na tej posiadłości które używają QuickTime idź do [http://www.apple.com/quicktime strona QuickTime] i zainstaluj odtwarzacz. + </notification> + <notification name="NoPlugin"> + Nie znaleziono wtyczki mediów dla "[MIME_TYPE]" typu mime. Media tego typu będą niedostępne. + </notification> + <notification name="MediaPluginFailed"> + Następujące wtyczki mediów nie działają: + [PLUGIN] + +Zainstaluj proszę wtyczki ponownie lub skontaktuj się z dostawcą jeśli nadal problem będzie występował. + <form name="form"> + <ignore name="ignore" text="Wtyczka mediów nie działa"/> + </form> + </notification> + <notification name="OwnedObjectsReturned"> + Twoje obiekty z wybranej posiadłości zostały zwrócone do Twojej Szafy. + </notification> + <notification name="OtherObjectsReturned"> + Obiekty należące do [NAME] na wybranej posiadłości zostały zwrócone do Szafy tej osoby. + </notification> + <notification name="OtherObjectsReturned2"> + Obiekty z posiadłości należącej do Rezydenta'[NAME]' zostały zwrócone do właściciela. + </notification> + <notification name="GroupObjectsReturned"> + Obiekty z wybranej posiadłości przypisane do grupy [GROUPNAME] zostały zwrócone do szafy ich właścicieli. +Przekazywalne obiekty przekazne grupie zostały zwrócone do ich poprzednich właścicieli. +Nieprzekazywalne obiekty przekazane grupie zostały usunięte. + </notification> + <notification name="UnOwnedObjectsReturned"> + Obiekty z wybranej posiadłości które nie należą do Ciebie zostały zwrócone do ich właścicieli. + </notification> + <notification name="ServerObjectMessage"> + Wiadomość od [NAME]: +<nolink>[MSG]</nolink> + </notification> + <notification name="NotSafe"> + Ta posiadłość pozwala na uszkodzenia. +Możesz doznać tutaj urazu. Jeżeli zginiesz nastąpi teleportacja do Twojego miejsca startu. + </notification> + <notification name="NoFly"> + Ta posiadłość nie pozwala na latanie. +Nie możesz tutaj latać. + </notification> + <notification name="PushRestricted"> + Popychanie niedozwolone. Nie możesz tutaj popychać innych, chyba, że jesteś właścicielem tej posiadłości. + </notification> + <notification name="NoVoice"> + Ta posiadłość nie pozwala na rozmowy. + </notification> + <notification name="NoBuild"> + Ta posiadłość nie pozwala na budowanie. Nie możesz tworzyć tutaj obiektów. + </notification> + <notification name="ScriptsStopped"> + Administrator czasowo zatrzymał skrypty w tym regionie. + </notification> + <notification name="ScriptsNotRunning"> + Żadne skrypty nie działają w tym regionie. + </notification> + <notification name="NoOutsideScripts"> + Ta posiadłość nie pozwala na zewnętrzne skrypty. + +Żadne skrypty nie będą tutaj działać za wyjątkiem skryptów należących do właściciela posiadłości. + </notification> + <notification name="ClaimPublicLand"> + Tylko publiczne posiadłości w tym regionie mogą być przejęte. + </notification> + <notification name="RegionTPAccessBlocked"> + Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Możesz potrzebować weryfikacji wieku bądź instalacji najnowszej wersji klienta. + +Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera. + </notification> + <notification name="URBannedFromRegion"> + Zostałeś zbanowany w regionie. + </notification> + <notification name="NoTeenGridAccess"> + Twoje konto nie może zostać połączone z podanym regionem Teen Grid. + </notification> + <notification name="ImproperPaymentStatus"> + Nie posiadasz odpowiedniego statusu płatniczego by uzyskać dostęp do regionu. + </notification> + <notification name="MustGetAgeParcel"> + By móc przebywać na tej posiadłości wymagana jest weryfikacja Twojego wieku. + </notification> + <notification name="NoDestRegion"> + Żądana lokalizacja regionu nie została odnaleziona. + </notification> + <notification name="NotAllowedInDest"> + Brak dostępu do podanej lokalizacji. + </notification> + <notification name="RegionParcelBan"> + Nie możesz przejść przez zamkniętą posiadłość. Spróbuj skorzystać z innej drogi. + </notification> + <notification name="TelehubRedirect"> + Zostałeś przeniesiony do teleportera. + </notification> + <notification name="CouldntTPCloser"> + Brak możliwości teleportacji do bliższej lokacji. + </notification> + <notification name="TPCancelled"> + Teleportacja anulowana. + </notification> + <notification name="FullRegionTryAgain"> + Region, który chcesz odwiedzić jest w tej chwili pełny. +Spróbuj ponowanie za kilka minut. + </notification> + <notification name="GeneralFailure"> + Nieudana próba. + </notification> + <notification name="RoutedWrongRegion"> + Wysłano niewłaściwe połączenie do regionu. Proszę spróbować ponownie. + </notification> + <notification name="NoValidAgentID"> + Nieważny identyfikator agenta. + </notification> + <notification name="NoValidSession"> + Nieważny identyfikator sesji. + </notification> + <notification name="NoValidCircuit"> + Nieważny obwód kodowania. + </notification> + <notification name="NoValidTimestamp"> + Niewłaściwy czas zapisu. + </notification> + <notification name="NoPendingConnection"> + Brak możliwości wykonania połączenia. + </notification> + <notification name="InternalUsherError"> + Podczas teleportacji nastąpił błąd wewnętrzny, który może być wynikiem problemów serwera. + </notification> + <notification name="NoGoodTPDestination"> + Brak lokalizacji punktu do teleportacji w podanym regionie. + </notification> + <notification name="InternalErrorRegionResolver"> + Podczas próby odnalezienia globalnych współrzędych dla żądanej teleportacji pojawił się wewnętrzny błąd. Może być to wynikiem problemów serwera. + </notification> + <notification name="NoValidLanding"> + Nieważny punkt lądowania. + </notification> + <notification name="NoValidParcel"> + Nieważana posiadłość. + </notification> + <notification name="ObjectGiveItem"> + Obiekt o nazwie <nolink>[OBJECTFROMNAME]</nolink>, którego właścicielem jest [NAME_SLURL] oferuje Tobie [ITEM_SLURL]. Korzystanie z tego obieku wymaga przelączenia się na tryb zaawansowany, w którym będzie można odszukać obiekt w Twojej Szafie. W celu przełączenia trybu życia na zaawansowany, zamknij i uruchom ponownie aplikację. Przed ponownym zalogowaniem zmień tryb życia na ekranie logowania. + <form name="form"> + <button name="Keep" text="Zaakceptuj obiekt"/> + <button name="Discard" text="Odrzuć obiekt"/> + <button name="Mute" text="Zablokuj obiekt"/> + </form> + </notification> + <notification name="UserGiveItem"> + [NAME_SLURL] proponuje Tobie [ITEM_SLURL]. Korzystanie z tego obieku wymaga przelączenia się na tryb zaawansowany, w którym będzie można odszukać obiekt w Twojej Szafie. W celu przełączenia trybu życia na zaawansowany, zamknij i uruchom ponownie aplikację. Przed ponownym zalogowaniem zmień tryb życia na ekranie logowania. + <form name="form"> + <button name="Show" text="Zaakceptuj obiekt"/> + <button name="Discard" text="Odrzuć obiekt"/> + <button name="Mute" text="Zablokuj użytkownika"/> + </form> + </notification> + <notification name="GodMessage"> + [NAME] + +[MESSAGE] + </notification> + <notification name="JoinGroup"> + [MESSAGE] + <form name="form"> + <button name="Join" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Info" text="Info"/> + </form> + </notification> + <notification name="TeleportOffered"> + [NAME_SLURL] proponuje Ci teleportację do siebie: + +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> + <form name="form"> + <button name="Teleport" text="Teleportuj"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="TeleportOfferSent"> + Oferta teleportacji wysłana do [TO_NAME] + </notification> + <notification name="GotoURL"> + [MESSAGE] +[URL] + <form name="form"> + <button name="Later" text="Póżniej"/> + <button name="GoNow..." text="Teraz..."/> + </form> + </notification> + <notification name="OfferFriendship"> + [NAME_SLURL] proponuje znajomość. + +[MESSAGE] + +(Będziecie mogli widzieć swój status online) + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + </form> + </notification> + <notification name="FriendshipOffered"> + Oferta znajomości dla [TO_NAME] + </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME_SLURL] proponuje Ci znajomość. + +(Z zalożenia będzie widzić swój status online.) + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + </form> + </notification> + <notification name="FriendshipAccepted"> + Twoja propozycja znajomości została przyjęta przez [NAME]. + </notification> + <notification name="FriendshipDeclined"> + Twoja propozycja znajomości została odrzucona przez [NAME]. + </notification> + <notification name="FriendshipAcceptedByMe"> + Propozycja znajomości została zaakceptowana. + </notification> + <notification name="FriendshipDeclinedByMe"> + Propozycja znajomości została odrzucona. + </notification> + <notification name="OfferCallingCard"> + [NAME] oferuje swoją wizytówkę. +Wizytówka w Twojej Szafie umożliwi szybki kontakt IM z tym Rezydentem. + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + </form> + </notification> + <notification name="RegionRestartMinutes"> + Restart regionu za [MINUTES] min. +Nastąpi wylogowanie jeżeli zostaniesz w tym regionie. + </notification> + <notification name="RegionRestartSeconds"> + Restart regionu za [SECONDS] sec. +Nastąpi wylogowanie jeżeli zostaniesz w tym regionie. + </notification> + <notification name="LoadWebPage"> + Załadować stronę [URL]? + +[MESSAGE] + +Od obiektu: <nolink>[OBJECTNAME]</nolink>, właściciel właściciel: [NAME]? + <form name="form"> + <button name="Gotopage" text="Załaduj"/> + <button name="Cancel" text="Anuluj"/> + </form> + </notification> + <notification name="FailedToFindWearableUnnamed"> + [TYPE] - nie znaleziono w bazie danych. + </notification> + <notification name="FailedToFindWearable"> + [TYPE] [DESC] - nie znaleziono w bazie danych. + </notification> + <notification name="InvalidWearable"> + Obiekt, który chcesz założyć używa narzędzia nieobecnego w wersji klienta, którą używasz. By go założyć ściągnij najnowszą wersję [APP_NAME]. + </notification> + <notification name="ScriptQuestion"> + Obiekt '<nolink>[OBJECTNAME]</nolink>', którego właścicielem jest '[NAME]', chciałby: + +[QUESTIONS] +Czy się zgadzasz? + <form name="form"> + <button name="Yes" text="Tak"/> + <button name="No" text="Nie"/> + <button name="Mute" text="Zablokuj"/> + </form> + </notification> + <notification name="ScriptQuestionCaution"> + Obiekt '<nolink>[OBJECTNAME]</nolink>', którego właścicielem jest '[NAME]' chciałby: + +[QUESTIONS] +Jeśli nie ufasz temu obiektowi i jego kreatorowi, odmów. + +Czy się zgadzasz? + <form name="form"> + <button name="Grant" text="Zaakceptuj"/> + <button name="Deny" text="Odmów"/> + <button name="Details" text="Szczegóły..."/> + </form> + </notification> + <notification name="ScriptDialog"> + [NAME]'s '<nolink>[TITLE]</nolink>' +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Zignoruj"/> + </form> + </notification> + <notification name="ScriptDialogGroup"> + [GROUPNAME]'s '<nolink>[TITLE]</nolink>' +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Zignoruj"/> + </form> + </notification> + <notification name="BuyLindenDollarSuccess"> + Dziękujemy za wpłatę! + +Twój stan konta L$ zostanie zaktualizowany w momencie zakończenia transakcji. Jeżeli w ciągu 20 minut, Twój balans konta nie ulegnie zmianie, transakcja została anulowana. W tym przypadku, pobrana kwota zostanie zwrócona na stan konta w US$. + +Status transkacji możesz sprawdzić odwiedzając Historię Transakcji swojego konta na [http://secondlife.com/account/ Dashboard] + </notification> + <notification name="FirstOverrideKeys"> + Twoje sterujące klawisze zostały przejęte przez obiekt. +Użyj strzałek lub AWSD żeby sprawdzić ich działanie. +Niektóre obiekty (np broń) wymagają trybu panoramicznego. +Nacisnij 'M' żeby go wybrać. + </notification> + <notification name="FirstSandbox"> + Ten region to piaskownica. + +Obiekty które tu zbudujesz mogą zostać usunięte jak opuścisz ten obszar - piaskownice są regularnie czyszczone, sprawdź informacje na górze ekranu obok nazwy regionu. + </notification> + <notification name="MaxListSelectMessage"> + Maksymalnie możesz wybrać [MAX_SELECT] rzeczy +z tej listy. + </notification> + <notification name="VoiceInviteP2P"> + [NAME] zaprasza Cię do rozmowy głosem. +Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. +Wybierz Zablokuj żeby wyciszyć dzwoniącą osób + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Mute" text="Zablokuj"/> + </form> + </notification> + <notification name="AutoUnmuteByIM"> + Wysłano [NAME] prywatną wiadomość i ta osoba została automatycznie odblokowana. + </notification> + <notification name="AutoUnmuteByMoney"> + Przekazano [NAME] pieniądze i ta osoba została automatycznie odblokowana. + </notification> + <notification name="AutoUnmuteByInventory"> + Zaoferowno [NAME] obiekty i ta osoba została automatycznie odblokowana. + </notification> + <notification name="VoiceInviteGroup"> + [NAME] zaczyna rozmowę z grupą [GROUP]. +Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę. + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Mute" text="Zablokuj"/> + </form> + </notification> + <notification name="VoiceInviteAdHoc"> + [NAME] zaczyna konferencję głosem. +Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę. + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Mute" text="Zablokuj"/> + </form> + </notification> + <notification name="InviteAdHoc"> + [NAME] zaprasza Cię do konferencji poprzez Czat/IM. +Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć tą osobę. + <form name="form"> + <button name="Accept" text="Zaakceptuj"/> + <button name="Decline" text="Odmów"/> + <button name="Mute" text="Block"/> + </form> + </notification> + <notification name="VoiceChannelFull"> + Rozmowa w której chcesz uczestniczyć, [VOICE_CHANNEL_NAME], nie akceptuje więcej rozmówców. Spróbuj póżniej. + </notification> + <notification name="ProximalVoiceChannelFull"> + Przepraszamy. Limit rozmów został przekroczony w tym obszarze. Spróbuj w innym miejscu. + </notification> + <notification name="VoiceChannelDisconnected"> + [VOICE_CHANNEL_NAME] odłączył się. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="VoiceChannelDisconnectedP2P"> + [VOICE_CHANNEL_NAME] skończył rozmowę. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="P2PCallDeclined"> + [VOICE_CHANNEL_NAME] odmówił połączenia. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="P2PCallNoAnswer"> + [VOICE_CHANNEL_NAME] nie odpowiada. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="VoiceChannelJoinFailed"> + Brak połączenia z [VOICE_CHANNEL_NAME], spróbuj póżniej. Przełączanie do rozmowy przestrzennej. + </notification> + <notification name="VoiceLoginRetry"> + Tworzymy kanał głosu dla Ciebie. Moze potrwać minutę. + </notification> + <notification name="VoiceEffectsExpired"> + Subskrypcja jednego lub więcej z Voice Morph wygasła. +[[URL] Kliknij tutaj] oby odnowić subskrypcję. + </notification> + <notification name="VoiceEffectsExpiredInUse"> + Czas aktywności Voice Morph wygasł, normalne ustawienia Twojego głosu zostały zastosowane. +[[URL] Kliknij tutaj] aby odnowić subskrypcję. + </notification> + <notification name="VoiceEffectsWillExpire"> + Jedno lub więcej z Twoich Voice Morph wygaśnie za mniej niż [INTERVAL] dni. +[[URL] Klinij tutaj] aby odnowić subskrypcję. + </notification> + <notification name="VoiceEffectsNew"> + Nowe Voice Morph są dostępne! + </notification> + <notification name="Cannot enter parcel: not a group member"> + Nie masz dostępu do posiadłości, nie należysz do właściwej grupy. + </notification> + <notification name="Cannot enter parcel: banned"> + Masz wzbroniony wstęp na tą posiadłości (ban). + </notification> + <notification name="Cannot enter parcel: not on access list"> + Nie masz dostępu do posiadłości, nie jesteś na liście dostępu. + </notification> + <notification name="VoiceNotAllowed"> + Nie masz pozwolenia na połączenie z rozmową [VOICE_CHANNEL_NAME]. + </notification> + <notification name="VoiceCallGenericError"> + Błąd podczas łączenia z rozmową [VOICE_CHANNEL_NAME]. Spróbuj póżniej. + </notification> + <notification name="UnsupportedCommandSLURL"> + Nie można otworzyć wybranego SLurl. + </notification> + <notification name="BlockedSLURL"> + SLurl został otrzymany z niesprawdzonej przeglądarki i został zablokowany dla bezpieczeństwa. + </notification> + <notification name="ThrottledSLURL"> + Wiele SLurlów zostało otrzymanych w krótkim czasie od niesprawdzonej przeglądarki. +Zostaną zablokowane na kilka sekund dla bezpieczeństwa. + </notification> + <notification name="IMToast"> + [MESSAGE] + <form name="form"> + <button name="respondbutton" text="Odpowiedź"/> + </form> + </notification> + <notification name="ConfirmCloseAll"> + Czy chcesz zamknąć wszystkie wiadomości IM? + <usetemplate ignoretext="Potwierdź, przed zamknięciem wszystkich wiadomości prywatnych (IM)." name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="AttachmentSaved"> + Załącznik został zapisany. + </notification> + <notification name="UnableToFindHelpTopic"> + Nie można znależć tematu pomocy dla tego elementu. + </notification> + <notification name="ObjectMediaFailure"> + Błąd serwera: aktualizacja mediów nie powiodła się. +'[ERROR]' + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TextChatIsMutedByModerator"> + Twój czat został wyciszony przez moderatora. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="VoiceIsMutedByModerator"> + Twoja rozmowa głosowa została wyciszona przez moderatora. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ConfirmClearTeleportHistory"> + Czy na pewno chcesz usunąć historię teleportacji? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BottomTrayButtonCanNotBeShown"> + Wybrany przycisk nie może zostać wyświetlony w tej chwili. +Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni. + </notification> + <notification name="ShareNotification"> + Zaznacz Rezydentów, z którymi chcesz się podzielić. + </notification> + <notification name="ShareItemsConfirmation"> + Czy na pewno chcesz udostępnić następujące obiekty: + +<nolink>[ITEMS]</nolink> + +następującym Rezydentom: + +[RESIDENTS] + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Ok"/> + </notification> + <notification name="ItemsShared"> + Obiekty zostały udostępnione. + </notification> + <notification name="DeedToGroupFail"> + Przekazanie grupie nie powiodło się. + </notification> + <notification name="AvatarRezNotification"> + ( [EXISTENCE] sekund w Second Life) +Awatar '[NAME]' rozchmurzył się po [TIME] sekundach. + </notification> + <notification name="AvatarRezSelfBakedDoneNotification"> + ( [EXISTENCE] sekund w Second Life) +You finished baking your outfit after [TIME] seconds. + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + ( [EXISTENCE] sekund w Second Life ) +Wysłano aktualizację wyglądu po [TIME] sekundach. +[STATUS] + </notification> + <notification name="AvatarRezCloudNotification"> + ( [EXISTENCE] sekund w Second Life ) +Awatar '[NAME]' stał się chmurą. + </notification> + <notification name="AvatarRezArrivedNotification"> + ( [EXISTENCE] sekund w Second Life) +Awatar '[NAME]' pojawił się. + </notification> + <notification name="AvatarRezLeftCloudNotification"> + ( [EXISTENCE] sekund w Second Life ) +Awatar '[NAME]' pozostał [TIME] sekund chmurą. + </notification> + <notification name="AvatarRezEnteredAppearanceNotification"> + ( [EXISTENCE] sekund w Second Life ) +Awatar '[NAME]' rozpoczął edycję wyglądu. + </notification> + <notification name="AvatarRezLeftAppearanceNotification"> + ( [EXISTENCE] sekund w Second Life ) +Awatar '[NAME]' opuścił edycję wyglądu. + </notification> + <notification name="NoConnect"> + Występuje problem z połączeniem [PROTOCOL] [HOSTID]. +Proszę sprawdź swoją sieć i ustawienia firewall. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="NoVoiceConnect"> + Występuje problem z Twoim połączniem głosowym: + +[HOSTID] + +Komunikacja głosowa nie będzie dostępna. +Proszę sprawdź swoją sieć i ustawienia firewall. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AvatarRezLeftNotification"> + ( [EXISTENCE] sekund w Second Life) +Awatar '[NAME]' pozostał w pełni załadowany. + </notification> + <notification name="AvatarRezSelfBakedTextureUploadNotification"> + ( [EXISTENCE] sekund w Second Life ) +Zbakowane tekstury [RESOLUTION] dla '[BODYREGION]' zostały załadowane po[TIME] sekundach. + </notification> + <notification name="AvatarRezSelfBakedTextureUpdateNotification"> + ( [EXISTENCE] sekund w Second Life ) +Zbakowane tekstury zostały lokalnie zaktualizowane [RESOLUTION] dla '[BODYREGION]' po [TIME] sekundach. + </notification> + <notification name="ConfirmLeaveCall"> + Czy jestes pewien/pewna, że chcesz zakończyć rozmowę? + <usetemplate ignoretext="Potwierdź zanim rozmowa głosowa zostanie zakończona" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> + <notification name="ConfirmMuteAll"> + Wybrano wyciszenie wszystkich uczestników rozmowy głosowej w grupie. +To spowoduje również wyciszenie wszystkich Rezydentów, którzy dołączą póżniej do rozmowy, nawet jeśli zakończysz rozmowę. + +Wyciszyć wszystkich? + <usetemplate ignoretext="Potwierdź zanim zostaną wyciszeni wszyscy uczestnicy rozmowy głosowej w grupie" name="okcancelignore" notext="Anuluj" yestext="Ok"/> + </notification> + <notification label="Czat" name="HintChat"> + W celu przylączenia się do rozmowy zacznij pisać w poniższym polu czatu. + </notification> + <notification label="Wstań" name="HintSit"> + Aby wstać i opuścić pozycję siedzącą, kliknij przycisk Wstań. + </notification> + <notification label="Odkrywaj Świat" name="HintDestinationGuide"> + Destination Guide zawiera tysiące nowych miejsc do odkrycia. Wybierz lokalizację i teleportuj się aby rozpocząć zwiedzanie. + </notification> + <notification label="Schowek" name="HintSidePanel"> + Schowek umożliwia szybki dostęp do Twojej Szafy, ubrań, profili i innych w panelu bocznym. + </notification> + <notification label="Ruch" name="HintMove"> + Aby chodzić lub biegać, otwórz panel ruchu i użyj strzałek do nawigacji. Możesz także używać strzałek z klawiatury. + </notification> + <notification label="Wyświetlana nazwa" name="HintDisplayName"> + Ustaw wyświetlaną nazwę, którą możesz zmieniać tutaj. Jest ona dodatkiem do unikatowej nazwy użytkownika, która nie może być zmieniona. Możesz zmienić sposób w jaki widzisz nazwy innych osób w Twoich Ustawieniach. + </notification> + <notification label="Ruch" name="HintMoveArrows"> + Użyj przycisków ze strzałkami z klawiatury aby chodzić. Jeśli wciśniesz strzałkę 'do góry' podwójnie, zaczniesz biec. + </notification> + <notification label="Widok" name="HintView"> + To change your camera view, use the Orbit and Pan controls. Zresetuj widok poprzez wciśnięcie klawisza Esc lub chodzenie. + </notification> + <notification label="Szafa" name="HintInventory"> + Sprawdź swoją Szafę aby znaleźć obiekty. Najnowsze obiekty mogą być łatwo odnalezione w zakładce Nowe obiekty. + </notification> + <notification label="Otrzymano L$!" name="HintLindenDollar"> + Tutaj znajduje się Twoj bieżący bilans L$. Kliknij Kup aby kupić więcej L$. + </notification> + <notification name="PopupAttempt"> + Wyskakujące okienko zostało zablokowane. + <form name="form"> + <ignore name="ignore" text="Zezwól na wyskakujące okienka"/> + <button name="open" text="Otwórz wyskakujące okno."/> + </form> + </notification> + <notification name="AuthRequest"> + Strpna '<nolink>[HOST_NAME]</nolink>' w domenie '[REALM]' wymaga nazwy użytkownika i hasła. + <form name="form"> + <input name="username" text="Nazwa użytkownika"/> + <input name="password" text="Hasło"/> + <button name="ok" text="Wyślij"/> + <button name="cancel" text="Anuluj"/> + </form> + </notification> + <notification label="" name="ModeChange"> + Zmiana trybu wymaga restartu. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoClassifieds"> + Tworzenie i edycja reklam jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoGroupInfo"> + Tworzenie i edycja grup jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoPicks"> + Tworzenie i edycja Ulubionych jest możliwa jedynie w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoWorldMap"> + Oglądanie mapy świata jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoVoiceCall"> + Rozmowy głosowe są możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoAvatarShare"> + Udostępnienie jest możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <notification label="" name="NoAvatarPay"> + Płacenie innym Rezydentom jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania. + <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/> + </notification> + <global name="UnsupportedCPU"> + - Prędkość Twojego CPU nie spełnia minimalnych wymagań. + </global> + <global name="UnsupportedGLRequirements"> + Wygląda na to, że Twój system nie spełnia wymagań sprzętowych [APP_NAME]. [APP_NAME] wymaga karty graficznej kompatybilnej z OpenGL z multiteksturami. Jeżeli masz taką kartę zainstaluj najnowsze sterowniki do niej i uaktualnienia systemu operacyjnego. + +Jeżeli wciąż masz problemy sprawdź: [SUPPORT_SITE]. + </global> + <global name="UnsupportedCPUAmount"> + 796 + </global> + <global name="UnsupportedRAMAmount"> + 510 + </global> + <global name="UnsupportedGPU"> + - Twoja karta graficzna nie spełnia minimalnych wymagań. + </global> + <global name="UnsupportedRAM"> + - Pamięć Twojego systemu nie spełnia minimalnych wymagań. + </global> + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + Jeśli jesteś właścicielem posiadłości, możesz ustawić na niej miejsce startu. +W innym przypadku możesz poszukać na mapie miejsca oznaczone jako "Infohub". + </global> + <global name="You died and have been teleported to your home location"> + Nastąpiła śmierć i teleportacja do Miejsca Startu. + </global> +</notifications> diff --git a/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000..ba0c85e4ef --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_adhoc_control_panel.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="Dzwoń" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Zakończ rozmowę" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Przełączniki głosu" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml new file mode 100644 index 0000000000..f49d820938 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_bottomtray.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/> + <string name="SpeakBtnToolTip" value="Włącza/wyłącza mikrofon"/> + <string name="VoiceControlBtnToolTip" value="Pokazuje/Ukrywa panel kontroli głosu"/> + <layout_stack name="toolbar_stack"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gesturki" name="Gesture" tool_tip="Pokazuje/Ukrywa gesturki"/> + </layout_panel> + <layout_panel name="cam_panel"> + <bottomtray_button label="Widok" name="camera_btn" tool_tip="Pokaż/Ukryj ustawienia kamery"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Atrakcje turystyczne" name="destination_btn" tool_tip="Pokaż okno dotyczące ludzi"/> + </layout_panel> + <layout_panel name="avatar_and_destinations_panel"> + <bottomtray_button label="Mój awatar" name="avatar_btn"/> + </layout_panel> + <layout_panel name="people_panel"> + <bottomtray_button label="Ludzie" name="show_people_button" tool_tip="Pokazuje okno dotyczące ludzi"/> + </layout_panel> + <layout_panel name="profile_panel"> + <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Pokazuje okno profilu."/> + </layout_panel> + <layout_panel name="howto_panel"> + <bottomtray_button label="POMOC" name="show_help_btn" tool_tip="Otwiera temat pomocy Second Life"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Rozmowy"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Ogłoszenia"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml new file mode 100644 index 0000000000..074f572a4c --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_group_control_panel.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="group_info_btn_panel"> + <button label="Grupa" name="group_info_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Dzwoń" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Zakończ rozmowę" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Otwórz kontroler głosu" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml new file mode 100644 index 0000000000..4aadd3b93b --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_im_control_panel.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Profil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Poznaj" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Udostępnij" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Zapłać" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Dzwoń" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Zakończ rozmowę" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Przełączniki głosu" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_login.xml b/indra/newview/skins/minimal/xui/pl/panel_login.xml new file mode 100644 index 0000000000..dc8e7399af --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_login.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + Użytkownik: + </text> + <combo_box name="username_combo" tool_tip="Nazwę użytkownika wybierasz przy rejestracji, np. bobsmith12 lub Steller Sunshine"/> + <text name="password_text"> + Hasło: + </text> + <check_box label="Zapamiętaj hasło" name="remember_check"/> + <button label="Połącz" name="connect_btn"/> + <text name="mode_selection_text"> + Tryb życia: + </text> + <combo_box name="mode_combo" tool_tip="Wybierz tryb życia. Wybierz tryb turystyczny dla łatwego zwiedzania i czatowania. Wybierz tryb zaawansowany aby mieć dostęp do większej ilości opcji."> + <combo_box.item label="Turystyczny" name="Basic"/> + <combo_box.item label="Zaawansowany" name="Advanced"/> + </combo_box> + <text name="start_location_text"> + Rozpocznij w: + </text> + <combo_box name="start_location_combo"> + <combo_box.item label="Ostatnie Miejsce" name="MyLastLocation"/> + <combo_box.item label="Moje Miejsce Startu" name="MyHome"/> + <combo_box.item label="<Wpisz Region>" name="Typeregionname"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + Utwórz nowe konto + </text> + <text name="forgot_password_text"> + Zapomniałeś swojej nazwy użytkownika lub hasła? + </text> + <text name="login_help"> + Potrzebujesz pomocy z logowaniem się? + </text> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml new file mode 100644 index 0000000000..b01e686c41 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Wróć do poprzedniej lokalizacji"/> + <pull_button name="forward_btn" tool_tip="Idź do następnej lokalizacji"/> + <button name="home_btn" tool_tip="Teleportuj do miejsca startu"/> + <location_input label="Lokalizacja" name="location_combo"/> + <search_combo_box label="Szukaj" name="search_combo_box" tool_tip="Szukaj"> + <combo_editor label="Szukaj [SECOND_LIFE]" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!"> + <label name="favorites_bar_label" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!"> + Pasek Ulubionych + </label> + <chevron_button name=">>" tool_tip="Pokaż więcej Moich Ulubionych"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_people.xml b/indra/newview/skins/minimal/xui/pl/panel_people.xml new file mode 100644 index 0000000000..dbfee739f4 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_people.xml @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Ludzie" name="people_panel"> + <string name="no_recent_people" value="Brak ostatnich rozmówców. Chcesz spotkać ludzi? Skorzystaj z przycisku "Atrakcje turystyczne" poniżej."/> + <string name="no_filtered_recent_people" value="Brak ostatnich rozmówców posiadających wskazane imię."/> + <string name="no_one_near" value="Nie ma nikogo w pobliżu. Chcesz spotkać ludzi? Skorzystaj z przycisku "Atrakcje turystyczne" poniżej."/> + <string name="no_one_filtered_near" value="Nie ma nikogo o wskazanym imieniu w pobliżu."/> + <string name="no_friends_online" value="Brak dostępnych znajomych"/> + <string name="no_friends" value="Brak znajomych"/> + <string name="no_friends_msg"> + Kliknij prawym przyciskiem na Rezydenta aby dodać go do listy znajomych. +Chcesz spotkać ludzi? Skorzystaj z przycisku "Atrakcje turystyczne" poniżej. + </string> + <string name="no_filtered_friends_msg"> + Nie znaleziono tego czego szukasz? Skorzystaj z przycisku "Atrakcje turystyczne" poniżej. + </string> + <string name="people_filter_label" value="Filtruj ludzi"/> + <string name="groups_filter_label" value="Filtruj grupy"/> + <string name="no_filtered_groups_msg" value="Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/groups/[SEARCH_TERM] Szukaj]."/> + <string name="no_groups_msg" value="Chcesz dołączyć do grup? Spróbuj [secondlife:///app/search/groups Szukaj]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie otwiera mapę, wciśnij Shift i przeciągnij myszką aby przesunąć)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie aktywuje teleportację, wciśnij Shift i przeciągnij myszką aby przesunąć)"/> + <filter_editor label="Filtr" name="filter_input"/> + <tab_container name="tabs"> + <panel label="W POBLIŻU" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="nearby_view_sort_btn" tool_tip="Opcje"/> + <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/> + </panel> + </panel> + <panel label="ZNAJOMI" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="Dostępni"/> + <accordion_tab name="tab_all" title="Wszyscy"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <layout_stack name="bottom_panel"> + <layout_panel name="options_gear_btn_panel"> + <menu_button name="friends_viewsort_btn" tool_tip="Pokaż opcje dodatkowe"/> + </layout_panel> + <layout_panel name="add_btn_panel"> + <button name="add_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/> + </layout_panel> + <layout_panel name="trash_btn_panel"> + <dnd_button name="del_btn" tool_tip="Usuń zaznaczoną osobę ze swojej listy znajomych"/> + </layout_panel> + </layout_stack> + </panel> + </panel> + <panel label="GRUPY" name="groups_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="groups_viewsort_btn" tool_tip="Opcje"/> + <button name="plus_btn" tool_tip="Dołącz do grupy/Stwórz nową grupę"/> + <button name="activate_btn" tool_tip="Aktywuj wybraną grupę"/> + </panel> + </panel> + <panel label="OSTATNIE" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="recent_viewsort_btn" tool_tip="Opcje"/> + <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <layout_stack name="bottom_bar_ls"> + <layout_panel name="view_profile_btn_lp"> + <button label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="IM" name="im_btn" tool_tip="Otwórz wiadomości IM"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Dzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Udostępnij" name="share_btn" tool_tip="Udostępnij obiekt z Szafy"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleport"/> + </layout_panel> + </layout_stack> + <layout_stack name="bottom_bar_ls1"> + <layout_panel name="group_info_btn_lp"> + <button label="Profil grupy" name="group_info_btn" tool_tip="Pokaż informacje o grupie"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Czat grupy" name="chat_btn" tool_tip="Otwórz sesję czatu"/> + </layout_panel> + <layout_panel name="group_call_btn_lp"> + <button label="Rozmowa głosowa w grupie" name="group_call_btn" tool_tip="Rozmowa głosowa w tej grupie"/> + </layout_panel> + </layout_stack> + </panel> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..95cd7c53dc --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_side_tray_tab_caption.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Schowek"/> + <button name="undock" tool_tip="Odłącz"/> + <button name="dock" tool_tip="Przyłącz"/> + <button name="show_help" tool_tip="Pomoc"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml b/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml new file mode 100644 index 0000000000..6aa0d27bb8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/pl/panel_status_bar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Niedziela:Poniedziałek:Wtorek:Środa:Czwartek:Piątek:Sobota + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + Styczeń:Luty:Marzec:Kwiecień:Maj:Czerwiec:Lipiec:Styczeń:Wrzesień:Październik:Listopad:Grudzień + </panel.string> + <panel.string name="packet_loss_tooltip"> + Utracone pakiety + </panel.string> + <panel.string name="bandwidth_tooltip"> + Przepustowość + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="balance_bg"> + <text name="balance" tool_tip="Kliknij aby odświeżyć bilans L$" value="L$20"/> + <button label="Kup L$" name="buyL" tool_tip="Kliknij aby kupić więcej L$"/> + </panel> + <text name="TimeText" tool_tip="Obecny czas (Pacyficzny)"> + 24:00 AM PST + </text> + <button name="media_toggle_btn" tool_tip="Start/Stop wszystkie media (Muzyka, Video, WWW)"/> + <button name="volume_btn" tool_tip="Regulacja głośności"/> +</panel> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f0b1973fdf..450d274fd7 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -114,6 +114,16 @@ class ViewerManifest(LLManifest): # Files in the newview/ directory self.path("gpu_table.txt") + # The summary.json file gets left in the base checkout dir by + # build.sh. It's only created for a build.sh build, therefore we + # have to check whether it exists. :-P + summary_json = "summary.json" + summary_json_path = os.path.join(os.pardir, os.pardir, summary_json) + if os.path.exists(os.path.join(self.get_src_prefix(), summary_json_path)): + self.path(summary_json_path, summary_json) + else: + print "No %s" % os.path.join(self.get_src_prefix(), summary_json_path) + def login_channel(self): """Channel reported for login and upgrade purposes ONLY; used for A/B testing""" @@ -939,9 +949,9 @@ class Linux_i686Manifest(LinuxManifest): self.path("libdb-5.1.so") self.path("libdb-5.so") self.path("libdb.so") - self.path("libcrypto.so.0.9.8") + self.path("libcrypto.so.1.0.0") self.path("libexpat.so.1.5.2") - self.path("libssl.so.0.9.8") + self.path("libssl.so.1.0.0") self.path("libuuid.so") self.path("libuuid.so.16") self.path("libuuid.so.16.0.22") diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index e9d4d99753..884b00f0cc 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2008&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2011, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -2154,6 +2154,10 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e } break; + case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: + std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE, uri is: " << self->getClickURL() << std::endl; + break; + case MEDIA_EVENT_CLICK_LINK_HREF: { std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl; @@ -2233,7 +2237,13 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e case MEDIA_EVENT_LINK_HOVERED: { std::cerr << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << std::endl; - }; + } + break; + + default: + { + std::cerr << "Media event: <unknown>, code is: " << int(event) << std::endl; + } break; } } diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt index fe64926da6..7720619df3 100644 --- a/indra/viewer_components/login/CMakeLists.txt +++ b/indra/viewer_components/login/CMakeLists.txt @@ -9,13 +9,11 @@ endif(LL_TESTS) include(LLCommon) include(LLMath) include(LLXML) -include(Pth) include_directories( ${LLCOMMON_INCLUDE_DIRS} ${LLMATH_INCLUDE_DIRS} ${LLXML_INCLUDE_DIRS} - ${PTH_INCLUDE_DIRS} ) set(login_SOURCE_FILES @@ -42,7 +40,6 @@ target_link_libraries(lllogin ${LLCOMMON_LIBRARIES} ${LLMATH_LIBRARIES} ${LLXML_LIBRARIES} - ${PTH_LIBRARIES} ) if(LL_TESTS) @@ -50,11 +47,5 @@ if(LL_TESTS) lllogin.cpp ) - set_source_files_properties( - lllogin.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${PTH_LIBRARIES}" - ) - LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}") endif(LL_TESTS) diff --git a/install.xml b/install.xml new file mode 100644 index 0000000000..889386b336 --- /dev/null +++ b/install.xml @@ -0,0 +1,1851 @@ +<?xml version="1.0" ?> +<llsd> +<map> + <key>installables</key> + <map> + <key>GL</key> + <map> + <key>copyright</key> + <string>Copyright (c) 1991-2000 Silicon Graphics, Inc.</string> + <key>description</key> + <string>A standard for 3D Graphics rendering engine.</string> + <key>license</key> + <string>GL</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>0bd2795a2afe09f6c563f2f888f24cc9</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-darwin-20080613.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>2ab29212a7f3acdaebf10059af816be0</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20080812.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>9c3dff3817f1105f9054401fdef1fe50</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>91155239b02f576384603795d41eb971</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-windows-20090505.tar.bz2</uri> + </map> + </map> + </map> + <key>SDL</key> + <map> + <key>copyright</key> + <string>Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga</string> + <key>description</key> + <string>The Simple DirectMedia Layer libraries are used for handling input and basic window/GL setup on the Linux client. Packages also include cursors.</string> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>fce0ff7d2cdf0f36c1647e6a3916e29e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.12-linux-20090218.tar.bz2</uri> + </map> + </map> + </map> + <key>apr_suite</key> + <map> + <key>license</key> + <string>apache 2.0</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>115d8ac44a91efdb173e9b3e478c46b6</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.3.7-darwin-20090805.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>7b84cd6a3c601a104d9c09e58ef2f50c</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-20080812.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>1a7e1186855d48d8316ce86803095f70</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux64-20080909a.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>a02619c1e30a3db02d3883bf1ad7a1e6</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.3.8-windows-20090911.tar.bz2</uri> + </map> + </map> + </map> + <key>ares</key> + <map> + <key>copyright</key> + <string>Copyright 1998 by the Massachusetts Institute of Technology.</string> + <key>description</key> + <string>Performs DNS requests and name resolves asynchronously. Used with libcurl to keep all HTTP operations async.</string> + <key>license</key> + <string>c-ares</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>cdb2f5c4a5a1f9ecd75bc1dbdd4db8e9</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20100606.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>91694429e391efeea1de974df26032a2</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-linux-20100527.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>c4242416e0b2e642c0bf062a19a250e4</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>4b84738eec2e21b0c096d53b79ee2681</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-windows-20100611a.tar.bz2</uri> + </map> + </map> + </map> + <key>artwork-common</key> + <map> + <key>copyright</key> + <string>(C) 2008 Linden Research, Inc.</string> + <key>description</key> + <string>Second Life(TM) Viewer Artwork</string> + <key>license</key> + <string>artwork</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>5e047437d73d1017bf270a6c6e936f23</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/artwork-common-20090415.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>5e047437d73d1017bf270a6c6e936f23</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/artwork-common-20090415.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>5e047437d73d1017bf270a6c6e936f23</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/artwork-common-20090415.tar.bz2</uri> + </map> + </map> + </map> + <key>berkeley</key> + <map> + <key>copyright</key> + <string>Copyright (c) 1990-1999 Sleepycat Software. All rights reserved.</string> + <key>description</key> + <string>a high-performance, embedded database library</string> + <key>license</key> + <string>sleepycat</string> + </map> + <key>boost</key> + <map> + <key>copyright</key> + <string>various</string> + <key>description</key> + <string>A set of portable C++ libraries which provide a wide set of functionality. </string> + <key>license</key> + <string>boost</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>71defd179827bf172b76d6020023e0e8</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20100222a.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>4db3d74e40d149eeec06f4d97a609bb1</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100624.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>af4badd6b2c10bc4db82ff1256695892</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux64-20100119.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>72e6e2eff5d146a107f3059b6c31fb95</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100630.tar.bz2</uri> + </map> + </map> + </map> + <key>curl</key> + <map> + <key>copyright</key> + <string>Copyright (c) 1996 - 2008, Daniel Stenberg, <daniel@haxx.se>.</string> + <key>description</key> + <string>Client-side URL transfer library. Handles moving data across the net in many different protocols. Used to GET/POST/PUT/DELETE web resources. </string> + <key>license</key> + <string>curl</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>ca8f0134fa5ab6f34a6eeb8d0896c9b0</string> + <key>url</key> + <uri>https://s3.amazonaws.com/automated-builds-secondlife-com/hg/repo/brad_curl-autobuild/rev/216961/arch/Darwin/installer/curl-7.21.1-darwin-20101214.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>9c9b629b62bf874d550c430ad678dc04</string> + <key>url</key> + <uri>https://s3.amazonaws.com/automated-builds-secondlife-com/hg/repo/brad_curl-autobuild/rev/216961/arch/Linux/installer/curl-7.21.1-linux-20101215.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>6994192cea7ab2d885a158a3de474273</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4a-linux64-20090303.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>48691883065a82d53691d73aae81d4c1</string> + <key>url</key> + <uri>https://s3.amazonaws.com/automated-builds-secondlife-com/hg/repo/brad_curl-autobuild/rev/216961/arch/CYGWIN/installer/curl-7.21.1-windows-20101214.tar.bz2</uri> + </map> + </map> + </map> + <key>dbghelp</key> + <map> + <key>copyright</key> + <string>Copyright Microsoft Corporation</string> + <key>description</key> + <string>dbghelp: Debug helper from Microsoft Debugging Tools For Windows</string> + <key>license</key> + <string>MSDTW</string> + <key>packages</key> + <map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>b7563064037e032143ca2d610aae5153</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbghelp-6.11.1.404-windows-20090520.tar.bz2</uri> + </map> + </map> + </map> + <key>dbusglib</key> + <map> + <key>copyright</key> + <string>Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.</string> + <key>description</key> + <string>dbus/dbus-glib: headers only</string> + <key>license</key> + <string>AFL2.1</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>eb25444142d4102b0ce1b7ffaadb071e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbusglib-linux-20080707.tar.bz2</uri> + </map> + </map> + </map> + <key>elfio</key> + <map> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>82ea408af2f968cfe5f013ab241323ef</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-20080812.tar.bz2</uri> + </map> + </map> + </map> + <key>expat</key> + <map> + <key>copyright</key> + <string>Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd</string> + <key>description</key> + <string>An XML parser library written in C. It is a stream-oriented parser in which an application registers handlers for things the parser might find in the XML document (like start tags).</string> + <key>license</key> + <string>mit</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>c457a0a041ac4946265889a503d26c3d</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20090805.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>67b470fd446b08c9831d1039674eae4e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-20080812.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>278c61871419b9a4d50a4f88b7922403</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>5dbbdb4a9b5bec86d180ef20a5f8ccfb</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-windows-20090917.tar.bz2</uri> + </map> + </map> + </map> + <key>fmod</key> + <map> + <key>copyright</key> + <string>FMOD Sound System, copyright (C) Firelight Technologies Pty, Ltd., 1994-2006.</string> + <key>description</key> + <string>Audio engine and mp3 stream decoder .</string> + <key>license</key> + <string>fmod</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>261bcd3387066cf0a1d46549400052b5</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-darwin-20101007.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>8490d97430c12c2e1ac19ff80a8d4db4</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-20101007.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>bab1babcb01ff9849b7f072d352e1ecd</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-windows-20101007.tar.bz2</uri> + </map> + </map> + </map> + <key>fontconfig</key> + <map> + <key>license</key> + <string>mit</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>9af6a1ed39fa540bfcaa402b0ea22f78</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-20080613.tar.bz2</uri> + </map> + </map> + </map> + <key>freeglut</key> + <map> + <key>license</key> + <string>mit</string> + <key>packages</key> + <map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>fcbb695ff203775fad96d184bf5f34fc</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freeglut-2.4.0-windows-20090608.tar.bz2</uri> + </map> + </map> + </map> + <key>freetype</key> + <map> + <key>copyright</key> + <string>Copyright</string> + <key>description</key> + <string>Font</string> + <key>license</key> + <string>freetype</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>f00144dfb597140f328774c3244f0c3e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-darwin-20090922.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>9de3f44be65645c7f6af236139596942</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-linux-2010-02-19a-nommap.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>35f6fa557ba90f9cda0a18d1af2055a4</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>88980fd6d91ac541b62dea877ebe6ba6</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-windows-20090917.tar.bz2</uri> + </map> + </map> + </map> + <key>glh_linear</key> + <map> + <key>copyright</key> + <string>Copyright (c) 2000 Cass Everitt; Copyright (c) 2000 NVIDIA Corporation; All rights reserved.</string> + <key>description</key> + <string>nVidia NVParse SDK: platform-indepenedent C++ Apple OpenGL helper library</string> + <key>license</key> + <string>glh_linear</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>23bd9a75e5a2365a827461e6c324f52b</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-darwin-20080613.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>23bd9a75e5a2365a827461e6c324f52b</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080812.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>2965646aea1d2a6aec1fbc431c02733f</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080613.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>38b9ddfe8dceff55ee4351016a937d1b</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-windows-20080613.tar.bz2</uri> + </map> + </map> + </map> + <key>glib</key> + <map> + <key>description</key> + <string>GLib is a library containing many useful C routines for things such as trees, hashes, and lists.</string> + <key>license</key> + <string>gpl</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>6cc5ce1fafd10299fdb890b3d4c3cf53</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-darwin-20080817.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>2f1a9e14f9213c2c9564c1c1cfdd6d47</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-linux-20080817.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>3d5e29d444dde4815b36082eedfc775a</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-windows-20080817.tar.bz2</uri> + </map> + </map> + </map> + <key>glui</key> + <map> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>84f792a860691d0fad6d1de6eeb31baa</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.36-darwin-20090623a.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>5b8631fe510d4ebaeb965c673937e1e7</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.3.6-windows-freeglut-20090608.tar.bz2</uri> + </map> + </map> + </map> + <key>google</key> + <map> + <key>license</key> + <string>mit</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>40db900872612615e849f17cbdfd2c27</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-linux-20080812.tar.bz2</uri> + </map> + </map> + </map> + <key>google-perftools</key> + <map> + <key>copyright</key> + <string>Copyright (c) 2005, Google Inc.</string> + <key>description</key> + <string>Heap performance and validity checking tools from google. Includes TCMalloc, heap-checker, heap-profiler and cpu-profiler.</string> + <key>license</key> + <string>bsd</string> + <key>packages</key> + <map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>32dba32ddd460a08e082898ebba6315c</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-perftools-1.0-windows-20090406.tar.bz2</uri> + </map> + </map> + </map> + <key>google_breakpad</key> + <map> + <key>copyright</key> + <string>Copyright (c) 2006, Google Inc.</string> + <key>description</key> + <string>An open-source multi-platform crash reporting system </string> + <key>license</key> + <string>bsd</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>ced4010b59f1a579caa7fe3c18512499</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20100528a.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>29c3e7dad60bbf02c811786436d99523</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20100521b.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>0859d47242990125f17eaab30bece2ff</string> + <key>url</key> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/google_breakpad-0.0.0-rev599-windows-20100524.tar.bz2</uri> + </map> + </map> + </map> + <key>googlemock</key> + <map> + <key>copyright</key> + <string>Copyright 2008, Google Inc.</string> + <key>description</key> + <string>Google C++ Mocking Framework (or Google Mock for short) is a library for writing and using C++ mock classes.</string> + <key>license</key> + <string>bsd</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>4863e9fea433d0a4be761ea5d3e8346a</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-darwin-20090626.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>877dabecf84339690191c6115c76366e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-linux32-20090527.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>f601a82ea91030974072da8924cae41e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-windows-20090921.tar.bz2</uri> + </map> + </map> + </map> + <key>gstreamer</key> + <map> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>c829b638b6eef71ca63418cb9aea46a2</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20080613.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>befc7520fe01250f39458f65c29bc584</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux64-20080909.tar.bz2</uri> + </map> + </map> + </map> + <key>gtk-atk-pango-glib</key> + <map> + <key>copyright</key> + <string>Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald</string> + <key>description</key> + <string>Libraries associated with GTK for gui features. atk: interfaces for accessibility; glib: low-level core functionality for using GTK+ and GNOME; pango: layout/rendering of text w/ emphasis on internationalization.</string> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>21c16a74f8fc9a62e3ab944a6eb7403d</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080616.tar.bz</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>d963750bcd333a108b3697d220c87d09</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-windows-20080613.tar.bz2</uri> + </map> + </map> + </map> + <key>havok</key> + <map> + <key>copyright</key> + <string>on file</string> + <key>description</key> + <string>Physics engine for the simulator</string> + <key>license</key> + <string>havok</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>f64c08771a4fc456db2a55b47302078b</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-darwin-20080812.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>af7b1fc9072443009f19e43fb3c8342f</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-20081029.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>cd4076d6caf5fabff36bf48bd01e4ba8</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux64-20081030.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>f25fbb29c2275267233c79f0c68ca37f</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-windows-20081030.tar.bz2</uri> + </map> + </map> + </map> + <key>jpeglib</key> + <map> + <key>copyright</key> + <string>Copyright (c) 2003, Yves Piguet.</string> + <key>description</key> + <string>An open-source JPEG (JFIF) library</string> + <key>license</key> + <string>jpeglib</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>8d38d74c481e9aab4518c8f2a7d52800</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-darwin-20080812.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>8aa8e01e0c21f60f0ede0ffb04e9214f</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20081218.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>0e7facf7d48531d20c0cd6a3c3f04021</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>6a6bb0143a2561e3276dab4bcfa425ef</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-windows-20090917a.tar.bz2</uri> + </map> + </map> + </map> + <key>jsoncpp</key> + <map> + <key>copyright</key> + <string>json-cpp library released to Public Domain by Baptiste Lepilleur <blep@users.sourceforge.net></string> + <key>description</key> + <string>jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++.</string> + <key>license</key> + <string>jsoncpp</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>4c6b949778099a63550898f00f3e6a5e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-darwin-20090923.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>a2a94b8ca1d32f23e3e668d64023514e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-linux-20090922.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>a06ab38628ab7b53b8f3326cd942a6a8</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-linux64-20090922.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>caf152cfc730737c124f7612cf68fbd3</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-svn-r69-windows-20090922.tar.bz2</uri> + </map> + </map> + </map> + <key>kdu</key> + <map> + <key>copyright</key> + <string>on file</string> + <key>description</key> + <string>Kakadu (KDU) JPEG-2000 decoder library. </string> + <key>license</key> + <string>kdu</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>8261994de5af6581e08c26fefe1b2810</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-6.4.1-darwin-20101123.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>ed3e58899a424684dad49c94ba3813e7</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-6.4.1-linux-20101124.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>066e089a5d9faeaf131e1f4e4860a163</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-6.4.1-windows-20101123.tar.bz2</uri> + </map> + </map> + </map> + <key>libmono</key> + <map> + <key>copyright</key> + <string>(C) 2005 Novell, Inc. http://www.novell.com</string> + <key>description</key> + <string>An open source implementation of the ECMA/ISO ECMA-334 Common L\ +anguage Infrstructure (CLI) international standard</string> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>39a803fcbe6f11b72358fc78b7777b6c</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-darwin-20080724.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>9bc0f8b7d5e0ff194b6d5635daf9ae3a</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux-20080816a.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>451521b4cb57c35caf3efb8dcf99b99e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux64-20080926.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>6712a09311a914752f47d5d62562a239</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-windows-20080903.tar.bz2</uri> + </map> + </map> + </map> + <key>libpng</key> + <map> + <key>copyright</key> + <string>Copyright (c) 2004, 2006-2008 Glenn Randers-Pehrson</string> + <key>description</key> + <string>An open, extensible image format with lossless compression. PNG Reference Library </string> + <key>license</key> + <string>libpng</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>82659b48831cbf58bf04b86602939e0b</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-darwin-20090304.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>f5e84c991f6e3caacb26db259593cbea</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-linux-20090304.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>5ee1e62bde38520c7f134c4afb9ac9b1</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-linux64-20090304.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>c781cd9846cf20afb90ac40ad1a0ce9d</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-windows-20090917.tar.bz2</uri> + </map> + </map> + </map> + <key>libuuid</key> + <map> + <key>copyright</key> + <string>Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/></string> + <key>description</key> + <string>Generates UUIDs under Linux. Originally a part of the ext2fs filesystem. Also see lluuid.cpp for all platforms. Part of the e2fsprogs package.</string> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>91b194aed4b38bc23493b198009a8c6a</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20090417.tar.bz2</uri> + </map> + </map> + </map> + <key>libxml</key> + <map> + <key>license</key> + <string>mit</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>4b5d2dcfe8a49b73fb69f10aab441092</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20080613.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>921d7f980519101afb74623e29e9d175</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux64-20080909.tar.bz2</uri> + </map> + </map> + </map> + <key>llqtwebkit</key> + <map> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>f07b063cdc207479b111576dc74127f0</string> + <key>url</key> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-darwin-qt4.7.1-20110322.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>5d743c93b970abe685b185de83001a6e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20100923.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>1e66b1ecab911a60ba50b59361ef62e1</string> + <key>url</key> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.7.1-20110317.tar.bz2</uri> + </map> + </map> + </map> + <key>mesa</key> + <map> + <key>copyright</key> + <string>Copyright (C) 1999-2007 Brian Paul All Rights Reserved.</string> + <key>description</key> + <string>Mesa 3-D graphics library. Provides the required Apple OpenGL headers under Linux.</string> + <key>license</key> + <string>mesa</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>70d0bbe1145fff29a0131349c898260e</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20080812.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>56630977f9261bd82039b0da08a0685c</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-6.2.1-linux64-20081016.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>82cdcdcb2d0615389a7480485ea35f4c</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-windows-20080613.tar.bz2</uri> + </map> + </map> + </map> + <key>mysql</key> + <map> + <key>license</key> + <string>gpl</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>df27f2db244ea2762759a06cd75ada4e</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysql-darwin-20080812.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>cc86b4cc858655e23704d1168325d7b9</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysqlclient-linux-20090320.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>98bac06680dca907e783d8dd4aa9edde</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysql-windows-20080804.tar.bz2</uri> + </map> + </map> + </map> + <key>ndofdev</key> + <map> + <key>copyright</key> + <string>Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved.</string> + <key>description</key> + <string>in use on windows and darwin for joystick support.</string> + <key>license</key> + <string>linden</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>17999c47e17f2dd9e12a22372ce8ff14</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-darwin-20080812.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>9469c3732a33a154fa0a2807b9f36ccc</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-0.2-20080828.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>f0df8a1e60991095e3adca1450b8c9c0</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-windows-20090917.tar.bz2</uri> + </map> + </map> + </map> + <key>ogg-vorbis</key> + <map> + <key>copyright</key> + <string>Copyright (C) 2008 Xiph.org Foundation</string> + <key>description</key> + <string>Ogg: container format Vorbis: audio compression scheme</string> + <key>license</key> + <string>ogg-vorbis</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>a6843398b780645c4897c9776c688926</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080812.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>6dc0536329a0aadf76e3054ffd4da61c</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux-20081201.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>964c71e6ee22be1bcaf6d480e74cdd14</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>9bf1fea65e66b2cd3075e6ffd7eb57ad</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.1.3-1.2.0-windows-20080723.tar.bz2</uri> + </map> + </map> + </map> + <key>openSSL</key> + <map> + <key>license</key> + <string>openSSL</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>11d2be4f2b172430747b7d4a6739e3d8</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8l-darwin-20100428.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>f219ef07b02e2abb9282345c3a8f2b39</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080812.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>00b23f28a2457d9dabbaff0b29ee7323</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8g-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>dd85209081b832e836de6e1538541d89</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8j-windows-20090129.tar.bz2</uri> + </map> + </map> + </map> + <key>openal-soft</key> + <map> + <key>copyright</key> + <string>Copyright (C) 2008 by authors.</string> + <key>description</key> + <string>3D Audio library</string> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>a0757244e3e6688fde2ffeea35cc1f96</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-darwin-20080924.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>75a7004ab14bea46594b1c652f1a6040</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-linux-20100120-3ad86a1c.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>5ad0a3ab623356c1ad61394ba238f99f</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-soft-1.6.372-linux64-20081219.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>a0757244e3e6688fde2ffeea35cc1f96</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-windows-20080924.tar.bz2</uri> + </map> + </map> + </map> + <key>openjpeg</key> + <map> + <key>copyright</key> + <string>Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium</string> + <key>description</key> + <string>An open-source JPEG-2000 library; a slower alternative to Kadaku. Used in the open source release </string> + <key>license</key> + <string>openjpeg</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>23313fda213a2496945435db2a0ee78b</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3.0-darwin-20090501.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>02af0dad64803e0d821bc09e6038682c</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3-linux-20081124b.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>44f1bc9d47e4a54fc274c213f2cb565f</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2.0-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>41541a98106894e28a6bf585010fea65</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3-windows-20090407.tar.bz2</uri> + </map> + </map> + </map> + <key>pulseaudio</key> + <map> + <key>copyright</key> + <string>Copyright 2004-2006 Lennart Poettering, Copyright 2006 Pierre Ossman (ossman@cendio.se) for Cendio AB</string> + <key>description</key> + <string>pulseaudio: headers only</string> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>30cb00069fe2a545fbf7be1070386236</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri> + </map> + </map> + </map> + <key>quicktime</key> + <map> + <key>copyright</key> + <string>Copyright (C) 1990-2007 by Apple Computer, Inc., all rights reserved.</string> + <key>description</key> + <string>Separate download. Used to play in-world video clips on a prim. </string> + <key>license</key> + <string>quicktime</string> + <key>packages</key> + <map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>be45825cc14ede53790ac93c58307dcb</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/quicktime-sdk-windows-7.3-20091110.tar.bz2</uri> + </map> + </map> + </map> + <key>smartheap</key> + <map> + <key>copyright</key> + <string>Copyright (C) 1991-2000 Compuware Corporation. All Rights Reserved.</string> + <key>description</key> + <string>Memory Management Library</string> + <key>license</key> + <string>smartheap</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>f54131b5f228e805c64c2e4e6c96579a</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-darwin-20080610.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>499208522bf7d7843e1d014d64214e06</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-linux-20080610.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>78fd47017f21d11eae43bca3e38a3e1e</string> + <key>url</key> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-windows-20080611.tar.bz2</uri> + </map> + </map> + </map> + <key>tut</key> + <map> + <key>copyright</key> + <string>Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008 Michal Rzechonek</string> + <key>description</key> + <string>C++ Template Unit Test</string> + <key>license</key> + <string>bsd</string> + <key>packages</key> + <map> + <key>common</key> + <map> + <key>md5sum</key> + <string>a1b8a118ba9df1f2a73f6aafa7980e83</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-2008-11-30-common-20081208.tar.bz2</uri> + </map> + </map> + </map> + <key>unistd</key> + <map> + <key>copyright</key> + <string>(c) 2008 Linden Lab.</string> + <key>description</key> + <string>Placeholder file to make flex happy on windows.</string> + <key>license</key> + <string>linden</string> + <key>packages</key> + <map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>6353aff33d7d03b22055aec76f53a866</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/unistd-windows-20080611.tar.bz2</uri> + </map> + </map> + </map> + <key>slvoice</key> + <map> + <key>copyright</key> + <string> </string> + <key>license</key> + <string>vivox</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>2f9b3528d4b5f858fb8dcee4b6dd5188</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-darwin-20101117a.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>cde4728b8a75a76c72a8785815cb769f</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-linux-20101117a.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>940ac55a6d0141c958bf2b14939d8474</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-windows-20101117a.tar.bz2</uri> + </map> + </map> + </map> + <key>xmlrpc-epi</key> + <map> + <key>copyright</key> + <string>Copyright 2000 Epinions, Inc.</string> + <key>description</key> + <string>Implementation of the xmlrpc protocol in C that provides an API for developers to serialize RPC requests to and from XML. </string> + <key>license</key> + <string>xmlrpc-epi</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>2d3a918c88d756422c1a8139ebe15f56</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-darwin-20080812.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>84a219199240ea70f54439c02acef0cd</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-20080812.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>dc67b896c56116df8e18f2d1bbd07031</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>262629bcaa39dcf7266caa50da01a599</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-windows-20091016.tar.bz2</uri> + </map> + </map> + </map> + <key>zlib</key> + <map> + <key>copyright</key> + <string>Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler</string> + <key>description</key> + <string>A Massively Spiffy Yet Delicately Unobtrusive Compression Library (Also Free, Not to Mention Unencumbered by Patents)</string> + <key>license</key> + <string>zlib</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>c844e1b05723ce078dbbd5aea9cdd3ad</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-darwin-20080818.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>26fe88213c213dc6153690ab142c25ca</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3dfsg-linux-20091208.tar.bz2</uri> + </map> + <key>linux64</key> + <map> + <key>md5sum</key> + <string>4bddfb2c6dd7b1470a3ed675ac14bd9a</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-linux64-20080909.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>73baf52a740d151fddbc2a008369c462</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-windows-20090921.tar.bz2</uri> + </map> + </map> + </map> + </map> + <key>licenses</key> + <map> + <key>AFL2.1</key> + <map> + <key>url</key> + <string>http://opensource-definition.org/licenses/afl-2.1.html</string> + </map> + <key>GL</key> + <map> + <key>url</key> + <string>http://www.xfree86.org/4.4.0/LICENSE9.html#sgi</string> + </map> + <key>MSDTW</key> + <map> + <key>text</key> + <string>MICROSOFT SOFTWARE LICENSE TERMS +MICROSOFT DEBUGGING TOOLS FOR WINDOWS +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of +its affiliates) and you. Please read them. They apply to the software named above, which includes the +media on which you received it, if any. The terms also apply to any Microsoft +* updates, +* supplements, +* Internet-based services +* support services, and +* Debugging symbol files that you may access over the internet +for this software, unless other terms accompany those items. If so, those terms apply. +By using the software, you accept these terms. If you do not accept them, do not use the +software. +If you comply with these license terms, you have the rights below. +1. INSTALLATION AND USE RIGHTS. One user may install and use any number of copies of the +software on your devices to design, develop, debug and test your programs. +2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. +a. Distributable Code. The software contains code that you are permitted to distribute in programs +you develop if you comply with the terms below. +i. Right to Use and Distribute. The code and text files listed below are Distributable Code. +* REDIST.TXT Files. You may copy and distribute the object code form of code listed in +REDIST.TXT files. +* Sample Code. You may modify, copy, and distribute the source and object code form of +code marked as sample. +* Third Party Distribution. You may permit distributors of your programs to copy and +distribute the Distributable Code as part of those programs. +ii. Distribution Requirements. For any Distributable Code you distribute, you must +* add significant primary functionality to it in your programs; +* require distributors and external end users to agree to terms that protect it at least as much +as this agreement; +* display your valid copyright notice on your programs; and +* indemnify, defend, and hold harmless Microsoft from any claims, including attorneys fees, +related to the distribution or use of your programs. +iii. Distribution Restrictions. You may not +* alter any copyright, trademark or patent notice in the Distributable Code; +* distribute any symbol files which you may access or use under these license terms for the +software; +* use Microsofts trademarks in your programs names or in a way that suggests your +programs come from or are endorsed by Microsoft; +* distribute Distributable Code to run on a platform other than the Windows platform; +* include Distributable Code in malicious, deceptive or unlawful programs; or +* modify or distribute the source code of any Distributable Code so that any part of it +becomes subject to an Excluded License. An Excluded License is one that requires, as a +condition of use, modification or distribution, that +* the code be disclosed or distributed in source code form; or +* others have the right to modify it. +3. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights +to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights +despite this limitation, you may use the software only as expressly permitted in this agreement. In +doing so, you must comply with any technical limitations in the software that only allow you to use it in +certain ways. You may not +* work around any technical limitations in the software; +* reverse engineer, decompile or disassemble the software, except and only to the extent that +applicable law expressly permits, despite this limitation; +* make more copies of the software than specified in this agreement or allowed by applicable law, +despite this limitation; +* publish the software for others to copy; +* rent, lease or lend the software; +* transfer the software or this agreement to any third party; or +* use the software for commercial software hosting services. +4. INTERNET-BASED SERVICES. Microsoft provides Internet-based services with the software. It may +change or cancel them at any time. +a. Consent for Internet-Based Services. The software contains features which may connect to +Microsoft or service provider computer systems over the Internet. In some cases, you will not +receive a separate notice when they connect. You may switch these features on or you may +choose not to use them. For more information about these features, see +http://www.microsoft.com/info/privacy/default.mspx. By using these features, you consent to the transmission of +this information. Microsoft does not use the information to identify or contact you. +b. Misuse of Internet-based Services. You may not use these services in any way that could +harm them or impair anyone elses use of them. You may not use the services to try to gain +unauthorized access to any service, data, account or network by any means. + +5. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the +software. +6. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy +and use the documentation for your internal, reference purposes. +7. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You +must comply with all domestic and international export laws and regulations that apply to the software. +These laws include restrictions on destinations, end users and end use. For additional information, see +www.microsoft.com/exporting. +8. SUPPORT SERVICES. Because this software is as is, we may not provide support services for it. +9. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based +services and support services that you use, are the entire agreement for the software and support +services. +10. APPLICABLE LAW. +a. United States. If you acquired the software in the United States, Washington state law governs +the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of +laws principles. The laws of the state where you live govern all other claims, including claims under +state consumer protection laws, unfair competition laws, and in tort. +b. Outside the United States. If you acquired the software in any other country, the laws of that +country apply. +11. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the +laws of your country. You may also have rights with respect to the party from whom you acquired the +software. This agreement does not change your rights under the laws of your country if the laws of +your country do not permit it to do so. +12. DISCLAIMER OF WARRANTY. The software is licensed as-is. You bear the risk of using +it. Microsoft gives no express warranties, guarantees or conditions. You may have +additional consumer rights under your local laws which this agreement cannot change. To +the extent permitted under your local laws, Microsoft excludes the implied warranties of +merchantability, fitness for a particular purpose and non-infringement. +13. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. You can recover from +Microsoft and its suppliers only direct damages up to U.S. $5.00. You cannot recover any +other damages, including consequential, lost profits, special, indirect or incidental +damages. +This limitation applies to +* anything related to the software, services, content (including code) on third party Internet sites, or +third party programs; and +* claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, +or other tort to the extent permitted by applicable law. +It also applies even if Microsoft knew or should have known about the possibility of the damages. The +above limitation or exclusion may not apply to you because your country may not allow the exclusion or +limitation of incidental, consequential or other damages. + </string> + </map> + <key>apache 2.0</key> + <map> + <key>url</key> + <string>http://www.apache.org/licenses/LICENSE-2.0</string> + </map> + <key>artwork</key> + <map> + <key>text</key> + <string>COPYRIGHT AND PERMISSION NOTICE + +Second Life(TM) Viewer Artwork. Copyright (C) 2008 Linden Research, Inc. + +Linden Research, Inc. ("Linden Lab") licenses the Second Life viewer +artwork and other works in the files distributed with this Notice under +the Creative Commons Attribution-Share Alike 3.0 License, available at +http://creativecommons.org/licenses/by-sa/3.0/legalcode. For the license +summary, see http://creativecommons.org/licenses/by-sa/3.0/. + +Notwithstanding the foregoing, all of Linden Lab's trademarks, including +but not limited to the Second Life brand name and Second Life Eye-in-Hand +logo, are subject to our trademark policy at +http://secondlife.com/corporate/trademark/. + +If you distribute any copies or adaptations of the Second Life viewer +artwork or any other works in these files, you must include this Notice +and clearly identify any changes made to the original works. Include +this Notice and information where copyright notices are usually included, +for example, after your own copyright notice acknowledging your use of +the Second Life viewer artwork, in a text file distributed with your +program, in your application's About window, or on a credits page for +your work. +</string> + <key>url</key> + <string>http://svn.secondlife.com/svn/linden/trunk/doc/LICENSE-logos.txt</string> + </map> + <key>boost</key> + <map> + <key>url</key> + <string>http://www.boost.org/LICENSE_1_0.txt</string> + </map> + <key>bsd</key> + <map> + <key>url</key> + <string>http://www.opensource.org/licenses/bsd-license.php</string> + </map> + <key>c-ares</key> + <map> + <key>text</key> + <string>http://daniel.haxx.se/projects/c-ares/license.html</string> + </map> + <key>curl</key> + <map> + <key>url</key> + <string>http://curl.haxx.se/docs/copyright.html</string> + </map> + <key>fmod</key> + <map> + <key>url</key> + <string>http://www.fmod.org/ifmodlicense.html</string> + </map> + <key>freetype</key> + <map> + <key>url</key> + <string>http://freetype.sourceforge.net/FTL.TXT</string> + </map> + <key>glh_linear</key> + <map> + <key>text</key> + <string>glh - is a platform-indepenedent C++ OpenGL helper library + +Copyright (c) 2000 Cass Everitt +Copyright (c) 2000 NVIDIA Corporation +All rights reserved. + +Redistribution and use in source and binary forms, with or +without modification, are permitted provided that the following +conditions are met: + +Redistributions of source code must retain the above +copyright notice, this list of conditions and the following +disclaimer. +Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following +disclaimer in the documentation and/or other materials +provided with the distribution. +The names of contributors to this software may not be used +to endorse or promote products derived from this software +without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Cass Everitt - cass@r3.nu + +</string> + </map> + <key>glut</key> + <map> + <key>url</key> + <string>http://www.xmission.com/~nate/glut/README-win32.txt</string> + </map> + <key>gpl</key> + <map> + <key>url</key> + <string>http://www.gnu.org/licenses/gpl.html</string> + </map> + <key>havok</key> + <map> + <key>text</key> + <string>on file</string> + </map> + <key>intel</key> + <map> + <key>text</key> + <string>Haven't yet found. +</string> + </map> + <key>jpeglib</key> + <map> + <key>text</key> + <string>http://nyctergatis.com/jpeglib/</string> + </map> + <key>jsoncpp</key> + <map> + <key>text</key> + <string>The json-cpp library and this documentation are in Public Domain. Retrieved from http://jsoncpp.sourceforge.net/ on 2009-09-04.</string> + <key>url</key> + <string>http://jsoncpp.sourceforge.net</string> + </map> + <key>kdu</key> + <map> + <key>text</key> + <string>jpeg2000 license #00024 (on file)</string> + </map> + <key>lgpl</key> + <map> + <key>url</key> + <string>http://www.gnu.org/copyleft/lgpl.html</string> + </map> + <key>libpng</key> + <map> + <key>text</key> + <string>http://www.libpng.org/pub/png/src/libpng-LICENSE.txt</string> + </map> + <key>linden</key> + <map> + <key>text</key> + <string>Using this license for Linden Lab owned library files</string> + </map> + <key>mesa</key> + <map> + <key>url</key> + <string>http://www.mesa3d.org/license.html</string> + </map> + <key>mit</key> + <map> + <key>text</key> + <string>http://www.jclark.com/xml/copying.txt</string> + </map> + <key>ogg-vorbis</key> + <map> + <key>url</key> + <string>http://www.xiph.org/licenses/bsd/</string> + </map> + <key>openSSL</key> + <map> + <key>url</key> + <string>http://www.openssl.org/source/license.html</string> + </map> + <key>openjpeg</key> + <map> + <key>url</key> + <string>http://www.openjpeg.org/BSDlicense.txt</string> + </map> + <key>quicktime</key> + <map> + <key>text</key> + <string>ENGLISH + +Apple Computer, Inc. +QuickTime 7 Software Developer Kit (SDK) +Software License Agreement + +PLEASE READ THIS SOFTWARE LICENSE AGREEMENT ("LICENSE") BEFORE USING THE SOFTWARE. BY USING THE SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE TERMS OF THIS LICENSE. IF YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, SIGNIFY YOUR AGREEMENT TO BE BOUND BY THE TERMS OF THIS LICENSE BY CLICKING THE "AGREE/ACCEPT" BUTTON. IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE, RETURN THE APPLE SOFTWARE TO THE PLACE WHERE YOU OBTAINED IT FOR A REFUND OR, IF THE SOFTWARE WAS ACCESSED ELECTRONICALLY, CLICK "DISAGREE/DECLINE". + +IMPORTANT NOTE: To the extent this software may be used to reproduce materials, it is licensed to you only for reproduction of materials you are authorized or legally permitted to reproduce. + +1. License. Any software, tools, utilities, sample code, documentation, fonts, API?s, header files and other materials accompanying this License, whether on disk, print or electronic documentation, in read only memory, or any other media, (collectively, the "Apple Software") are licensed, not sold, to you by Apple Computer, Inc. ("Apple") for use only under the terms of this License, and Apple reserves all rights not expressly granted to you. The rights granted herein are limited to Apple's and its licensors' intellectual property rights in the Apple Software and do not include any other patents or intellectual property rights. You own the media on which the Apple Software is recorded but Apple and/or Apple's licensor(s) retain ownership of the Apple Software itself. The Apple Software in this package and any copies, modifications and derivative works that this License authorizes you to make are subject to this License. + +2. Permitted Uses and Restrictions. You may use the Apple Software to develop application software that is compatible with, and runs only on Mac OS X and/or Windows platforms with QuickTime installed. Except for compiling header files and linking libraries as necessary to build your application software, you have no right to modify, incorporate into or include in combination with your own programs, license or otherwise redistribute any portion of the Apple Software. Your software application may not interfere with the functionality of QuickTime Player or the QuickTime Plug-in, including but not limited to file type or MIME type associations that are registered to QuickTime. You may make only as many internal use copies of the Apple Software as reasonably necessary to use the Apple Software as permitted in this paragraph and distribute such copies only to your employees whose job duties require them to so use the Apple Software. You must reproduce on each copy of the Apple Software or portion thereof, the Apple copyright notice and any other proprietary legends that were on the original copy of the Apple Software. Except as expressly permitted in this License, you may not decompile, reverse engineer, disassemble, modify, rent, lease, loan, sublicense, distribute or create derivative works based upon the Apple Software in whole or part. Your rights under this License will terminate automatically without notice from Apple if you fail to comply with any term(s) of this License. In addition, Apple reserves the right to terminate this License if a new version of Apple's operating system software or the Apple Software is released which is incompatible with the Apple Software. + +3. Disclaimer Of Warranty. The Apple Software may be "alpha", "beta", "development", pre-release, untested, and/or not fully tested and may contain errors that could cause failures or loss of data, be incomplete or contain inaccuracies. YOU EXPRESSLY ACKNOWLEDGE AND AGREE THAT USE OF THE APPLE SOFTWARE IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU. EXCEPT FOR THE LIMITED WARRANTY ON MEDIA SET FORTH ABOVE AND TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE APPLE SOFTWARE IS PROVIDED "AS IS", WITH ALL FAULTS AND WITHOUT WARRANTY OF ANY KIND, AND APPLE AND APPLE'S LICENSORS (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF SECTIONS 4 AND 5) HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH RESPECT TO THE APPLE SOFTWARE, EITHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NON-INFRINGEMENT OF THIRD PARTY RIGHTS. APPLE DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE APPLE SOFTWARE, THAT THE FUNCTIONS CONTAINED IN THE APPLE SOFTWARE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE APPLE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE APPLE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SHOULD THE APPLE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES OR LIMITATIONS ON APPLICABLE STATUTORY RIGHTS OF A CONSUMER, SO THE ABOVE EXCLUSION AND LIMITATIONS MAY NOT APPLY TO YOU. + +4. Limitation Of Liability. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL APPLE BE LIABLE FOR PERSONAL INJURY, OR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES WHATSOEVER, INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, LOSS OF DATA, BUSINESS INTERRUPTION OR ANY OTHER COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO YOUR USE OR INABILITY TO USE THE APPLE SOFTWARE, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT OR OTHERWISE) AND EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY FOR PERSONAL INJURY, OR OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to you for all damages (other than as may be required by applicable law in cases involving personal injury) exceed the amount of fifty dollars ($50.00). The foregoing limitations will apply even if the above stated remedy fails of its essential purpose. + +5. Export Control. You may not use or otherwise export or reexport the Apple Product except as authorized by United States law and the laws of the jurisdiction in which the Apple Product was obtained. In particular, but without limitation, the Apple Product may not be exported or re-exported (a) into any U.S. embargoed countries or (b) to anyone on the U.S. Treasury Department's list of Specially Designated Nationals or the U.S. Department of Commerce Denied Person?s List or Entity List. By using the Apple Product, you represent and warrant that you are not located in any such country or on any such list. + +6. Government End Users. The Apple Software and related documentation are "Commercial Items", as that term is defined at 48 C.F.R. ?2.101, consisting of "Commercial Computer Software" and "Commercial Computer Software Documentation", as such terms are used in 48 C.F.R. ?12.212 or 48 C.F.R. ?227.7202, as applicable. Consistent with 48 C.F.R. ?12.212 or 48 C.F.R. ?227.7202-1through 227.7202-4, as applicable, the Commercial Computer Software and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rights as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States. + +7. Controlling Law and Severability. This License will be governed by and construed in accordance with the laws of the State of California, as applied to agreements entered into and to be performed entirely within California between California residents. This License shall not be governed by the United Nations Convention on Contracts for the International Sale of Goods, the application of which is expressly excluded. If for any reason a court of competent jurisdiction finds any provision, or portion thereof, to be unenforceable, the remainder of this License shall continue in full force and effect. + +8. Complete Agreement. This License constitutes the entire agreement between the parties with respect to the use of the Apple Software licensed hereunder and supersedes all prior or contemporaneous understandings regarding such subject matter. No amendment to or modification of this License will be binding unless in writing and signed by Apple. Any translation of this License is done for local requirements and in the event of a dispute between the English and any non-English versions, the English version of this License shall govern. + +EA0300 +</string> + </map> + <key>sleepycat</key> + <map> + <key>url</key> + <string>http://opensource.org/licenses/sleepycat.php</string> + </map> + <key>smartheap</key> + <map> + <key>text</key> + <string>on file +</string> + </map> + <key>things</key> + <map> + </map> + <key>vivox</key> + <map> + <key>text</key> + <string>on file</string> + </map> + <key>xmlrpc-epi</key> + <map> + <key>url</key> + <string>http://xmlrpc-epi.sourceforge.net/main.php?t=license</string> + </map> + <key>zlib</key> + <map> + <key>url</key> + <string>http://www.gzip.org/zlib/zlib_license.html</string> + </map> + </map> + </map> +</llsd> |