summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorAnchor Linden <anchor@lindenlab.com>2018-09-17 10:50:08 -0700
committerAnchor Linden <anchor@lindenlab.com>2018-09-17 10:50:08 -0700
commite5aeaa659a453674ef898cdd2ad6183d5eb77e41 (patch)
tree2c7196f2f80d11b6f6d660c5852299646f2d449a /indra/newview
parent7318bd61f7a7ea89e471a6e0f3cc310786a3b41c (diff)
parent6f54add8a8852c8f3df86abebe38ef0ce4a6742c (diff)
Merge
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt9
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rw-r--r--indra/newview/app_settings/settings.xml8
-rw-r--r--indra/newview/llagentcamera.cpp44
-rw-r--r--indra/newview/llagentcamera.h2
-rw-r--r--indra/newview/llappviewer.cpp20
-rw-r--r--indra/newview/llchathistory.cpp25
-rw-r--r--indra/newview/lldirpicker.cpp159
-rw-r--r--indra/newview/lldirpicker.h42
-rw-r--r--indra/newview/lldrawpoolalpha.cpp3
-rw-r--r--indra/newview/llfeaturemanager.cpp102
-rw-r--r--indra/newview/llfeaturemanager.h5
-rw-r--r--indra/newview/llfloaterauction.cpp552
-rw-r--r--indra/newview/llfloaterauction.h86
-rw-r--r--indra/newview/llfloaterland.cpp25
-rw-r--r--indra/newview/llfloaterpreference.cpp39
-rw-r--r--indra/newview/llfloaterpreference.h2
-rw-r--r--indra/newview/llfloatersnapshot.cpp10
-rw-r--r--indra/newview/llfloatersnapshot.h4
-rw-r--r--indra/newview/llglsandbox.cpp9
-rw-r--r--indra/newview/lloutfitgallery.cpp114
-rw-r--r--indra/newview/lloutfitgallery.h1
-rw-r--r--indra/newview/llpanellogin.cpp13
-rw-r--r--indra/newview/llpanellogin.h1
-rw-r--r--indra/newview/llpanelnearbymedia.cpp6
-rw-r--r--indra/newview/llpanelpermissions.cpp46
-rw-r--r--indra/newview/llpanelsnapshotlocal.cpp28
-rw-r--r--indra/newview/llpanelvoicedevicesettings.cpp18
-rw-r--r--indra/newview/llpreviewscript.cpp16
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp2
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp46
-rw-r--r--indra/newview/llsnapshotlivepreview.h9
-rw-r--r--indra/newview/lltexturecache.cpp72
-rw-r--r--indra/newview/lltexturecache.h2
-rw-r--r--indra/newview/lltooldraganddrop.cpp17
-rw-r--r--indra/newview/lltooldraganddrop.h2
-rw-r--r--indra/newview/lltoolpie.cpp6
-rw-r--r--indra/newview/llviewerfloaterreg.cpp2
-rw-r--r--indra/newview/llviewermedia.cpp15
-rw-r--r--indra/newview/llviewermedia.h2
-rw-r--r--indra/newview/llviewermenu.cpp12
-rw-r--r--indra/newview/llviewermenufile.cpp34
-rw-r--r--indra/newview/llviewermenufile.h5
-rw-r--r--indra/newview/llviewermessage.cpp342
-rw-r--r--indra/newview/llviewernetwork.cpp2
-rw-r--r--indra/newview/llviewerregion.cpp4
-rw-r--r--indra/newview/llviewerwindow.cpp128
-rw-r--r--indra/newview/llviewerwindow.h8
-rw-r--r--indra/newview/llvoiceclient.cpp8
-rw-r--r--indra/newview/llvoiceclient.h15
-rw-r--r--indra/newview/llvoicevivox.cpp302
-rw-r--r--indra/newview/llvoicevivox.h4
-rw-r--r--indra/newview/skins/default/xui/de/floater_preferences_graphics_advanced.xml11
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_roles.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_setup.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_uploads.xml3
-rw-r--r--indra/newview/skins/default/xui/de/role_actions.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_auction.xml96
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml4
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml17
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_login_first.xml15
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_preferences_graphics_advanced.xml11
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_roles.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_setup.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_uploads.xml3
-rw-r--r--indra/newview/skins/default/xui/es/role_actions.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_roles.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_uploads.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/role_actions.xml18
-rw-r--r--indra/newview/skins/default/xui/it/floater_preferences_graphics_advanced.xml11
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_roles.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_uploads.xml3
-rw-r--r--indra/newview/skins/default/xui/it/role_actions.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_roles.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/role_actions.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preferences_graphics_advanced.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_roles.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_setup.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_uploads.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/role_actions.xml18
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preferences_graphics_advanced.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_roles.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_setup.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_uploads.xml3
-rw-r--r--indra/newview/skins/default/xui/ru/role_actions.xml18
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_roles.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_setup.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_uploads.xml3
-rw-r--r--indra/newview/skins/default/xui/tr/role_actions.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_roles.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_setup.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_uploads.xml3
-rw-r--r--indra/newview/skins/default/xui/zh/role_actions.xml18
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp10
128 files changed, 2372 insertions, 701 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b7a860aae0..2fc722d4c3 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -201,6 +201,7 @@ set(viewer_SOURCE_FILES
llflickrconnect.cpp
llfloaterabout.cpp
llfloaterbvhpreview.cpp
+ llfloaterauction.cpp
llfloaterautoreplacesettings.cpp
llfloateravatar.cpp
llfloateravatarpicker.cpp
@@ -822,6 +823,7 @@ set(viewer_HEADER_FILES
llflickrconnect.h
llfloaterabout.h
llfloaterbvhpreview.h
+ llfloaterauction.h
llfloaterautoreplacesettings.h
llfloateravatar.h
llfloateravatarpicker.h
@@ -2055,7 +2057,12 @@ if (DARWIN)
# These all get set with PROPERTIES
set(product "Second Life")
# this is the setting for the Python wrapper, see SL-322 and WRAPPER line in Info-SecondLife.plist
- set(MACOSX_WRAPPER_EXECUTABLE_NAME "SL_Launcher")
+ if (PACKAGE)
+ set(MACOSX_WRAPPER_EXECUTABLE_NAME "SL_Launcher")
+ else (PACKAGE)
+ # force the name of the actual executable to allow running it within Xcode for debugging
+ set(MACOSX_WRAPPER_EXECUTABLE_NAME "../Resources/Second Life Viewer.app/Contents/MacOS/Second Life")
+ endif (PACKAGE)
set(MACOSX_BUNDLE_INFO_STRING "Second Life Viewer")
set(MACOSX_BUNDLE_ICON_FILE "secondlife.icns")
set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.secondlife.indra.viewer")
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index cbad66a094..fc3aa7739a 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-5.1.7
+5.1.9
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index f0782e0bf7..8e8cce5787 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3703,13 +3703,13 @@
<key>FeatureManagerHTTPTable</key>
<map>
<key>Comment</key>
- <string>Base directory for HTTP feature/gpu table fetches</string>
+ <string>Deprecated</string>
<key>Persist</key>
- <integer>1</integer>
+ <integer>0</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://viewer-settings.secondlife.com</string>
+ <string></string>
</map>
<key>FPSLogFrequency</key>
<map>
@@ -12280,7 +12280,7 @@
<key>Comment</key>
<string>If TRUE, always load textures at full resolution (discard = 0)</string>
<key>Persist</key>
- <integer>1</integer>
+ <integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 5b9f1b9d4f..92a3026096 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -76,6 +76,8 @@ const F32 AVATAR_ZOOM_MIN_Y_FACTOR = 0.7f;
const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f;
const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f;
+const F32 MAX_CAMERA_DISTANCE_FROM_OBJECT = 496.f;
+const F32 CAMERA_FUDGE_FROM_OBJECT = 16.f;
const F32 MAX_CAMERA_SMOOTH_DISTANCE = 50.0f;
@@ -738,10 +740,7 @@ F32 LLAgentCamera::getCameraZoomFraction()
else
{
F32 min_zoom;
- const F32 DIST_FUDGE = 16.f; // meters
- F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
- LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
- MAX_CAMERA_DISTANCE_FROM_AGENT);
+ F32 max_zoom = getCameraMaxZoomDistance();
F32 distance = (F32)mCameraFocusOffsetTarget.magVec();
if (mFocusObject.notNull())
@@ -787,23 +786,17 @@ void LLAgentCamera::setCameraZoomFraction(F32 fraction)
else
{
F32 min_zoom = LAND_MIN_ZOOM;
- const F32 DIST_FUDGE = 16.f; // meters
- F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
- LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
- MAX_CAMERA_DISTANCE_FROM_AGENT);
+ F32 max_zoom = getCameraMaxZoomDistance();
if (mFocusObject.notNull())
{
- if (mFocusObject.notNull())
+ if (mFocusObject->isAvatar())
{
- if (mFocusObject->isAvatar())
- {
- min_zoom = AVATAR_MIN_ZOOM;
- }
- else
- {
- min_zoom = OBJECT_MIN_ZOOM;
- }
+ min_zoom = AVATAR_MIN_ZOOM;
+ }
+ else
+ {
+ min_zoom = OBJECT_MIN_ZOOM;
}
}
@@ -909,10 +902,7 @@ void LLAgentCamera::cameraZoomIn(const F32 fraction)
new_distance = llmax(new_distance, min_zoom);
- // Don't zoom too far back
- const F32 DIST_FUDGE = 16.f; // meters
- F32 max_distance = llmin(mDrawDistance - DIST_FUDGE,
- LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
+ F32 max_distance = getCameraMaxZoomDistance();
max_distance = llmin(max_distance, current_distance * 4.f); //Scaled max relative to current distance. MAINT-3154
@@ -978,10 +968,7 @@ void LLAgentCamera::cameraOrbitIn(const F32 meters)
new_distance = llmax(new_distance, min_zoom);
- // Don't zoom too far back
- const F32 DIST_FUDGE = 16.f; // meters
- F32 max_distance = llmin(mDrawDistance - DIST_FUDGE,
- LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
+ F32 max_distance = getCameraMaxZoomDistance();
if (new_distance > max_distance)
{
@@ -1946,6 +1933,13 @@ LLVector3 LLAgentCamera::getCameraOffsetInitial()
return convert_from_llsd<LLVector3>(mCameraOffsetInitial[mCameraPreset]->get(), TYPE_VEC3, "");
}
+F32 LLAgentCamera::getCameraMaxZoomDistance()
+{
+ // Ignore "DisableCameraConstraints", we don't want to be out of draw range when we focus onto objects or avatars
+ return llmin(MAX_CAMERA_DISTANCE_FROM_OBJECT,
+ mDrawDistance - 1, // convenience, don't hit draw limit when focusing on something
+ LLWorld::getInstance()->getRegionWidthInMeters() - CAMERA_FUDGE_FROM_OBJECT);
+}
//-----------------------------------------------------------------------------
// handleScrollWheel()
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index ab793ff316..d087de1e2f 100644
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -112,6 +112,8 @@ public:
private:
/** Determines default camera offset depending on the current camera preset */
LLVector3 getCameraOffsetInitial();
+ /** Determines maximum camera distance from target for mouselook, opposite to LAND_MIN_ZOOM */
+ F32 getCameraMaxZoomDistance();
/** Camera preset in Third Person Mode */
ECameraPreset mCameraPreset;
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f705084bdb..687b76c224 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -42,6 +42,7 @@
#include "llagentlanguage.h"
#include "llagentui.h"
#include "llagentwearables.h"
+#include "lldirpicker.h"
#include "llfloaterimcontainer.h"
#include "llimprocessing.h"
#include "llwindow.h"
@@ -1082,6 +1083,8 @@ bool LLAppViewer::init()
}
}
+// don't nag developers who need to run the executable directly
+#if LL_RELEASE_FOR_DOWNLOAD
// MAINT-8305: If we're processing a SLURL, skip the launcher check.
if (gSavedSettings.getString("CmdLineLoginLocation").empty())
{
@@ -1098,6 +1101,7 @@ bool LLAppViewer::init()
LLNotificationsUtil::add("RunLauncher");
}
}
+#endif
#if LL_WINDOWS
if (gGLManager.mGLVersion < LLFeatureManager::getInstance()->getExpectedGLVersion())
@@ -1577,6 +1581,11 @@ bool LLAppViewer::doFrame()
saveFinalSnapshot();
}
+ if (LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->terminate();
+ }
+
delete gServicePump;
destroyMainloopTimeout();
@@ -1676,11 +1685,6 @@ bool LLAppViewer::cleanup()
// Give any remaining SLPlugin instances a chance to exit cleanly.
LLPluginProcessParent::shutdown();
- if (LLVoiceClient::instanceExists())
- {
- LLVoiceClient::getInstance()->terminate();
- }
-
disconnectViewer();
LL_INFOS() << "Viewer disconnected" << LL_ENDL;
@@ -1794,6 +1798,8 @@ bool LLAppViewer::cleanup()
// (Deleted observers should have already removed themselves)
gInventory.cleanupInventory();
+ LLCoros::getInstance()->printActiveCoroutines();
+
LL_INFOS() << "Cleaning up Selections" << LL_ENDL;
// Clean up selection managers after UI is destroyed, as UI may be observing them.
@@ -1980,6 +1986,7 @@ bool LLAppViewer::cleanup()
mAppCoreHttp.cleanup();
SUBSYSTEM_CLEANUP(LLFilePickerThread);
+ SUBSYSTEM_CLEANUP(LLDirPickerThread);
//MUST happen AFTER SUBSYSTEM_CLEANUP(LLCurl)
delete sTextureCache;
@@ -2150,6 +2157,7 @@ bool LLAppViewer::initThreads()
gMeshRepo.init();
LLFilePickerThread::initClass();
+ LLDirPickerThread::initClass();
// *FIX: no error handling here!
return true;
@@ -4584,7 +4592,7 @@ void LLAppViewer::idle()
LLSmoothInterpolation::updateInterpolants();
LLMortician::updateClass();
LLFilePickerThread::clearDead(); //calls LLFilePickerThread::notify()
-
+ LLDirPickerThread::clearDead();
F32 dt_raw = idle_timer.getElapsedTimeAndResetF32();
// Cap out-of-control frame times
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 97a71a8802..1099d4bc09 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -528,10 +528,24 @@ public:
registrar_enable.add("ObjectIcon.Visible", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mPopupMenuHandleAvatar = menu->getHandle();
+ if (menu)
+ {
+ mPopupMenuHandleAvatar = menu->getHandle();
+ }
+ else
+ {
+ LL_WARNS() << " Failed to create menu_avatar_icon.xml" << LL_ENDL;
+ }
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mPopupMenuHandleObject = menu->getHandle();
+ if (menu)
+ {
+ mPopupMenuHandleObject = menu->getHandle();
+ }
+ else
+ {
+ LL_WARNS() << " Failed to create menu_object_icon.xml" << LL_ENDL;
+ }
setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::showInspector, this));
@@ -619,7 +633,12 @@ public:
}
mUserNameFont = style_params.font();
- LLTextBox* user_name = getChild<LLTextBox>("user_name");
+ if (!mUserNameTextBox)
+ {
+ mUserNameTextBox = getChild<LLTextBox>("user_name");
+ mTimeBoxTextBox = getChild<LLTextBox>("time_box");
+ }
+ LLTextBox* user_name = mUserNameTextBox;
user_name->setReadOnlyColor(style_params.readonly_color());
user_name->setColor(style_params.color());
diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp
index 5c4f0f4d5d..5443afe60c 100644
--- a/indra/newview/lldirpicker.cpp
+++ b/indra/newview/lldirpicker.cpp
@@ -77,6 +77,14 @@ LLDirPicker::LLDirPicker() :
mFileName(NULL),
mLocked(false)
{
+ bi.hwndOwner = NULL;
+ bi.pidlRoot = NULL;
+ bi.pszDisplayName = NULL;
+ bi.lpszTitle = NULL;
+ bi.ulFlags = BIF_USENEWUI;
+ bi.lpfn = NULL;
+ bi.lParam = NULL;
+ bi.iImage = 0;
}
LLDirPicker::~LLDirPicker()
@@ -84,7 +92,7 @@ LLDirPicker::~LLDirPicker()
// nothing
}
-BOOL LLDirPicker::getDir(std::string* filename)
+BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
{
if( mLocked )
{
@@ -99,39 +107,39 @@ BOOL LLDirPicker::getDir(std::string* filename)
BOOL success = FALSE;
- // Modal, so pause agent
- send_agent_pause();
-
- BROWSEINFO bi;
- memset(&bi, 0, sizeof(bi));
-
- bi.ulFlags = BIF_USENEWUI;
- bi.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
- bi.lpszTitle = NULL;
-
- ::OleInitialize(NULL);
+
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
- LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);
+ bi.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
- if(pIDL != NULL)
- {
- WCHAR buffer[_MAX_PATH] = {'\0'};
+ ::OleInitialize(NULL);
+ LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);
- if(::SHGetPathFromIDList(pIDL, buffer) != 0)
- {
- // Set the string value.
+ if(pIDL != NULL)
+ {
+ WCHAR buffer[_MAX_PATH] = {'\0'};
- mDir = utf16str_to_utf8str(llutf16string(buffer));
- success = TRUE;
- }
+ if(::SHGetPathFromIDList(pIDL, buffer) != 0)
+ {
+ // Set the string value.
- // free the item id list
- CoTaskMemFree(pIDL);
- }
+ mDir = utf16str_to_utf8str(llutf16string(buffer));
+ success = TRUE;
+ }
+ // free the item id list
+ CoTaskMemFree(pIDL);
+ }
- ::OleUninitialize();
+ ::OleUninitialize();
- send_agent_resume();
+ if (blocking)
+ {
+ send_agent_resume();
+ }
// Account for the fact that the app has been stalled.
LLFrameTimer::updateFrameTime();
@@ -167,7 +175,7 @@ void LLDirPicker::reset()
//static
-BOOL LLDirPicker::getDir(std::string* filename)
+BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
{
LLFilePicker::ELoadFilter filter=LLFilePicker::FFLOAD_DIRECTORY;
@@ -201,7 +209,7 @@ void LLDirPicker::reset()
mFilePicker->reset();
}
-BOOL LLDirPicker::getDir(std::string* filename)
+BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
{
reset();
@@ -256,7 +264,7 @@ void LLDirPicker::reset()
{
}
-BOOL LLDirPicker::getDir(std::string* filename)
+BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
{
return FALSE;
}
@@ -267,3 +275,94 @@ std::string LLDirPicker::getDirName()
}
#endif
+
+
+LLMutex* LLDirPickerThread::sMutex = NULL;
+std::queue<LLDirPickerThread*> LLDirPickerThread::sDeadQ;
+
+void LLDirPickerThread::getFile()
+{
+#if LL_WINDOWS
+ start();
+#else
+ run();
+#endif
+}
+
+//virtual
+void LLDirPickerThread::run()
+{
+#if LL_WINDOWS
+ bool blocking = false;
+#else
+ bool blocking = true; // modal
+#endif
+
+ LLDirPicker picker;
+
+ if (picker.getDir(&mProposedName, blocking))
+ {
+ mResponses.push_back(picker.getDirName());
+ }
+
+ {
+ LLMutexLock lock(sMutex);
+ sDeadQ.push(this);
+ }
+
+}
+
+//static
+void LLDirPickerThread::initClass()
+{
+ sMutex = new LLMutex(NULL);
+}
+
+//static
+void LLDirPickerThread::cleanupClass()
+{
+ clearDead();
+
+ delete sMutex;
+ sMutex = NULL;
+}
+
+//static
+void LLDirPickerThread::clearDead()
+{
+ if (!sDeadQ.empty())
+ {
+ LLMutexLock lock(sMutex);
+ while (!sDeadQ.empty())
+ {
+ LLDirPickerThread* thread = sDeadQ.front();
+ thread->notify(thread->mResponses);
+ delete thread;
+ sDeadQ.pop();
+ }
+ }
+}
+
+LLDirPickerThread::LLDirPickerThread(const dir_picked_signal_t::slot_type& cb, const std::string &proposed_name)
+ : LLThread("dir picker"),
+ mFilePickedSignal(NULL)
+{
+ mFilePickedSignal = new dir_picked_signal_t();
+ mFilePickedSignal->connect(cb);
+}
+
+LLDirPickerThread::~LLDirPickerThread()
+{
+ delete mFilePickedSignal;
+}
+
+void LLDirPickerThread::notify(const std::vector<std::string>& filenames)
+{
+ if (!filenames.empty())
+ {
+ if (mFilePickedSignal)
+ {
+ (*mFilePickedSignal)(filenames, mProposedName);
+ }
+ }
+}
diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h
index 8656b23afd..c7dba12130 100644
--- a/indra/newview/lldirpicker.h
+++ b/indra/newview/lldirpicker.h
@@ -33,6 +33,13 @@
#include "stdtypes.h"
+#include "llthread.h"
+#include <queue>
+
+#if LL_WINDOWS
+#include <shlobj.h>
+#endif
+
#if LL_DARWIN
// AssertMacros.h does bad things.
@@ -53,7 +60,7 @@ public:
// calling this before main() is undefined
static LLDirPicker& instance( void ) { return sInstance; }
- BOOL getDir(std::string* filename);
+ BOOL getDir(std::string* filename, bool blocking = true);
std::string getDirName();
// clear any lists of buffers or whatever, and make sure the dir
@@ -76,11 +83,15 @@ private:
LLFilePicker *mFilePicker;
#endif
+
std::string* mFileName;
std::string mDir;
bool mLocked;
static LLDirPicker sInstance;
+#if LL_WINDOWS
+ BROWSEINFO bi;
+#endif
public:
// don't call these directly please.
@@ -88,4 +99,33 @@ public:
~LLDirPicker();
};
+class LLDirPickerThread : public LLThread
+{
+public:
+
+ static std::queue<LLDirPickerThread*> sDeadQ;
+ static LLMutex* sMutex;
+
+ static void initClass();
+ static void cleanupClass();
+ static void clearDead();
+
+ std::vector<std::string> mResponses;
+ std::string mProposedName;
+
+ typedef boost::signals2::signal<void(const std::vector<std::string>& filenames, std::string proposed_name)> dir_picked_signal_t;
+
+ LLDirPickerThread(const dir_picked_signal_t::slot_type& cb, const std::string &proposed_name);
+ ~LLDirPickerThread();
+
+ void getFile();
+
+ virtual void run();
+
+ virtual void notify(const std::vector<std::string>& filenames);
+
+private:
+ dir_picked_signal_t* mFilePickedSignal;
+};
+
#endif
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index b0d48abb14..0873300cd2 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -328,6 +328,9 @@ void LLDrawPoolAlpha::render(S32 pass)
gGL.diffuseColor4f(0, 0, 1, 1);
pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+ gGL.diffuseColor4f(0, 1, 0, 1);
+ pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+
if(shaders)
{
gHighlightProgram.unbind();
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index bc96ee00f7..487496df9a 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -62,13 +62,10 @@
#if LL_DARWIN
const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt";
#elif LL_LINUX
const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt";
#else
const char FEATURE_TABLE_FILENAME[] = "featuretable.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable.%s.txt";
#endif
#if 0 // consuming code in #if 0 below
@@ -273,33 +270,11 @@ bool LLFeatureManager::loadFeatureTables()
app_path += gDirUtilp->getDirDelimiter();
std::string filename;
- std::string http_filename;
filename = FEATURE_TABLE_FILENAME;
- http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
app_path += filename;
- // second table is downloaded with HTTP - note that this will only be used on the run _after_ it is downloaded
- std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
-
- // use HTTP table if it exists
- std::string path;
- bool parse_ok = false;
- if (gDirUtilp->fileExists(http_path))
- {
- parse_ok = parseFeatureTable(http_path);
- if (!parse_ok)
- {
- // the HTTP table failed to parse, so delete it
- LLFile::remove(http_path);
- LL_WARNS("RenderInit") << "Removed invalid feature table '" << http_path << "'" << LL_ENDL;
- }
- }
-
- if (!parse_ok)
- {
- parse_ok = parseFeatureTable(app_path);
- }
+ bool parse_ok = parseFeatureTable(app_path);
return parse_ok;
}
@@ -407,7 +382,16 @@ bool LLFeatureManager::loadGPUClass()
if (!gSavedSettings.getBOOL("SkipBenchmark"))
{
//get memory bandwidth from benchmark
- F32 gbps = gpu_benchmark();
+ F32 gbps;
+ try
+ {
+ gbps = gpu_benchmark();
+ }
+ catch (const std::exception& e)
+ {
+ gbps = -1.f;
+ LL_WARNS("RenderInit") << "GPU benchmark failed: " << e.what() << LL_ENDL;
+ }
if (gbps < 0.f)
{ //couldn't bench, use GLVersion
@@ -486,70 +470,6 @@ bool LLFeatureManager::loadGPUClass()
return true; // indicates that a gpu value was established
}
-void LLFeatureManager::fetchFeatureTableCoro(std::string tableName)
-{
- LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
- LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
- httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("FeatureManagerHTTPTable", httpPolicy));
- LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
-
- const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable");
-
-
-#if LL_WINDOWS
- std::string os_string = LLOSInfo::instance().getOSStringSimple();
- std::string filename;
-
- if (os_string.find("Microsoft Windows XP") == 0)
- {
- filename = llformat(tableName.c_str(), "_xp", LLVersionInfo::getVersion().c_str());
- }
- else
- {
- filename = llformat(tableName.c_str(), "", LLVersionInfo::getVersion().c_str());
- }
-#else
- const std::string filename = llformat(tableName.c_str(), LLVersionInfo::getVersion().c_str());
-#endif
-
- std::string url = base + "/" + filename;
- // testing url below
- //url = "http://viewer-settings.secondlife.com/featuretable.2.1.1.208406.txt";
- const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
-
-
- LL_INFOS() << "LLFeatureManager fetching " << url << " into " << path << LL_ENDL;
-
- LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url);
-
- LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
- LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
-
- if (status)
- { // There was a newer feature table on the server. We've grabbed it and now should write it.
- // write to file
- const LLSD::Binary &raw = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_RAW].asBinary();
-
- LL_INFOS() << "writing feature table to " << path << LL_ENDL;
-
- S32 size = raw.size();
- if (size > 0)
- {
- // write to file
- LLAPRFile out(path, LL_APR_WB);
- out.write(raw.data(), size);
- out.close();
- }
- }
-}
-
-// fetch table(s) from a website (S3)
-void LLFeatureManager::fetchHTTPTables()
-{
- LLCoros::instance().launch("LLFeatureManager::fetchFeatureTableCoro",
- boost::bind(&LLFeatureManager::fetchFeatureTableCoro, this, FEATURE_TABLE_VER_FILENAME));
-}
-
void LLFeatureManager::cleanupFeatureTables()
{
std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer());
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index 54bd07329a..f77861a1a7 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -145,9 +145,6 @@ public:
// in the skip list if true
void applyFeatures(bool skipFeatures);
- // load the dynamic GPU/feature table from a website
- void fetchHTTPTables();
-
LLSD getRecommendedSettingsMap();
protected:
@@ -158,8 +155,6 @@ protected:
void initBaseMask();
- void fetchFeatureTableCoro(std::string name);
-
std::map<std::string, LLFeatureList *> mMaskList;
std::set<std::string> mSkippedFeatures;
BOOL mInited;
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
new file mode 100644
index 0000000000..56619e818a
--- /dev/null
+++ b/indra/newview/llfloaterauction.cpp
@@ -0,0 +1,552 @@
+/**
+ * @file llfloaterauction.cpp
+ * @author James Cook, Ian Wilkes
+ * @brief Implementation of the auction floater.
+ *
+ * $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$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloaterauction.h"
+
+#include "llgl.h"
+#include "llimagej2c.h"
+#include "llimagetga.h"
+#include "llparcel.h"
+#include "llvfile.h"
+#include "llvfs.h"
+#include "llwindow.h"
+#include "message.h"
+
+#include "llagent.h"
+#include "llassetstorage.h"
+#include "llcombobox.h"
+#include "llestateinfomodel.h"
+#include "llmimetypes.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llsavedsettingsglue.h"
+#include "llviewertexturelist.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "lluictrlfactory.h"
+#include "llviewerwindow.h"
+#include "llviewerdisplay.h"
+#include "llviewercontrol.h"
+#include "llui.h"
+#include "llrender.h"
+#include "llsdutil.h"
+#include "llsdutil_math.h"
+#include "lltrans.h"
+#include "llcorehttputil.h"
+
+///----------------------------------------------------------------------------
+/// Local function declarations, constants, enums, and typedefs
+///----------------------------------------------------------------------------
+
+void auction_j2c_upload_done(const LLUUID& asset_id,
+ void* user_data, S32 status, LLExtStat ext_status);
+void auction_tga_upload_done(const LLUUID& asset_id,
+ void* user_data, S32 status, LLExtStat ext_status);
+
+///----------------------------------------------------------------------------
+/// Class llfloaterauction
+///----------------------------------------------------------------------------
+
+// Default constructor
+LLFloaterAuction::LLFloaterAuction(const LLSD& key)
+ : LLFloater(key),
+ mParcelID(-1)
+{
+ mCommitCallbackRegistrar.add("ClickSnapshot", boost::bind(&LLFloaterAuction::onClickSnapshot, this));
+ mCommitCallbackRegistrar.add("ClickSellToAnyone", boost::bind(&LLFloaterAuction::onClickSellToAnyone, this));
+ mCommitCallbackRegistrar.add("ClickStartAuction", boost::bind(&LLFloaterAuction::onClickStartAuction, this));
+ mCommitCallbackRegistrar.add("ClickResetParcel", boost::bind(&LLFloaterAuction::onClickResetParcel, this));
+}
+
+// Destroys the object
+LLFloaterAuction::~LLFloaterAuction()
+{
+}
+
+BOOL LLFloaterAuction::postBuild()
+{
+ return TRUE;
+}
+
+void LLFloaterAuction::onOpen(const LLSD& key)
+{
+ initialize();
+}
+
+void LLFloaterAuction::initialize()
+{
+ mParcelUpdateCapUrl.clear();
+
+ mParcelp = LLViewerParcelMgr::getInstance()->getParcelSelection();
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ LLParcel* parcelp = mParcelp->getParcel();
+ if(parcelp && region && !parcelp->getForSale())
+ {
+ mParcelHost = region->getHost();
+ mParcelID = parcelp->getLocalID();
+ mParcelUpdateCapUrl = region->getCapability("ParcelPropertiesUpdate");
+
+ getChild<LLUICtrl>("parcel_text")->setValue(parcelp->getName());
+ getChildView("snapshot_btn")->setEnabled(TRUE);
+ getChildView("reset_parcel_btn")->setEnabled(TRUE);
+ getChildView("start_auction_btn")->setEnabled(TRUE);
+
+ U32 estate_id = LLEstateInfoModel::instance().getID();
+ // Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet
+ getChildView("sell_to_anyone_btn")->setEnabled(estate_id == ESTATE_TEEN || estate_id == 0);
+ }
+ else
+ {
+ mParcelHost.invalidate();
+ if(parcelp && parcelp->getForSale())
+ {
+ getChild<LLUICtrl>("parcel_text")->setValue(getString("already for sale"));
+ }
+ else
+ {
+ getChild<LLUICtrl>("parcel_text")->setValue(LLStringUtil::null);
+ }
+ mParcelID = -1;
+ getChildView("snapshot_btn")->setEnabled(false);
+ getChildView("reset_parcel_btn")->setEnabled(false);
+ getChildView("sell_to_anyone_btn")->setEnabled(false);
+ getChildView("start_auction_btn")->setEnabled(false);
+ }
+
+ mImageID.setNull();
+ mImage = NULL;
+}
+
+void LLFloaterAuction::draw()
+{
+ LLFloater::draw();
+
+ if(!isMinimized() && mImage.notNull())
+ {
+ LLView* snapshot_icon = findChildView("snapshot_icon");
+ if (snapshot_icon)
+ {
+ LLRect rect = snapshot_icon->getRect();
+ {
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f));
+ rect.stretch(-1);
+ }
+ {
+ LLGLSUIDefault gls_ui;
+ gGL.color3f(1.f, 1.f, 1.f);
+ gl_draw_scaled_image(rect.mLeft,
+ rect.mBottom,
+ rect.getWidth(),
+ rect.getHeight(),
+ mImage);
+ }
+ }
+ }
+}
+
+
+// static
+void LLFloaterAuction::onClickSnapshot(void* data)
+{
+ LLFloaterAuction* self = (LLFloaterAuction*)(data);
+
+ LLPointer<LLImageRaw> raw = new LLImageRaw;
+
+ gForceRenderLandFence = self->getChild<LLUICtrl>("fence_check")->getValue().asBoolean();
+ BOOL success = gViewerWindow->rawSnapshot(raw,
+ gViewerWindow->getWindowWidthScaled(),
+ gViewerWindow->getWindowHeightScaled(),
+ TRUE, FALSE,
+ FALSE, FALSE);
+ gForceRenderLandFence = FALSE;
+
+ if (success)
+ {
+ self->mTransactionID.generate();
+ self->mImageID = self->mTransactionID.makeAssetID(gAgent.getSecureSessionID());
+
+ if(!gSavedSettings.getBOOL("QuietSnapshotsToDisk"))
+ {
+ gViewerWindow->playSnapshotAnimAndSound();
+ }
+ LL_INFOS() << "Writing TGA..." << LL_ENDL;
+
+ LLPointer<LLImageTGA> tga = new LLImageTGA;
+ tga->encode(raw);
+ LLVFile::writeFile(tga->getData(), tga->getDataSize(), gVFS, self->mImageID, LLAssetType::AT_IMAGE_TGA);
+
+ raw->biasedScaleToPowerOfTwo(LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT);
+
+ LL_INFOS() << "Writing J2C..." << LL_ENDL;
+
+ LLPointer<LLImageJ2C> j2c = new LLImageJ2C;
+ j2c->encode(raw, 0.0f);
+ LLVFile::writeFile(j2c->getData(), j2c->getDataSize(), gVFS, self->mImageID, LLAssetType::AT_TEXTURE);
+
+ self->mImage = LLViewerTextureManager::getLocalTexture((LLImageRaw*)raw, FALSE);
+ gGL.getTexUnit(0)->bind(self->mImage);
+ self->mImage->setAddressMode(LLTexUnit::TAM_CLAMP);
+ }
+ else
+ {
+ LL_WARNS() << "Unable to take snapshot" << LL_ENDL;
+ }
+}
+
+// static
+void LLFloaterAuction::onClickStartAuction(void* data)
+{
+ LLFloaterAuction* self = (LLFloaterAuction*)(data);
+
+ if(self->mImageID.notNull())
+ {
+ LLSD parcel_name = self->getChild<LLUICtrl>("parcel_text")->getValue();
+
+ // create the asset
+ std::string* name = new std::string(parcel_name.asString());
+ gAssetStorage->storeAssetData(self->mTransactionID, LLAssetType::AT_IMAGE_TGA,
+ &auction_tga_upload_done,
+ (void*)name,
+ FALSE);
+ self->getWindow()->incBusyCount();
+
+ std::string* j2c_name = new std::string(parcel_name.asString());
+ gAssetStorage->storeAssetData(self->mTransactionID, LLAssetType::AT_TEXTURE,
+ &auction_j2c_upload_done,
+ (void*)j2c_name,
+ FALSE);
+ self->getWindow()->incBusyCount();
+
+ LLNotificationsUtil::add("UploadingAuctionSnapshot");
+
+ }
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessage("ViewerStartAuction");
+
+ msg->nextBlock("AgentData");
+ msg->addUUID("AgentID", gAgent.getID());
+ msg->addUUID("SessionID", gAgent.getSessionID());
+ msg->nextBlock("ParcelData");
+ msg->addS32("LocalID", self->mParcelID);
+ msg->addUUID("SnapshotID", self->mImageID);
+ msg->sendReliable(self->mParcelHost);
+
+ // clean up floater, and get out
+ self->cleanupAndClose();
+}
+
+
+void LLFloaterAuction::cleanupAndClose()
+{
+ mImageID.setNull();
+ mImage = NULL;
+ mParcelID = -1;
+ mParcelHost.invalidate();
+ closeFloater();
+}
+
+
+
+// static glue
+void LLFloaterAuction::onClickResetParcel(void* data)
+{
+ LLFloaterAuction* self = (LLFloaterAuction*)(data);
+ if (self)
+ {
+ self->doResetParcel();
+ }
+}
+
+
+// Reset all the values for the parcel in preparation for a sale
+void LLFloaterAuction::doResetParcel()
+{
+ LLParcel* parcelp = mParcelp->getParcel();
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+
+ if (parcelp
+ && region
+ && !mParcelUpdateCapUrl.empty())
+ {
+ LLSD body;
+ std::string empty;
+
+ // request new properties update from simulator
+ U32 message_flags = 0x01;
+ body["flags"] = ll_sd_from_U32(message_flags);
+
+ // Set all the default parcel properties for auction
+ body["local_id"] = parcelp->getLocalID();
+
+ U32 parcel_flags = PF_ALLOW_LANDMARK |
+ PF_ALLOW_FLY |
+ PF_CREATE_GROUP_OBJECTS |
+ PF_ALLOW_ALL_OBJECT_ENTRY |
+ PF_ALLOW_GROUP_OBJECT_ENTRY |
+ PF_ALLOW_GROUP_SCRIPTS |
+ PF_RESTRICT_PUSHOBJECT |
+ PF_SOUND_LOCAL |
+ PF_ALLOW_VOICE_CHAT |
+ PF_USE_ESTATE_VOICE_CHAN;
+
+ body["parcel_flags"] = ll_sd_from_U32(parcel_flags);
+
+ // Build a parcel name like "Ahern (128,128) PG 4032m"
+ std::ostringstream parcel_name;
+ LLVector3 center_point( parcelp->getCenterpoint() );
+ center_point.snap(0); // Get rid of fractions
+ parcel_name << region->getName()
+ << " ("
+ << (S32) center_point.mV[VX]
+ << ","
+ << (S32) center_point.mV[VY]
+ << ") "
+ << region->getSimAccessString()
+ << " "
+ << parcelp->getArea()
+ << "m";
+
+ std::string new_name(parcel_name.str().c_str());
+ body["name"] = new_name;
+ getChild<LLUICtrl>("parcel_text")->setValue(new_name); // Set name in dialog as well, since it won't get updated otherwise
+
+ body["sale_price"] = (S32) 0;
+ body["description"] = empty;
+ body["music_url"] = empty;
+ body["media_url"] = empty;
+ body["media_desc"] = empty;
+ body["media_type"] = LLMIMETypes::getDefaultMimeType();
+ body["media_width"] = (S32) 0;
+ body["media_height"] = (S32) 0;
+ body["auto_scale"] = (S32) 0;
+ body["media_loop"] = (S32) 0;
+ body["obscure_media"] = (S32) 0; // OBSOLETE - no longer used
+ body["obscure_music"] = (S32) 0; // OBSOLETE - no longer used
+ body["media_id"] = LLUUID::null;
+ body["group_id"] = MAINTENANCE_GROUP_ID; // Use maintenance group
+ body["pass_price"] = (S32) 10; // Defaults to $10
+ body["pass_hours"] = 0.0f;
+ body["category"] = (U8) LLParcel::C_NONE;
+ body["auth_buyer_id"] = LLUUID::null;
+ body["snapshot_id"] = LLUUID::null;
+ body["user_location"] = ll_sd_from_vector3( LLVector3::zero );
+ body["user_look_at"] = ll_sd_from_vector3( LLVector3::zero );
+ body["landing_type"] = (U8) LLParcel::L_DIRECT;
+
+ LL_INFOS() << "Sending parcel update to reset for auction via capability to: "
+ << mParcelUpdateCapUrl << LL_ENDL;
+
+ LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(mParcelUpdateCapUrl, body,
+ "Parcel reset for auction",
+ "Parcel not set for auction.");
+
+ // Send a message to clear the object return time
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ParcelSetOtherCleanTime);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, parcelp->getLocalID());
+ msg->addS32Fast(_PREHASH_OtherCleanTime, 5); // 5 minute object auto-return
+
+ msg->sendReliable(region->getHost());
+
+ // Clear the access lists
+ clearParcelAccessList(parcelp, region, AL_ACCESS);
+ clearParcelAccessList(parcelp, region, AL_BAN);
+ clearParcelAccessList(parcelp, region, AL_ALLOW_EXPERIENCE);
+ clearParcelAccessList(parcelp, region, AL_BLOCK_EXPERIENCE);
+ }
+}
+
+
+
+void LLFloaterAuction::clearParcelAccessList(LLParcel* parcel, LLViewerRegion* region, U32 list)
+{
+ if (!region || !parcel) return;
+
+ LLUUID transactionUUID;
+ transactionUUID.generate();
+
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_ParcelAccessListUpdate);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
+ msg->nextBlockFast(_PREHASH_Data);
+ msg->addU32Fast(_PREHASH_Flags, list);
+ msg->addS32(_PREHASH_LocalID, parcel->getLocalID() );
+ msg->addUUIDFast(_PREHASH_TransactionID, transactionUUID);
+ msg->addS32Fast(_PREHASH_SequenceID, 1); // sequence_id
+ msg->addS32Fast(_PREHASH_Sections, 0); // num_sections
+
+ // pack an empty block since there will be no data
+ msg->nextBlockFast(_PREHASH_List);
+ msg->addUUIDFast(_PREHASH_ID, LLUUID::null );
+ msg->addS32Fast(_PREHASH_Time, 0 );
+ msg->addU32Fast(_PREHASH_Flags, 0 );
+
+ msg->sendReliable( region->getHost() );
+}
+
+
+
+// static - 'Sell to Anyone' clicked, throw up a confirmation dialog
+void LLFloaterAuction::onClickSellToAnyone(void* data)
+{
+ LLFloaterAuction* self = (LLFloaterAuction*)(data);
+ if (self)
+ {
+ LLParcel* parcelp = self->mParcelp->getParcel();
+
+ // Do a confirmation
+ S32 sale_price = parcelp->getArea(); // Selling for L$1 per meter
+ S32 area = parcelp->getArea();
+
+ LLSD args;
+ args["LAND_SIZE"] = llformat("%d", area);
+ args["SALE_PRICE"] = llformat("%d", sale_price);
+ args["NAME"] = LLTrans::getString("Anyone");
+
+ LLNotification::Params params("ConfirmLandSaleChange"); // Re-use existing dialog
+ params.substitutions(args)
+ .functor.function(boost::bind(&LLFloaterAuction::onSellToAnyoneConfirmed, self, _1, _2));
+
+ params.name("ConfirmLandSaleToAnyoneChange");
+
+ // ask away
+ LLNotifications::instance().add(params);
+ }
+}
+
+
+// Sell confirmation clicked
+bool LLFloaterAuction::onSellToAnyoneConfirmed(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ doSellToAnyone();
+ }
+
+ return false;
+}
+
+
+
+// Reset all the values for the parcel in preparation for a sale
+void LLFloaterAuction::doSellToAnyone()
+{
+ LLParcel* parcelp = mParcelp->getParcel();
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+
+ if (parcelp
+ && region
+ && !mParcelUpdateCapUrl.empty())
+ {
+ LLSD body;
+ std::string empty;
+
+ // request new properties update from simulator
+ U32 message_flags = 0x01;
+ body["flags"] = ll_sd_from_U32(message_flags);
+
+ // Set all the default parcel properties for auction
+ body["local_id"] = parcelp->getLocalID();
+
+ // Set 'for sale' flag
+ U32 parcel_flags = parcelp->getParcelFlags() | PF_FOR_SALE;
+ // Ensure objects not included
+ parcel_flags &= ~PF_FOR_SALE_OBJECTS;
+ body["parcel_flags"] = ll_sd_from_U32(parcel_flags);
+
+ body["sale_price"] = parcelp->getArea(); // Sell for L$1 per square meter
+ body["auth_buyer_id"] = LLUUID::null; // To anyone
+
+ LL_INFOS() << "Sending parcel update to sell to anyone for L$1 via capability to: "
+ << mParcelUpdateCapUrl << LL_ENDL;
+
+ LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(mParcelUpdateCapUrl, body,
+ "Parcel set as sell to everyone.",
+ "Parcel sell to everyone failed.");
+
+ // clean up floater, and get out
+ cleanupAndClose();
+ }
+}
+
+
+///----------------------------------------------------------------------------
+/// Local function definitions
+///----------------------------------------------------------------------------
+
+void auction_tga_upload_done(const LLUUID& asset_id, void* user_data, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed)
+{
+ std::string* name = (std::string*)(user_data);
+ LL_INFOS() << "Upload of asset '" << *name << "' " << asset_id
+ << " returned " << status << LL_ENDL;
+ delete name;
+
+ gViewerWindow->getWindow()->decBusyCount();
+
+ if (0 == status)
+ {
+ LLNotificationsUtil::add("UploadWebSnapshotDone");
+ }
+ else
+ {
+ LLSD args;
+ args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
+ LLNotificationsUtil::add("UploadAuctionSnapshotFail", args);
+ }
+}
+
+void auction_j2c_upload_done(const LLUUID& asset_id, void* user_data, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed)
+{
+ std::string* name = (std::string*)(user_data);
+ LL_INFOS() << "Upload of asset '" << *name << "' " << asset_id
+ << " returned " << status << LL_ENDL;
+ delete name;
+
+ gViewerWindow->getWindow()->decBusyCount();
+
+ if (0 == status)
+ {
+ LLNotificationsUtil::add("UploadSnapshotDone");
+ }
+ else
+ {
+ LLSD args;
+ args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
+ LLNotificationsUtil::add("UploadAuctionSnapshotFail", args);
+ }
+}
diff --git a/indra/newview/llfloaterauction.h b/indra/newview/llfloaterauction.h
new file mode 100644
index 0000000000..c83a11ba8b
--- /dev/null
+++ b/indra/newview/llfloaterauction.h
@@ -0,0 +1,86 @@
+/**
+ * @file llfloaterauction.h
+ * @author James Cook, Ian Wilkes
+ * @brief llfloaterauction class header file
+ *
+ * $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_LLFLOATERAUCTION_H
+#define LL_LLFLOATERAUCTION_H
+
+#include "llfloater.h"
+#include "lluuid.h"
+#include "llpointer.h"
+#include "llviewertexture.h"
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFloaterAuction
+//
+// Class which holds the functionality to start auctions.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLParcelSelection;
+class LLParcel;
+class LLViewerRegion;
+
+class LLFloaterAuction : public LLFloater
+{
+ friend class LLFloaterReg;
+public:
+ // LLFloater interface
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void draw();
+
+private:
+
+ LLFloaterAuction(const LLSD& key);
+ ~LLFloaterAuction();
+
+ void initialize();
+
+ static void onClickSnapshot(void* data);
+ static void onClickResetParcel(void* data);
+ static void onClickSellToAnyone(void* data); // Sell to anyone clicked
+ bool onSellToAnyoneConfirmed(const LLSD& notification, const LLSD& response); // Sell confirmation clicked
+ static void onClickStartAuction(void* data);
+
+ /*virtual*/ BOOL postBuild();
+
+ void doResetParcel();
+ void doSellToAnyone();
+ void clearParcelAccessList( LLParcel* parcel, LLViewerRegion* region, U32 list);
+ void cleanupAndClose();
+
+private:
+
+ LLTransactionID mTransactionID;
+ LLAssetID mImageID;
+ LLPointer<LLViewerTexture> mImage;
+ LLSafeHandle<LLParcelSelection> mParcelp;
+ S32 mParcelID;
+ LLHost mParcelHost;
+
+ std::string mParcelUpdateCapUrl; // "ParcelPropertiesUpdate" capability
+};
+
+
+#endif // LL_LLFLOATERAUCTION_H
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 596b04c31c..88b3fb7b96 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -45,6 +45,7 @@
#include "llcombobox.h"
#include "llfloaterreg.h"
#include "llfloateravatarpicker.h"
+#include "llfloaterauction.h"
#include "llfloatergroups.h"
#include "llfloaterscriptlimits.h"
#include "llavataractions.h"
@@ -78,7 +79,6 @@
#include "llpanelexperiencelisteditor.h"
#include "llpanelexperiencepicker.h"
#include "llexperiencecache.h"
-#include "llweb.h"
#include "llgroupactions.h"
@@ -542,6 +542,7 @@ void LLPanelLandGeneral::refresh()
mBtnDeedToGroup->setEnabled(FALSE);
mBtnSetGroup->setEnabled(FALSE);
+ mBtnStartAuction->setEnabled(FALSE);
mCheckDeedToGroup ->set(FALSE);
mCheckDeedToGroup ->setEnabled(FALSE);
@@ -639,6 +640,7 @@ void LLPanelLandGeneral::refresh()
mTextClaimDate->setEnabled(FALSE);
mTextGroup->setText(getString("none_text"));
mTextGroup->setEnabled(FALSE);
+ mBtnStartAuction->setEnabled(FALSE);
}
else
{
@@ -690,6 +692,11 @@ void LLPanelLandGeneral::refresh()
LLStringUtil::format (claim_date_str, substitution);
mTextClaimDate->setText(claim_date_str);
mTextClaimDate->setEnabled(is_leased);
+
+ BOOL enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON)
+ && (owner_id == GOVERNOR_LINDEN_ID)
+ && (parcel->getAuctionID() == 0);
+ mBtnStartAuction->setEnabled(enable_auction);
}
// Display options
@@ -1017,8 +1024,20 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)
// static
void LLPanelLandGeneral::onClickStartAuction(void* data)
{
- std::string auction_url = "https://places.[GRID]/auctions/";
- LLWeb::loadURLExternal(LLWeb::expandURLSubstitutions(auction_url, LLSD()));
+ LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
+ LLParcel* parcelp = panelp->mParcel->getParcel();
+ if(parcelp)
+ {
+ if(parcelp->getForSale())
+ {
+ LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale");
+ }
+ else
+ {
+ //LLFloaterAuction::showInstance();
+ LLFloaterReg::showInstance("auction");
+ }
+ }
}
// static
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 9d723bdd9d..4ce35643b1 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1096,16 +1096,15 @@ void LLFloaterPreference::onClickSetCache()
std::string proposed_name(cur_name);
- LLDirPicker& picker = LLDirPicker::instance();
- if (! picker.getDir(&proposed_name ) )
- {
- return; //Canceled!
- }
+ (new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeCachePath, this, _1, _2), proposed_name))->getFile();
+}
- std::string dir_name = picker.getDirName();
- if (!dir_name.empty() && dir_name != cur_name)
+void LLFloaterPreference::changeCachePath(const std::vector<std::string>& filenames, std::string proposed_name)
+{
+ std::string dir_name = filenames[0];
+ if (!dir_name.empty() && dir_name != proposed_name)
{
- std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
+ std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
LLNotificationsUtil::add("CacheWillBeMoved");
gSavedSettings.setString("NewCacheLocation", dir_name);
gSavedSettings.setString("NewCacheLocationTopFolder", new_top_folder);
@@ -1744,25 +1743,21 @@ void LLFloaterPreference::onClickLogPath()
std::string proposed_name(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
mPriorInstantMessageLogPath.clear();
- LLDirPicker& picker = LLDirPicker::instance();
- //Launches a directory picker and waits for feedback
- if (!picker.getDir(&proposed_name ) )
- {
- return; //Canceled!
- }
- //Gets the path from the directory picker
- std::string dir_name = picker.getDirName();
+ (new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeLogPath, this, _1, _2), proposed_name))->getFile();
+}
+void LLFloaterPreference::changeLogPath(const std::vector<std::string>& filenames, std::string proposed_name)
+{
//Path changed
- if(proposed_name != dir_name)
+ if (proposed_name != filenames[0])
{
- gSavedPerAccountSettings.setString("InstantMessageLogPath", dir_name);
+ gSavedPerAccountSettings.setString("InstantMessageLogPath", filenames[0]);
mPriorInstantMessageLogPath = proposed_name;
-
- // enable/disable 'Delete transcripts button
- updateDeleteTranscriptsButton();
-}
+
+ // enable/disable 'Delete transcripts button
+ updateDeleteTranscriptsButton();
+ }
}
bool LLFloaterPreference::moveTranscriptsAndLog()
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 0cd7bac20f..8339a18296 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -133,6 +133,7 @@ public:
void setCacheLocation(const LLStringExplicit& location);
void onClickSetCache();
+ void changeCachePath(const std::vector<std::string>& filenames, std::string proposed_name);
void onClickResetCache();
void onClickSkin(LLUICtrl* ctrl,const LLSD& userdata);
void onSelectSkin();
@@ -145,6 +146,7 @@ public:
void resetAllIgnored();
void setAllIgnored();
void onClickLogPath();
+ void changeLogPath(const std::vector<std::string>& filenames, std::string proposed_name);
bool moveTranscriptsAndLog();
void enableHistory();
void setPersonalInfo(const std::string& visibility, bool im_via_email, bool is_verified_email);
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 156b2ba7b1..c08aaf3f50 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -1309,17 +1309,15 @@ void LLFloaterSnapshot::saveTexture()
previewp->saveTexture();
}
-BOOL LLFloaterSnapshot::saveLocal()
+void LLFloaterSnapshot::saveLocal(const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
{
LL_DEBUGS() << "saveLocal" << LL_ENDL;
LLSnapshotLivePreview* previewp = getPreviewView();
- if (!previewp)
+ llassert(previewp != NULL);
+ if (previewp)
{
- llassert(previewp != NULL);
- return FALSE;
+ previewp->saveLocal(success_cb, failure_cb);
}
-
- return previewp->saveLocal();
}
void LLFloaterSnapshotBase::postSave()
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index 698273ac90..bcba14d63d 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -156,7 +156,9 @@ public:
static LLFloaterSnapshot* getInstance();
static LLFloaterSnapshot* findInstance();
/*virtual*/ void saveTexture();
- BOOL saveLocal();
+
+ typedef boost::signals2::signal<void(void)> snapshot_saved_signal_t;
+ void saveLocal(const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
static void setAgentEmail(const std::string& email);
BOOL isWaitingState();
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 4b0b10dd5a..a9b15fc8b6 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -966,15 +966,6 @@ private:
//-----------------------------------------------------------------------------
F32 gpu_benchmark()
{
-#if LL_WINDOWS
- if (gGLManager.mIsIntel
- && std::string::npos != LLOSInfo::instance().getOSStringSimple().find("Microsoft Windows 8")) // or 8.1
- { // don't run benchmark on Windows 8/8.1 based PCs with Intel GPU (MAINT-8197)
- LL_WARNS() << "Skipping gpu_benchmark() for Intel graphics on Windows 8." << LL_ENDL;
- return -1.f;
- }
-#endif
-
if (!gGLManager.mHasShaderObjects || !gGLManager.mHasTimerQuery)
{ // don't bother benchmarking the fixed function
// or venerable drivers which don't support accurate timing anyway
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index dc3b153da2..a90a29a731 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -1166,72 +1166,72 @@ void LLOutfitGallery::refreshTextures(const LLUUID& category_id)
void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
{
- outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
- if (outfit_it == mOutfitMap.end() || outfit_it->first.isNull())
- {
- return;
- }
+ outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
+ if (outfit_it == mOutfitMap.end() || outfit_it->first.isNull())
+ {
+ return;
+ }
+ (new LLFilePickerReplyThread(boost::bind(&LLOutfitGallery::uploadOutfitImage, this, _1, outfit_id), LLFilePicker::FFLOAD_IMAGE, false))->getFile();
+}
- LLFilePicker& picker = LLFilePicker::instance();
- if (picker.getOpenFile(LLFilePicker::FFLOAD_IMAGE))
+void LLOutfitGallery::uploadOutfitImage(const std::vector<std::string>& filenames, LLUUID outfit_id)
+{
+ std::string filename = filenames[0];
+ LLLocalBitmap* unit = new LLLocalBitmap(filename);
+ if (unit->getValid())
{
- std::string filename = picker.getFirstFile();
- LLLocalBitmap* unit = new LLLocalBitmap(filename);
- if (unit->getValid())
+ std::string exten = gDirUtilp->getExtension(filename);
+ U32 codec = LLImageBase::getCodecFromExtension(exten);
+
+ LLImageDimensionsInfo image_info;
+ std::string image_load_error;
+ if (!image_info.load(filename, codec))
{
- std::string exten = gDirUtilp->getExtension(filename);
- U32 codec = LLImageBase::getCodecFromExtension(exten);
+ image_load_error = image_info.getLastError();
+ }
- LLImageDimensionsInfo image_info;
- std::string image_load_error;
- if (!image_info.load(filename, codec))
- {
- image_load_error = image_info.getLastError();
- }
+ S32 max_width = MAX_OUTFIT_PHOTO_WIDTH;
+ S32 max_height = MAX_OUTFIT_PHOTO_HEIGHT;
- S32 max_width = MAX_OUTFIT_PHOTO_WIDTH;
- S32 max_height = MAX_OUTFIT_PHOTO_HEIGHT;
+ 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_height);
- 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_height);
+ image_load_error = LLTrans::getString("outfit_photo_load_dimensions_error", args);
+ }
- image_load_error = LLTrans::getString("outfit_photo_load_dimensions_error", args);
- }
+ if (!image_load_error.empty())
+ {
+ LLSD subst;
+ subst["REASON"] = image_load_error;
+ LLNotificationsUtil::add("OutfitPhotoLoadError", subst);
+ return;
+ }
- if (!image_load_error.empty())
- {
- LLSD subst;
- subst["REASON"] = image_load_error;
- LLNotificationsUtil::add("OutfitPhotoLoadError", subst);
- return;
- }
+ S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
+ void *nruserdata = NULL;
+ nruserdata = (void *)&outfit_id;
- S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
- void *nruserdata = NULL;
- nruserdata = (void *)&outfit_id;
-
- LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(outfit_id);
- if (!outfit_cat) return;
- updateSnapshotFolderObserver();
- checkRemovePhoto(outfit_id);
- std::string upload_pending_name = outfit_id.asString();
- std::string upload_pending_desc = "";
- LLAssetStorage::LLStoreAssetCallback callback = NULL;
- LLUUID photo_id = upload_new_resource(filename, // file
- upload_pending_name,
- upload_pending_desc,
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms("Uploads"),
- LLFloaterPerms::getGroupPerms("Uploads"),
- LLFloaterPerms::getEveryonePerms("Uploads"),
- upload_pending_name, callback, expected_upload_cost, nruserdata);
- mOutfitLinkPending = outfit_id;
- }
- delete unit;
- }
+ LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(outfit_id);
+ if (!outfit_cat) return;
+ updateSnapshotFolderObserver();
+ checkRemovePhoto(outfit_id);
+ std::string upload_pending_name = outfit_id.asString();
+ std::string upload_pending_desc = "";
+ LLAssetStorage::LLStoreAssetCallback callback = NULL;
+ LLUUID photo_id = upload_new_resource(filename, // file
+ upload_pending_name,
+ upload_pending_desc,
+ 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
+ LLFloaterPerms::getNextOwnerPerms("Uploads"),
+ LLFloaterPerms::getGroupPerms("Uploads"),
+ LLFloaterPerms::getEveryonePerms("Uploads"),
+ upload_pending_name, callback, expected_upload_cost, nruserdata);
+ mOutfitLinkPending = outfit_id;
+ }
+ delete unit;
}
void LLOutfitGallery::linkPhotoToOutfit(LLUUID photo_id, LLUUID outfit_id)
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 383924a7d6..6dd8a6298f 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -130,6 +130,7 @@ protected:
private:
void loadPhotos();
void uploadPhoto(LLUUID outfit_id);
+ void uploadOutfitImage(const std::vector<std::string>& filenames, LLUUID outfit_id);
void updateSnapshotFolderObserver();
LLUUID getPhotoAssetId(const LLUUID& outfit_id);
LLUUID getDefaultPhoto();
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index ef5ce155b1..142dea83e2 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -204,6 +204,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// change z sort of clickable text to be behind buttons
sendChildToBack(getChildView("forgot_password_text"));
+ sendChildToBack(getChildView("sign_up_text"));
LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo");
updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
@@ -271,6 +272,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text");
forgot_password_text->setClickedCallback(onClickForgotPassword, NULL);
+ LLTextBox* sign_up_text = getChild<LLTextBox>("sign_up_text");
+ sign_up_text->setClickedCallback(onClickSignUp, NULL);
+
// get the web browser control
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
web_browser->addObserver(this);
@@ -921,6 +925,15 @@ void LLPanelLogin::onClickForgotPassword(void*)
}
}
+//static
+void LLPanelLogin::onClickSignUp(void*)
+{
+ if (sInstance)
+ {
+ LLWeb::loadURLExternal(sInstance->getString("sign_up_url"));
+ }
+}
+
// static
void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
{
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 852195b304..c633582d89 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -99,6 +99,7 @@ private:
static void onClickNewAccount(void*);
static void onClickVersion(void*);
static void onClickForgotPassword(void*);
+ static void onClickSignUp(void*);
static void onPassKey(LLLineEditor* caller, void* user_data);
static void updateServerCombo();
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index d8ef5b39ad..f3a2ed9408 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -1168,12 +1168,12 @@ void LLPanelNearByMedia::onClickSelectedMediaMute()
F32 volume = impl->getVolume();
if(volume > 0.0)
{
- impl->setVolume(0.0);
+ impl->setMute(true);
}
else if (mVolumeSlider->getValueF32() == 0.0)
{
- impl->setVolume(1.0);
- mVolumeSlider->setValue(1.0);
+ impl->setMute(false);
+ mVolumeSlider->setValue(impl->getVolume());
}
else
{
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index a7c53a7050..ef16427713 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -100,6 +100,10 @@ U8 string_value_to_click_action(std::string p_value)
{
return CLICK_ACTION_ZOOM;
}
+ if (p_value == "None")
+ {
+ return CLICK_ACTION_DISABLED;
+ }
return CLICK_ACTION_TOUCH;
}
@@ -126,6 +130,9 @@ std::string click_action_to_string_value( U8 action)
case CLICK_ACTION_ZOOM:
return "Zoom";
break;
+ case CLICK_ACTION_DISABLED:
+ return "None";
+ break;
}
}
@@ -1203,23 +1210,34 @@ void LLPanelPermissions::setAllSaleInfo()
LLSaleInfo new_sale_info(sale_type, price);
LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
- struct f : public LLSelectedObjectFunctor
+ // Note: won't work right if a root and non-root are both single-selected (here and other places).
+ BOOL is_perm_modify = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsModify())
+ || LLSelectMgr::getInstance()->selectGetModify();
+ BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
+ && LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
+ || LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
+
+ if (is_perm_modify && is_nonpermanent_enforced)
{
- virtual bool apply(LLViewerObject* object)
+ struct f : public LLSelectedObjectFunctor
{
- return object->getClickAction() == CLICK_ACTION_BUY
- || object->getClickAction() == CLICK_ACTION_TOUCH;
+ virtual bool apply(LLViewerObject* object)
+ {
+ return object->getClickAction() == CLICK_ACTION_BUY
+ || object->getClickAction() == CLICK_ACTION_TOUCH;
+ }
+ } check_actions;
+
+ // Selection should only contain objects that are of target
+ // action already or of action we are aiming to remove.
+ bool default_actions = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&check_actions);
+
+ if (default_actions && old_sale_info.isForSale() != new_sale_info.isForSale())
+ {
+ U8 new_click_action = new_sale_info.isForSale() ? CLICK_ACTION_BUY : CLICK_ACTION_TOUCH;
+ LLSelectMgr::getInstance()->selectionSetClickAction(new_click_action);
}
- } check_actions;
-
- // Selection should only contain objects that are of target
- // action already or of action we are aiming to remove.
- bool default_actions = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&check_actions);
-
- if (default_actions && old_sale_info.isForSale() != new_sale_info.isForSale())
- {
- U8 new_click_action = new_sale_info.isForSale() ? CLICK_ACTION_BUY : CLICK_ACTION_TOUCH;
- LLSelectMgr::getInstance()->selectionSetClickAction(new_click_action);
}
}
diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp
index 77378f8092..e7fced92a7 100644
--- a/indra/newview/llpanelsnapshotlocal.cpp
+++ b/indra/newview/llpanelsnapshotlocal.cpp
@@ -65,6 +65,9 @@ private:
void onFormatComboCommit(LLUICtrl* ctrl);
void onQualitySliderCommit(LLUICtrl* ctrl);
void onSaveFlyoutCommit(LLUICtrl* ctrl);
+
+ void onLocalSaved();
+ void onLocalCanceled();
};
static LLPanelInjector<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal");
@@ -164,19 +167,22 @@ void LLPanelSnapshotLocal::onSaveFlyoutCommit(LLUICtrl* ctrl)
LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance();
floater->notify(LLSD().with("set-working", true));
- BOOL saved = floater->saveLocal();
- if (saved)
- {
- mSnapshotFloater->postSave();
- floater->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local")));
- }
- else
- {
- cancel();
- floater->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "local")));
- }
+ floater->saveLocal((boost::bind(&LLPanelSnapshotLocal::onLocalSaved, this)), (boost::bind(&LLPanelSnapshotLocal::onLocalCanceled, this)));
+}
+
+void LLPanelSnapshotLocal::onLocalSaved()
+{
+ mSnapshotFloater->postSave();
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local")));
+}
+
+void LLPanelSnapshotLocal::onLocalCanceled()
+{
+ cancel();
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "local")));
}
+
LLSnapshotModel::ESnapshotType LLPanelSnapshotLocal::getSnapshotType()
{
return LLSnapshotModel::SNAPSHOT_LOCAL;
diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp
index 07f8045546..28631e2b7b 100644
--- a/indra/newview/llpanelvoicedevicesettings.cpp
+++ b/indra/newview/llpanelvoicedevicesettings.cpp
@@ -39,7 +39,6 @@
// Library includes (after viewer)
#include "lluictrlfactory.h"
-
static LLPanelInjector<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings");
static const std::string DEFAULT_DEVICE("Default");
@@ -233,18 +232,18 @@ void LLPanelVoiceDeviceSettings::refresh()
}
else if (LLVoiceClient::getInstance()->deviceSettingsUpdated())
{
- LLVoiceDeviceList::const_iterator iter;
+ LLVoiceDeviceList::const_iterator device;
if(mCtrlInputDevices)
{
mCtrlInputDevices->removeall();
mCtrlInputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
- for(iter=LLVoiceClient::getInstance()->getCaptureDevices().begin();
- iter != LLVoiceClient::getInstance()->getCaptureDevices().end();
- iter++)
+ for(device=LLVoiceClient::getInstance()->getCaptureDevices().begin();
+ device != LLVoiceClient::getInstance()->getCaptureDevices().end();
+ device++)
{
- mCtrlInputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
+ mCtrlInputDevices->add(getLocalizedDeviceName(device->display_name), device->full_name, ADD_BOTTOM);
}
// Fix invalid input audio device preference.
@@ -261,10 +260,11 @@ void LLPanelVoiceDeviceSettings::refresh()
mCtrlOutputDevices->removeall();
mCtrlOutputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
- for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin();
- iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)
+ for(device = LLVoiceClient::getInstance()->getRenderDevices().begin();
+ device != LLVoiceClient::getInstance()->getRenderDevices().end();
+ device++)
{
- mCtrlOutputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
+ mCtrlOutputDevices->add(getLocalizedDeviceName(device->display_name), device->full_name, ADD_BOTTOM);
}
// Fix invalid output audio device preference.
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index d4eecaffce..9431914ba3 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -1741,14 +1741,22 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset
buffer[file_length] = 0;
preview->mScriptEd->setScriptText(LLStringExplicit(&buffer[0]), TRUE);
preview->mScriptEd->mEditor->makePristine();
+
+ std::string script_name = DEFAULT_SCRIPT_NAME;
LLInventoryItem* item = gInventory.getItem(*item_uuid);
BOOL is_modifiable = FALSE;
- if(item
- && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(),
- GP_OBJECT_MANIPULATE))
+ if (item)
{
- is_modifiable = TRUE;
+ if (!item->getName().empty())
+ {
+ script_name = item->getName();
+ }
+ if (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))
+ {
+ is_modifiable = TRUE;
+ }
}
+ preview->mScriptEd->setScriptName(script_name);
preview->mScriptEd->setEnableEditing(is_modifiable);
preview->mAssetStatus = PREVIEW_ASSET_LOADED;
}
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index f73722521a..f03c7abc4d 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -1130,6 +1130,8 @@ static U8 string_value_to_click_action(std::string p_value)
return CLICK_ACTION_OPEN;
if (p_value == "Zoom")
return CLICK_ACTION_ZOOM;
+ if (p_value == "None")
+ return CLICK_ACTION_DISABLED;
return CLICK_ACTION_TOUCH;
}
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index ee8b2d79c0..d0cff1464b 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -70,6 +70,7 @@ S32 BORDER_WIDTH = 6;
const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512
std::set<LLSnapshotLivePreview*> LLSnapshotLivePreview::sList;
+LLPointer<LLImageFormatted> LLSnapshotLivePreview::sSaveLocalImage = NULL;
LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Params& p)
: LLView(p),
@@ -131,6 +132,7 @@ LLSnapshotLivePreview::~LLSnapshotLivePreview()
// gIdleCallbacks.deleteFunction( &LLSnapshotLivePreview::onIdle, (void*)this );
sList.erase(this);
+ sSaveLocalImage = NULL;
}
void LLSnapshotLivePreview::setMaxImageSize(S32 size)
@@ -1065,53 +1067,19 @@ void LLSnapshotLivePreview::saveTexture(BOOL outfit_snapshot, std::string name)
mDataSize = 0;
}
-BOOL LLSnapshotLivePreview::saveLocal()
+void LLSnapshotLivePreview::saveLocal(const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
{
// Update mFormattedImage if necessary
getFormattedImage();
// Save the formatted image
- BOOL success = saveLocal(mFormattedImage);
-
- if(success)
- {
- gViewerWindow->playSnapshotAnimAndSound();
- }
- return success;
+ saveLocal(mFormattedImage, success_cb, failure_cb);
}
//Check if failed due to insufficient memory
-BOOL LLSnapshotLivePreview::saveLocal(LLPointer<LLImageFormatted> mFormattedImage)
+void LLSnapshotLivePreview::saveLocal(LLPointer<LLImageFormatted> image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
{
- BOOL insufficient_memory;
- BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage, FALSE, insufficient_memory);
+ sSaveLocalImage = image;
- if (insufficient_memory)
- {
- std::string lastSnapshotDir = LLViewerWindow::getLastSnapshotDir();
-
-#ifdef LL_WINDOWS
- boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir));
-#else
- boost::filesystem::path b_path(lastSnapshotDir);
-#endif
- boost::filesystem::space_info b_space = boost::filesystem::space(b_path);
- if (b_space.free < mFormattedImage->getDataSize())
- {
- LLSD args;
- args["PATH"] = lastSnapshotDir;
-
- std::string needM_bytes_string;
- LLResMgr::getInstance()->getIntegerString(needM_bytes_string, (mFormattedImage->getDataSize()) >> 10);
- args["NEED_MEMORY"] = needM_bytes_string;
-
- std::string freeM_bytes_string;
- LLResMgr::getInstance()->getIntegerString(freeM_bytes_string, (b_space.free) >> 10);
- args["FREE_MEMORY"] = freeM_bytes_string;
-
- LLNotificationsUtil::add("SnapshotToComputerFailed", args);
- return false;
- }
- }
- return success;
+ gViewerWindow->saveImageNumbered(sSaveLocalImage, FALSE, success_cb, failure_cb);
}
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index 4ea8d25a5a..683cd016d8 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -40,8 +40,9 @@ class LLSnapshotLivePreview : public LLView
{
LOG_CLASS(LLSnapshotLivePreview);
public:
+ typedef boost::signals2::signal<void(void)> snapshot_saved_signal_t;
- static BOOL saveLocal(LLPointer<LLImageFormatted>);
+ static void saveLocal(LLPointer<LLImageFormatted> image, const snapshot_saved_signal_t::slot_type& success_cb = snapshot_saved_signal_t(), const snapshot_saved_signal_t::slot_type& failure_cb = snapshot_saved_signal_t());
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
Params()
@@ -101,7 +102,7 @@ public:
std::string getFilter() const { return mFilterName; }
void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);
void saveTexture(BOOL outfit_snapshot = FALSE, std::string name = "");
- BOOL saveLocal();
+ void saveLocal(const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
LLPointer<LLImageFormatted> getFormattedImage();
LLPointer<LLImageRaw> getEncodedImage();
@@ -170,7 +171,9 @@ private:
LLQuaternion mCameraRot;
BOOL mSnapshotActive;
LLSnapshotModel::ESnapshotLayerType mSnapshotBufferType;
- std::string mFilterName;
+ std::string mFilterName;
+
+ static LLPointer<LLImageFormatted> sSaveLocalImage;
public:
static std::set<LLSnapshotLivePreview*> sList;
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 2a0d961952..633e025478 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -615,7 +615,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
if(idx >= 0)
{
// write to the fast cache.
- if(!mCache->writeToFastCache(idx, mRawImage, mRawDiscardLevel))
+ if(!mCache->writeToFastCache(mID, idx, mRawImage, mRawDiscardLevel))
{
LL_WARNS() << "writeToFastCache failed" << LL_ENDL;
mDataSize = -1; // failed
@@ -1998,8 +1998,48 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d
return raw;
}
+#if LL_WINDOWS
+
+static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
+
+U32 exception_dupe_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop)
+{
+ if (code == STATUS_MSC_EXCEPTION)
+ {
+ // C++ exception, go on
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ else
+ {
+ // handle it
+ return EXCEPTION_EXECUTE_HANDLER;
+ }
+}
+
+//due to unwinding
+void dupe(LLPointer<LLImageRaw> &raw)
+{
+ raw = raw->duplicate();
+}
+
+void logExceptionDupplicate(LLPointer<LLImageRaw> &raw)
+{
+ __try
+ {
+ dupe(raw);
+ }
+ __except (exception_dupe_filter(GetExceptionCode(), GetExceptionInformation()))
+ {
+ // convert to C++ styled exception
+ char integer_string[32];
+ sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());
+ throw std::exception(integer_string);
+ }
+}
+#endif
+
//return the fast cache location
-bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 discardlevel)
+bool LLTextureCache::writeToFastCache(LLUUID image_id, S32 id, LLPointer<LLImageRaw> raw, S32 discardlevel)
{
//rescale image if needed
if (raw.isNull() || raw->isBufferInvalid() || !raw->getData())
@@ -2027,13 +2067,39 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
if(w * h *c > 0) //valid
{
//make a duplicate to keep the original raw image untouched.
- raw = raw->scaled(w, h);
+
+ try
+ {
+#if LL_WINDOWS
+ // Temporary diagnostics for scale/duplicate crash
+ logExceptionDupplicate(raw);
+#else
+ raw = raw->duplicate();
+#endif
+ }
+ catch (...)
+ {
+ removeFromCache(image_id);
+ LL_ERRS() << "Failed to cache image: " << image_id
+ << " local id: " << id
+ << " Exception: " << boost::current_exception_diagnostic_information()
+ << " Image new width: " << w
+ << " Image new height: " << h
+ << " Image new components: " << c
+ << " Image discard difference: " << i
+ << LL_ENDL;
+
+ return false;
+ }
+
if (raw->isBufferInvalid())
{
LL_WARNS() << "Invalid image duplicate buffer" << LL_ENDL;
return false;
}
+ raw->scale(w, h);
+
discardlevel += i ;
}
}
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 95f9afc2bc..987b9375c0 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -179,7 +179,7 @@ private:
void openFastCache(bool first_time = false);
void closeFastCache(bool forced = false);
- bool writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 discardlevel);
+ bool writeToFastCache(LLUUID image_id, S32 cache_id, LLPointer<LLImageRaw> raw, S32 discardlevel);
private:
// Internal
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 9fb53dc9ab..0f38cca56f 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -263,7 +263,7 @@ LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()
addEntry(DAD_CLOTHING, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_OBJECT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dRezAttachmentFromInv, &LLToolDragAndDrop::dad3dGiveInventoryObject, &LLToolDragAndDrop::dad3dRezObjectOnObject, &LLToolDragAndDrop::dad3dRezObjectOnLand));
addEntry(DAD_NOTECARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory, &LLToolDragAndDrop::dad3dUpdateInventoryCategory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory, &LLToolDragAndDrop::dad3dRezCategoryOnObject, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_ROOT_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_BODYPART, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
@@ -2335,6 +2335,21 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
return rv;
}
+
+EAcceptance LLToolDragAndDrop::dad3dRezCategoryOnObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+{
+ if ((mask & MASK_CONTROL))
+ {
+ return dad3dUpdateInventoryCategory(obj, face, mask, drop);
+ }
+ else
+ {
+ return ACCEPT_NO;
+ }
+}
+
+
BOOL LLToolDragAndDrop::dadUpdateInventoryCategory(LLViewerObject* obj,
BOOL drop)
{
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 2d99de2244..24a712029c 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -162,6 +162,8 @@ protected:
MASK mask, BOOL drop);
EAcceptance dad3dRezObjectOnObject(LLViewerObject* obj, S32 face,
MASK mask, BOOL drop);
+ EAcceptance dad3dRezCategoryOnObject(LLViewerObject* obj, S32 face,
+ MASK mask, BOOL drop);
EAcceptance dad3dRezScript(LLViewerObject* obj, S32 face,
MASK mask, BOOL drop);
EAcceptance dad3dTextureObject(LLViewerObject* obj, S32 face,
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index f473000657..6a8843cb44 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -300,6 +300,8 @@ BOOL LLToolPie::handleLeftClickPick()
}
}
return TRUE;
+ case CLICK_ACTION_DISABLED:
+ return TRUE;
default:
// nothing
break;
@@ -463,6 +465,8 @@ ECursorType LLToolPie::cursorFromObject(LLViewerObject* object)
case CLICK_ACTION_OPEN_MEDIA:
cursor = cursor_from_parcel_media(click_action);
break;
+ case CLICK_ACTION_DISABLED:
+ break;
default:
break;
}
@@ -528,6 +532,8 @@ void LLToolPie::selectionPropertiesReceived()
case CLICK_ACTION_OPEN:
LLFloaterReg::showInstance("openobject");
break;
+ case CLICK_ACTION_DISABLED:
+ break;
default:
break;
}
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 55317bdaf5..0ebacddd9b 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -34,6 +34,7 @@
#include "llcompilequeue.h"
#include "llfasttimerview.h"
#include "llfloaterabout.h"
+#include "llfloaterauction.h"
#include "llfloaterautoreplacesettings.h"
#include "llfloateravatar.h"
#include "llfloateravatarpicker.h"
@@ -193,6 +194,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);
LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("associate_listing", "floater_associate_listing.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAssociateListing>);
+ LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
LLFloaterReg::add("avatar_render_settings", "floater_avatar_render_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarRenderSettings>);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 4334cbfda3..22a21c9ca3 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1555,6 +1555,7 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
mNavigateServerRequest(false),
mMediaSourceFailed(false),
mRequestedVolume(1.0f),
+ mPreviousVolume(1.0f),
mIsMuted(false),
mNeedsMuteCheck(false),
mPreviousMediaState(MEDIA_NONE),
@@ -2082,6 +2083,20 @@ void LLViewerMediaImpl::setVolume(F32 volume)
}
//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::setMute(bool mute)
+{
+ if (mute)
+ {
+ mPreviousVolume = mRequestedVolume;
+ setVolume(0.0);
+ }
+ else
+ {
+ setVolume(mPreviousVolume);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::updateVolume()
{
if(mMediaSource)
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index c52960dfcf..e2e758befb 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -216,6 +216,7 @@ public:
void skipBack(F32 step_scale);
void skipForward(F32 step_scale);
void setVolume(F32 volume);
+ void setMute(bool mute);
void updateVolume();
F32 getVolume();
void focus(bool focus);
@@ -448,6 +449,7 @@ private:
bool mNavigateServerRequest;
bool mMediaSourceFailed;
F32 mRequestedVolume;
+ F32 mPreviousVolume;
bool mIsMuted;
bool mNeedsMuteCheck;
int mPreviousMediaState;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 0eebf2051c..f7250ffb66 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3649,9 +3649,16 @@ class LLSelfSitDown : public view_listener_t
}
};
+
+
+bool show_sitdown_self()
+{
+ return isAgentAvatarValid() && !gAgentAvatarp->isSitting();
+}
+
bool enable_sitdown_self()
{
- return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgentAvatarp->isEditingAppearance() && !gAgent.getFlying();
+ return show_sitdown_self() && !gAgentAvatarp->isEditingAppearance() && !gAgent.getFlying();
}
class LLCheckPanelPeopleTab : public view_listener_t
@@ -9068,7 +9075,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp");
enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self));
view_listener_t::addMenu(new LLSelfSitDown(), "Self.SitDown");
- enable.add("Self.EnableSitDown", boost::bind(&enable_sitdown_self));
+ enable.add("Self.EnableSitDown", boost::bind(&enable_sitdown_self));
+ enable.add("Self.ShowSitDown", boost::bind(&show_sitdown_self));
view_listener_t::addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments");
view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index dc05d98228..cf1c442ce9 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -203,38 +203,55 @@ void LLFilePickerThread::clearDead()
}
}
-LLFilePickerReplyThread::LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple)
+LLFilePickerReplyThread::LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple, const file_picked_signal_t::slot_type& failure_cb)
: LLFilePickerThread(filter, get_multiple),
mLoadFilter(filter),
mSaveFilter(LLFilePicker::FFSAVE_ALL),
- mFilePickedSignal(NULL)
+ mFilePickedSignal(NULL),
+ mFailureSignal(NULL)
{
mFilePickedSignal = new file_picked_signal_t();
mFilePickedSignal->connect(cb);
+
+ mFailureSignal = new file_picked_signal_t();
+ mFailureSignal->connect(failure_cb);
}
-LLFilePickerReplyThread::LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name)
+LLFilePickerReplyThread::LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name, const file_picked_signal_t::slot_type& failure_cb)
: LLFilePickerThread(filter, proposed_name),
mLoadFilter(LLFilePicker::FFLOAD_ALL),
mSaveFilter(filter),
- mFilePickedSignal(NULL)
+ mFilePickedSignal(NULL),
+ mFailureSignal(NULL)
{
mFilePickedSignal = new file_picked_signal_t();
mFilePickedSignal->connect(cb);
+
+ mFailureSignal = new file_picked_signal_t();
+ mFailureSignal->connect(failure_cb);
}
LLFilePickerReplyThread::~LLFilePickerReplyThread()
{
delete mFilePickedSignal;
+ delete mFailureSignal;
}
void LLFilePickerReplyThread::notify(const std::vector<std::string>& filenames)
{
- if (filenames.empty()) return;
-
- if (mFilePickedSignal)
+ if (filenames.empty())
+ {
+ if (mFailureSignal)
+ {
+ (*mFailureSignal)(filenames, mLoadFilter, mSaveFilter);
+ }
+ }
+ else
{
- (*mFilePickedSignal)(filenames, mLoadFilter, mSaveFilter);
+ if (mFilePickedSignal)
+ {
+ (*mFilePickedSignal)(filenames, mLoadFilter, mSaveFilter);
+ }
}
}
@@ -592,7 +609,6 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
gSavedSettings.getBOOL("RenderUIInSnapshot"),
FALSE))
{
- gViewerWindow->playSnapshotAnimAndSound();
LLPointer<LLImageFormatted> formatted;
LLSnapshotModel::ESnapshotFormat fmt = (LLSnapshotModel::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat");
switch (fmt)
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 15bbdd1e2d..35f86f606b 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -113,8 +113,8 @@ public:
typedef boost::signals2::signal<void(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter)> file_picked_signal_t;
- LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple);
- LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name);
+ LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
+ LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
~LLFilePickerReplyThread();
virtual void notify(const std::vector<std::string>& filenames);
@@ -123,6 +123,7 @@ private:
LLFilePicker::ELoadFilter mLoadFilter;
LLFilePicker::ESaveFilter mSaveFilter;
file_picked_signal_t* mFilePickedSignal;
+ file_picked_signal_t* mFailureSignal;
};
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 0f326efe09..850d455c36 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -153,6 +153,98 @@ const U8 AU_FLAGS_NONE = 0x00;
const U8 AU_FLAGS_HIDETITLE = 0x01;
const U8 AU_FLAGS_CLIENT_AUTOPILOT = 0x02;
+void accept_friendship_coro(std::string url, LLSD notification)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ if (url.empty())
+ {
+ LL_WARNS("Friendship") << "Empty capability!" << LL_ENDL;
+ return;
+ }
+
+ LLSD payload = notification["payload"];
+ url += "?from=" + payload["from_id"].asString();
+ url += "&agent_name=\"" + LLURI::escape(gAgentAvatarp->getFullname()) + "\"";
+
+ LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ if (!status)
+ {
+ LL_WARNS("Friendship") << "HTTP status, " << status.toTerseString() <<
+ ". friendship offer accept failed." << LL_ENDL;
+ }
+ else
+ {
+ if (!result.has("success") || result["success"].asBoolean() == false)
+ {
+ LL_WARNS("Friendship") << "Server failed to process accepted friendship. " << httpResults << LL_ENDL;
+ }
+ else
+ {
+ LL_DEBUGS("Friendship") << "Adding friend to list" << httpResults << LL_ENDL;
+ // add friend to recent people list
+ LLRecentPeople::instance().add(payload["from_id"]);
+
+ LLNotificationsUtil::add("FriendshipAcceptedByMe",
+ notification["substitutions"], payload);
+ }
+ }
+}
+
+void decline_friendship_coro(std::string url, LLSD notification, S32 option)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ if (url.empty())
+ {
+ LL_WARNS("Friendship") << "Empty capability!" << LL_ENDL;
+ return;
+ }
+
+ LLSD payload = notification["payload"];
+ url += "?from=" + payload["from_id"].asString();
+
+ LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ if (!status)
+ {
+ LL_WARNS("Friendship") << "HTTP status, " << status.toTerseString() <<
+ ". friendship offer decline failed." << LL_ENDL;
+ }
+ else
+ {
+ if (!result.has("success") || result["success"].asBoolean() == false)
+ {
+ LL_WARNS("Friendship") << "Server failed to process declined friendship. " << httpResults << LL_ENDL;
+ }
+ else
+ {
+ LL_DEBUGS("Friendship") << "Friendship declined" << httpResults << LL_ENDL;
+ if (option == 1)
+ {
+ LLNotificationsUtil::add("FriendshipDeclinedByMe",
+ notification["substitutions"], payload);
+ }
+ else if (option == 2)
+ {
+ // start IM session
+ LLAvatarActions::startIM(payload["from_id"].asUUID());
+ }
+ }
+ }
+}
+
bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -163,9 +255,6 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
// this will be skipped if the user offering friendship is blocked
if (notification_ptr)
{
- // add friend to recent people list
- LLRecentPeople::instance().add(payload["from_id"]);
-
switch(option)
{
case 0:
@@ -176,46 +265,79 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
// This will also trigger an onlinenotification if the user is online
- msg->newMessageFast(_PREHASH_AcceptFriendship);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_TransactionBlock);
- msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
- msg->nextBlockFast(_PREHASH_FolderData);
- msg->addUUIDFast(_PREHASH_FolderID, fid);
- msg->sendReliable(LLHost(payload["sender"].asString()));
-
- LLSD payload = notification["payload"];
- LLNotificationsUtil::add("FriendshipAcceptedByMe",
- notification["substitutions"], payload);
+ std::string url = gAgent.getRegionCapability("AcceptFriendship");
+ LL_DEBUGS("Friendship") << "Cap string: " << url << LL_ENDL;
+ if (!url.empty() && payload.has("online") && payload["online"].asBoolean() == false)
+ {
+ LL_DEBUGS("Friendship") << "Accepting friendship via capability" << LL_ENDL;
+ LLCoros::instance().launch("LLMessageSystem::acceptFriendshipOffer",
+ boost::bind(accept_friendship_coro, url, notification));
+ }
+ else if (payload.has("session_id") && payload["session_id"].asUUID().notNull())
+ {
+ LL_DEBUGS("Friendship") << "Accepting friendship via viewer message" << LL_ENDL;
+ msg->newMessageFast(_PREHASH_AcceptFriendship);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_TransactionBlock);
+ msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
+ msg->nextBlockFast(_PREHASH_FolderData);
+ msg->addUUIDFast(_PREHASH_FolderID, fid);
+ msg->sendReliable(LLHost(payload["sender"].asString()));
+
+ // add friend to recent people list
+ LLRecentPeople::instance().add(payload["from_id"]);
+ LLNotificationsUtil::add("FriendshipAcceptedByMe",
+ notification["substitutions"], payload);
+ }
+ else
+ {
+ LL_WARNS("Friendship") << "Failed to accept friendship offer, neither capability nor transaction id are accessible" << LL_ENDL;
+ }
break;
}
case 1: // Decline
- {
- LLSD payload = notification["payload"];
- LLNotificationsUtil::add("FriendshipDeclinedByMe",
- notification["substitutions"], payload);
- }
// fall-through
case 2: // Send IM - decline and start IM session
{
// decline
// We no longer notify other viewers, but we DO still send
- // the rejection to the simulator to delete the pending userop.
- msg->newMessageFast(_PREHASH_DeclineFriendship);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_TransactionBlock);
- msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
- msg->sendReliable(LLHost(payload["sender"].asString()));
-
- // start IM session
- if(2 == option)
- {
- LLAvatarActions::startIM(payload["from_id"].asUUID());
- }
+ // the rejection to the simulator to delete the pending userop.
+ std::string url = gAgent.getRegionCapability("DeclineFriendship");
+ LL_DEBUGS("Friendship") << "Cap string: " << url << LL_ENDL;
+ if (!url.empty() && payload.has("online") && payload["online"].asBoolean() == false)
+ {
+ LL_DEBUGS("Friendship") << "Declining friendship via capability" << LL_ENDL;
+ LLCoros::instance().launch("LLMessageSystem::declineFriendshipOffer",
+ boost::bind(decline_friendship_coro, url, notification, option));
+ }
+ else if (payload.has("session_id") && payload["session_id"].asUUID().notNull())
+ {
+ LL_DEBUGS("Friendship") << "Declining friendship via viewer message" << LL_ENDL;
+ msg->newMessageFast(_PREHASH_DeclineFriendship);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_TransactionBlock);
+ msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
+ msg->sendReliable(LLHost(payload["sender"].asString()));
+
+ if (option == 1) // due to fall-through
+ {
+ LLNotificationsUtil::add("FriendshipDeclinedByMe",
+ notification["substitutions"], payload);
+ }
+ else if (option == 2)
+ {
+ // start IM session
+ LLAvatarActions::startIM(payload["from_id"].asUUID());
+ }
+ }
+ else
+ {
+ LL_WARNS("Friendship") << "Failed to decline friendship offer, neither capability nor transaction id are accessible" << LL_ENDL;
+ }
}
default:
// close button probably, possibly timed out
@@ -3258,6 +3380,110 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
}
+// sounds can arrive before objects, store them for a short time
+// Note: this is a workaround for MAINT-4743, real fix would be to make
+// server send sound along with object update that creates (rezes) the object
+class PostponedSoundData
+{
+public:
+ PostponedSoundData() :
+ mExpirationTime(0)
+ {}
+ PostponedSoundData(const LLUUID &object_id, const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const U8 flags);
+ bool hasExpired() { return LLFrameTimer::getTotalSeconds() > mExpirationTime; }
+
+ LLUUID mObjectId;
+ LLUUID mSoundId;
+ LLUUID mOwnerId;
+ F32 mGain;
+ U8 mFlags;
+ static const F64 MAXIMUM_PLAY_DELAY;
+
+private:
+ F64 mExpirationTime; //seconds since epoch
+};
+const F64 PostponedSoundData::MAXIMUM_PLAY_DELAY = 15.0;
+static F64 postponed_sounds_update_expiration = 0.0;
+static std::map<LLUUID, PostponedSoundData> postponed_sounds;
+
+void set_attached_sound(LLViewerObject *objectp, const LLUUID &object_id, const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const U8 flags)
+{
+ if (LLMuteList::getInstance()->isMuted(object_id)) return;
+
+ if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return;
+
+ // Don't play sounds from a region with maturity above current agent maturity
+ LLVector3d pos = objectp->getPositionGlobal();
+ if (!gAgent.canAccessMaturityAtGlobal(pos))
+ {
+ return;
+ }
+
+ objectp->setAttachedSound(sound_id, owner_id, gain, flags);
+}
+
+PostponedSoundData::PostponedSoundData(const LLUUID &object_id, const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const U8 flags)
+ :
+ mObjectId(object_id),
+ mSoundId(sound_id),
+ mOwnerId(owner_id),
+ mGain(gain),
+ mFlags(flags),
+ mExpirationTime(LLFrameTimer::getTotalSeconds() + MAXIMUM_PLAY_DELAY)
+{
+}
+
+// static
+void update_attached_sounds()
+{
+ if (postponed_sounds.empty())
+ {
+ return;
+ }
+
+ std::map<LLUUID, PostponedSoundData>::iterator iter = postponed_sounds.begin();
+ std::map<LLUUID, PostponedSoundData>::iterator end = postponed_sounds.end();
+ while (iter != end)
+ {
+ std::map<LLUUID, PostponedSoundData>::iterator cur_iter = iter++;
+ PostponedSoundData* data = &cur_iter->second;
+ if (data->hasExpired())
+ {
+ postponed_sounds.erase(cur_iter);
+ }
+ else
+ {
+ LLViewerObject *objectp = gObjectList.findObject(data->mObjectId);
+ if (objectp)
+ {
+ set_attached_sound(objectp, data->mObjectId, data->mSoundId, data->mOwnerId, data->mGain, data->mFlags);
+ postponed_sounds.erase(cur_iter);
+ }
+ }
+ }
+ postponed_sounds_update_expiration = LLFrameTimer::getTotalSeconds() + 2 * PostponedSoundData::MAXIMUM_PLAY_DELAY;
+}
+
+//static
+void clear_expired_postponed_sounds()
+{
+ if (postponed_sounds_update_expiration > LLFrameTimer::getTotalSeconds())
+ {
+ return;
+ }
+ std::map<LLUUID, PostponedSoundData>::iterator iter = postponed_sounds.begin();
+ std::map<LLUUID, PostponedSoundData>::iterator end = postponed_sounds.end();
+ while (iter != end)
+ {
+ std::map<LLUUID, PostponedSoundData>::iterator cur_iter = iter++;
+ PostponedSoundData* data = &cur_iter->second;
+ if (data->hasExpired())
+ {
+ postponed_sounds.erase(cur_iter);
+ }
+ }
+ postponed_sounds_update_expiration = LLFrameTimer::getTotalSeconds() + 2 * PostponedSoundData::MAXIMUM_PLAY_DELAY;
+}
// *TODO: Remove this dependency, or figure out a better way to handle
// this hack.
@@ -3276,7 +3502,12 @@ void process_object_update(LLMessageSystem *mesgsys, void **user_data)
}
// Update the object...
+ S32 old_num_objects = gObjectList.mNumNewObjects;
gObjectList.processObjectUpdate(mesgsys, user_data, OUT_FULL);
+ if (old_num_objects != gObjectList.mNumNewObjects)
+ {
+ update_attached_sounds();
+ }
}
void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data)
@@ -3292,7 +3523,12 @@ void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data
}
// Update the object...
+ S32 old_num_objects = gObjectList.mNumNewObjects;
gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_FULL_COMPRESSED);
+ if (old_num_objects != gObjectList.mNumNewObjects)
+ {
+ update_attached_sounds();
+ }
}
void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data)
@@ -3323,7 +3559,12 @@ void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_
gObjectData += (U32Bytes)mesgsys->getReceiveSize();
}
+ S32 old_num_objects = gObjectList.mNumNewObjects;
gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_TERSE_IMPROVED);
+ if (old_num_objects != gObjectList.mNumNewObjects)
+ {
+ update_attached_sounds();
+ }
}
static LLTrace::BlockTimerStatHandle FTM_PROCESS_OBJECTS("Process Kill Objects");
@@ -3545,28 +3786,27 @@ void process_attached_sound(LLMessageSystem *msg, void **user_data)
msg->getU8Fast(_PREHASH_DataBlock, _PREHASH_Flags, flags);
LLViewerObject *objectp = gObjectList.findObject(object_id);
- if (!objectp)
+ if (objectp)
{
- // we don't know about this object, just bail
- return;
+ set_attached_sound(objectp, object_id, sound_id, owner_id, gain, flags);
}
-
- if (LLMuteList::getInstance()->isMuted(object_id)) return;
-
- if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return;
-
-
- // Don't play sounds from a region with maturity above current agent maturity
- LLVector3d pos = objectp->getPositionGlobal();
- if( !gAgent.canAccessMaturityAtGlobal(pos) )
+ else if (sound_id.notNull())
{
- return;
+ // we don't know about this object yet, probably it has yet to arrive
+ // std::map for dupplicate prevention.
+ postponed_sounds[object_id] = (PostponedSoundData(object_id, sound_id, owner_id, gain, flags));
+ clear_expired_postponed_sounds();
+ }
+ else
+ {
+ std::map<LLUUID, PostponedSoundData>::iterator iter = postponed_sounds.find(object_id);
+ if (iter != postponed_sounds.end())
+ {
+ postponed_sounds.erase(iter);
+ }
}
-
- objectp->setAttachedSound(sound_id, owner_id, gain, flags);
}
-
void process_attached_sound_gain_change(LLMessageSystem *mesgsys, void **user_data)
{
F32 gain = 0;
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 6937d064f9..9f6d606a22 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -63,7 +63,7 @@ const std::string GRID_LOGIN_IDENTIFIER_TYPES = "login_identifier_types";
const std::string GRID_SLURL_BASE = "slurl_base";
const std::string GRID_APP_SLURL_BASE = "app_slurl_base";
-const std::string DEFAULT_LOGIN_PAGE = "http://viewer-login.agni.lindenlab.com/";
+const std::string DEFAULT_LOGIN_PAGE = "https://viewer-splash.secondlife.com/";
const std::string MAIN_GRID_LOGIN_URI = "https://login.agni.lindenlab.com/cgi-bin/login.cgi";
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 98320247e0..836b92efb8 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1877,7 +1877,7 @@ void LLViewerRegion::updateNetStats()
mLastPacketsLost = mPacketsLost;
mPacketsIn = cdp->getPacketsIn();
- mBitsIn = cdp->getBytesIn();
+ mBitsIn = 8 * cdp->getBytesIn();
mPacketsOut = cdp->getPacketsOut();
mPacketsLost = cdp->getPacketsLost();
mPingDelay = cdp->getPingDelay();
@@ -2817,6 +2817,7 @@ void LLViewerRegion::unpackRegionHandshake()
void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
{
capabilityNames.append("AbuseCategories");
+ //capabilityNames.append("AcceptFriendship");
capabilityNames.append("AgentPreferences");
capabilityNames.append("AgentState");
capabilityNames.append("AttachmentResources");
@@ -2826,6 +2827,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("ChatSessionRequest");
capabilityNames.append("CopyInventoryFromNotecard");
capabilityNames.append("CreateInventoryCategory");
+ //capabilityNames.append("DeclineFriendship");
capabilityNames.append("DispatchRegionInfo");
capabilityNames.append("DirectDelivery");
capabilityNames.append("EnvironmentSettings");
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index f394d6913f..cef19c9c2d 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -193,6 +193,7 @@
#include "llviewerdisplay.h"
#include "llspatialpartition.h"
#include "llviewerjoystick.h"
+#include "llviewermenufile.h" // LLFilePickerReplyThread
#include "llviewernetwork.h"
#include "llpostprocess.h"
#include "llfloaterimnearbychat.h"
@@ -4365,77 +4366,110 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d
}
// Saves an image to the harddrive as "SnapshotX" where X >= 1.
-BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picker, BOOL& insufficient_memory)
+void LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picker, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
{
- insufficient_memory = FALSE;
-
if (!image)
{
LL_WARNS() << "No image to save" << LL_ENDL;
- return FALSE;
+ return;
}
-
- LLFilePicker::ESaveFilter pick_type;
std::string extension("." + image->getExtension());
- if (extension == ".j2c")
- pick_type = LLFilePicker::FFSAVE_J2C;
- else if (extension == ".bmp")
- pick_type = LLFilePicker::FFSAVE_BMP;
- else if (extension == ".jpg")
- pick_type = LLFilePicker::FFSAVE_JPEG;
- else if (extension == ".png")
- pick_type = LLFilePicker::FFSAVE_PNG;
- else if (extension == ".tga")
- pick_type = LLFilePicker::FFSAVE_TGA;
- else
- pick_type = LLFilePicker::FFSAVE_ALL; // ???
-
- BOOL is_snapshot_name_loc_set = isSnapshotLocSet();
-
+ LLImageFormatted* formatted_image = image;
// Get a base file location if needed.
if (force_picker || !isSnapshotLocSet())
{
- std::string proposed_name( sSnapshotBaseName );
+ std::string proposed_name(sSnapshotBaseName);
// getSaveFile will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in.
+ LLFilePicker::ESaveFilter pick_type;
+
+ if (extension == ".j2c")
+ pick_type = LLFilePicker::FFSAVE_J2C;
+ else if (extension == ".bmp")
+ pick_type = LLFilePicker::FFSAVE_BMP;
+ else if (extension == ".jpg")
+ pick_type = LLFilePicker::FFSAVE_JPEG;
+ else if (extension == ".png")
+ pick_type = LLFilePicker::FFSAVE_PNG;
+ else if (extension == ".tga")
+ pick_type = LLFilePicker::FFSAVE_TGA;
+ else
+ pick_type = LLFilePicker::FFSAVE_ALL;
- // pick a directory in which to save
- LLFilePicker& picker = LLFilePicker::instance();
- if (!picker.getSaveFile(pick_type, proposed_name))
- {
- // Clicked cancel
- return FALSE;
- }
+ (new LLFilePickerReplyThread(boost::bind(&LLViewerWindow::onDirectorySelected, this, _1, formatted_image, success_cb, failure_cb), pick_type, proposed_name,
+ boost::bind(&LLViewerWindow::onSelectionFailure, this, failure_cb)))->getFile();
+ }
+ else
+ {
+ saveImageLocal(formatted_image, success_cb, failure_cb);
+ }
+}
+
+void LLViewerWindow::onDirectorySelected(const std::vector<std::string>& filenames, LLImageFormatted *image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
+{
+ // Copy the directory + file name
+ std::string filepath = filenames[0];
- // Copy the directory + file name
- std::string filepath = picker.getFirstFile();
+ gSavedPerAccountSettings.setString("SnapshotBaseName", gDirUtilp->getBaseFileName(filepath, true));
+ gSavedPerAccountSettings.setString("SnapshotBaseDir", gDirUtilp->getDirName(filepath));
+ saveImageLocal(image, success_cb, failure_cb);
+}
- gSavedPerAccountSettings.setString("SnapshotBaseName", gDirUtilp->getBaseFileName(filepath, true));
- gSavedPerAccountSettings.setString("SnapshotBaseDir", gDirUtilp->getDirName(filepath));
- }
+void LLViewerWindow::onSelectionFailure(const snapshot_saved_signal_t::slot_type& failure_cb)
+{
+ failure_cb();
+}
- std::string snapshot_dir = sSnapshotDir;
- if(snapshot_dir.empty())
+
+void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
+{
+ std::string lastSnapshotDir = LLViewerWindow::getLastSnapshotDir();
+ if (lastSnapshotDir.empty())
{
- return FALSE;
+ failure_cb();
+ return;
}
// Check if there is enough free space to save snapshot
#ifdef LL_WINDOWS
- boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(snapshot_dir));
+ boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir));
#else
- boost::filesystem::space_info b_space = boost::filesystem::space(snapshot_dir);
+ boost::filesystem::path b_path(lastSnapshotDir);
#endif
+ if (!boost::filesystem::is_directory(b_path))
+ {
+ LLSD args;
+ args["PATH"] = lastSnapshotDir;
+ LLNotificationsUtil::add("SnapshotToLocalDirNotExist", args);
+ resetSnapshotLoc();
+ failure_cb();
+ return;
+ }
+ boost::filesystem::space_info b_space = boost::filesystem::space(b_path);
if (b_space.free < image->getDataSize())
{
- insufficient_memory = TRUE;
- return FALSE;
+ LLSD args;
+ args["PATH"] = lastSnapshotDir;
+
+ std::string needM_bytes_string;
+ LLResMgr::getInstance()->getIntegerString(needM_bytes_string, (image->getDataSize()) >> 10);
+ args["NEED_MEMORY"] = needM_bytes_string;
+
+ std::string freeM_bytes_string;
+ LLResMgr::getInstance()->getIntegerString(freeM_bytes_string, (b_space.free) >> 10);
+ args["FREE_MEMORY"] = freeM_bytes_string;
+
+ LLNotificationsUtil::add("SnapshotToComputerFailed", args);
+
+ failure_cb();
}
+
// Look for an unused file name
+ BOOL is_snapshot_name_loc_set = isSnapshotLocSet();
std::string filepath;
S32 i = 1;
S32 err = 0;
-
+ std::string extension("." + image->getExtension());
do
{
filepath = sSnapshotDir;
@@ -4457,7 +4491,15 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picke
&& is_snapshot_name_loc_set); // Or stop if we are rewriting.
LL_INFOS() << "Saving snapshot to " << filepath << LL_ENDL;
- return image->save(filepath);
+ if (image->save(filepath))
+ {
+ playSnapshotAnimAndSound();
+ success_cb();
+ }
+ else
+ {
+ failure_cb();
+ }
}
void LLViewerWindow::resetSnapshotLoc()
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index c01921641c..d8d420e6be 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -352,7 +352,13 @@ public:
BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, LLSnapshotModel::ESnapshotLayerType type);
BOOL isSnapshotLocSet() const;
void resetSnapshotLoc() const;
- BOOL saveImageNumbered(LLImageFormatted *image, BOOL force_picker, BOOL& insufficient_memory);
+
+ typedef boost::signals2::signal<void(void)> snapshot_saved_signal_t;
+
+ void saveImageNumbered(LLImageFormatted *image, BOOL force_picker, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
+ void onDirectorySelected(const std::vector<std::string>& filenames, LLImageFormatted *image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
+ void saveImageLocal(LLImageFormatted *image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
+ void onSelectionFailure(const snapshot_saved_signal_t::slot_type& failure_cb);
// Reset the directory where snapshots are saved.
// Client will open directory picker on next snapshot save.
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 503815e2ed..e1dca4ae43 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -79,7 +79,7 @@ LLVoiceHandler gVoiceHandler;
std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserver::EStatusType inStatus)
{
- std::string result = "UNKNOWN";
+ std::string result = "UNTRANSLATED";
// Prevent copy-paste errors when updating this list...
#define CASE(x) case x: result = #x; break
@@ -92,12 +92,18 @@ std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserv
CASE(STATUS_JOINED);
CASE(STATUS_LEFT_CHANNEL);
CASE(STATUS_VOICE_DISABLED);
+ CASE(STATUS_VOICE_ENABLED);
CASE(BEGIN_ERROR_STATUS);
CASE(ERROR_CHANNEL_FULL);
CASE(ERROR_CHANNEL_LOCKED);
CASE(ERROR_NOT_AVAILABLE);
CASE(ERROR_UNKNOWN);
default:
+ {
+ std::ostringstream stream;
+ stream << "UNKNOWN(" << (int)inStatus << ")";
+ result = stream.str();
+ }
break;
}
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index 32637dcf42..337f01f3e5 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -40,8 +40,19 @@ class LLVOAvatar;
// devices
-typedef std::vector<std::string> LLVoiceDeviceList;
-
+class LLVoiceDevice
+{
+ public:
+ std::string display_name; // friendly value for the user
+ std::string full_name; // internal value for selection
+
+ LLVoiceDevice(const std::string& display_name, const std::string& full_name)
+ :display_name(display_name)
+ ,full_name(full_name)
+ {
+ };
+};
+typedef std::vector<LLVoiceDevice> LLVoiceDeviceList;
class LLVoiceClientParticipantObserver
{
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index da4b6a5008..b90e09b739 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -99,6 +99,7 @@ namespace {
const int CONNECT_RETRY_MAX = 3;
const F32 LOGIN_ATTEMPT_TIMEOUT = 30.0f;
+ const F32 LOGOUT_ATTEMPT_TIMEOUT = 5.0f;
const int LOGIN_RETRY_MAX = 3;
const F32 PROVISION_RETRY_TIMEOUT = 2.0;
@@ -259,9 +260,16 @@ static void killGateway()
{
if (sGatewayPtr)
{
+ LL_DEBUGS("Voice") << "SLVoice " << sGatewayPtr->getStatusString() << LL_ENDL;
+
sGatewayPump.stopListening("VivoxDaemonPump");
- sGatewayPtr->kill();
+ sGatewayPtr->kill(__FUNCTION__);
+ sGatewayPtr=NULL;
}
+ else
+ {
+ LL_DEBUGS("Voice") << "no gateway" << LL_ENDL;
+ }
}
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -283,7 +291,7 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
mDevicesListUpdated(false),
mAreaVoiceDisabled(false),
- mAudioSession(),
+ mAudioSession(), // TBD - should be NULL
mAudioSessionChanged(false),
mNextAudioSession(),
@@ -416,6 +424,7 @@ void LLVivoxVoiceClient::cleanUp()
deleteAllSessions();
deleteAllVoiceFonts();
deleteVoiceFontTemplates();
+ LL_DEBUGS("Voice") << "exiting" << LL_ENDL;
}
//---------------------------------------------------
@@ -542,6 +551,10 @@ void LLVivoxVoiceClient::connectorShutdown()
writeString(stream.str());
}
+ else
+ {
+ mShutdownComplete = true;
+ }
}
void LLVivoxVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &agentID)
@@ -641,18 +654,18 @@ void LLVivoxVoiceClient::idle(void* user_data)
//
void LLVivoxVoiceClient::voiceControlCoro()
{
+ LL_DEBUGS("Voice") << "starting" << LL_ENDL;
mIsCoroutineActive = true;
LLCoros::set_consuming(true);
while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
{
- LL_INFOS("Voice") << "Suspending voiceControlCoro() due to teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL;
+ LL_DEBUGS("Voice") << "Suspending voiceControlCoro() momentarily for teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL;
llcoro::suspendUntilTimeout(1.0);
}
do
{
-
if (startAndConnectSession())
{
if (mTuningMode)
@@ -662,6 +675,7 @@ void LLVivoxVoiceClient::voiceControlCoro()
waitForChannel(); // this doesn't normally return unless relog is needed or shutting down
+ LL_DEBUGS("Voice") << "lost channel RelogRequested=" << mRelogRequested << LL_ENDL;
endAndDisconnectSession();
}
@@ -669,16 +683,23 @@ void LLVivoxVoiceClient::voiceControlCoro()
// that we attempted to relog into Vivox and were rejected.
// Rather than just quit out of voice, we will tear it down (above)
// and then reconstruct the voice connecion from scratch.
+ LL_DEBUGS("Voice")
+ << "disconnected"
+ << " RelogRequested=" << mRelogRequested
+ << LL_ENDL;
if (mRelogRequested)
{
+ LL_INFOS("Voice") << "will attempt to reconnect to voice" << LL_ENDL;
while (isGatewayRunning() || gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
{
+ LL_INFOS("Voice") << "waiting for SLVoice to exit" << LL_ENDL;
llcoro::suspendUntilTimeout(1.0);
}
}
}
- while (mRelogRequested);
+ while (mVoiceEnabled && mRelogRequested);
mIsCoroutineActive = false;
+ LL_INFOS("Voice") << "exiting" << LL_ENDL;
}
@@ -710,6 +731,8 @@ bool LLVivoxVoiceClient::startAndConnectSession()
bool LLVivoxVoiceClient::endAndDisconnectSession()
{
+ LL_DEBUGS("Voice") << LL_ENDL;
+
breakVoiceConnection(true);
killGateway();
@@ -719,13 +742,15 @@ bool LLVivoxVoiceClient::endAndDisconnectSession()
bool LLVivoxVoiceClient::callbackEndDaemon(const LLSD& data)
{
- if (!LLAppViewer::isExiting())
+ if (!LLAppViewer::isExiting() && mVoiceEnabled)
{
+ LL_WARNS("Voice") << "SLVoice terminated " << ll_stream_notation_sd(data) << LL_ENDL;
terminateAudioSession(false);
closeSocket();
cleanUp();
LLVoiceClient::getInstance()->setUserPTTState(false);
gAgent.setVoiceConnected(false);
+ mRelogRequested = true;
}
sGatewayPump.stopListening("VivoxDaemonPump");
return false;
@@ -737,6 +762,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
if (!voiceEnabled())
{
// Voice is locked out, we must not launch the vivox daemon.
+ LL_WARNS("Voice") << "voice disabled; not starting daemon" << LL_ENDL;
return false;
}
@@ -744,11 +770,6 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
{
#ifndef VIVOXDAEMON_REMOTEHOST
// Launch the voice daemon
-
- // *FIX:Mani - Using the executable dir instead
- // of mAppRODataDir, the working directory from which the app
- // is launched.
- //std::string exe_path = gDirUtilp->getAppRODataDir();
std::string exe_path = gDirUtilp->getExecutableDir();
exe_path += gDirUtilp->getDirDelimiter();
#if LL_WINDOWS
@@ -803,13 +824,16 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
params.postend = sGatewayPump.getName();
sGatewayPump.listen("VivoxDaemonPump", boost::bind(&LLVivoxVoiceClient::callbackEndDaemon, this, _1));
+ LL_INFOS("Voice") << "Launching SLVoice" << LL_ENDL;
+ LL_DEBUGS("Voice") << "SLVoice params " << params << LL_ENDL;
+
sGatewayPtr = LLProcess::create(params);
mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort"));
}
else
{
- LL_INFOS("Voice") << exe_path << " not found." << LL_ENDL;
+ LL_WARNS("Voice") << exe_path << " not found." << LL_ENDL;
return false;
}
#else
@@ -832,6 +856,10 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
mMainSessionGroupHandle.clear();
}
+ else
+ {
+ LL_DEBUGS("Voice") << " gateway running; not attempting to start" << LL_ENDL;
+ }
//---------------------------------------------------------------------
llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
@@ -896,12 +924,15 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
while (!gAgent.getRegion() || !gAgent.getRegion()->capabilitiesReceived())
{
+ LL_DEBUGS("Voice") << "no capabilities for voice provisioning; waiting " << LL_ENDL;
// *TODO* Pump a message for wake up.
llcoro::suspend();
}
std::string url = gAgent.getRegionCapability("ProvisionVoiceAccountRequest");
+ LL_DEBUGS("Voice") << "region ready for voice provisioning; url=" << url << LL_ENDL;
+
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("voiceAccountProvision", httpPolicy));
@@ -949,14 +980,23 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
std::string voiceUserName = result["username"].asString();
std::string voicePassword = result["password"].asString();
- //LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response:" << dumpResponse() << LL_ENDL;
-
if (result.has("voice_sip_uri_hostname"))
+ {
voiceSipUriHostname = result["voice_sip_uri_hostname"].asString();
-
+ }
+
// this key is actually misnamed -- it will be an entire URI, not just a hostname.
if (result.has("voice_account_server_name"))
+ {
voiceAccountServerUri = result["voice_account_server_name"].asString();
+ }
+
+ LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response"
+ << " user " << (voiceUserName.empty() ? "not set" : "set")
+ << " password " << (voicePassword.empty() ? "not set" : "set")
+ << " sip uri " << voiceSipUriHostname
+ << " account uri " << voiceAccountServerUri
+ << LL_ENDL;
setLoginInfo(voiceUserName, voicePassword, voiceSipUriHostname, voiceAccountServerUri);
@@ -968,8 +1008,11 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
LLEventPump &voiceConnectPump = LLEventPumps::instance().obtain("vivoxClientPump");
if (!mVoiceEnabled && mIsInitialized)
+ {
+ LL_WARNS("Voice") << "cannot establish connection; enabled "<<mVoiceEnabled<<" initialized "<<mIsInitialized<<LL_ENDL;
return false;
-
+ }
+
LLSD result;
bool connected(false);
bool giving_up(false);
@@ -1031,7 +1074,7 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
{
- LL_DEBUGS("Voice") << LL_ENDL;
+ LL_DEBUGS("Voice") << "( wait=" << corowait << ")" << LL_ENDL;
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
bool retval(true);
@@ -1040,26 +1083,38 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
if (corowait)
{
- LLSD result = llcoro::suspendUntilEventOn(voicePump);
+ LLSD timeoutResult(LLSDMap("connector", "timeout"));
+
+ LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
retval = result.has("connector");
}
else
- { // If we are not doing a corowait then we must sleep until the connector has responded
+ {
+ mRelogRequested = false; //stop the control coro
+ // If we are not doing a corowait then we must sleep until the connector has responded
// otherwise we may very well close the socket too early.
#if LL_WINDOWS
- int count = 0;
- while (!mShutdownComplete && 10 > count++)
- { // Rider: This comes out to a max wait time of 10 seconds.
- // The situation that brings us here is a call from ::terminate()
- // and so the viewer is attempting to go away. Don't slow it down
- // longer than this.
+ if (!mShutdownComplete)
+ {
+ // The situation that brings us here is a call from ::terminate()
+ // At this point message system is already down so we can't wait for
+ // the message, yet we need to receive "connector shutdown response".
+ // Either wait a bit and emulate it or check gMessageSystem for specific message
_sleep(1000);
+ if (mConnected)
+ {
+ mConnected = false;
+ LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
+ LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
+ }
+ mShutdownComplete = true;
}
#endif
}
+ LL_DEBUGS("Voice") << "closing SLVoice socket" << LL_ENDL;
closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
cleanUp();
mConnected = false;
@@ -1161,31 +1216,35 @@ bool LLVivoxVoiceClient::loginToVivox()
void LLVivoxVoiceClient::logoutOfVivox(bool wait)
{
+ if (mIsLoggedIn)
+ {
+ // Ensure that we'll re-request provisioning before logging in again
+ mAccountPassword.clear();
+ mVoiceAccountServerURI.clear();
- if (!mIsLoggedIn)
- return;
-
- // Ensure that we'll re-request provisioning before logging in again
- mAccountPassword.clear();
- mVoiceAccountServerURI.clear();
-
- logoutSendMessage();
+ logoutSendMessage();
- if (wait)
- {
- LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
- LLSD timeoutResult(LLSDMap("lougout", "timeout"));
+ if (wait)
+ {
+ LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
+ LLSD timeoutResult(LLSDMap("logout", "timeout"));
- LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult);
+ LL_DEBUGS("Voice")
+ << "waiting for logout response on "
+ << voicePump.getName()
+ << LL_ENDL;
- LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
+ LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
- if (result.has("logout"))
+ LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
+ }
+ else
{
+ LL_DEBUGS("Voice") << "not waiting for logout" << LL_ENDL;
}
- }
- mIsLoggedIn = false;
+ mIsLoggedIn = false;
+ }
}
@@ -1256,6 +1315,10 @@ bool LLVivoxVoiceClient::requestParcelVoiceInfo()
// state. If the cap request is still pending,
// the responder will check to see if we've moved
// to a new session and won't change any state.
+ LL_DEBUGS("Voice") << "terminate requested " << mSessionTerminateRequested
+ << " enabled " << mVoiceEnabled
+ << " initialized " << mIsInitialized
+ << LL_ENDL;
terminateAudioSession(true);
return false;
}
@@ -1280,17 +1343,30 @@ bool LLVivoxVoiceClient::requestParcelVoiceInfo()
LLSD voice_credentials = result["voice_credentials"];
if (voice_credentials.has("channel_uri"))
{
+ LL_DEBUGS("Voice") << "got voice channel uri" << LL_ENDL;
uri = voice_credentials["channel_uri"].asString();
}
+ else
+ {
+ LL_WARNS("Voice") << "No voice channel uri" << LL_ENDL;
+ }
+
if (voice_credentials.has("channel_credentials"))
{
+ LL_DEBUGS("Voice") << "got voice channel credentials" << LL_ENDL;
credentials =
voice_credentials["channel_credentials"].asString();
}
- }
+ else
+ {
+ LL_WARNS("Voice") << "No voice channel credentials" << LL_ENDL;
- if (!uri.empty())
- LL_INFOS("Voice") << "Voice URI is " << uri << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("Voice") << "No voice credentials" << LL_ENDL;
+ }
// set the spatial channel. If no voice credentials or uri are
// available, then we simply drop out of voice spatially.
@@ -1353,7 +1429,10 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
if (!mVoiceEnabled && mIsInitialized)
{
- LL_DEBUGS("Voice") << "Voice no longer enabled. Exiting." << LL_ENDL;
+ LL_DEBUGS("Voice") << "Voice no longer enabled. Exiting"
+ << " enabled " << mVoiceEnabled
+ << " initialized " << mIsInitialized
+ << LL_ENDL;
mIsJoiningSession = false;
// User bailed out during connect -- jump straight to teardown.
terminateAudioSession(true);
@@ -1476,7 +1555,7 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
if (mAudioSession)
{
- LL_INFOS("Voice") << "Terminating current voice session " << mAudioSession->mHandle << LL_ENDL;
+ LL_INFOS("Voice") << "terminateAudioSession(" << wait << ") Terminating current voice session " << mAudioSession->mHandle << LL_ENDL;
if (mIsLoggedIn)
{
@@ -1506,7 +1585,9 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
LLSD result;
do
{
- result = llcoro::suspendUntilEventOn(voicePump);
+ LLSD timeoutResult(LLSDMap("session", "timeout"));
+
+ result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
if (result.has("session"))
@@ -1521,7 +1602,7 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
}
std::string message = result["session"].asString();
- if (message == "removed")
+ if (message == "removed" || message == "timeout")
break;
}
} while (true);
@@ -1546,11 +1627,10 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
// The old session may now need to be deleted.
reapSession(oldSession);
-
}
else
{
- LL_WARNS("Voice") << "stateSessionTerminated with NULL mAudioSession" << LL_ENDL;
+ LL_WARNS("Voice") << "terminateAudioSession(" << wait << ") with NULL mAudioSession" << LL_ENDL;
}
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
@@ -1560,13 +1640,15 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
// the region chat.
mSessionTerminateRequested = false;
- if ((mVoiceEnabled || !mIsInitialized) && !mRelogRequested && !LLApp::isExiting())
- {
- // Just leaving a channel, go back to stateNoChannel (the "logged in but have no channel" state).
- return true;
- }
-
- return false;
+ bool status=((mVoiceEnabled || !mIsInitialized) && !mRelogRequested && !LLApp::isExiting());
+ LL_DEBUGS("Voice") << "exiting"
+ << " VoiceEnabled " << mVoiceEnabled
+ << " IsInitialized " << mIsInitialized
+ << " RelogRequested " << mRelogRequested
+ << " AppExiting " << LLApp::isExiting()
+ << " returning " << status
+ << LL_ENDL;
+ return status;
}
bool LLVivoxVoiceClient::waitForChannel()
@@ -1627,7 +1709,18 @@ bool LLVivoxVoiceClient::waitForChannel()
sessionStatePtr_t joinSession = mNextAudioSession;
mNextAudioSession.reset();
if (!runSession(joinSession))
+ {
+ LL_DEBUGS("Voice") << "runSession returned false; leaving inner loop" << LL_ENDL;
break;
+ }
+ else
+ {
+ LL_DEBUGS("Voice")
+ << "runSession returned true to inner loop"
+ << " RelogRequested=" << mRelogRequested
+ << " VoiceEnabled=" << mVoiceEnabled
+ << LL_ENDL;
+ }
}
if (!mNextAudioSession)
@@ -1636,20 +1729,33 @@ bool LLVivoxVoiceClient::waitForChannel()
}
} while (mVoiceEnabled && !mRelogRequested);
+ LL_DEBUGS("Voice")
+ << "leaving inner waitForChannel loop"
+ << " RelogRequested=" << mRelogRequested
+ << " VoiceEnabled=" << mVoiceEnabled
+ << LL_ENDL;
+
mIsProcessingChannels = false;
logoutOfVivox(true);
if (mRelogRequested)
{
+ LL_DEBUGS("Voice") << "Relog Requested, restarting provisioning" << LL_ENDL;
if (!provisionVoiceAccount())
{
+ LL_WARNS("Voice") << "provisioning voice failed; giving up" << LL_ENDL;
giveUp();
return false;
}
}
- } while (mVoiceEnabled && mRelogRequested);
+ } while (mVoiceEnabled && mRelogRequested && isGatewayRunning());
+ LL_DEBUGS("Voice")
+ << "exiting"
+ << " RelogRequested=" << mRelogRequested
+ << " VoiceEnabled=" << mVoiceEnabled
+ << LL_ENDL;
return true;
}
@@ -1663,6 +1769,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
if (mSessionTerminateRequested)
{
+ LL_DEBUGS("Voice") << "runSession terminate requested " << LL_ENDL;
terminateAudioSession(true);
}
// if a relog has been requested then addAndJoineSession
@@ -1681,7 +1788,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
mIsInChannel = true;
mMuteMicDirty = true;
- while (mVoiceEnabled && !mSessionTerminateRequested && !mTuningMode)
+ while (mVoiceEnabled && isGatewayRunning() && !mSessionTerminateRequested && !mTuningMode)
{
sendCaptureAndRenderDevices();
if (mAudioSession && mAudioSession->mParticipantsChanged)
@@ -1731,7 +1838,9 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
mIsInitialized = true;
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, UPDATE_THROTTLE_SECONDS, timeoutEvent);
if (!result.has("timeout")) // logging the timeout event spams the log
+ {
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
+ }
if (result.has("session"))
{
if (result.has("handle"))
@@ -1752,6 +1861,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
if (message == "removed")
{
+ LL_DEBUGS("Voice") << "session removed" << LL_ENDL;
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
break;
}
@@ -1761,15 +1871,16 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
std::string message = result["login"];
if (message == "account_logout")
{
+ LL_DEBUGS("Voice") << "logged out" << LL_ENDL;
mIsLoggedIn = false;
mRelogRequested = true;
break;
}
}
-
}
mIsInChannel = false;
+ LL_DEBUGS("Voice") << "terminating at end of runSession" << LL_ENDL;
terminateAudioSession(true);
return true;
@@ -1965,6 +2076,7 @@ bool LLVivoxVoiceClient::performMicTuning()
if (mTuningSpeakerVolumeDirty)
{
+ LL_INFOS("Voice") << "setting tuning speaker level to " << mTuningSpeakerVolume << LL_ENDL;
stream
<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetSpeakerLevel.1\">"
<< "<Level>" << mTuningSpeakerVolume << "</Level>"
@@ -2322,11 +2434,10 @@ void LLVivoxVoiceClient::clearCaptureDevices()
mCaptureDevices.clear();
}
-void LLVivoxVoiceClient::addCaptureDevice(const std::string& name)
+void LLVivoxVoiceClient::addCaptureDevice(const LLVoiceDevice& device)
{
- LL_DEBUGS("Voice") << name << LL_ENDL;
-
- mCaptureDevices.push_back(name);
+ LL_DEBUGS("Voice") << "display: '" << device.display_name << "' device: '" << device.full_name << "'" << LL_ENDL;
+ mCaptureDevices.push_back(device);
}
LLVoiceDeviceList& LLVivoxVoiceClient::getCaptureDevices()
@@ -2364,10 +2475,10 @@ void LLVivoxVoiceClient::clearRenderDevices()
mRenderDevices.clear();
}
-void LLVivoxVoiceClient::addRenderDevice(const std::string& name)
+void LLVivoxVoiceClient::addRenderDevice(const LLVoiceDevice& device)
{
- LL_DEBUGS("Voice") << name << LL_ENDL;
- mRenderDevices.push_back(name);
+ LL_DEBUGS("Voice") << "display: '" << device.display_name << "' device: '" << device.full_name << "'" << LL_ENDL;
+ mRenderDevices.push_back(device);
}
LLVoiceDeviceList& LLVivoxVoiceClient::getRenderDevices()
@@ -2515,13 +2626,13 @@ bool LLVivoxVoiceClient::deviceSettingsAvailable()
}
bool LLVivoxVoiceClient::deviceSettingsUpdated()
{
+ bool updated = mDevicesListUpdated;
if (mDevicesListUpdated)
{
// a hot swap event or a polling of the audio devices has been parsed since the last redraw of the input and output device panel.
- mDevicesListUpdated = !mDevicesListUpdated; // toggle the setting
- return true;
+ mDevicesListUpdated = false; // toggle the setting
}
- return false;
+ return updated;
}
void LLVivoxVoiceClient::refreshDeviceLists(bool clearCurrentList)
@@ -2540,8 +2651,7 @@ void LLVivoxVoiceClient::daemonDied()
// The daemon died, so the connection is gone. Reset everything and start over.
LL_WARNS("Voice") << "Connection to vivox daemon lost. Resetting state."<< LL_ENDL;
- // Try to relaunch the daemon
- /*TODO:*/
+ //TODO: Try to relaunch the daemon
}
void LLVivoxVoiceClient::giveUp()
@@ -2902,7 +3012,6 @@ void LLVivoxVoiceClient::sendPositionAndVolumeUpdate(void)
}
}
- //sendLocalAudioUpdates(); obsolete, used to send volume setting on position updates
std::string update(stream.str());
if(!update.empty())
{
@@ -2947,7 +3056,6 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()
{
// Check all of the dirty states and then send messages to those needing to be changed.
// Tuningmode hands its own mute settings.
-
std::ostringstream stream;
if (mMuteMicDirty && !mTuningMode)
@@ -2956,7 +3064,7 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()
// Send a local mute command.
- LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic ? "true" : "false") << LL_ENDL;
+ LL_INFOS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic ? "true" : "false") << LL_ENDL;
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"
@@ -3218,8 +3326,6 @@ void LLVivoxVoiceClient::sessionConnectResponse(std::string &requestId, int stat
{
LL_DEBUGS("Voice") << "Session.Connect response received (success)" << LL_ENDL;
}
-
- /*TODO: Post response?*/
}
void LLVivoxVoiceClient::logoutResponse(int statusCode, std::string &statusString)
@@ -3243,6 +3349,7 @@ void LLVivoxVoiceClient::connectorShutdownResponse(int statusCode, std::string &
}
mConnected = false;
+ mShutdownComplete = true;
LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
@@ -4023,7 +4130,7 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st
void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)
{
- LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL;
+ LL_DEBUGS("VoiceEnergy") << "got energy " << energy << LL_ENDL;
mTuningEnergy = energy;
}
@@ -4975,6 +5082,12 @@ void LLVivoxVoiceClient::setMuteMic(bool muted)
void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
{
+ LL_DEBUGS("Voice")
+ << "( " << (enabled ? "enabled" : "disabled") << " )"
+ << " was "<< (mVoiceEnabled ? "enabled" : "disabled")
+ << " coro "<< (mIsCoroutineActive ? "active" : "inactive")
+ << LL_ENDL;
+
if (enabled != mVoiceEnabled)
{
// TODO: Refactor this so we don't call into LLVoiceChannel, but simply
@@ -4984,6 +5097,7 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
if (enabled)
{
+ LL_DEBUGS("Voice") << "enabling" << LL_ENDL;
LLVoiceChannel::getCurrentVoiceChannel()->activate();
status = LLVoiceClientStatusObserver::STATUS_VOICE_ENABLED;
@@ -4992,6 +5106,10 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
LLCoros::instance().launch("LLVivoxVoiceClient::voiceControlCoro();",
boost::bind(&LLVivoxVoiceClient::voiceControlCoro, LLVivoxVoiceClient::getInstance()));
}
+ else
+ {
+ LL_DEBUGS("Voice") << "coro should be active.. not launching" << LL_ENDL;
+ }
}
else
{
@@ -4999,8 +5117,13 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
LLVoiceChannel::getCurrentVoiceChannel()->deactivate();
status = LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED;
}
- notifyStatusObservers(status);
+
+ notifyStatusObservers(status);
}
+ else
+ {
+ LL_DEBUGS("Voice") << " no-op" << LL_ENDL;
+ }
}
bool LLVivoxVoiceClient::voiceEnabled()
@@ -5704,7 +5827,7 @@ void LLVivoxVoiceClient::deleteSession(const sessionStatePtr_t &session)
void LLVivoxVoiceClient::deleteAllSessions()
{
- LL_DEBUGS("Voice") << "called" << LL_ENDL;
+ LL_DEBUGS("Voice") << LL_ENDL;
while (!mSessionsByHandle.empty())
{
@@ -5755,6 +5878,10 @@ void LLVivoxVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer)
void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status)
{
+ LL_DEBUGS("Voice") << "( " << LLVoiceClientStatusObserver::status2string(status) << " )"
+ << " mAudioSession=" << mAudioSession
+ << LL_ENDL;
+
if(mAudioSession)
{
if(status == LLVoiceClientStatusObserver::ERROR_UNKNOWN)
@@ -5799,8 +5926,8 @@ void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESta
LL_DEBUGS("Voice")
<< " " << LLVoiceClientStatusObserver::status2string(status)
<< ", session URI " << getAudioSessionURI()
- << (inSpatialChannel()?", proximal is true":", proximal is false")
- << LL_ENDL;
+ << ", proximal is " << inSpatialChannel()
+ << LL_ENDL;
for (status_observer_set_t::iterator it = mStatusObservers.begin();
it != mStatusObservers.end();
@@ -6193,6 +6320,7 @@ void LLVivoxVoiceClient::expireVoiceFonts()
LLSD args;
args["URL"] = LLTrans::getString("voice_morphing_url");
+ args["PREMIUM_URL"] = LLTrans::getString("premium_voice_morphing_url");
// Give a notification if any voice fonts have expired.
if (have_expired)
@@ -7007,16 +7135,20 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
else if (!stricmp("Presence", tag))
statusString = string;
else if (!stricmp("CaptureDevices", tag))
+ {
LLVivoxVoiceClient::getInstance()->setDevicesListUpdated(true);
+ }
else if (!stricmp("RenderDevices", tag))
+ {
LLVivoxVoiceClient::getInstance()->setDevicesListUpdated(true);
+ }
else if (!stricmp("CaptureDevice", tag))
{
- LLVivoxVoiceClient::getInstance()->addCaptureDevice(deviceString);
+ LLVivoxVoiceClient::getInstance()->addCaptureDevice(LLVoiceDevice(displayNameString, deviceString));
}
else if (!stricmp("RenderDevice", tag))
{
- LLVivoxVoiceClient::getInstance()->addRenderDevice(deviceString);
+ LLVivoxVoiceClient::getInstance()->addRenderDevice(LLVoiceDevice(displayNameString, deviceString));
}
else if (!stricmp("BlockMask", tag))
blockMask = string;
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 9d4af85c8c..50862cea1e 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -432,10 +432,10 @@ protected:
//----------------------------------
// devices
void clearCaptureDevices();
- void addCaptureDevice(const std::string& name);
+ void addCaptureDevice(const LLVoiceDevice& device);
void clearRenderDevices();
void setDevicesListUpdated(bool state);
- void addRenderDevice(const std::string& name);
+ void addRenderDevice(const LLVoiceDevice& device);
void buildSetAudioDevices(std::ostringstream &stream);
void getCaptureDevicesSendMessage();
diff --git a/indra/newview/skins/default/xui/de/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/de/floater_preferences_graphics_advanced.xml
index 65a7e255f9..1361366bd5 100644
--- a/indra/newview/skins/default/xui/de/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/de/floater_preferences_graphics_advanced.xml
@@ -31,7 +31,7 @@
<text name="AvatarPhysicsDetailText">
Niedrig
</text>
- <text name="ShadersText">
+ <text name="HardwareText">
Hardware
</text>
<slider label="Texturen-Cache (MB):" name="GraphicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/>
@@ -56,6 +56,9 @@
<text name="antialiasing restart">
(Neustart erforderlich)
</text>
+ <text name="MeshText">
+ Netz
+ </text>
<slider label="Gitterdetails Terrain:" name="TerrainMeshDetail"/>
<text name="TerrainMeshDetailText">
Niedrig
@@ -72,6 +75,9 @@
<text name="FlexibleMeshDetailText">
Niedrig
</text>
+ <text name="ShadersText">
+ Shader
+ </text>
<check_box initial_value="true" label="Transparentes Wasser" name="TransparentWater"/>
<check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/>
<check_box initial_value="true" label="Lokale Lichtquellen" name="LocalLights"/>
@@ -111,5 +117,6 @@
<button label="Auf empfohlene Einstellungen zurücksetzen" name="Defaults"/>
<button label="OK" label_selected="OK" name="OK"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
- <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
+ <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
+ <check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml
index 4508465d25..c32223aef6 100644
--- a/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Nicht mehr ignorieren" name="unblock"/>
<menu_item_check label="Voice ignorieren" name="BlockVoice"/>
<menu_item_check label="Text ignorieren" name="MuteText"/>
+ <menu_item_check label="Partikel blockieren" name="MuteParticles"/>
<menu_item_check label="Objektsounds ignorieren" name="BlockObjectSounds"/>
<menu_item_call label="Profil..." name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 8ff3ac770b..8cebd1f441 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -4317,7 +4317,7 @@ Wählen Sie eine kleinere Landfläche aus.
Aufgrund eines internen Fehlers konnte Ihr Viewer nicht ordnungsgemäß aktualisiert werden. Der in Ihrem Viewer angezeigte L$-Kontostand oder Parzellenbesitz stimmt möglicherweise nicht mit dem aktuellen Stand auf den Servern überein.
</notification>
<notification name="LargePrimAgentIntersect">
- Große Prims, die sich mit anderen Spielern überschneiden, können nicht erstellt werden. Bitte erneut versuchen, wenn sich die anderen Spieler bewegt haben.
+ Große Prims, die sich mit anderen Einwohnern überschneiden, können nicht erstellt werden. Bitte erneut versuchen, wenn sich die anderen Einwohner fort bewegt haben.
</notification>
<notification name="PreferenceChatClearLog">
Dadurch werden die Protokolle vorheriger Unterhaltungen und alle Backups dieser Datei gelöscht.
diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml
index 2f3268164c..dec71dd8ef 100644
--- a/indra/newview/skins/default/xui/de/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml
@@ -96,6 +96,11 @@ um mehrere Mitglieder auszuwählen.
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
+ <panel name="members_header">
+ <text_editor name="member_action_description">
+ Diese Fähigkeit wird als „Mitglieder dieser Gruppe verweisen“ bezeichnet. Eigentümer können nur von anderen Eigentümern verwiesen werden.
+ </text_editor>
+ </panel>
<panel name="roles_footer">
<text name="static">
Rolle:
@@ -121,6 +126,11 @@ um mehrere Mitglieder auszuwählen.
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
+ <panel name="roles_header">
+ <text_editor name="role_action_description">
+ Diese Fähigkeit wird als „Mitglieder dieser Gruppe verweisen“ bezeichnet. Eigentümer können nur von anderen Eigentümern verwiesen werden.
+ </text_editor>
+ </panel>
<panel name="actions_footer">
<text_editor name="action_description">
Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden.
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index 7ac6708321..3b1a718756 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -3,7 +3,7 @@
<panel.string name="log_in_to_change">
Anmelden, um Änderungen vorzunehmen
</panel.string>
- <button label="Cache leeren" name="clear_cache" tool_tip="Bild bei Anmeldung, letzter Standort, Teleport-Liste, Internet- und Texturen-Cache löschen"/>
+ <button label="Cache leeren" name="clear_cache" tool_tip="Anmeldungsbild, letzten Standort, Teleport-Liste, Internet- und Texturen-Cache löschen"/>
<text name="cache_size_label_l">
(Standorte, Bilder, Web, Suchverlauf)
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
index 3e596de55c..1435b7f87d 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -15,8 +15,8 @@
Web:
</text>
<radio_group name="preferred_browser_behavior">
- <radio_item label="Meinen Browser (Chrome, Firefox, IE) für alle Links verwenden" name="internal" tool_tip="Standard-Browser für Hilfe, Weblinks usw. verwenden. Im Vollbildmodus nicht empfohlen." value="0"/>
- <radio_item label="Integrierten Browser nur für Linden Lab-/Second Life-Links verwenden" name="external" tool_tip="Verwenden Sie den Standard-Webbrowser Ihres Systems für Hilfe, Weblinks usw. Der integrierte Browser wird nur für Linden Lab-/Second Life-Links verwendet." value="1"/>
+ <radio_item label="Standard-Systembrowser für alle Links verwenden" name="internal" tool_tip="Standard-Browser für Hilfe, Weblinks usw. verwenden. Im Vollbildmodus nicht empfohlen." value="0"/>
+ <radio_item label="Integrierten Browser nur für Second Life-Links verwenden" name="external" tool_tip="Standard-Systembrowser für Hilfe, Weblinks usw. verwenden. Der integrierte Browser wird nur für LindenLab-/Second Life-Links verwendet." value="1"/>
<radio_item label="Integrierten Browser für alle Links verwenden" name="external_all" tool_tip="Integrierten Browser für Hilfe, Internetlinks, usw. verwenden. Der Browser wird als eigenständiges Fenster in [APP_NAME] geöffnet." value="2"/>
</radio_group>
<check_box initial_value="true" label="Plugins aktivieren" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/de/panel_preferences_uploads.xml
index e2759715d1..40c80f5074 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_uploads.xml
@@ -12,6 +12,9 @@
<text name="title_animation">
Animationen
</text>
+ <text name="title_model">
+ Modelle
+ </text>
<text name="upload_help">
Um einen Zielordner zu ändern, klicken Sie im Inventar mit der rechten Maustaste auf den Ordner und wählen Sie „Als Standard verwenden für“.
</text>
diff --git a/indra/newview/skins/default/xui/de/role_actions.xml b/indra/newview/skins/default/xui/de/role_actions.xml
index daddefd69e..26187678a0 100644
--- a/indra/newview/skins/default/xui/de/role_actions.xml
+++ b/indra/newview/skins/default/xui/de/role_actions.xml
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Diese Fähigkeiten ermöglichen das Hinzufügen und Entfernen von Mitgliedern sowie den Beitritt ohne Einladung." name="Membership">
- <action description="Personen in diese Gruppe einladen" longdescription="Leute in diese Gruppe mit der Schaltfläche „Einladen“ im Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“ in die Gruppe einladen." name="member invite" value="1"/>
- <action description="Mitglieder aus dieser Gruppe werfen" longdescription="Leute aus dieser Gruppe mit der Schaltfläche „Hinauswerfen“ im Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“ aus der Gruppe werfen. Ein Eigentümer kann jeden, außer einen anderen Eigentümer, ausschließen. Wenn Sie kein Eigentümer sind, können Sie ein Mitglied nur dann aus der Gruppe werfen, wenn es die Rolle Jeder inne hat, jedoch KEINE andere Rolle. Um Mitgliedern Rollen entziehen zu können, müssen Sie über die Fähigkeit „Mitgliedern Rollen entziehen“ verfügen." name="member eject" value="2"/>
+ <action description="Personen in diese Gruppe einladen" longdescription="Andere Personen über die Schaltfläche &quot;Einladen&quot; im Bereich &quot;Rollen und Mitglieder&quot; &gt; Registerkarte &quot;Mitglieder&quot; in diese Gruppe einladen." name="member invite" value="1"/>
+ <action description="Mitglieder mit der Rolle &quot;Jeder&quot; dieser Gruppe verweisen" longdescription="Mitglieder mithilfe der Schaltfläche „Hinauswerfen“ im Abschnitt „Rollen und Mitglieder“ &gt; Registerkarte „Mitglieder“ der Gruppe verweisen. Ein Eigentümer kann, mit Ausnahme eines anderen Eigentümers, jedes Mitglied ausschließen. Wenn Sie kein Eigentümer sind, können Sie ein Mitglied nur dann aus der Gruppe ausschließen, wenn es über die Rolle &quot;Jeder&quot;, ansonsten jedoch über KEINE weitere Rolle verfügt. Um Mitgliedern Rollen entziehen zu können, müssen Sie über die Fähigkeit „Mitgliedern Rollen entziehen“ verfügen." name="member eject" value="2"/>
<action description="Bannliste verwalten" longdescription="Gruppenmitglied das Verbannen/Zulassen von Einwohnern aus dieser Gruppe gestatten." name="allow ban" value="51"/>
<action description="„Registrierung offen“ aktivieren/deaktivieren und „Beitrittsgebühr“ ändern." longdescription="„Registrierung offen“ aktivieren, um damit neue Mitglieder ohne Einladung beitreten können, und die „Beitrittsgebühr“ im Abschnitt „Allgemein“ ändern." name="member options" value="3"/>
</action_set>
<action_set description="Diese Fähigkeiten ermöglichen das Hinzufügen, Entfernen und Ändern von Gruppenrollen, das Zuweisen und Entfernen von Rollen und das Zuweisen von Fähigkeiten zu Rollen." name="Roles">
- <action description="Neue Rollen erstellen" longdescription="Neue Rollen im Abschnitt „Rollen“ &gt; Registerkarte „Rollen“ erstellen." name="role create" value="4"/>
- <action description="Rollen löschen" longdescription="Neue Rollen im Abschnitt „Rollen“ &gt; Registerkarte „Rollen“ löschen." name="role delete" value="5"/>
- <action description="Rollennamen, Titel, Beschreibungen und ob die Rolleninhaber öffentlich bekannt sein sollen, ändern." longdescription="Rollennamen, Titel, Beschreibungen und ob die Rolleninhaber öffentlich bekannt sein sollen, ändern. Dies wird im unteren Bereich des Abschnitts „Rollen“ &gt; Registerkarte „Rollen“ eingestellt, nachdem eine Rolle ausgewählt wurde." name="role properties" value="6"/>
- <action description="Mitgliedern nur eigene Rollen zuweisen" longdescription="In der Liste „Rollen“ (Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“) können Mitgliedern Rollen zugewiesen werden. Ein Mitglied mit dieser Fähigkeit kann anderen Mitgliedern nur die eigenen Rollen zuweisen." name="role assign member limited" value="7"/>
- <action description="Mitgliedern beliebige Rolle zuweisen" longdescription="Sie können Mitglieder jede beliebige Rolle der Liste „Rollen“ (Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“) zuweisen. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) Rollen mit weitreichenden Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Überlegen Sie sich gut, wem Sie diese Fähigkeit verleihen." name="role assign member" value="8"/>
- <action description="Mitgliedern Rollen entziehen" longdescription="In der Liste „Rollen“ (Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“) können Mitgliedern Rollen abgenommen werden. Eigentümer können nicht entfernt werden." name="role remove member" value="9"/>
- <action description="Rollenfähigkeiten zuweisen und entfernen" longdescription="Fähigkeiten für jede Rolle können in der Liste „Zulässige Fähigkeiten&quot; (Abschnitt „Rollen&quot; &gt; Registerkarte „Rollen“) zugewiesen und auch entzogen werden. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) alle Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Überlegen Sie sich gut, wem Sie diese Fähigkeit verleihen." name="role change actions" value="10"/>
+ <action description="Neue Rollen erstellen" longdescription="Erstellen neuer Rollen im Abschnitt „Rollen und Mitglieder“ &gt; Registerkarte „Rollen“." name="role create" value="4"/>
+ <action description="Rollen löschen" longdescription="Löschen von Rollen im Abschnitt „Rollen und Mitglieder“ &gt; Registerkarte „Rollen“." name="role delete" value="5"/>
+ <action description="Rollennamen, Titel, Beschreibungen und ob die Rolleninhaber öffentlich bekannt sein sollen, ändern." longdescription="Ändern von Rollennamen, Titeln, Beschreibungen und öffentlicher Bekanntgabe der Rolleninhaber. Dies wird im unteren Bereich des Abschnitts „Rollen und Mitglieder“ &gt; Registerkarte „Rollen“ eingestellt, nachdem eine Rolle ausgewählt wurde." name="role properties" value="6"/>
+ <action description="Mitgliedern nur eigene Rollen zuweisen" longdescription="In der Liste „Zugewiesene Rollen“ (Abschnitt „Rollen und Mitglieder“ &gt; Registerkarte „Mitglieder“) können Mitgliedern Rollen zugewiesen werden. Ein Mitglied mit dieser Fähigkeit kann anderen Mitgliedern nur die eigene Rolle zuweisen." name="role assign member limited" value="7"/>
+ <action description="Mitgliedern beliebige Rolle zuweisen" longdescription="Sie können Mitgliedern in der Liste „Zugewiesene Rollen“ (Abschnitt „Rollen und Mitglieder“ &gt; Registerkarte „Mitglieder“) jede beliebige Rolle zuweisen.*WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) Rollen mit weitreichenden Berechtigungen zuweisen und damit nahezu Eigentümerrechte erreichen. Überlegen Sie also genau, wem Sie diese Berechtigung erteilen." name="role assign member" value="8"/>
+ <action description="Mitgliedern Rollen entziehen" longdescription="In der Liste „Zugewiesene Rollen“ (Abschnitt „Rollen und Mitglieder“ &gt; Registerkarte „Mitglieder“) können Mitglieder aus Rollenzuweisungen entfernt werden. Eigentümer können nicht entfernt werden." name="role remove member" value="9"/>
+ <action description="Rollenfähigkeiten zuweisen und entfernen" longdescription="In der Liste &quot;Zulässige Fähigkeiten&quot; (Bereich &quot;Rollen und Mitglieder&quot; &gt; Registerkarte &quot;Rollen&quot;) können für jede Rolle Fähigkeiten hinzugefügt und entfernt werden. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) alle Fähigkeiten zuweisen und damit nahezu Eigentümerrechte erreichen. Überlegen Sie also genau, wem Sie diese Fähigkeit zuweisen." name="role change actions" value="10"/>
</action_set>
<action_set description="Diese Fähigkeiten ermöglichen es, die Gruppenidentität zu ändern, z. B. öffentliche Sichtbarkeit, Charta und Insignien." name="Group Identity">
<action description="Charta, Insignien und „Im Web veröffentlichen“ ändern und festlegen, welche Mitglieder in der Gruppeninfo öffentlich sichtbar sind." longdescription="Charta, Insignien und „In Suche anzeigen&quot; ändern. Diese Einstellungen werden im Abschnitt „Allgemein&quot; vorgenommen." name="group change identity" value="11"/>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index cf843a07a6..535af317d9 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -502,7 +502,7 @@
name="Buy Land..."
width="130" />
<button
- enabled="true"
+ enabled="false"
follows="left|top"
height="23"
label="Linden Sale"
diff --git a/indra/newview/skins/default/xui/en/floater_auction.xml b/indra/newview/skins/default/xui/en/floater_auction.xml
new file mode 100644
index 0000000000..9c6d114c4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_auction.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="412"
+ layout="topleft"
+ min_height="412"
+ min_width="420"
+ name="floater_auction"
+ help_topic="floater_auction"
+ title="START LINDEN LAND SALE"
+ width="420">
+ <floater.string
+ name="already for sale">
+ You cannot auction parcels which are already for sale.
+ </floater.string>
+ <icon
+ bottom="280"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="4"
+ name="snapshot_icon"
+ right="-4"
+ top="24" />
+ <text
+ follows="left|right|bottom"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ name="parcel_text"
+ top_pad="12"
+ width="400" />
+ <check_box
+ control_name="AuctionShowFence"
+ follows="left|bottom"
+ height="16"
+ initial_value="true"
+ label="Include yellow selection fence"
+ layout="topleft"
+ left_delta="0"
+ name="fence_check"
+ top_pad="12"
+ width="199" />
+ <button
+ follows="left|bottom"
+ height="20"
+ label="Snapshot"
+ label_selected="Snapshot"
+ layout="topleft"
+ left_delta="0"
+ name="snapshot_btn"
+ top_pad="4"
+ width="150">
+ <button.commit_callback
+ function="ClickSnapshot" />
+ </button>
+ <button
+ follows="left|bottom"
+ height="20"
+ label="Sell to Anyone"
+ label_selected="Sell to Anyone"
+ layout="topleft"
+ left_delta="0"
+ name="sell_to_anyone_btn"
+ top_pad="4"
+ width="150">
+ <button.commit_callback
+ function="ClickSellToAnyone" />
+ </button>
+ <button
+ follows="left|bottom"
+ height="20"
+ label="Clear Settings"
+ label_selected="Clear Settings"
+ layout="topleft"
+ left_delta="0"
+ name="reset_parcel_btn"
+ top_pad="4"
+ width="150">
+ <button.commit_callback
+ function="ClickResetParcel" />
+ </button>
+ <button
+ follows="left|bottom"
+ height="20"
+ label="Start Auction"
+ label_selected="Start Auction"
+ layout="topleft"
+ left_pad="4"
+ name="start_auction_btn"
+ top_delta="0"
+ width="150">
+ <button.commit_callback
+ function="ClickStartAuction" />
+ </button>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index ed3cc26851..bdcf3648fa 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -1115,6 +1115,10 @@
label="Zoom"
name="Zoom"
value="Zoom" />
+ <combo_box.item
+ label="None"
+ name="None"
+ value="None" />
</combo_box>
<check_box
height="23"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 1848a1cd37..6527679178 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -92,11 +92,24 @@
shortcut="alt|shift|S"
name="Sit Down Here">
<menu_item_call.on_click
- function="Self.SitDown"
- parameter="" />
+ function="Self.SitDown"/>
+ <menu_item_call.on_visible
+ function="Self.ShowSitDown"/>
<menu_item_call.on_enable
function="Self.EnableSitDown" />
</menu_item_call>
+ <menu_item_call
+ label="Stand Up"
+ layout="topleft"
+ shortcut="alt|shift|S"
+ name="Stand up">
+ <menu_item_call.on_click
+ function="Self.StandUp"/>
+ <menu_item_call.on_visible
+ function="Self.EnableStandUp"/>
+ <menu_item_call.on_enable
+ function="Self.EnableStandUp" />
+ </menu_item_call>
<menu_item_check
label="Fly"
name="Fly"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 7f9dc0c41f..6b164c660a 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -8102,6 +8102,8 @@ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now
<unique/>
One or more of your subscribed Voice Morphs has expired.
[[URL] Click here] to renew your subscription.
+
+If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
<tag>fail</tag>
<tag>voice</tag>
</notification>
@@ -8115,6 +8117,8 @@ One or more of your subscribed Voice Morphs has expired.
<unique/>
The active Voice Morph has expired, your normal voice settings have been applied.
[[URL] Click here] to renew your subscription.
+
+If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
<tag>fail</tag>
<tag>voice</tag>
</notification>
@@ -8128,6 +8132,8 @@ The active Voice Morph has expired, your normal voice settings have been applied
<unique/>
One or more of your Voice Morphs will expire in less than [INTERVAL] days.
[[URL] Click here] to renew your subscription.
+
+If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
<tag>fail</tag>
<tag>voice</tag>
</notification>
@@ -8260,6 +8266,11 @@ Failed to save appearance to XML.
Failed to save snapshot to [PATH]: Disk is full. [NEED_MEMORY]KB is required but only [FREE_MEMORY]KB is free.
</notification>
+ <notification icon="notifytip.tga"
+ name="SnapshotToLocalDirNotExist" type="notifytip">
+Failed to save snapshot to [PATH]: Directory does not exist.
+ </notification>
+
<notification
icon="notifytip.tga"
name="PresetNotSaved"
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 3a34bcbe21..7759d4fdb2 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -12,6 +12,10 @@
name="forgot_password_url">
http://secondlife.com/account/request.php
</panel.string>
+ <panel.string
+ name="sign_up_url">
+ https://join.secondlife.com/
+ </panel.string>
<layout_stack
follows="left|right|top"
height="172"
@@ -149,7 +153,18 @@
label="Select grid"
layout="topleft"
name="server_combo"
- width="149" />
+ width="149" />
+ <text
+ follows="left|top"
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ height="16"
+ name="sign_up_text"
+ left="778"
+ bottom_delta="-10"
+ width="200">
+ Sign up
+ </text>
</layout_panel>
<layout_panel
height="172"
diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml
index 35b80c56ab..213f9a6b0c 100644
--- a/indra/newview/skins/default/xui/en/panel_login_first.xml
+++ b/indra/newview/skins/default/xui/en/panel_login_first.xml
@@ -12,6 +12,10 @@
name="forgot_password_url">
http://secondlife.com/account/request.php
</panel.string>
+ <panel.string
+ name="sign_up_url">
+ https://join.secondlife.com/
+ </panel.string>
<layout_stack
follows="left|right|top|bottom"
width="1024"
@@ -168,6 +172,17 @@
width="200">
Forgotten password
</text>
+ <text
+ follows="left|top"
+ font="SansSerifLarge"
+ text_color="EmphasisColor"
+ height="16"
+ name="sign_up_text"
+ left="432"
+ top="34"
+ width="200">
+ Sign up
+ </text>
</layout_panel>
<layout_panel
height="100"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index b84dce222f..efedb9559e 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -292,10 +292,14 @@
label="Open"
name="Open"
value="Open" />
- <combo_box.item
- label="Zoom"
- name="Zoom"
- value="Zoom" />
+ <combo_box.item
+ label="Zoom"
+ name="Zoom"
+ value="Zoom" />
+ <combo_box.item
+ label="None"
+ name="None"
+ value="None" />
</combo_box>
<panel
border="false"
diff --git a/indra/newview/skins/default/xui/es/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/es/floater_preferences_graphics_advanced.xml
index 84b256c8e3..a0618521ee 100644
--- a/indra/newview/skins/default/xui/es/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/es/floater_preferences_graphics_advanced.xml
@@ -31,7 +31,7 @@
<text name="AvatarPhysicsDetailText">
Bajo
</text>
- <text name="ShadersText">
+ <text name="HardwareText">
Hardware
</text>
<slider label="Memoria para texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vídeo. Reducir esta cantidad puede mejorar el rendimiento, pero también hacer que las texturas se vean borrosas."/>
@@ -56,6 +56,9 @@
<text name="antialiasing restart">
(requiere reiniciar)
</text>
+ <text name="MeshText">
+ Malla
+ </text>
<slider label="Detalle de la malla del terreno:" name="TerrainMeshDetail"/>
<text name="TerrainMeshDetailText">
Bajo
@@ -72,6 +75,9 @@
<text name="FlexibleMeshDetailText">
Bajo
</text>
+ <text name="ShadersText">
+ Shaders
+ </text>
<check_box initial_value="true" label="Agua transparente" name="TransparentWater"/>
<check_box initial_value="true" label="Efecto de relieve y brillo" name="BumpShiny"/>
<check_box initial_value="true" label="Puntos de luz locales" name="LocalLights"/>
@@ -111,5 +117,6 @@
<button label="Restablecer la configuración recomendada" name="Defaults"/>
<button label="OK" label_selected="OK" name="OK"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
+ <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
+ <check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml
index 98b0798011..5cfcaf29a0 100644
--- a/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml
@@ -3,6 +3,7 @@
<menu_item_call label="No ignorar" name="unblock"/>
<menu_item_check label="Bloquear la voz" name="BlockVoice"/>
<menu_item_check label="Bloquear el texto" name="MuteText"/>
+ <menu_item_check label="Bloquear partículas" name="MuteParticles"/>
<menu_item_check label="Bloquear los sonidos de objeto" name="BlockObjectSounds"/>
<menu_item_call label="Perfil..." name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index fdf9003321..028354f3cf 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -4299,7 +4299,7 @@ Prueba a seleccionar un terreno más pequeño.
Un error interno nos ha impedido actualizar tu visor correctamente. El saldo en L$ o las parcelas en propiedad presentadas en el visor podrían no coincidir con tu saldo real en los servidores.
</notification>
<notification name="LargePrimAgentIntersect">
- No se pueden crear prims grandes que intersectan a otros jugadores. Reinténtalo cuando se hayan movido otros jugadores.
+ No se pudo crear primitivas grandes que se crucen con otros residentes. Por favor, vuelve a intentar cuando otros residentes se hayan desplazado.
</notification>
<notification name="PreferenceChatClearLog">
Esto eliminará los registros de conversaciones anteriores y las copias de seguridad de ese archivo.
diff --git a/indra/newview/skins/default/xui/es/panel_group_roles.xml b/indra/newview/skins/default/xui/es/panel_group_roles.xml
index 54a5566600..f9c31a14e0 100644
--- a/indra/newview/skins/default/xui/es/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_roles.xml
@@ -91,6 +91,11 @@ Seleccione varios nombres manteniendo pulsada la tecla Ctrl y pulsando en cada u
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
+ <panel name="members_header">
+ <text_editor name="member_action_description">
+ Esta habilidad es &apos;Expulsar miembros de este grupo&apos;. Sólo un propietario puede expulsar a otro propietario.
+ </text_editor>
+ </panel>
<panel name="roles_footer">
<text name="static">
Nombre del rol
@@ -117,6 +122,11 @@ Seleccione varios nombres manteniendo pulsada la tecla Ctrl y pulsando en cada u
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
+ <panel name="roles_header">
+ <text_editor name="role_action_description">
+ Esta habilidad es &apos;Expulsar miembros de este grupo&apos;. Sólo un propietario puede expulsar a otro propietario.
+ </text_editor>
+ </panel>
<panel name="actions_footer">
<text_editor name="action_description">
Esta capacidad es la de &apos;Expulsar miembros de este grupo&apos;. Sólo un propietario puede expulsar a otro.
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
index 34947ca478..1b191d3e46 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -15,8 +15,8 @@
Web:
</text>
<radio_group name="preferred_browser_behavior">
- <radio_item label="Usar mi navegador (Chrome, Firefox, IE) para todos los enlaces" name="internal" tool_tip="Usa el navegador predeterminado para obtener ayuda, visitar enlaces web, etc. No es aconsejable si estás a pantalla completa." value="0"/>
- <radio_item label="Usar el navegador integrado solo para los enlaces de Second Life" name="external" tool_tip="Usa el navegador predeterminado del sistema para obtener ayuda, visitar enlaces web, etc. El navegador integrado solo se utilizará para los enlaces de LindenLab/SecondLife." value="1"/>
+ <radio_item label="Usar el navegador incorporado para todos los enlaces" name="internal" tool_tip="Usa el navegador predeterminado para obtener ayuda, visitar enlaces web, etc. No es aconsejable si estás a pantalla completa." value="0"/>
+ <radio_item label="Usar el navegador integrado solo para los enlaces de Second Life" name="external" tool_tip="Usa el navegador predeterminado para obtener ayuda, visitar enlaces web, etc. Se utilizará el navegador incorporado sólo para los enlaces LindenLab/Second Life." value="1"/>
<radio_item label="Usar el navegador incorporado para todos los vínculos" name="external_all" tool_tip="Usa el navegador incorporado para ayuda, enlaces web, etc. Este navegador se abre en una nueva ventana dentro de [APP_NAME]." value="2"/>
</radio_group>
<check_box initial_value="true" label="Activar plugins" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/es/panel_preferences_uploads.xml
index b095ed6c67..2764268752 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_uploads.xml
@@ -12,6 +12,9 @@
<text name="title_animation">
Animaciones
</text>
+ <text name="title_model">
+ Modelos
+ </text>
<text name="upload_help">
Para cambiar una carpeta de destino, pulsa con el botón derecho en ella en el inventario y elige
&quot;Usar como valor predeterminado para&quot;
diff --git a/indra/newview/skins/default/xui/es/role_actions.xml b/indra/newview/skins/default/xui/es/role_actions.xml
index 25708ae731..80379da064 100644
--- a/indra/newview/skins/default/xui/es/role_actions.xml
+++ b/indra/newview/skins/default/xui/es/role_actions.xml
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Estas capacidades incluyen poderes para añadir o quitar miembros del grupo, y para pemitir que se sumen nuevos miembros sin necesidad de invitación." name="Membership">
- <action description="Invitar personas al grupo" longdescription="Invitar a gente a este grupo usando el botón &apos;Invitar&apos; en la sección Roles &gt; pestaña Miembros." name="member invite" value="1"/>
- <action description="Expulsar a miembros del grupo" longdescription="Expulsar a miembros de este grupo usando el botón &apos;Expulsar&apos; en la sección Roles &gt; pestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si no eres un propietario, un miembro puede ser expulsado única y exclusivamente si está en el rol de Cualquiera y NO en otros roles. Para quitar roles a los miembros, tienes que tener la capacidad de &apos;Quitar roles a los miembros&apos;." name="member eject" value="2"/>
+ <action description="Invitar personas al grupo" longdescription="Invitar a gente a este grupo usando el botón &apos;Invitar&apos; en la sección Roles y Miembros &gt; pestaña Miembros." name="member invite" value="1"/>
+ <action description="Expulsar miembros que pertenecen al rol &apos;Todos&apos; en este grupo." longdescription="Expulsar a miembros de este grupo usando el botón &apos;Expulsar&apos; en la sección Roles y Miembros &gt; pestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si no eres un propietario, un miembro puede ser expulsado única y exclusivamente si está en el rol de Todos y NO en otros roles. Para quitar roles a los miembros, tienes que tener la capacidad de &apos;Quitar roles a los miembros&apos;." name="member eject" value="2"/>
<action description="Administra la lista de expulsados" longdescription="Permite que el miembro del grupo expulse a residentes de este grupo o los readmita." name="allow ban" value="51"/>
<action description="Cambiar &apos;Inscripción abierta&apos; y &apos;Cuota de inscripción&apos;" longdescription="En la sección General, cambiar la &apos;Inscripción abierta&apos; -que permite entrar al grupo sin invitación- y la &apos;Cuota de inscripción&apos;." name="member options" value="3"/>
</action_set>
<action_set description="Estas habilidades incluyen el poder añadir, quitar y cambiar roles, asignarlos a miembros, y darles capacidades." name="Roles">
- <action description="Crear nuevos roles" longdescription="Crear roles nuevos en la sección Roles &gt; pestaña Roles." name="role create" value="4"/>
- <action description="Borrar roles" longdescription="Borrar roles en la sección Roles &gt; pestaña Roles." name="role delete" value="5"/>
- <action description="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol" longdescription="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol. Se hace seleccionando el rol, dentro de la sección Roles &gt; pestaña Roles." name="role properties" value="6"/>
- <action description="Designar miembros para el rol del asignador" longdescription="Añadir miembros a los roles en la lista de Roles asignados (sección Roles &gt; pestaña Miembros). Un miembro con esta capacidad sólo puede añadir miembros a los roles que tenga él mismo." name="role assign member limited" value="7"/>
- <action description="Designar miembros para cualquier rol" longdescription="Designar miembros para cualquier rol en la lista de Roles asignados (sección Roles &gt; pestaña Miembros). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role assign member" value="8"/>
- <action description="Quitar capacidades a los miembros" longdescription="Quitar miembros de los roles en la lista de roles asignados (sección Roles &gt; pestaña Miembros). No se puede quitar a los Propietarios." name="role remove member" value="9"/>
- <action description="Añadir o quitar capacidades a los roles" longdescription="Asignar y quitar capacidades a cada rol en la lista de capacidades permitidas (sección Roles &gt; pestaña Roles). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- todas las capacidades. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role change actions" value="10"/>
+ <action description="Crear nuevos roles" longdescription="Crear roles nuevos en la sección Roles y Miembros &gt; pestaña Roles." name="role create" value="4"/>
+ <action description="Borrar roles" longdescription="Borrar roles en la sección Roles y Miembros &gt; pestaña Roles." name="role delete" value="5"/>
+ <action description="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol" longdescription="Cambiar el nombre, la etiqueta y la descripción de los roles, y si los miembros se muestran públicamente en ese rol. Esto se hace al final de la sección Roles y Miembros &gt; pestaña Roles, luego de seleccionar un Rol." name="role properties" value="6"/>
+ <action description="Designar miembros para el rol del asignador" longdescription="Añadir miembros a los roles en la lista de Roles asignados (sección Roles y Miembros &gt; pestaña Miembros). Un miembro con esta capacidad sólo puede añadir miembros a los roles que tenga él mismo." name="role assign member limited" value="7"/>
+ <action description="Designar miembros para cualquier rol" longdescription="Asignar miembros a cualquier rol en la lista de roles asignados (Sección Roles y miembros &gt; pestaña Miembros) *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role assign member" value="8"/>
+ <action description="Quitar capacidades a los miembros" longdescription="Quitar miembros de los roles en la lista de roles asignados (sección Roles y Miembros &gt; pestaña Miembros). No se puede quitar a los Propietarios." name="role remove member" value="9"/>
+ <action description="Añadir o quitar capacidades a los roles" longdescription="Asignar y quitar habilidades para cada Rol en la lista de capacidades permitidas (Sección Roles y Miembros &gt; pestaña Roles). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- todas las capacidades. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role change actions" value="10"/>
</action_set>
<action_set description="Estas capacidades incluyen poderes para modificar la identidad del grupo, como su visibilidad pública, su carta o su emblema." name="Group Identity">
<action description="Cambiar la carta, emblema, &apos;Mostrar en la búsqueda&apos;, y qué miembros serán visibles en la información del grupo" longdescription="Cambia la carta, emblema y &apos;Mostrar en la búsqueda&apos;. Se hace en la sección General." name="group change identity" value="11"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml
index 42cc2e6dac..23fff3b770 100644
--- a/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml
@@ -31,7 +31,7 @@
<text name="AvatarPhysicsDetailText">
Faible
</text>
- <text name="ShadersText">
+ <text name="HardwareText">
Matériel
</text>
<slider label="Mémoire textures (Mo) :" name="GraphicsCardTextureMemory" tool_tip="Quantité de mémoire à affecter aux textures. Utilise la mémoire de la carte vidéo par défaut. Si vous réduisez ce paramètre, cela peut améliorer les performances, mais les textures risquent d’être floues."/>
@@ -56,6 +56,9 @@
<text name="antialiasing restart">
(redémarrage requis)
</text>
+ <text name="MeshText">
+ Maillage
+ </text>
<slider label="Détails des rendus des terrains :" name="TerrainMeshDetail"/>
<text name="TerrainMeshDetailText">
Faible
@@ -72,6 +75,9 @@
<text name="FlexibleMeshDetailText">
Faible
</text>
+ <text name="ShadersText">
+ Effets
+ </text>
<check_box initial_value="true" label="Eau transparente" name="TransparentWater"/>
<check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/>
<check_box initial_value="true" label="Lumières locales" name="LocalLights"/>
@@ -111,5 +117,6 @@
<button label="Réinitialiser les paramètres recommandés" name="Defaults"/>
<button label="OK" label_selected="OK" name="OK"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
- <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
+ <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
+ <check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml
index adce6f5682..26243c48c2 100644
--- a/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Ne plus ignorer" name="unblock"/>
<menu_item_check label="Bloquer le chat vocal" name="BlockVoice"/>
<menu_item_check label="Ignorer le texte" name="MuteText"/>
+ <menu_item_check label="Ignorez les particules" name="MuteParticles"/>
<menu_item_check label="Bloquer les sons des objets" name="BlockObjectSounds"/>
<menu_item_call label="Profil..." name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 6225eba119..4976b4a724 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -4302,7 +4302,7 @@ Veuillez sélectionner un terrain plus petit.
Une erreur interne nous a empêchés de mettre votre client à jour correctement. Le solde de L$ et le patrimoine affichés dans votre client peuvent ne pas correspondre à votre solde réel sur les serveurs.
</notification>
<notification name="LargePrimAgentIntersect">
- Impossible de créer de grandes prims qui coupent d&apos;autres joueurs. Réessayez une fois que les autres joueurs se seront déplacés.
+ Impossible de créer de grands prims qui rejoignent d&apos;autres résidents. Veuillez essayer à nouveau lorsque les autres résidents seront partis.
</notification>
<notification name="PreferenceChatClearLog">
Cela supprimera les journaux des conversations précédentes, ainsi que toute copie de sauvegarde de ce fichier.
diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
index 3e66190c8d..66f4c8a768 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
@@ -95,6 +95,11 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
+ <panel name="members_header">
+ <text_editor name="member_action_description">
+ Ce pouvoir permet « d&apos;expulser des membres de ce groupe ». Seul un propriétaire peut expulser un autre propriétaire.
+ </text_editor>
+ </panel>
<panel name="roles_footer">
<text name="static">
Nom du rôle
@@ -120,6 +125,11 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
+ <panel name="roles_header">
+ <text_editor name="role_action_description">
+ Ce pouvoir permet « d&apos;expulser des membres de ce groupe ». Seul un propriétaire peut expulser un autre propriétaire.
+ </text_editor>
+ </panel>
<panel name="actions_footer">
<text_editor name="action_description">
Ce pouvoir permet d&apos;expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire.
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
index 0a78a1bb93..ee167fce99 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
@@ -3,7 +3,7 @@
<panel.string name="log_in_to_change">
se connecter pour changer
</panel.string>
- <button label="Vider l&apos;historique" name="clear_cache" tool_tip="Effacer le cache de l&apos;image de connexion, du dernier lieu, de l&apos;historique des téléportations, Web et de texture."/>
+ <button label="Vider l&apos;historique" name="clear_cache" tool_tip="Effacez le cache de l&apos;image de connexion, du dernier lieu, de l&apos;historique des téléportations, du Web et des textures."/>
<text name="cache_size_label_l">
(endroits, images, web, historique des recherches)
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
index 7ac84fb4bd..c010fa9e90 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -15,9 +15,9 @@
Web :
</text>
<radio_group name="preferred_browser_behavior">
- <radio_item label="Utiliser mon navigateur (Chrome, Firefox, IE) pour tous les liens" name="internal" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens, etc. Non recommandé en mode plein écran." value="0"/>
- <radio_item label="Utiliser le navigateur intégré pour les liens Second Life uniquement" name="external" tool_tip="Utilisez le navigateur web système par défaut pour l&apos;aide, les liens Web, etc. Le navigateur intégré sera uniquement utilisé pour les liens LindenLab/SecondLife." value="1"/>
- <radio_item label="Utiliser le navigateur intégré pour tous les liens" name="external_all" tool_tip="Utilisez le navigateur intégré pour obtenir de l’aide, ouvrir des liens etc. Ce navigateur s’ouvre dans [APP_NAME]." value="2"/>
+ <radio_item label="Utilisez le navigateur intégré par défaut pour tous les liens" name="internal" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens, etc. Non recommandé en mode plein écran." value="0"/>
+ <radio_item label="Utilisez le navigateur intégré pour les liens Second Life uniquement" name="external" tool_tip="Utilisez le navigateur web système par défaut pour trouver de l&apos;aide, les liens web, etc. Le navigateur intégré ne sera utilisé que pour les liens LindenLab / SeconLife." value="1"/>
+ <radio_item label="Utilisez le navigateur intégré pour tous les liens" name="external_all" tool_tip="Utilisez le navigateur intégré pour obtenir de l’aide, ouvrir des liens etc. Ce navigateur s’ouvre dans [APP_NAME]." value="2"/>
</radio_group>
<check_box initial_value="true" label="Activer les plugins" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Accepter les cookies" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/fr/panel_preferences_uploads.xml
index c1d9d15a93..76a08da7db 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_uploads.xml
@@ -12,6 +12,9 @@
<text name="title_animation">
Animations
</text>
+ <text name="title_model">
+ Modèles
+ </text>
<text name="upload_help">
Pour modifier un dossier de destination, cliquez-droit sur ce dossier dans l’inventaire et faites votre choix
&quot;Utiliser comme défaut pour&quot;
diff --git a/indra/newview/skins/default/xui/fr/role_actions.xml b/indra/newview/skins/default/xui/fr/role_actions.xml
index cc29066ba2..d10de38437 100644
--- a/indra/newview/skins/default/xui/fr/role_actions.xml
+++ b/indra/newview/skins/default/xui/fr/role_actions.xml
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Ces pouvoirs permettent d&apos;ajouter et de supprimer des membres du groupe et permettent aux nouveaux membres de rejoindre le groupe sans recevoir d&apos;invitation." name="Membership">
- <action description="Inviter des membres dans ce groupe" longdescription="Invitez des personnes à rejoindre ce groupe en utilisant le bouton Inviter dans l&apos;onglet Membres de la section Rôles." name="member invite" value="1"/>
- <action description="Expulser des membres du groupe" longdescription="Expulsez des personnes de ce groupe en utilisant le bouton Expulser dans l&apos;onglet Membres de la section Rôles. Un propriétaire peut expulser tout le monde à l&apos;exception des autres propriétaires. Si vous n&apos;êtes pas propriétaire, vous pouvez expulser un membre d&apos;un groupe uniquement si il n&apos;a que le rôle Tous et AUCUN autre rôle. Pour supprimer des membres des rôles, vous devez disposer du pouvoir correspondant." name="member eject" value="2"/>
+ <action description="Inviter des membres dans ce groupe" longdescription="Invitez des personnes à rejoindre ce groupe en utilisant le bouton « Inviter » dans la section Rôles et membres &gt; onglet Membres" name="member invite" value="1"/>
+ <action description="Expulser les Membres appartenant du rôle « Tous » de ce groupe" longdescription="Expulsez des personnes de ce groupe en utilisant le bouton « Expulser » dans la section Rôles et membres &gt; onglet Membres Un propriétaire peut expulser tout le monde à l’exception des autres propriétaires. Si vous n’êtes pas propriétaire, vous pouvez expulser un membre d’un groupe si, et uniquement s&apos;il n’a que le rôle Tous et AUCUN autre rôle. Pour supprimer des membres des rôles, vous devez disposer du pouvoir « Supprimer des membres des rôles »" name="member eject" value="2"/>
<action description="Gérer la liste des résidents bannis" longdescription="Permet au membre du groupe de bannir / d&apos;annuler le bannissement des résidents de ce groupe." name="allow ban" value="51"/>
<action description="Activer Inscription libre et modifier les frais d&apos;inscription" longdescription="Activez Inscription libre pour permettre aux nouveaux membres de s&apos;inscrire sans invitation, et changez les frais d&apos;inscription dans la section Général." name="member options" value="3"/>
</action_set>
<action_set description="Ces pouvoirs permettent d&apos;ajouter, de supprimer et de modifier les rôles dans le groupe et d&apos;y assigner des membres et des pouvoirs." name="Roles">
- <action description="Créer des rôles" longdescription="Créez de nouveaux rôles dans l&apos;onglet Rôles de la section Rôles." name="role create" value="4"/>
- <action description="Supprimer des rôles" longdescription="Supprimez des rôles dans l&apos;onglet Rôles de la section Rôles." name="role delete" value="5"/>
- <action description="Changer les noms, les titres et les descriptions des rôles et indiquer si les membres des rôles sont rendus publics" longdescription="Changez les noms, les titres et les descriptions des rôles, et indiquez si les membres des rôles sont rendus publics. Vous pouvez le faire au bas de l&apos;onglet Rôles dans la section Rôles, après avoir sélectionné un rôle." name="role properties" value="6"/>
- <action description="Attribuer des rôles limités" longdescription="Assignez des membres aux rôles dans la liste Rôles assignés (section Rôles &gt; onglet Membres). Un membre avec ce pouvoir peut uniquement ajouter des membres à un rôle dans lequel le responsable de l&apos;assignation est déjà présent." name="role assign member limited" value="7"/>
- <action description="Attribuer tous les rôles" longdescription="Assignez des membres à n&apos;importe quel rôle dans la liste Rôles assignés (section Rôles &gt; onglet Membres). *AVERTISSEMENT* Tout membre disposant de ce pouvoir peut s&apos;assigner lui-même, ainsi que tout autre membre non-propriétaire, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir." name="role assign member" value="8"/>
- <action description="Destituer des membres de leurs rôles" longdescription="Supprimez des membres des rôles dans la liste Rôles assignés (section Rôles &gt; onglet Membres). Les propriétaires ne peuvent pas être supprimés." name="role remove member" value="9"/>
- <action description="Modifier les pouvoirs d&apos;un rôle" longdescription="Attribuez et supprimez des pouvoirs pour chaque rôle dans la liste Pouvoirs attribués (section Rôles &gt; onglet Rôles). *AVERTISSEMENT* Tout membre dans un rôle avec ce pouvoir peut s&apos;attribuer à lui-même, ainsi qu&apos;à tout autre membre non-propriétaire, tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir." name="role change actions" value="10"/>
+ <action description="Créer des rôles" longdescription="Créez de nouveaux rôles dans la section Rôles et membres &gt; onglet Rôles" name="role create" value="4"/>
+ <action description="Supprimer des rôles" longdescription="Supprimez des rôles dans la section Rôles et membres &gt; onglet Rôles" name="role delete" value="5"/>
+ <action description="Changer les noms, les titres et les descriptions des rôles et indiquer si les membres des rôles sont rendus publics" longdescription="Changez les noms, les titres et les descriptions des rôles, et indiquez si les membres des rôles sont rendus publics. Vous pouvez le faire au bas de la section Rôles et membres &gt; onglet Rôles après avoir sélectionné un rôle." name="role properties" value="6"/>
+ <action description="Attribuer des rôles limités" longdescription="Assignez des membres aux rôles dans la liste Rôles assignés (section Rôles et membres &gt; onglet Membres). Un membre avec ce pouvoir peut uniquement ajouter des membres à un rôle dans lequel le responsable de l’assignation est déjà présent." name="role assign member limited" value="7"/>
+ <action description="Attribuer tous les rôles" longdescription="Attribuez aux membres tout rôle dans la liste des Rôles assignés (Section Rôles et membres &gt; onglet Membres). AVERTISSEMENT* Tout membre disposant de ce pouvoir peut s’assigner lui-même, ainsi que tout autre membre non-propriétaire, à des rôles disposant de pouvoirs plus importants que ceux dont ils disposent actuellement, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir." name="role assign member" value="8"/>
+ <action description="Destituer des membres de leurs rôles" longdescription="Supprimez des membres des rôles dans la liste Rôles assignés (section Rôles et membres &gt; onglet Membres). Les propriétaires ne peuvent pas être supprimés." name="role remove member" value="9"/>
+ <action description="Modifier les pouvoirs d&apos;un rôle" longdescription="Attribuez et Supprimez des pouvoirs pour chaque rôle figurant dans la liste Pouvoirs assignés (Section Rôles et membres &gt; onglet Rôles). *AVERTISSEMENT* Tout membre dans un rôle avec ce pouvoir peut s&apos;attribuer à lui-même, ainsi qu&apos;à tout autre membre non-propriétaire, tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir." name="role change actions" value="10"/>
</action_set>
<action_set description="Ces pouvoirs permettent de modifier le profil public du groupe, sa charte et son logo." name="Group Identity">
<action description="Modifier le profil public du groupe" longdescription="Modifiez la charte, le logo et l&apos;affichage dans les résultats de recherche. Vous pouvez faire cela dans la section Général." name="group change identity" value="11"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/it/floater_preferences_graphics_advanced.xml
index 0568891264..b9fe6d76e7 100644
--- a/indra/newview/skins/default/xui/it/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/it/floater_preferences_graphics_advanced.xml
@@ -31,7 +31,7 @@
<text name="AvatarPhysicsDetailText">
Basso
</text>
- <text name="ShadersText">
+ <text name="HardwareText">
Hardware
</text>
<slider label="Memoria texture (MB):" name="GraphicsCardTextureMemory" tool_tip="Spazio di memoria da assegnare alle texture. Utilizza la memoria della scheda video come impostazione predefinita. La riduzione di questa impostazione potrebbe migliorare il rendimento ma potrebbe anche rendere le texture poco definite."/>
@@ -56,6 +56,9 @@
<text name="antialiasing restart">
(richiede il riavvio)
</text>
+ <text name="MeshText">
+ Mesh
+ </text>
<slider label="Dettagli mesh terreno:" name="TerrainMeshDetail"/>
<text name="TerrainMeshDetailText">
Basso
@@ -72,6 +75,9 @@
<text name="FlexibleMeshDetailText">
Basso
</text>
+ <text name="ShadersText">
+ Shader
+ </text>
<check_box initial_value="true" label="Acqua trasparente" name="TransparentWater"/>
<check_box initial_value="true" label="Mappatura urti e brillantezza" name="BumpShiny"/>
<check_box initial_value="true" label="Luci locali" name="LocalLights"/>
@@ -111,5 +117,6 @@
<button label="Ripristina impostazioni consigliate" name="Defaults"/>
<button label="OK" label_selected="OK" name="OK"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
- <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
+ <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
+ <check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml
index 172d712a1e..6ef8a330ad 100644
--- a/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Sblocca" name="unblock"/>
<menu_item_check label="Blocca voce" name="BlockVoice"/>
<menu_item_check label="Blocca testo" name="MuteText"/>
+ <menu_item_check label="Blocca Particelle" name="MuteParticles"/>
<menu_item_check label="Blocca suoni oggetto" name="BlockObjectSounds"/>
<menu_item_call label="Profilo..." name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index cf354b8f4f..e0c1403491 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -4301,7 +4301,7 @@ Prova a selezionare un pezzo di terreno più piccolo.
Un errore interno ha impedito l&apos;aggiornamento del Viewer. Il saldo in L$ o i lotti posseduti mostrati nel Viewer potrebbero non corrispondere ai valori correnti sui server.
</notification>
<notification name="LargePrimAgentIntersect">
- Non puoi creare prim grandi che intersecano altri giocatori. Riprova quando gli altri giocatori si sono spostati.
+ Impossibile creare prim larghi che si intersechino con altri residenti. Si prega di riprovare quando gli altri residenti si saranno mossi.
</notification>
<notification name="PreferenceChatClearLog">
Verranno cancellati i registri delle conversazioni precedenti e tutti gli eventuali backup di quel file.
diff --git a/indra/newview/skins/default/xui/it/panel_group_roles.xml b/indra/newview/skins/default/xui/it/panel_group_roles.xml
index 4d414d47ce..2047793f30 100644
--- a/indra/newview/skins/default/xui/it/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_roles.xml
@@ -82,6 +82,11 @@ cliccando sui loro nomi.
</text>
<scroll_list name="member_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi la scheda abilità."/>
</panel>
+ <panel name="members_header">
+ <text_editor name="member_action_description">
+ Questa abilità è “Espelli membri da questo gruppo”. Solo un proprietario può espellere un altro proprietario.
+ </text_editor>
+ </panel>
<panel name="roles_footer">
<text name="static">
Nome del ruolo
@@ -104,6 +109,11 @@ cliccando sui loro nomi.
</text>
<scroll_list name="role_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi la scheda abilità."/>
</panel>
+ <panel name="roles_header">
+ <text_editor name="role_action_description">
+ Questa abilità è “Espelli membri da questo gruppo”. Solo un proprietario può espellere un altro proprietario.
+ </text_editor>
+ </panel>
<panel name="actions_footer">
<text_editor name="action_description">
Questa abilità è &apos;Espelli i membri dal gruppo&apos;. Solo un Capogruppo puo espellere un&apos;altro Capogruppo.
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
index 2a73b66c9e..4365dd8caa 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
@@ -3,7 +3,7 @@
<panel.string name="log_in_to_change">
accedi per cambiare
</panel.string>
- <button label="Pulisci la cronologia" name="clear_cache" tool_tip="Elimina immagine login, ultimo luogo, cronologia teleport, web e texture cache"/>
+ <button label="Pulisci la cronologia" name="clear_cache" tool_tip="Elimina immagine login, ultimo luogo, cronologia teletrasporto, cache web e texture"/>
<text name="cache_size_label_l">
(Luoghi, immagini, web, cronologia ricerche)
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
index 24375e0de1..aa3ff53f4a 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -15,9 +15,9 @@
Web:
</text>
<radio_group name="preferred_browser_behavior">
- <radio_item label="Usa il mio browser (Chrome, Firefox, IE) per tutti i link" name="internal" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="0"/>
- <radio_item label="Usa il browser incorporato solo per i link di Second Life" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Il browser incorporato verrà usato solo per i link LindenLab/SecondLife." value="1"/>
- <radio_item label="Usa il browser incorporato per tutti i link" name="external_all" tool_tip="Utilizza il browser Web integrato per l&apos;aiuto, per i link Web e così via. Questo browser si apre in una nuova finestra in [APP_NAME]." value="2"/>
+ <radio_item label="Usa il browser predefinito per tutti i link" name="internal" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="0"/>
+ <radio_item label="Usa il browser integrato solo per i link di Second Life" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l’aiuto, link Web, ecc. Il browser integrato verrà utilizzato solo per aprire i link LindenLab/Second Life." value="1"/>
+ <radio_item label="Usa il browser integrato per tutti i link" name="external_all" tool_tip="Utilizza il browser Web integrato per l&apos;aiuto, per i link Web e così via. Questo browser si apre in una nuova finestra in [APP_NAME]." value="2"/>
</radio_group>
<check_box initial_value="true" label="Abilita plugin" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Accetta cookie" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/it/panel_preferences_uploads.xml
index 5083ceb552..bab2baacd8 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_uploads.xml
@@ -12,6 +12,9 @@
<text name="title_animation">
Animazioni
</text>
+ <text name="title_model">
+ Modelli
+ </text>
<text name="upload_help">
Per cambiare una cartella di destinazione, fai clic col pulsante destro del mouse sulla cartella desiderata nell&apos;inventario e sceglila
&quot;Usa come impostazione predefinita per&quot;
diff --git a/indra/newview/skins/default/xui/it/role_actions.xml b/indra/newview/skins/default/xui/it/role_actions.xml
index fe9a51d619..2bfaea8963 100644
--- a/indra/newview/skins/default/xui/it/role_actions.xml
+++ b/indra/newview/skins/default/xui/it/role_actions.xml
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Queste abilità permettono di aggiungere e rimuovere membri dal gruppo e consentono ai nuovi membri di aderire al gruppo senza invito." name="Membership">
- <action description="Invita persone in questo gruppo" longdescription="Invita persone in questo gruppo usando il pulsante Invita nella sezione Ruoli &gt; scheda membri." name="member invite" value="1"/>
- <action description="Espelli membri da questo gruppo" longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli &gt; scheda membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l&apos;Abilità corrispondente." name="member eject" value="2"/>
+ <action description="Invita persone in questo gruppo" longdescription="Invita persone a questo gruppo usando il pulsante “Invita” nella sezione Ruoli e Membri &gt; scheda Membri." name="member invite" value="1"/>
+ <action description="Espelli dal gruppo membri appartenenti alla categoria “Tutti”." longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli e Membri &gt; scheda Membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l’Abilità corrispondente." name="member eject" value="2"/>
<action description="Gestisci lista espulsi" longdescription="Consenti ai membri del gruppo di espellere / riammettere i residenti nel gruppo." name="allow ban" value="51"/>
<action description="Seleziona Iscrizione libera e modifica la Quota d&apos;iscrizione" longdescription="Seleziona Iscrizione libera per permettere ai nuovi membri di aderire senza invito e modifica la quota d&apos;iscrizione nella scheda Generale." name="member options" value="3"/>
</action_set>
<action_set description="Queste Abilità permettono di aggiungere, rimuovere, cambiare i ruoli del gruppo, aggiungere e rimuovere membri dai ruoli, nonché assegnare abilità ai ruoli." name="Roles">
- <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli &gt; scheda ruoli." name="role create" value="4"/>
- <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli &gt; scheda ruoli." name="role delete" value="5"/>
- <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici Viene fatto nella parte inferiore della sezione Ruoli &gt; scheda Ruoli, dopo avere selezionato un ruolo." name="role properties" value="6"/>
- <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Un utente con questa Abilità può aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited" value="7"/>
- <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna i membri a qualsiasi ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri membri non proprietari -- ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role assign member" value="8"/>
- <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Il proprietario non può essere rimosso." name="role remove member" value="9"/>
- <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e Rimuovi Abilità per ogni ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi -- ed assegnare ad altri membri non proprietari -- tutte le Abilità, che potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role change actions" value="10"/>
+ <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli e Membri &gt; scheda Ruoli." name="role create" value="4"/>
+ <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli e Membri &gt; scheda Ruoli." name="role delete" value="5"/>
+ <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici. Tutto ciò si può fare andando nella parte inferiore della sezione Ruoli e Membri &gt; scheda Ruoli, dopo avere selezionato un ruolo." name="role properties" value="6"/>
+ <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli e Membri&gt; scheda Membri). Un utente con questa Abilità può solo aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited" value="7"/>
+ <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna un qualunque ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli e membri &gt; scheda Membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi (e assegnare ad altri membri non proprietari) ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di un proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role assign member" value="8"/>
+ <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nella lista dei ruoli assegnati (sezione Ruoli e Membri&gt; scheda Membri). I proprietari non possono essere rimossi." name="role remove member" value="9"/>
+ <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e rimuovi abilità per ogni ruolo nella lista delle abilità permesse (sezione Ruoli e membri &gt; scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi (e assegnare ad altri membri non proprietari) tutte le Abilità, arrivando potenzialmente ad avere poteri analoghi a quelli di un proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role change actions" value="10"/>
</action_set>
<action_set description="Queste abilità autorizzano a modificare l&apos;identità di questo gruppo, come ad esempio la modifica della visibilità pubblica, lo statuto e il logo." name="Group Identity">
<action description="Cambiare lo statuto, il logo, e &apos;Mostra nella ricerca&apos;" longdescription="Cambia statuto, logo e &apos;Mostra nella ricerca&apos;. Viene fatto nella sezione Generale." name="group change identity" value="11"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml
index db4e086c13..ff7814ffb7 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml
@@ -31,7 +31,7 @@
<text name="AvatarPhysicsDetailText">
</text>
- <text name="ShadersText">
+ <text name="HardwareText">
ハードウェア
</text>
<slider label="テクスチャメモリ (MB):" name="GraphicsCardTextureMemory" tool_tip="テクスチャに割り当てられたメモリの量。ビデオカードのメモリに既定。数値を下げるとパフォーマンスが向上しますが、テクスチャの精度が落ちることがあります。"/>
@@ -56,6 +56,9 @@
<text name="antialiasing restart">
(再起動後に反映)
</text>
+ <text name="MeshText">
+ メッシュ
+ </text>
<slider label="地形のメッシュの詳細:" name="TerrainMeshDetail"/>
<text name="TerrainMeshDetailText">
@@ -72,6 +75,9 @@
<text name="FlexibleMeshDetailText">
</text>
+ <text name="ShadersText">
+ シェーダー
+ </text>
<check_box initial_value="true" label="透明な水" name="TransparentWater"/>
<check_box initial_value="true" label="バンプマッピングと光沢" name="BumpShiny"/>
<check_box initial_value="true" label="近くの光" name="LocalLights"/>
@@ -111,5 +117,6 @@
<button label="推奨設定にリセット" name="Defaults"/>
<button label="OK" label_selected="OK" name="OK"/>
<button label="取り消し" label_selected="取り消し" name="Cancel"/>
- <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
+ <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
+ <check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml
index fcc67f8d89..f74399f2ba 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml
@@ -3,6 +3,7 @@
<menu_item_call label="ブロック解除" name="unblock"/>
<menu_item_check label="ボイスをブロック" name="BlockVoice"/>
<menu_item_check label="文字をブロック" name="MuteText"/>
+ <menu_item_check label="パーティクルをブロック" name="MuteParticles"/>
<menu_item_check label="オブジェクトのサウンドをブロック" name="BlockObjectSounds"/>
<menu_item_call label="プロフィール..." name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 67586efc9e..c032e0d1ba 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -4337,7 +4337,7 @@ M キーを押して変更します。
内部エラーが発生したため、ビューワを正しく更新できませんでした。ビューワに表示されるリンデンドルの残高または区画の所有は、サーバー上の実際の残高を反映していない可能性があります。
</notification>
<notification name="LargePrimAgentIntersect">
- 他のプレイヤーの関心を引く大きなプリムを作成できません。他のプレイヤーが移動したときに再試行してください。
+ 他の住民と交差する大きなプリムを作成することはできません。他の住民が移動した場合は再度お試しください。
</notification>
<notification name="PreferenceChatClearLog">
これにより、過去の会話のログ、およびそのファイルのすべてのバックアップが削除されます。
diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
index 0e231b5b4f..2549266ee8 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
@@ -96,6 +96,11 @@ Ctrl キーを押しながらメンバー名をクリックすると
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
+ <panel name="members_header">
+ <text_editor name="member_action_description">
+ これは「このグループからメンバーを追放」する能力です。「オーナー」のみが他の「オーナー」を追放できます。
+ </text_editor>
+ </panel>
<panel name="roles_footer">
<text name="static">
役割名
@@ -121,6 +126,11 @@ Ctrl キーを押しながらメンバー名をクリックすると
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
+ <panel name="roles_header">
+ <text_editor name="role_action_description">
+ これは「このグループからメンバーを追放」する能力です。「オーナー」のみが他の「オーナー」を追放できます。
+ </text_editor>
+ </panel>
<panel name="actions_footer">
<text_editor name="action_description">
これは「グループからメンバーを追放する」能力です。 オーナーを追放できるのは、別のオーナーだけです。
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index ac5e43c4d4..2ceecf9df6 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -15,9 +15,9 @@
Web:
</text>
<radio_group name="preferred_browser_behavior">
- <radio_item label="すべてのリンクにマイ ブラウザ (Chrome、Firefox、IE) を使用" name="internal" tool_tip="デフォルトのシステム Web ブラウザでヘルプや Web リンク先などを見ます。全画面で起動中にはおすすめしません。" value="0"/>
- <radio_item label="Second Life リンクにのみ内蔵ブラウザを使用" name="external" tool_tip="ヘルプ、Web リンクなどにはデフォルトシステムのブラウザを使用します。 内蔵ブラウザは LindenLab/SecondLife リンクにのみ使用されます。" value="1"/>
- <radio_item label="すべてのリンクに内蔵ブラウザを使用" name="external_all" tool_tip="内蔵ブラウザでヘルプや Web リンクなどを見ます。[APP_NAME] 内に新しいウィンドウでこのブラウザが開きます。" value="2"/>
+ <radio_item label="すべてのリンクにデフォルトシステムのブラウザを使用します" name="internal" tool_tip="デフォルトのシステム Web ブラウザでヘルプや Web リンク先などを見ます。全画面で起動中にはおすすめしません。" value="0"/>
+ <radio_item label="Second Life リンクにのみ内蔵ブラウザを使用します" name="external" tool_tip="ヘルプ、Web リンクなどにはデフォルトシステムのブラウザを使用します内蔵ブラウザは LindenLab/Second Life リンクにのみ使用されます。" value="1"/>
+ <radio_item label="すべてのリンクに内蔵ブラウザを使用します" name="external_all" tool_tip="内蔵ブラウザでヘルプや Web リンクなどを見ます。[APP_NAME] 内に新しいウィンドウでこのブラウザが開きます。" value="2"/>
</radio_group>
<check_box initial_value="true" label="プラグインを有効にする" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Cookie を受け入れる" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml
index b8524aa60f..50d0e311a0 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml
@@ -12,6 +12,9 @@
<text name="title_animation">
アニメーション
</text>
+ <text name="title_model">
+ モデル
+ </text>
<text name="upload_help">
宛先フォルダを変更するには、持ち物でそのフォルダを右クリックして、&quot;デフォルトとして使用&quot; を選択します
</text>
diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml
index 0dc3528acb..fe90da89c7 100644
--- a/indra/newview/skins/default/xui/ja/role_actions.xml
+++ b/indra/newview/skins/default/xui/ja/role_actions.xml
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="これらの能力には、グループメンバーを追加、排除し、招待状なしに新メンバーの参加を認める権限が含まれます。" name="Membership">
- <action description="このグループに人を招待" longdescription="「役割」セクションの「メンバー」タブ内にある「招待」ボタンを押して、このグループにメンバーを招待します。" name="member invite" value="1"/>
- <action description="メンバーをこのグループから追放" longdescription="「役割」セクションの「メンバー」タブ内にある「追放」ボタンを押して、このグループからメンバーを追放します。 「オーナー」は、他の「オーナー」以外は誰でも追放できます。 「オーナー」ではない人が「全員(Everyone)」にしか役割がない場合、メンバーはグループから追放されることがあります。 「役割」からメンバーを削除するには、「役割からメンバーを削除」の能力が与えられている必要があります。" name="member eject" value="2"/>
+ <action description="このグループに人を招待" longdescription="「役割&amp;メンバー」セクションの「メンバー」タブ内にある「招待」ボタンを押して、このグループにメンバーを招待します。" name="member invite" value="1"/>
+ <action description="このグループから「全員(Everyone)」の役割に属するメンバーを追放します" longdescription="「役割&amp;メンバー」セクションの「メンバー」タブ内にある「追放」ボタンを押して、このグループからメンバーを追放します。「オーナー」は、他の「オーナー」以外は誰でも追放できます。「オーナー」ではない人が「全員(Everyone)」にしか役割がない場合、メンバーはグループから追放されることがあります。「役割」からメンバーを削除するには、「役割からメンバーを削除」の能力が与えられている必要があります。" name="member eject" value="2"/>
<action description="立入禁止リストの管理" longdescription="グループのメンバーに、このグループから住人を立入禁止/立入禁止解除できるようにします。" name="allow ban" value="51"/>
<action description="「自由参加」と「入会費」の切り替え" longdescription="「自由参加」に切り替えると、招待されなくても新しいメンバーが入会できます。「入会費」は「一般」セクションで変更します。" name="member options" value="3"/>
</action_set>
<action_set description="これらの能力には、グループ内の役割を追加、削除、変更し、役割にメンバーを追加、削除し、さらに役割へ能力を割り当てる権限が含まれます。" name="Roles">
- <action description="新しい役割を作成" longdescription="新しい「役割」は、「役割」セクション &gt; 「役割」タブで作成します。" name="role create" value="4"/>
- <action description="役割を削除" longdescription="「役割」は、「役割」セクション &gt; 「役割」タブで削除できます。" name="role delete" value="5"/>
- <action description="「役割」の名前、タイトル、説明、メンバー公開の有無を変更" longdescription="「役割」の名前、タイトル、説明、メンバー公開の有無を変更します。 「役割」を選択後に、「役割」セクション &gt; 「役割」タブ の下で設定できます。" name="role properties" value="6"/>
- <action description="メンバーを割り当て人の役割に割り当てる" longdescription="「割り当てられた役割」(「役割」セクション &gt; 「メンバー」タブ)のリストで、メンバーを「役割」に割り当てます。 この能力があるメンバーは、割り当てる人が既に所属する「役割」にのみメンバーを追加できます。" name="role assign member limited" value="7"/>
- <action description="メンバーを任意の役割に割り当てる" longdescription="「割り当てられた役割」(「役割」セクション &gt; 「メンバー」タブ)のリストで、メンバーをどの「役割」にも割り当てることができます。 *警告* この「能力」がある「役割」を持つメンバーなら誰でも自分自身と、他の「オーナー」以外のメンバーを現在以上の権限のある「役割」に割り当てることができます。つまり、「オーナー」以外の人が「オーナー」に近い力を持つよう設定できることになります。 この「能力」を割り当てる前に、自分がしようとしていることをよく把握してください。" name="role assign member" value="8"/>
- <action description="役割からメンバーを解除" longdescription="「割り当てられた役割」(「役割」セクション &gt; 「メンバー」タブ)のリストで、メンバーを「役割」から削除します。 「オーナー」は削除できません。" name="role remove member" value="9"/>
- <action description="役割の能力の割り当てと解除" longdescription="「許可された能力」(「役割」セクション &gt; 「役割」タブ)のリストにある、各「役割」の「能力」を割り当てたり、削除します。 *警告* この「能力」がある「役割」を持つメンバーなら誰でも自分自身と、他の「オーナー」以外のメンバーをすべての「能力」」に割り当てることができます。つまり、「オーナー」以外の人が「オーナー」に近い権限を持つよう設定できることになります。 この「能力」を割り当てる前に、自分がしようとしていることをよく把握してください。" name="role change actions" value="10"/>
+ <action description="新しい役割を作成" longdescription="新しい「役割」は、「役割&amp;メンバー」セクション &gt; 「役割」タブで作成します。" name="role create" value="4"/>
+ <action description="役割を削除" longdescription="「役割」は、「役割&amp;メンバー」セクション &gt; 「役割」タブで削除します。" name="role delete" value="5"/>
+ <action description="「役割」の名前、タイトル、説明、メンバー公開の有無を変更" longdescription="「役割」の名前、肩書き、説明、メンバー公開の有無を変更します。「役割」を選択後に、「役割&amp;メンバー」セクション &gt; 「役割」タブ の下で設定できます。" name="role properties" value="6"/>
+ <action description="メンバーを割り当て人の役割に割り当てる" longdescription="「割り当てられた役割」(「役割&amp;メンバー」セクション &gt; 「メンバー」タブ)のリストで、メンバーを「役割」に割り当てます。この能力があるメンバーは、割り当てる人が既に所属する「役割」にのみメンバーを追加できます。" name="role assign member limited" value="7"/>
+ <action description="メンバーを任意の役割に割り当てる" longdescription="「割り当てられた役割」(「役割&amp;メンバー」セクション &gt; 「メンバー」タブ)のリストで、メンバーを「いずれかの役割」に割り当てます。*警告* この「能力」がある「役割」を持つメンバーなら誰でも自分自身と、他の「オーナー」以外のメンバーを現在以上の権限のある「役割」に割り当てることができます。つまり、「オーナー」以外の人が「オーナー」に近い力を持つよう設定できることになります。この「能力」を割り当てる前に、自分がしようとしていることをよく把握してください。" name="role assign member" value="8"/>
+ <action description="役割からメンバーを解除" longdescription="「割り当てられた役割」(「役割&amp;メンバー」セクション &gt; 「メンバー」タブ)のリストで、メンバーを「役割」から削除します。「オーナー」は削除できません。" name="role remove member" value="9"/>
+ <action description="役割の能力の割り当てと解除" longdescription="「許可された能力」(「役割&amp;メンバー」セクション &gt; 「役割」タブ)のリストで、各「役割」に対する「能力」を割り当てたり削除したりします。*警告* この「能力」がある「役割」を持つメンバーなら誰でも自分自身と、他の「オーナー」以外のメンバーをすべての「能力」」に割り当てることができます。つまり、「オーナー」以外の人が「オーナー」に近い権限を持つよう設定できることになります。この「能力」を割り当てる前に、自分がしようとしていることをよく把握してください。" name="role change actions" value="10"/>
</action_set>
<action_set description="これらの能力には、グループの公開性や理念、記章の変更といった、グループのアイデンティティを修正する権限が含まれます。" name="Group Identity">
<action description="理念、記章、「Web 上で公開」、およびグループ情報内で公開のメンバーを変更。" longdescription="理念、記章、「検索に表示」の変更をします。 「一般」セクションで行えます。" name="group change identity" value="11"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/pt/floater_preferences_graphics_advanced.xml
index 6fa25262ea..89b3781151 100644
--- a/indra/newview/skins/default/xui/pt/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preferences_graphics_advanced.xml
@@ -31,7 +31,7 @@
<text name="AvatarPhysicsDetailText">
Baixo
</text>
- <text name="ShadersText">
+ <text name="HardwareText">
Hardware
</text>
<slider label="Memória da textura (MB):" name="GraphicsCardTextureMemory" tool_tip="Quantidade de memória que deve ser alocada para texturas. O padrão é definido pela memória da placa de vídeo. Reduzir este valor pode melhorar o desempenho, mas pode deixar as texturas fora de foco."/>
@@ -56,6 +56,9 @@
<text name="antialiasing restart">
(reinicie para ativar)
</text>
+ <text name="MeshText">
+ Mesh
+ </text>
<slider label="Detalhe de mesh de terreno:" name="TerrainMeshDetail"/>
<text name="TerrainMeshDetailText">
Baixo
@@ -72,6 +75,9 @@
<text name="FlexibleMeshDetailText">
Baixo
</text>
+ <text name="ShadersText">
+ Sombreamento
+ </text>
<check_box initial_value="true" label="Água transparente" name="TransparentWater"/>
<check_box initial_value="true" label="Mapeamento de relevo e brilho" name="BumpShiny"/>
<check_box initial_value="true" label="Luzes locais" name="LocalLights"/>
@@ -111,5 +117,6 @@
<button label="Redefinir para configurações recomendadas" name="Defaults"/>
<button label="OK" label_selected="OK" name="OK"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
+ <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
+ <check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml
index da824589c8..c0415eb3dc 100644
--- a/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Desbloquear" name="unblock"/>
<menu_item_check label="Bloquear voz" name="BlockVoice"/>
<menu_item_check label="Bloquear texto" name="MuteText"/>
+ <menu_item_check label="Bloquear partícula" name="MuteParticles"/>
<menu_item_check label="Bloquear sons de objeto" name="BlockObjectSounds"/>
<menu_item_call label="Perfil..." name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index b66f65c682..a7759e1b04 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -4289,7 +4289,7 @@ Tente selecionar uma quantidade menor de terreno.
Um erro interno impediu que seu visualizador fosse atualizado corretamente. O saldo em L$ ou a propriedade de lotes exibidos em seu visualizador pode não refletir o saldo real nos servidores.
</notification>
<notification name="LargePrimAgentIntersect">
- Não é possível criar grandes prims que interceptam outros jogadores. Tente novamente quando os outros jogadores tiverem se movido.
+ Não é possível prims maiores que cruzam com outros residentes. Tente novamente quando os outros residentes tiverem mudado.
</notification>
<notification name="PreferenceChatClearLog">
Isso excluirá os registros das conversas anteriores e qualquer backup desse arquivo.
diff --git a/indra/newview/skins/default/xui/pt/panel_group_roles.xml b/indra/newview/skins/default/xui/pt/panel_group_roles.xml
index 162c4743ec..531701754f 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_roles.xml
@@ -80,6 +80,11 @@
</text>
<scroll_list name="member_allowed_actions" tool_tip="Clique na guia Funções para ver mais detalhes"/>
</panel>
+ <panel name="members_header">
+ <text_editor name="member_action_description">
+ Esta Habilidade é ‘Expulsar Membros deste Grupo&apos;. Somente os Proprietários podem expulsar outro Proprietário.
+ </text_editor>
+ </panel>
<panel name="roles_footer">
<text name="static">
Nome da função
@@ -102,6 +107,11 @@
</text>
<scroll_list name="role_allowed_actions" tool_tip="Clique na guia Funções para ver mais detalhes"/>
</panel>
+ <panel name="roles_header">
+ <text_editor name="role_action_description">
+ Esta Habilidade é ‘Expulsar Membros deste Grupo&apos;. Somente os Proprietários podem expulsar outro Proprietário.
+ </text_editor>
+ </panel>
<panel name="actions_footer">
<text_editor name="action_description">
Essa habilidade permite tirar alguem do grupo. Somente o dono do grupo poderá retirar outro dono do grupo.
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
index ce356a6447..03536f28c3 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
@@ -15,8 +15,8 @@
Web:
</text>
<radio_group name="preferred_browser_behavior">
- <radio_item label="Usar meu navegador (Chrome, Firefox, IE) para todos os links" name="internal" tool_tip="Use o navegador padrão do sistema para consultar a ajuda, abrir links da web etc. Uso em tela inteira não recomendado." value="0"/>
- <radio_item label="Usar o navegador incorporado somente para links do SecondLife" name="external" tool_tip="Usar o navegador padrão do sistema para consultar a ajuda, abrir links da web etc. O navegador incorporado será usado somente para os links da LindenLab/SecondLife." value="1"/>
+ <radio_item label="Usar os sistema padrão de navegador para todos os links" name="internal" tool_tip="Use o navegador padrão do sistema para consultar a ajuda, abrir links da web etc. Uso em tela inteira não recomendado." value="0"/>
+ <radio_item label="Usar o navegador incorporado somente para links do SecondLife" name="external" tool_tip="Use osistema padrão de navegador para ajudar, abrir links da web etc. O navegador incorporado somente será usado para os links LindenLab/Second Life." value="1"/>
<radio_item label="Usar navegador incorporado para todos os links" name="external_all" tool_tip="Use este navegador para consultar a ajuda, abrir links da web, etc. A nova janela é aberta dentro do [APP_NAME]." value="2"/>
</radio_group>
<check_box initial_value="true" label="Habilitar plugins" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/pt/panel_preferences_uploads.xml
index 8050b56f0a..a33413fe12 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_uploads.xml
@@ -12,6 +12,9 @@
<text name="title_animation">
Animações
</text>
+ <text name="title_model">
+ Modelos
+ </text>
<text name="upload_help">
Para alterar a pasta de destino, clique com o botão direito nela no inventário e selecione
&quot;Usar como padrão para&quot;
diff --git a/indra/newview/skins/default/xui/pt/role_actions.xml b/indra/newview/skins/default/xui/pt/role_actions.xml
index cc97669be1..67ecfa0be3 100644
--- a/indra/newview/skins/default/xui/pt/role_actions.xml
+++ b/indra/newview/skins/default/xui/pt/role_actions.xml
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Esta habilidades incluem poderes de adicionar ou remover membros do grupo e permitir que novos membros se juntem sem um convite." name="Membership">
- <action description="Convidar pessoas para este grupo" longdescription="Em Membros &gt; Cargos, use o botão &apos;Convidar&apos; para convidar pessoas para entrar no grupo." name="member invite" value="1"/>
- <action description="Expulsar membros deste grupo" longdescription="Em Membros &gt; Cargos, use o botão &apos;Ejetar&apos; para tirar pessoas do grupo. Proprietários podem expulsar qualquer pessoa, menos outro proprietário. Se você não é Proprietário, um membro só pode ser expulso se tiver cargo &apos;Todos&apos; e nenhum outro cargo. Para destituir um membro de seu cargo, você precisa ter a função &apos;Destituir membro com cargo&apos;." name="member eject" value="2"/>
+ <action description="Convidar pessoas para este grupo" longdescription="Convide Pessoas para este Grupo usando o botão ‘Convidar&apos; na seção Cargos e Membros &gt; na aba Membros." name="member invite" value="1"/>
+ <action description="Expulse Membros pertencendo ao cargo ‘Todos&apos; deste Grupo" longdescription="Expulse Membros deste Grupo usando o botão ‘Expulsar&apos; na seção Cargos e Membros &gt; aba Membros. Proprietários podem expulsar qualquer pessoa, menos outro proprietário. Se você não é Proprietário, um membro só pode ser expulso se tiver cargo &apos;Todos&apos; e nenhum outro cargo. Para destituir um membro de seu cargo, você precisa ter a função &apos;Destituir membro com cargo&apos;." name="member eject" value="2"/>
<action description="Gerenciar lista de banidos" longdescription="Permite que membros do grupo banam residentes ou revoguem o banimento neste grupo." name="allow ban" value="51"/>
<action description="Alterna entre &apos;Inscrições abertas&apos; e &apos;Taxa de associação&apos;." longdescription="Ative &apos;Inscrições abertas&apos; para que novos membros entrem no grupo sem convite, mude a &apos;Taxa de associação&apos; na seção Geral." name="member options" value="3"/>
</action_set>
<action_set description="Estas habilidades incluem poderes de adicionar, remover e mudar funções do grupo; adicionar e remover membros em funções e designar habilidades a funções." name="Roles">
- <action description="Criar novas funções" longdescription="Crie novos cargos na guia Cargos." name="role create" value="4"/>
- <action description="Apagar funções" longdescription="Exclua cargos na guia Cargos." name="role delete" value="5"/>
- <action description="Modificar o nome, título e a descrição de cargos, e se o acesso a essas informações é público ou não" longdescription="Modificar o nome, título e a descrição de cargos, e se o acesso a essas informações é público ou não. Essas configurações ficam na guia Cargos, depois da seleção do cargo." name="role properties" value="6"/>
- <action description="Designar membros para a função do designador" longdescription="Na lista Cargos desempenhados, distribua os cargos aos membros (em Cargos &gt; guia Membros). Membros exercendo esta função devem exercer um cargo para poder adicionar outros membros ao mesmo cargo." name="role assign member limited" value="7"/>
- <action description="Designar membros para qualquer função" longdescription="Designe cargos aos membros na lista Cargos desempenhados (Cargos &gt; guia Membros). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode se designar -- ou designar outros membros não-proprietários -- a cargos com mais poder do que têm. Ou seja, membros com essa função podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role assign member" value="8"/>
- <action description="Remover membros das funções" longdescription="Use a lista Cargos desempenhados para destituir membros de seus cargos (Cargos &gt; guia Membros). Proprietários não podem ser destituídos." name="role remove member" value="9"/>
- <action description="Determinar e remover habilidades em funções" longdescription="Use a lista Funções autorizadas para adicionar e tirar as funções de cada cargo (Cargos &gt; guia Cargos). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode dar a sim mesmo -- ou a outros membros não-proprietários -- todas as funções. Membros excercendo todas as funções podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role change actions" value="10"/>
+ <action description="Criar novas funções" longdescription="Crie novos Cargos na seção Cargos e Membros &gt; na aba Cargos." name="role create" value="4"/>
+ <action description="Apagar funções" longdescription="Exclua Cargos na seção Cargos e Membros &gt; na aba Cargos." name="role delete" value="5"/>
+ <action description="Modificar o nome, título e a descrição de cargos, e se o acesso a essas informações é público ou não" longdescription="Modificar o nome, título e a descrição de cargos, e se o acesso a essas informações é público ou não. Iste é feito por último na seção Cargos e Membros &gt; na aba Cargos após selecionar um Cargo." name="role properties" value="6"/>
+ <action description="Designar membros para a função do designador" longdescription="Atribuir Membros para os Cargos na lista de Cargos desempenhados (na seção Cargos e Membros &gt; na aba Membros). Membros exercendo esta função devem exercer um cargo para poder adicionar outros membros ao mesmo cargo." name="role assign member limited" value="7"/>
+ <action description="Designar membros para qualquer função" longdescription="Atribuir Membros para Qualquer Cargo na lista de Cargos desempenhados (na seção Cargos e Membros &gt; na aba Membros). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode-se designar -- para os Cargos com mais poder do que têm atualmente podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role assign member" value="8"/>
+ <action description="Remover membros das funções" longdescription="Remova os Membros dos Cargos na lista Cargos desempenhados (na seção Cargos e Membros &gt; na aba Membros). Proprietários não podem ser destituídos." name="role remove member" value="9"/>
+ <action description="Determinar e remover habilidades em funções" longdescription="Atribuir e Remover Funções para cada Cargo na lista de Funções Permitidas (na seção Cargos e Membros &gt; na aba Cargos). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode dar a sim mesmo -- ou a outros membros não-proprietários -- todas as funções, que podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role change actions" value="10"/>
</action_set>
<action_set description="Estas habilidade incluem poderes para modificar esta identidade de grupo, como mudar a visibilidade pública, apresentação e insígnia." name="Group Identity">
<action description="Mudar apresentação, insígnia, &apos;Publicar na web&apos;, e quais membros estão publicamente visíveis em Informações do Grupo." longdescription="Modificar o estatuto, símbolo e exibição nos resultados de busca. Use a seção Geral." name="group change identity" value="11"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/ru/floater_preferences_graphics_advanced.xml
index 05a02df83e..efad8678b6 100644
--- a/indra/newview/skins/default/xui/ru/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/ru/floater_preferences_graphics_advanced.xml
@@ -31,8 +31,8 @@
<text name="AvatarPhysicsDetailText">
Низкая
</text>
- <text name="ShadersText">
- Аппаратура
+ <text name="HardwareText">
+ Аппаратное оборудование
</text>
<slider label="Память для текстур (МБ):" name="GraphicsCardTextureMemory" tool_tip="Объем памяти, отводимый для текстур. По умолчанию – объем памяти видеокарты. Уменьшение поможет увеличить производительность, но текстуры могут стать размытыми."/>
<slider label="Дистанция тумана:" name="fog"/>
@@ -56,6 +56,9 @@
<text name="antialiasing restart">
(требуется перезапуск)
</text>
+ <text name="MeshText">
+ Сетка
+ </text>
<slider label="Детализация меша:" name="TerrainMeshDetail"/>
<text name="TerrainMeshDetailText">
Низкая
@@ -72,6 +75,9 @@
<text name="FlexibleMeshDetailText">
Низкая
</text>
+ <text name="ShadersText">
+ Шейдеры
+ </text>
<check_box initial_value="true" label="Прозрачность воды" name="TransparentWater"/>
<check_box initial_value="true" label="Рельефность и сияние" name="BumpShiny"/>
<check_box initial_value="true" label="Локальный свет" name="LocalLights"/>
@@ -111,5 +117,6 @@
<button label="Вернуть рекомендуемые настройки" name="Defaults"/>
<button label="OK" label_selected="OK" name="OK"/>
<button label="Отмена" label_selected="Отмена" name="Cancel"/>
- <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
+ <check_box label="RenderAvatarMaxComplexity (Отрисовка аватара макс. сложности)" name="RenderAvatarMaxComplexity"/>
+ <check_box label="RenderAvatarMaxNonImpostors (Отрисовка макс. кол-ва 3-D аватаров)" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml
index c06776d5f9..628a545be3 100644
--- a/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Разблокировать" name="unblock"/>
<menu_item_check label="Блокировать голос" name="BlockVoice"/>
<menu_item_check label="Блокировать текст" name="MuteText"/>
+ <menu_item_check label="Блокировка участка" name="MuteParticles"/>
<menu_item_check label="Блокировать звуки объекта" name="BlockObjectSounds"/>
<menu_item_call label="Профиль…" name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index 483cebaac5..8f0fec9607 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -4302,7 +4302,7 @@
Не удалось обновить клиент из-за внутренней ошибки. Отображаемый в клиенте баланс L$ или владение участками могут не соответствовать действительному балансу на серверах.
</notification>
<notification name="LargePrimAgentIntersect">
- Нельзя создавать большие примитивы, которые пересекаются с другими игроками. Повторите попытку, когда другие игроки уйдут.
+ Невозможно создать большие примитивы, которые пересекаются с другими жителями. Пожалуйста, повторите попытку, когда другие жители переедут.
</notification>
<notification name="PreferenceChatClearLog">
Будут удалены журналы предыдущих разговоров и все резервные копии этих файлов.
diff --git a/indra/newview/skins/default/xui/ru/panel_group_roles.xml b/indra/newview/skins/default/xui/ru/panel_group_roles.xml
index 88af469fbd..b03c300204 100644
--- a/indra/newview/skins/default/xui/ru/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/ru/panel_group_roles.xml
@@ -79,6 +79,11 @@
</text>
<scroll_list name="member_allowed_actions" tool_tip="Данные о каждой доступной способности см. на вкладке «Способности»"/>
</panel>
+ <panel name="members_header">
+ <text_editor name="member_action_description">
+ Это возможность «Исключения участников из группы». Владельца может исключить только другой владелец.
+ </text_editor>
+ </panel>
<panel name="roles_footer">
<text name="static">
Имя роли
@@ -98,6 +103,11 @@
</text>
<scroll_list name="role_allowed_actions" tool_tip="Данные о каждой доступной способности см. на вкладке «Способности»"/>
</panel>
+ <panel name="roles_header">
+ <text_editor name="role_action_description">
+ Это возможность «Исключения участников из группы». Владельца может исключить только другой владелец.
+ </text_editor>
+ </panel>
<panel name="actions_footer">
<text_editor name="action_description">
Это способность «Исключать участников из группы». Владельца может исключить только другой владелец.
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
index d19a35c8b5..d4d0ef9e7c 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
@@ -15,9 +15,9 @@
Браузер:
</text>
<radio_group name="preferred_browser_behavior">
- <radio_item label="Использовать мой браузер (Chrome, Firefox, IE) для всех ссылок" name="internal" tool_tip="Будет использоваться браузер, заданный в системе по умолчанию. Не рекомендуется, если [APP_NAME] работает в полноэкранном режиме." value="0"/>
- <radio_item label="Использовать встроенный браузер только для ссылок Second Life" name="external" tool_tip="Стандартный браузер системы будет использоваться для справки, ссылок Интернета и т.д. Встроенный браузер будет использоваться только для ссылок LindenLab/SecondLife." value="1"/>
- <radio_item label="Использовать встроенный браузер для всех ссылок" name="external_all" tool_tip="Для просмотра справки, ссылок на веб-страницы и т. д. будет использоваться встроенный браузер. Этот браузер открывается как новое окно в [APP_NAME]." value="2"/>
+ <radio_item label="Используйте встроенный браузер для всех ссылок" name="internal" tool_tip="Будет использоваться браузер, заданный в системе по умолчанию. Не рекомендуется, если [APP_NAME] работает в полноэкранном режиме." value="0"/>
+ <radio_item label="Для ссылок Second Life следует использовать только встроенный браузер" name="external" tool_tip="Используйте встроенный браузер для справки, веб-ссылок и т.д. Для ссылок LindenLab/Second Life следует использовать только встроенный браузер." value="1"/>
+ <radio_item label="Для всех ссылок следует использовать встроенный браузер" name="external_all" tool_tip="Для просмотра справки, ссылок на веб-страницы и т. д. будет использоваться встроенный браузер. Этот браузер открывается как новое окно в [APP_NAME]." value="2"/>
</radio_group>
<check_box initial_value="true" label="Разрешить плагины" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Принимать файлы cookie" name="cookies_enabled"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/ru/panel_preferences_uploads.xml
index 487c92bd2a..b30665f806 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_uploads.xml
@@ -12,6 +12,9 @@
<text name="title_animation">
Анимация
</text>
+ <text name="title_model">
+ Модели
+ </text>
<text name="upload_help">
Чтобы сменить папку назначения, щелкните ее в инвентаре правой кнопкой мыши и выберите
&quot;Использовать по умолчанию для&quot;
diff --git a/indra/newview/skins/default/xui/ru/role_actions.xml b/indra/newview/skins/default/xui/ru/role_actions.xml
index 02b51f7e1d..1d526b90e4 100644
--- a/indra/newview/skins/default/xui/ru/role_actions.xml
+++ b/indra/newview/skins/default/xui/ru/role_actions.xml
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Эти способности позволяют добавлять и удалять участников группы, а также вступать в группы без приглашения." name="Membership">
- <action description="Приглашение людей в эту группу" longdescription="Пригласите людей в группу с помощью кнопки «Пригласить» в разделе «Роли» на вкладке «Участники»." name="member invite" value="1"/>
- <action description="Удаление участников из группы" longdescription="Удалите участников из группы с помощью кнопки «Выкинуть» в разделе «Роли» на вкладке «Участники». Владелец может удалять всех, кроме другого владельца. Если вы не владелец, то удалить участника из группы можно только в том случае, если ему назначена ТОЛЬКО роль «Все». Чтобы удалять участников из ролей, необходима способность «Удаление участников из ролей»." name="member eject" value="2"/>
+ <action description="Приглашение людей в эту группу" longdescription="Пригласите людей в эту группу с помощью кнопки «Пригласить» в разделе «Роли и Участники» на вкладке «Участники»." name="member invite" value="1"/>
+ <action description="Удаление участников, относящихся к роли «Для всех» из этой группы" longdescription="Удалите участников из этой группы с помощью кнопки «Выкинуть» в разделе «Роли и Участники» на вкладке «Участники». Владелец может удалять всех, кроме другого владельца. Если вы не владелец, то удалить участника из группы можно только в том случае, если он в роли «Для всех» и НЕ в одной другой роли. Чтобы удалять участников из ролей, необходима способность «Удаление участников из ролей»." name="member eject" value="2"/>
<action description="Управление списком заблокированных пользователей" longdescription="Разрешить участнику группы блокировать/разблокировать жителей из этой группы." name="allow ban" value="51"/>
<action description="Включение-отключение свободного вступления и изменение платы за вступление" longdescription="Включение-отключение свободного вступления, что обеспечит вступление новых участников без приглашения, а также изменение платы за вступление в разделе «Общие»." name="member options" value="3"/>
</action_set>
<action_set description="Эти способности позволяют добавлять, удалять и изменять роли группы, добавлять и удалять участников ролей, а также назначать ролям способности." name="Roles">
- <action description="Создание ролей" longdescription="Создавайте новые роли в разделе «Роли» на вкладке «Роли»." name="role create" value="4"/>
- <action description="Удаление ролей" longdescription="Удаляйте роли в разделе «Роли» на вкладке «Роли»." name="role delete" value="5"/>
- <action description="Изменение названий, титулов, описаний ролей, а также настройка публичности их участников" longdescription="Изменение названий, титулов, описаний ролей, а также настройка публичности их участников. Это можно сделать в разделе «Роли», в нижней части вкладки «Роли» для выбранной роли." name="role properties" value="6"/>
- <action description="Назначение участникам ролей назначающего" longdescription="Назначьте участникам роли в списке «Назначенные роли» (раздел «Роли» &gt; вкладка «Участники»). Участник с этой способностью может добавлять участников только той роли, в которой состоит он сам." name="role assign member limited" value="7"/>
- <action description="Назначение участников любой роли" longdescription="Назначение участникам любой роли в списке «Назначенные роли» (раздел «Роли» &gt; вкладка «Участники»). *ПРЕДУПРЕЖДЕНИЕ* Любой участник роли с этой способностью может назначить себе (и любому другому участнику, кроме владельца) роли с большими возможностями, чем он имеет, и подняться практически до уровня владельца. Прежде чем назначить эту способность, убедитесь в целесообразности этого." name="role assign member" value="8"/>
- <action description="Удаление участников из ролей" longdescription="Удаляйте участников из ролей в списке «Назначенные роли» (раздел «Роли» &gt; вкладка «Участники»). Владельцев удалять нельзя." name="role remove member" value="9"/>
- <action description="Назначение и удаление способностей ролей" longdescription="Назначайте и удаляйте способности для ролей в списке «Доступные способности» (раздел «Роли» &gt; вкладка «Роли»). *ПРЕДУПРЕЖДЕНИЕ* Любой участник роли с такой способностью может назначить себе (и любому другому участнику, кроме владельца) все роли, потенциально поднимаясь практически до уровня владельца. Прежде чем назначить эту способность, убедитесь в целесообразности этого." name="role change actions" value="10"/>
+ <action description="Создание ролей" longdescription="Создание новых ролей в разделе «Роли и Участники» на вкладке «Роли»." name="role create" value="4"/>
+ <action description="Удаление ролей" longdescription="Удаляйте роли в разделе «Роли и Участники» на вкладке «Роли»." name="role delete" value="5"/>
+ <action description="Изменение названий, титулов, описаний ролей, а также настройка публичности их участников" longdescription="Изменение названий, титулов, описаний ролей, а также настройка публичности их участников. Это можно сделать в разделе «Роли и Участники» в нижней части вкладки «Роли» после выбора роли." name="role properties" value="6"/>
+ <action description="Назначение участникам ролей назначающего" longdescription="Присвоение участникам роли в списке «Назначенные роли» (раздел «Роли и Участники» &gt; вкладка «Участники»). Участник с этой возможностью может добавлять участников только той роли, в которой состоит он сам." name="role assign member limited" value="7"/>
+ <action description="Назначение участников любой роли" longdescription="Присвоение участникам любой роли в списке «Назначенные роли» (раздел «Роли и Участники» &gt; вкладка «Участники»). *ПРЕДУПРЕЖДЕНИЕ* Любой участник роли с этой способностью может назначить себе (и любому другому участнику, кроме владельца) роли с большими возможностями, чем он имеет, и подняться практически до уровня владельца. Прежде чем назначить эту способность, убедитесь в целесообразности этого." name="role assign member" value="8"/>
+ <action description="Удаление участников из ролей" longdescription="Удаляйте участников из ролей в списке «Назначенные роли» (раздел «Роли» &gt; вкладка «Участники») Удаление владельцев невозможно." name="role remove member" value="9"/>
+ <action description="Назначение и удаление способностей ролей" longdescription="Назначайте и удаляйте способности для каждой роли в списке «Доступные способности» (раздел «Роли и Участники» &gt; вкладка «Роли»). *ПРЕДУПРЕЖДЕНИЕ* Любой участник роли с такой способностью может назначить себе (и любому другому участнику, кроме владельца) все роли, потенциально поднимаясь практически до уровня владельца. Прежде чем назначить эту способность, убедитесь в целесообразности этого." name="role change actions" value="10"/>
</action_set>
<action_set description="К этим способностям относится способность изменить характер группы, в том числе общедоступность, устав и символ." name="Group Identity">
<action description="Изменение устава, символа и параметра «Показать в поиске»" longdescription="Изменение устава, символа и параметра «Показать в поиске». Это можно выполнить в разделе «Общие»." name="group change identity" value="11"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml
index 72c897ad47..734ceec89f 100644
--- a/indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml
@@ -31,7 +31,7 @@
<text name="AvatarPhysicsDetailText">
Düşük
</text>
- <text name="ShadersText">
+ <text name="HardwareText">
Donanım
</text>
<slider label="Doku Belleği (MB):" name="GraphicsCardTextureMemory" tool_tip="Dokular için tahsis edilecek bellek miktarı. Varsayılan değer video kartı belleğidir. Bu değerin küçültülmesi performansı artırabilir, ama ayrıca dokuları bulanıklaştırabilir."/>
@@ -56,6 +56,9 @@
<text name="antialiasing restart">
(yeniden başlatma gerektirir)
</text>
+ <text name="MeshText">
+ Ağ
+ </text>
<slider label="Yüzey Ağ Ayrıntısı:" name="TerrainMeshDetail"/>
<text name="TerrainMeshDetailText">
Düşük
@@ -72,6 +75,9 @@
<text name="FlexibleMeshDetailText">
Düşük
</text>
+ <text name="ShadersText">
+ Gölgelendiriciler:
+ </text>
<check_box initial_value="true" label="Saydam Su" name="TransparentWater"/>
<check_box initial_value="true" label="Tümsek eşleme ve parlaklık" name="BumpShiny"/>
<check_box initial_value="true" label="Yerel Işıklar" name="LocalLights"/>
@@ -111,5 +117,6 @@
<button label="Önerilen ayarlara dön" name="Defaults"/>
<button label="Tamam" label_selected="Tamam" name="OK"/>
<button label="İptal" label_selected="İptal" name="Cancel"/>
- <check_box label="AvatarMaksKarmaşıklığıİşleme" name="RenderAvatarMaxNonImpostors"/>
+ <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
+ <check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml
index e9770a72b8..03cdd3af04 100644
--- a/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Engellemeyi Kaldır" name="unblock"/>
<menu_item_check label="Sesi Engelle" name="BlockVoice"/>
<menu_item_check label="Metni Engelle" name="MuteText"/>
+ <menu_item_check label="Parçacıkları Engelle" name="MuteParticles"/>
<menu_item_check label="Nesne Seslerini Engelle" name="BlockObjectSounds"/>
<menu_item_call label="Profil..." name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
index d218eb1957..d09d485a14 100644
--- a/indra/newview/skins/default/xui/tr/notifications.xml
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -4295,7 +4295,7 @@ Daha küçük bir arazi parçası seçmeyi deneyin.
Dahili bir hata nedeniyle görüntüleyicinizi gerektiği gibi güncelleyemedik. Görüntüleyicinizde gösterilen L$ bakiyesi veya parsel tutarı sunucular üzerinde gerçekteki bakiyenizi yansıtmayabilir.
</notification>
<notification name="LargePrimAgentIntersect">
- Başka oyuncularla kesişen büyük primler oluşturulamaz. Öbür oyuncular hareket ettiğinde lütfen tekrar deneyin.
+ Diğer sakinler ile kesişen büyük primler oluşturulamaz. Lütfen diğer sakinler taşındıktan sonra yeniden deneyin.
</notification>
<notification name="PreferenceChatClearLog">
Bu, geçmiş sohbetlerin günlüklerini ve bu dosyanın tüm yedeklerini silecektir.
diff --git a/indra/newview/skins/default/xui/tr/panel_group_roles.xml b/indra/newview/skins/default/xui/tr/panel_group_roles.xml
index 59a48bbdc2..f95daae275 100644
--- a/indra/newview/skins/default/xui/tr/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/tr/panel_group_roles.xml
@@ -77,6 +77,11 @@ Ctrl tuşuna basıp adlarına tıklayarak birden fazla Üye seçebilirsiniz.
</text>
<scroll_list name="member_allowed_actions" tool_tip="İzin verilen her bir yeteneğin ayrıntıları için yetenekler sekmesine bakın"/>
</panel>
+ <panel name="members_header">
+ <text_editor name="member_action_description">
+ Bu Yetenek &apos;Üyeleri bu Gruptan Çıkar&apos; özelliğidir. Bir Sahibi sadece başka bir Sahip çıkarabilir.
+ </text_editor>
+ </panel>
<panel name="roles_footer">
<text name="static">
Rol Adı
@@ -96,6 +101,11 @@ Ctrl tuşuna basıp adlarına tıklayarak birden fazla Üye seçebilirsiniz.
</text>
<scroll_list name="role_allowed_actions" tool_tip="İzin verilen her bir yeteneğin ayrıntıları için yetenekler sekmesine bakın"/>
</panel>
+ <panel name="roles_header">
+ <text_editor name="role_action_description">
+ Bu Yetenek &apos;Üyeleri bu Gruptan Çıkar&apos; özelliğidir. Bir Sahibi sadece başka bir Sahip çıkarabilir.
+ </text_editor>
+ </panel>
<panel name="actions_footer">
<text_editor name="action_description">
Bu Yetenek &apos;Bu Gruptan Üye Çıkarma&apos;dır. Bir Sahibi sadece başka bir Sahip çıkartabilir.
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
index 185d557567..f1ed78cd1e 100644
--- a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
@@ -3,7 +3,7 @@
<panel.string name="log_in_to_change">
değiştirmek için oturum açın
</panel.string>
- <button label="Geçmişi Temizle" name="clear_cache" tool_tip="Oturum açma görüntüsünü, son konumu, ışınlama geçmişini, web ve dokulama önbelleğini temizleyin."/>
+ <button label="Geçmişi Temizle" name="clear_cache" tool_tip="Oturum açma görüntüsünü, son konumu, ışınlama geçmişini, web ve doku önbelleğini temizleyin."/>
<text name="cache_size_label_l">
(Konumlar, görüntüler, web, arama geçmişi)
</text>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
index 91a7cb48b7..a20d0e5ff1 100644
--- a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
@@ -15,8 +15,8 @@
Web:
</text>
<radio_group name="preferred_browser_behavior">
- <radio_item label="Tüm bağlantılar için kendi tarayıcımı kullan (Chrome, Firefox, IE)" name="internal" tool_tip="Yardım, web bağlantıları vb. için sistemin varsayılan web tarayıcısını kullanın. Tam ekran çalıştırılıyorsa tavsiye edilmez." value="0"/>
- <radio_item label="Yerleşik tarayıcıyı yalnızca Second Life bağlantıları için kullan" name="external" tool_tip="Yardım, web bağlantıları vb. için sistemin varsayılan web tarayıcısını kullanın. Yerleşik tarayıcı yalnızca LindenLab/SecondLife bağlantıları için kullanılır." value="1"/>
+ <radio_item label="Tüm bağlantılar için sisteme ait varsayılan tarayıcıyı kullan" name="internal" tool_tip="Yardım, web bağlantıları vb. için sistemin varsayılan web tarayıcısını kullanın. Tam ekran çalıştırılıyorsa tavsiye edilmez." value="0"/>
+ <radio_item label="Yerleşik tarayıcıyı yalnızca Second Life bağlantıları için kullan" name="external" tool_tip="Yardım, web bağlantıları vb. için sisteme ait varsayılan web tarayıcıyı kullan Yerleşik tarayıcı yalnızca LindenLab/Second Life bağlantıları için kullanılır." value="1"/>
<radio_item label="Tüm bağlantılar için yerleşik tarayıcıyı kullan" name="external_all" tool_tip="Yardım, web bağlantıları vs. için dahili web tarayıcısını kullanın. Bu tarayıcı [APP_NAME] içerisinde yeni bir pencere olarak açılır." value="2"/>
</radio_group>
<check_box initial_value="true" label="Eklentileri etkinleştir" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/tr/panel_preferences_uploads.xml
index d60a11159d..163f85cfe3 100644
--- a/indra/newview/skins/default/xui/tr/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_uploads.xml
@@ -12,6 +12,9 @@
<text name="title_animation">
Animasyonlar
</text>
+ <text name="title_model">
+ Modeller
+ </text>
<text name="upload_help">
Bir hedef klasörü değiştirmek için, envanterde o klasöre sağ tıklayın ve şu öğeyi seçin:
&quot;Şunun için varsayılan olarak kullan:&quot;
diff --git a/indra/newview/skins/default/xui/tr/role_actions.xml b/indra/newview/skins/default/xui/tr/role_actions.xml
index c6cb7ea156..5e830bddd5 100644
--- a/indra/newview/skins/default/xui/tr/role_actions.xml
+++ b/indra/newview/skins/default/xui/tr/role_actions.xml
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Bu Yetenekler arasında gruba Üye ekleme ve çıkarma ile davetiye olmadan yeni Üyelerin katılmasına imkan tanıma yer alır." name="Membership">
- <action description="Kişileri Bu Gruba Davet Et" longdescription="Roller bölümü &gt; Üyeler sekmesindeki &quot;Davet Et&quot; düğmesini kullanarak Kişileri Bu Gruba davet et" name="member invite" value="1"/>
- <action description="Üyeleri Bu Gruptan Çıkar" longdescription="Roller bölümü &gt; Üyeler sekmesindeki &quot;Çıkar&quot; düğmesini kullanarak Üyeleri Bu Gruptan çıkar. Bir Sahip, başka bir Sahip dışında herkesi çıkartabilir. Eğer bir Sahip değilseniz, bir Üyenin bir gruptan çıkarılmasının tek yolu, Herkes Rolünde olmaları ve başka hiçbir Rolde OLMAMALARIDIR. Üyeleri Rollerden çıkarmak için, &quot;Üyeleri Rollerden Çıkar&quot; Yeteneğine sahip olmalısınız." name="member eject" value="2"/>
+ <action description="Kişileri Bu Gruba Davet Et" longdescription="Roller ve Üyeler bölümü &gt; Üyeler sekmesindeki &apos;Davet Et&apos; düğmesini kullanarak Kişileri Bu Gruba davet edin." name="member invite" value="1"/>
+ <action description="&apos;Herkes&apos; rolüne ait olan Üyeleri bu Gruptan çıkar" longdescription="Roller ve Üyeler bölümü &gt; Üyeler sekmesindeki &apos;Çıkar&apos; düğmesini kullanarak Üyeleri Bu Gruptan çıkarın. Bir Sahip, başka bir Sahip dışında herkesi çıkarabilir. Eğer bir Sahip değilseniz, bir Üye, sadece ve sadece, Herkes Rolündeyse ve başka HİÇBİR Rolde değilse bir gruptan çıkarılabilir. Üyeleri Rollerden çıkarmak için, &apos;Üyeleri Rollerden Çıkar&apos; Yeteneğine sahip olmanız gerekir." name="member eject" value="2"/>
<action description="Yasaklı listesini yönet" longdescription="Grup üyelerinin, grupta sakinleri yasaklamalarına / bu yasaklamaları kaldırmalarına izin verir" name="allow ban" value="51"/>
<action description="&quot;Katılıma Açık&quot; için Aç/Kapa yapın ve &quot;Kayıt Ücretini&quot; değiştirin" longdescription="Yeni üyelerin davetiye olmadan katılmasına imkan tanımak amacıyla &quot;Katılıma Açık&quot; için Aç/Kapa yapın ve Genel bölümünde &quot;Kayıt Ücretini&quot; değiştirin" name="member options" value="3"/>
</action_set>
<action_set description="Bu Yetenekler arasında grup Rolleri ekleme, kaldırma ve değiştirme; Rollere Üye ekleme ve kaldırma ile Rollere Yetenek atama imkanları yer alır." name="Roles">
- <action description="Yeni Roller Oluştur" longdescription="Roller bölümü &gt; Roller sekmesinde yeni Roller oluşturun." name="role create" value="4"/>
- <action description="Rolleri Silin" longdescription="Roller bölümü &gt; Roller sekmesinde Rolleri silin." name="role delete" value="5"/>
- <action description="Rol adlarını, başlıklarını, açıklamalarını ve Rol üyelerinin kamuyla paylaşılıp paylaşılmadığını değiştirin" longdescription="Rol adlarını, başlıklarını, açıklamalarını ve Rol üyelerinin kamuyla paylaşılıp paylaşılmadığını değiştirin. Bu işlem, bir Rol seçtikten sonra Roller bölümü &gt; Roller sekmesinin altında yapılır." name="role properties" value="6"/>
- <action description="Üyeleri Atayan Rollerine Atama" longdescription="Üyeleri Atanmış Roller listesindeki Rollere atayın (Roller bölümü &gt; Üyeler sekmesi). Bu Yeteneğe sahip bir Üye, sadece atayanın zaten olduğu bir Role Üye ekleyebilir." name="role assign member limited" value="7"/>
- <action description="Üyelere Herhangi bir Role Atama" longdescription="Üyeleri Atanmış Roller listesindeki Herhangi Bir Role atayın (Roller bölümü &gt; Üyeler sekmesi). *UYARI* Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisini -- ve başka herhangi bir Sahip olmayan Üyeyi -- şu anda sahip olduklarından daha fazla güce sahip olan Rollere atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="role assign member" value="8"/>
- <action description="Üyeleri Rollerden Çıkarma" longdescription="Üyeleri Atanmış Roller listesindeki Rollerden çıkartın (Roller bölümü &gt; Üyeler sekmesi). Sahipler çıkartılamaz." name="role remove member" value="9"/>
- <action description="Rollere Yetenek Atama ve Kaldırma" longdescription="İzin Verilen Yetenekler listesindeki her bir Rol için Rollere Yetenek Atayın ve Kaldırın ((Roller bölümü &gt; Üyeler sekmesi). *UYARI* Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisine -- ve diğer tüm Sahip olmayan Üyelere -- tüm Yetenekleri atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="role change actions" value="10"/>
+ <action description="Yeni Roller Oluştur" longdescription="Roller ve Üyeler bölümü &gt; Roller sekmesinde yeni Roller oluşturun." name="role create" value="4"/>
+ <action description="Rolleri Silin" longdescription="Roller ve Üyeler bölümü &gt; Roller sekmesinde Rolleri silin." name="role delete" value="5"/>
+ <action description="Rol adlarını, başlıklarını, açıklamalarını ve Rol üyelerinin kamuyla paylaşılıp paylaşılmadığını değiştirin" longdescription="Rol adlarını, başlıklarını, açıklamalarını ve Rol üyelerinin herkese açık şekilde gösterilip gösterilmeyeceğini değiştirin. Bu işlem, bir Rol seçtikten sonra Roller ve Üyeler bölümü &gt; Roller sekmesinin alt kısmında yapılır." name="role properties" value="6"/>
+ <action description="Üyeleri Atayan Rollerine Atama" longdescription="Üyeleri Atanmış Roller listesindeki Rollere atayın (Roller ve Üyeler bölümü &gt; Üyeler sekmesi). Bu Yeteneğe sahip bir Üye, sadece atayanın zaten bulunduğu bir Role Üyeler ekleyebilir." name="role assign member limited" value="7"/>
+ <action description="Üyelere Herhangi bir Role Atama" longdescription="Üyeleri Atanmış Roller listesindeki Herhangi Bir Role atayın (Roller ve Üyeler bölümü &gt; Üyeler sekmesi). *UYARI* Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisini -- ve başka herhangi bir Sahip olmayan Üyeyi -- şu anda sahip olduklarından daha fazla güce sahip olan Rollere atayabilir, potansiyel olarak kendilerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="role assign member" value="8"/>
+ <action description="Üyeleri Rollerden Çıkarma" longdescription="Üyeleri Atanmış Roller listesindeki Rollerden çıkarın (Roller ve Üyeler bölümü &gt; Üyeler sekmesi). Sahipler çıkarılamaz." name="role remove member" value="9"/>
+ <action description="Rollere Yetenek Atama ve Kaldırma" longdescription="İzin Verilen Yetenekler listesindeki her bir Role Yetenek Atayın ve Kaldırın (Roller ve Üyeler bölümü &gt; Roller sekmesi).*UYARI* Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisine -- ve diğer tüm Sahip olmayan Üyelere -- tüm Yetenekleri atayabilir, potansiyel olarak kendilerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="role change actions" value="10"/>
</action_set>
<action_set description="Bu Yetenekler arasında grubun kimliğini değiştirme imkanları bulunmaktadır: Örneğin bilgilerin kamuya açıklığı, grup bildirgesi ve işaretleri." name="Group Identity">
<action description="Grup Bildirgesini, İşaretlerini ve &quot;Aramada gösterilsin&quot; ayarını değiştirme" longdescription="Grup Bildirgesini, İşaretlerini ve &quot;Aramada gösterilsin&quot; ayarını değiştirin. Bu işlem Genel bölümde yapılır." name="group change identity" value="11"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml
index bbc16dd7e5..7d8160a0f0 100644
--- a/indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml
@@ -31,7 +31,7 @@
<text name="AvatarPhysicsDetailText">
</text>
- <text name="ShadersText">
+ <text name="HardwareText">
硬體
</text>
<slider label="材質記憶體(MB):" name="GraphicsCardTextureMemory" tool_tip="配置給材質使用的記憶體量。 預設為顯像卡記憶體。 降低此值可以提升效能,但材質也會變模糊。"/>
@@ -56,6 +56,9 @@
<text name="antialiasing restart">
(須重新啟動)
</text>
+ <text name="MeshText">
+ 網面
+ </text>
<slider label="地形網面細節:" name="TerrainMeshDetail"/>
<text name="TerrainMeshDetailText">
@@ -72,6 +75,9 @@
<text name="FlexibleMeshDetailText">
</text>
+ <text name="ShadersText">
+ 著色器
+ </text>
<check_box initial_value="true" label="清澈透明的水" name="TransparentWater"/>
<check_box initial_value="true" label="凹凸映射與光澤效果" name="BumpShiny"/>
<check_box initial_value="true" label="本地光線" name="LocalLights"/>
@@ -111,5 +117,6 @@
<button label="重設為我們建議的設定" name="Defaults"/>
<button label="確定" label_selected="確定" name="OK"/>
<button label="取消" label_selected="取消" name="Cancel"/>
- <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
+ <check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
+ <check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml
index 8af35457af..db2cfb6f7d 100644
--- a/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml
@@ -3,6 +3,7 @@
<menu_item_call label="解除封鎖" name="unblock"/>
<menu_item_check label="禁止語音" name="BlockVoice"/>
<menu_item_check label="禁止文字" name="MuteText"/>
+ <menu_item_check label="封鎖粒子效果" name="MuteParticles"/>
<menu_item_check label="禁止物件聲音" name="BlockObjectSounds"/>
<menu_item_call label="檔案..." name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
index 5949d068c3..c418ce72cc 100644
--- a/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -4295,7 +4295,7 @@ SHA1 指紋:[MD5_DIGEST]
發生內部錯誤,我們無法如常更新你的瀏覽器。 你瀏覽器顯示的 L$ 餘額或擁有地段,可能和伺服器上的正確數額不一致。
</notification>
<notification name="LargePrimAgentIntersect">
- 無法建立和其他參與者發生交截的大型幾何元件。 請等其他參與者移開後再試。
+ 無法建立和其他居民形成交截的大型幾何元件。 請等其他居民移開原地後再試。
</notification>
<notification name="PreferenceChatClearLog">
這動作將刪除先前交談的記錄,和所有記錄備份。
diff --git a/indra/newview/skins/default/xui/zh/panel_group_roles.xml b/indra/newview/skins/default/xui/zh/panel_group_roles.xml
index b4b32c204a..b63f79f956 100644
--- a/indra/newview/skins/default/xui/zh/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/zh/panel_group_roles.xml
@@ -79,6 +79,11 @@
</text>
<scroll_list name="member_allowed_actions" tool_tip="想瞭解每一項允許的能力的詳情請查閱能力頁籤。"/>
</panel>
+ <panel name="members_header">
+ <text_editor name="member_action_description">
+ 這個能力可以「將會員踢出本群組」。 必須具備所有人身分才能把另一位所有人踢出。
+ </text_editor>
+ </panel>
<panel name="roles_footer">
<text name="static">
角色名稱
@@ -98,6 +103,11 @@
</text>
<scroll_list name="role_allowed_actions" tool_tip="想瞭解每一項允許的能力的詳情請查閱能力頁籤。"/>
</panel>
+ <panel name="roles_header">
+ <text_editor name="role_action_description">
+ 這個能力可以「將會員踢出本群組」。 必須具備所有人身分才能把另一位所有人踢出。
+ </text_editor>
+ </panel>
<panel name="actions_footer">
<text_editor name="action_description">
這個能力可「將會員自本群組踢出」。 必須是所有人才可踢出另一位所有人。
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
index 64c0fd062e..6ef25ad96e 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
@@ -15,8 +15,8 @@
網頁:
</text>
<radio_group name="preferred_browser_behavior">
- <radio_item label="所有連結都用我的網頁瀏覽器(例如 Chrome、Firefox、IE)開啟" name="internal" tool_tip="使用系統預設的瀏覽器瀏覽幫助,開啟網頁。全螢幕模式下不建議這麼做。" value="0"/>
- <radio_item label="僅在開啟第二人生連結時使用內建瀏覽器" name="external" tool_tip="使用系統預設的瀏覽器瀏覽幫助,開啟網頁。僅在開啟 LindenLab/SecondLife 的連結時才會使用內建瀏覽器。" value="1"/>
+ <radio_item label="用內建瀏覽器開啟所有連結" name="internal" tool_tip="使用系統預設的瀏覽器瀏覽幫助,開啟網頁。全螢幕模式下不建議這麼做。" value="0"/>
+ <radio_item label="僅在開啟Second Life連結時使用內建瀏覽器" name="external" tool_tip="使用系統預設的瀏覽器瀏覽幫助,開啟網頁。僅在開啟「LindenLab/Second Life」的連結時才會使用內建瀏覽器。" value="1"/>
<radio_item label="用內建瀏覽器開啟所有連結" name="external_all" tool_tip="使用內建的瀏覽器瀏覽幫助,開啟網頁。該瀏覽器將透過 [APP_NAME] 開啟新視窗。" value="2"/>
</radio_group>
<check_box initial_value="true" label="啟用外掛" name="browser_plugins_enabled"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/zh/panel_preferences_uploads.xml
index b34b4109d8..9bb2f956d0 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_uploads.xml
@@ -12,6 +12,9 @@
<text name="title_animation">
動作
</text>
+ <text name="title_model">
+ 模型
+ </text>
<text name="upload_help">
要變更目的資料夾,請在收納區用滑鼠右鍵按一下新的資料夾並選擇
「用作預設值」
diff --git a/indra/newview/skins/default/xui/zh/role_actions.xml b/indra/newview/skins/default/xui/zh/role_actions.xml
index 0442325104..e3b0eb1261 100644
--- a/indra/newview/skins/default/xui/zh/role_actions.xml
+++ b/indra/newview/skins/default/xui/zh/role_actions.xml
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="這些能力包括新增或移除群組成員和允許新成員不受邀即可加入群組的等權力。" name="Membership">
- <action description="邀請他人加入這個群組" longdescription="欲邀請他人加入這個群組,請按下角色欄下的成員頁籤中的「邀請」按鈕。" name="member invite" value="1"/>
- <action description="將會員由這個群組中踢出" longdescription="欲將成員從群組踢出,請按下角色欄下的成員頁籤中的「踢出」按鈕。 所有人可踢出任何不具所有人角色的人。 如果你不是所有人,一位成員只在他僅屬於「任何人」角色且沒有其他角色的情況下被踢出群組。 欲卸除成員的角色,你必須有「卸除成員角色」的能力。" name="member eject" value="2"/>
+ <action description="邀請他人加入這個群組" longdescription="欲邀請他人加入這個群組,請按下「角色及成員」欄目下「成員」頁籤的「邀請」按鈕。" name="member invite" value="1"/>
+ <action description="把屬於「任何人」角色的成員踢出這個群組" longdescription="欲將成員從群組踢出,請按「角色及成員」欄下「成員」頁籤的「踢出」按鈕。 所有人可踢出任何不具所有人角色的人。 如果你不是所有人,一位成員只在他僅屬於「任何人」角色且沒有其他角色的情況下被踢出群組。 欲卸除成員的角色,你必須有「卸除成員角色」的能力。" name="member eject" value="2"/>
<action description="管理禁入清單" longdescription="允許群組成員控制是否禁止或重新允許居民加入這個群組。" name="allow ban" value="51"/>
<action description="切換「免費自由加入」設定,更改「加入費」。" longdescription="切換「免費自由加入」設定,讓成員不受邀也可加入,並在基本設定欄更改「加入費」。" name="member options" value="3"/>
</action_set>
<action_set description="這些能力包括新增、移除、更改群組角色,新增或移除成員的角色,和為角色設定能力等權力。" name="Roles">
- <action description="創立一個新角色" longdescription="到角色欄的角色頁籤,可以建立新角色。" name="role create" value="4"/>
- <action description="刪除角色" longdescription="到角色欄的角色頁籤,可以刪除角色。" name="role delete" value="5"/>
- <action description="變更角色名稱、頭銜、描述,設定角色的成員名單是否公開" longdescription="變更角色名稱、頭銜、描述,設定角色的成員名單是否公開。 選取一個角色後,可到角色欄底下的角色頁籤完成這動作。" name="role properties" value="6"/>
- <action description="賦予成員「指派者」角色" longdescription="從已知的指派角色中選擇若干,賦予給成員(角色欄 &gt; 成員頁籤)。 有這能力的成員,只能把他自己已身負的角色賦予給別的成員。" name="role assign member limited" value="7"/>
- <action description="賦予成員「任何人」角色" longdescription="從已知的指派角色中,賦予給成員「任何人」角色(角色欄 &gt; 成員頁籤)。 *警告* 任何身負具這能力的角色的成員,都可以把某些角色賦予自己或任何不是所有人的成員,因此使自己或別人得到比現在更多的權力,最終可能擁有近似「所有人」的權力。 賦予這項能力之前,敬請慎重考慮。" name="role assign member" value="8"/>
- <action description="由角色中移除成員" longdescription="從已知的指派角色中選擇,將成員卸除該角色(角色欄 &gt; 成員頁籤)。 所有人角色不得被卸除。" name="role remove member" value="9"/>
- <action description="設定或卸除角色能力" longdescription="從允許的能力清單中選擇,為每一角色設定或卸除該能力(角色欄 &gt; 角色頁籤)。 *警告* 任何身負具有這能力的角色的成員,都可以將所有能力賦予自己和任何其他不是所有人的人,因此讓自己或他人提升為近似「所有人」權力的層級。 賦予這項能力之前,敬請慎重考慮。" name="role change actions" value="10"/>
+ <action description="創立一個新角色" longdescription="到「角色及成員」欄的「角色」頁籤,可以建立新角色。" name="role create" value="4"/>
+ <action description="刪除角色" longdescription="到「角色及成員」欄的「角色」頁籤,可以刪除角色。" name="role delete" value="5"/>
+ <action description="變更角色名稱、頭銜、描述,設定角色的成員名單是否公開" longdescription="變更角色名稱、頭銜、描述,設定角色的成員名單是否公開。 選取一個角色後,可到「角色及成員」欄底下的「角色」頁籤完成這動作。" name="role properties" value="6"/>
+ <action description="賦予成員「指派者」角色" longdescription="從已知的指派角色中選擇若干,賦予給成員(「角色及成員」欄 &gt; 「成員」頁籤)。 有這能力的成員,只能把他自己已身負的角色賦予給別的成員。" name="role assign member limited" value="7"/>
+ <action description="賦予成員「任何人」角色" longdescription="從已知的指派角色中,賦予給成員「任何人」角色(「角色及成員」欄 &gt; 「成員」頁籤)。 *警告* 任何身負具這能力的角色的成員,都可以把某些角色賦予自己或任何不是所有人的成員,因此使自己或別人得到比現在更多的權力,最終可能擁有近似「所有人」的權力。 賦予這項能力之前,敬請慎重考慮。" name="role assign member" value="8"/>
+ <action description="由角色中移除成員" longdescription="從已知的指派角色中選擇,將成員卸除該角色(「角色及成員」欄 &gt; 「成員」頁籤)。 所有人不得被卸除。" name="role remove member" value="9"/>
+ <action description="設定或卸除角色能力" longdescription="從允許的能力清單中選擇,為每一角色設定或卸除該能力(「角色及成員」欄 &gt; 「角色」頁籤)。 *警告* 任何身負具有這能力的角色的成員,都可以將所有能力賦予自己和任何其他不是所有人的人,因此讓自己或他人提升為近似「所有人」權力的層級。 賦予這項能力之前,敬請慎重考慮。" name="role change actions" value="10"/>
</action_set>
<action_set description="這些能力包括有權修改群組身份,例如更改公開程度、規章和徽章。" name="Group Identity">
<action description="更改規章、徽章,設定是否「顯示於搜尋結果」。" longdescription="更改規章、徽章,設定是否「顯示於搜尋結果」。 這可在「基本資料」欄設定。" name="group change identity" value="11"/>
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index 3dd327591e..d1dddf8e7e 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -236,7 +236,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page",
LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
- std::string("http://viewer-login.agni.lindenlab.com/"));
+ std::string("https://viewer-splash.secondlife.com/"));
ensure("Agni is a system grid",
LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com"));
@@ -261,7 +261,7 @@ namespace tut
std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
ensure_equals("Aditi login page",
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
- std::string("http://viewer-login.agni.lindenlab.com/"));
+ std::string("https://viewer-splash.secondlife.com/"));
ensure("Aditi is a system grid",
LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com"));
}
@@ -309,7 +309,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page",
LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
- std::string("http://viewer-login.agni.lindenlab.com/"));
+ std::string("https://viewer-splash.secondlife.com/"));
ensure("Agni is a system grid",
LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com"));
@@ -333,7 +333,7 @@ namespace tut
std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
ensure_equals("Aditi login page",
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
- std::string("http://viewer-login.agni.lindenlab.com/"));
+ std::string("https://viewer-splash.secondlife.com/"));
ensure("Aditi is a system grid",
LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com"));
@@ -422,7 +422,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("getLoginPage",
LLGridManager::getInstance()->getLoginPage(),
- std::string("http://viewer-login.agni.lindenlab.com/"));
+ std::string("https://viewer-splash.secondlife.com/"));
ensure_equals("update url base for Agni", // relies on agni being the default
std::string("https://update.secondlife.com/update"),
LLGridManager::getInstance()->getUpdateServiceURL());