diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000000..6d296d7a24
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,17 @@
+repos:
+ - repo: https://bitbucket.org/lindenlab/git-hooks.git
+ rev: v1.0.0-beta2
+ hooks:
+ - id: opensource-license
+ - id: jira-issue
+ - id: llsd
+ - id: no-trigraphs
+ - id: copyright
+ - id: end-of-file
+ files: \.(cpp|c|h|py|glsl|cmake|txt)$
+ exclude: language.txt
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v2.5.0
+ hooks:
+ - id: check-xml
+ - id: mixed-line-ending
diff --git a/autobuild.xml b/autobuild.xml
index f04fa20031..ee9eb4f8f4 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -76,9 +76,9 @@
archivenamelinux
@@ -954,11 +954,11 @@
archivenamedarwin
@@ -968,11 +968,11 @@
archivenamelinux64
@@ -982,11 +982,11 @@
archivenamewindows
@@ -996,18 +996,18 @@
archivenamewindows64version
- 2.02.05
+ 2.02.06fontconfigversion
- 202201010217.567162
+ 202202010217.567974llphysicsextensions_source
@@ -2774,9 +2774,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archivehash
- 05c4debd4cccfea620fc7e6f9a190924
+ f5f4bc956734e53ef99125ae9aae3a87url
- http://3p.firestormviewer.org/slvoice-3.2.0002.10426.302004-linux64-212691952.tar.bz2
+ http://3p.firestormviewer.org/slvoice-3.2-linux64_bionic-220651719.tar.bz2namelinux64
@@ -2988,9 +2988,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archivehash
- 33ed1bb3e24fbd3462da04fb3e917e94
+ 1dda5fb3bb649b0ab5a93f22df7cb11eurl
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/94814/850320/viewer_manager-3.0.568552-darwin64-568552.tar.bz2
+ https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/96998/862110/viewer_manager-3.0.569958-darwin64-569958.tar.bz2namedarwin64
@@ -3012,9 +3012,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archivehash
- 2ad8e04965ac8bddb7d351abe09bee07
+ 30d1386d0a6883d898fc56757a789b8burl
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/94813/850316/viewer_manager-3.0.568552-windows-568552.tar.bz2
+ https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/97002/862130/viewer_manager-3.0.569958-windows-569958.tar.bz2namewindows
@@ -3025,7 +3025,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
source_typehgversion
- 3.0.568552
+ 3.0.569958vlc-bin
@@ -3077,7 +3077,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
version
- 2.2.8.538966
+ 3.0.16.565299xmlrpc-epi
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index 76a9e6b981..803cb4f5f0 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -4,7 +4,7 @@
# other commands to guarantee full compatibility
# with the version specified
## 3.8 added VS_DEBUGGER_WORKING_DIRECTORY support
-cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR)
set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING
"The root project/makefile/solution name. Defaults to SecondLife.")
@@ -28,9 +28,9 @@ endif (NOT CMAKE_BUILD_TYPE)
#
option(OPENSIM "OpenSim support" OFF)
if (OPENSIM)
- add_definitions(-DOPENSIM=1)
+ add_compile_definitions(OPENSIM)
if (SINGLEGRID)
- add_definitions(-DSINGLEGRID=1 -DSINGLEGRID_URI=\"${SINGLEGRID_URI}\")
+ add_compile_definitions(SINGLEGRID SINGLEGRID_URI=\"${SINGLEGRID_URI}\")
message(STATUS "Compiling with OpenSim support - Single Grid version (${SINGLEGRID_URI})")
else (SINGLEGRID)
message(STATUS "Compiling with OpenSim support")
@@ -43,7 +43,7 @@ else (OPENSIM)
endif (OPENSIM)
if (HAVOK_TPV)
- add_definitions(-DHAVOK_TPV=1)
+ add_compile_definitions(HAVOK_TPV)
message(STATUS "Compiling with Havok libraries")
endif (HAVOK_TPV)
#
@@ -51,7 +51,7 @@ endif (HAVOK_TPV)
# Support for test builds
option(TESTBUILD "Generating test build" OFF)
if(TESTBUILD AND TESTBUILDPERIOD)
- add_definitions(-DTESTBUILD=1 -DTESTBUILDPERIOD=${TESTBUILDPERIOD})
+ add_compile_definitions(TESTBUILD TESTBUILDPERIOD=${TESTBUILDPERIOD})
message(STATUS "Creating test build version; test period: ${TESTBUILDPERIOD} days")
endif(TESTBUILD AND TESTBUILDPERIOD)
#
@@ -63,11 +63,11 @@ if (USE_AVX_OPTIMIZATION)
if (USE_AVX2_OPTIMIZATION)
message(FATAL_ERROR "You cannot use AVX and AVX2 at the same time!")
else (USE_AVX2_OPTIMIZATION)
- add_definitions(-DUSE_AVX_OPTIMIZATION=1)
+ add_compile_definitions(USE_AVX_OPTIMIZATION)
message(STATUS "Compiling with AVX optimizations")
endif (USE_AVX2_OPTIMIZATION)
elseif (USE_AVX2_OPTIMIZATION)
- add_definitions(-DUSE_AVX2_OPTIMIZATION=1)
+ add_compile_definitions(USE_AVX2_OPTIMIZATION)
message(STATUS "Compiling with AVX2 optimizations")
else (USE_AVX_OPTIMIZATION)
message(STATUS "Compiling without AVX optimizations")
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 519f68b53e..34a7c3f18d 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -223,7 +223,7 @@ elseif(LINUX)
set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}")
set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}")
- set(vivox_lib_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
+ set(vivox_lib_dir "${ARCH_PREBUILT_DIRS_RELEASE}/../../lib32/")
set(vivox_libs
libsndfile.so.1
libortp.so
@@ -255,6 +255,8 @@ elseif(LINUX)
libuuid.so.16.0.22
libfontconfig.so.1.8.0
libfontconfig.so.1
+ libaprutil-1.so.0
+ libapr-1.so.0
)
else (NOT USESYSTEMLIBS)
set(release_files
diff --git a/indra/cmake/bugsplat.cmake b/indra/cmake/bugsplat.cmake
index ce61b51b9b..0f5f283f6b 100644
--- a/indra/cmake/bugsplat.cmake
+++ b/indra/cmake/bugsplat.cmake
@@ -36,9 +36,7 @@ if (USE_BUGSPLAT)
if( LINUX )
set(BUGSPLAT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/breakpad)
- # Sadly we cannot have the nice things yet and need add_definitions for older cmake
- #add_compile_definitions(__STDC_FORMAT_MACROS)
- add_definitions(-D__STDC_FORMAT_MACROS)
+ add_compile_definitions(__STDC_FORMAT_MACROS)
else()
set(BUGSPLAT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/bugsplat)
endif()
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index d6f2913701..905dd5a7df 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -1533,6 +1533,15 @@ bool LLAudioSource::setupChannel()
return true;
}
+void LLAudioSource::stop()
+{
+ play(LLUUID::null);
+ if (mCurrentDatap)
+ {
+ // always reset data if something wants us to stop
+ mCurrentDatap = nullptr;
+ }
+}
bool LLAudioSource::play(const LLUUID &audio_uuid)
{
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 661707b209..ccd408576d 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -351,7 +351,13 @@ public:
LLAudioBuffer *getCurrentBuffer();
bool setupChannel();
- bool play(const LLUUID &audio_id); // Start the audio source playing
+
+ // Stop the audio source, reset audio id even if muted
+ void stop();
+
+ // Start the audio source playing,
+ // takes mute into account to preserve previous id if nessesary
+ bool play(const LLUUID &audio_id);
bool hasPendingPreloads() const; // Has preloads that haven't been done yet
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index c00df59756..5a7174ac9a 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -46,7 +46,6 @@
#include "llstl.h" // for DeletePointer()
#include "llstring.h"
#include "lleventtimer.h"
-
#include "stringize.h"
#include "llcleanup.h"
#include "llevents.h"
diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index 2042051dd9..6e1236982a 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -248,14 +248,25 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl
// protected_fixedsize_stack sets a guard page past the end of the new
// stack so that stack underflow will result in an access violation
// instead of weird, subtle, possibly undiagnosed memory stomps.
- boost::fibers::fiber newCoro(boost::fibers::launch::dispatch,
- std::allocator_arg,
- boost::fibers::protected_fixedsize_stack(mStackSize),
- [this, &name, &callable](){ toplevel(name, callable); });
- // You have two choices with a fiber instance: you can join() it or you
- // can detach() it. If you try to destroy the instance before doing
- // either, the program silently terminates. We don't need this handle.
- newCoro.detach();
+
+ try
+ {
+ boost::fibers::fiber newCoro(boost::fibers::launch::dispatch,
+ std::allocator_arg,
+ boost::fibers::protected_fixedsize_stack(mStackSize),
+ [this, &name, &callable]() { toplevel(name, callable); });
+
+ // You have two choices with a fiber instance: you can join() it or you
+ // can detach() it. If you try to destroy the instance before doing
+ // either, the program silently terminates. We don't need this handle.
+ newCoro.detach();
+ }
+ catch (std::bad_alloc&)
+ {
+ // Out of memory on stack allocation?
+ LL_ERRS("LLCoros") << "Bad memory allocation in LLCoros::launch(" << prefix << ")!" << LL_ENDL;
+ }
+
return name;
}
diff --git a/indra/llcommon/lleventcoro.cpp b/indra/llcommon/lleventcoro.cpp
index 995356dc52..067b5e6fbc 100644
--- a/indra/llcommon/lleventcoro.cpp
+++ b/indra/llcommon/lleventcoro.cpp
@@ -101,7 +101,7 @@ void storeToLLSDPath(LLSD& dest, const LLSD& path, const LLSD& value)
}
// Drill down to where we should store 'value'.
- llsd::drill(dest, path) = value;
+ llsd::drill_ref(dest, path) = value;
}
} // anonymous
diff --git a/indra/llcommon/llsdutil.cpp b/indra/llcommon/llsdutil.cpp
index a1ee1cb7ba..1a43e3675d 100644
--- a/indra/llcommon/llsdutil.cpp
+++ b/indra/llcommon/llsdutil.cpp
@@ -29,6 +29,7 @@
#include "linden_common.h"
#include "llsdutil.h"
+#include
#if LL_WINDOWS
# define WIN32_LEAN_AND_MEAN
@@ -868,7 +869,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs, int bits)
namespace llsd
{
-LLSD& drill(LLSD& blob, const LLSD& rawPath)
+LLSD& drill_ref(LLSD& blob, const LLSD& rawPath)
{
// Treat rawPath uniformly as an array. If it's not already an array,
// store it as the only entry in one. (But let's say Undefined means an
@@ -923,9 +924,9 @@ LLSD& drill(LLSD& blob, const LLSD& rawPath)
LLSD drill(const LLSD& blob, const LLSD& path)
{
- // non-const drill() does exactly what we want. Temporarily cast away
+ // drill_ref() does exactly what we want. Temporarily cast away
// const-ness and use that.
- return drill(const_cast(blob), path);
+ return drill_ref(const_cast(blob), path);
}
} // namespace llsd
diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h
index 8678ca97f2..1321615805 100644
--- a/indra/llcommon/llsdutil.h
+++ b/indra/llcommon/llsdutil.h
@@ -184,10 +184,10 @@ namespace llsd
* - Anything else is an error.
*
* By implication, if path.isUndefined() or otherwise equivalent to an empty
- * LLSD::Array, drill() returns 'blob' as is.
+ * LLSD::Array, drill[_ref]() returns 'blob' as is.
*/
LLSD drill(const LLSD& blob, const LLSD& path);
-LLSD& drill( LLSD& blob, const LLSD& path);
+LLSD& drill_ref( LLSD& blob, const LLSD& path);
}
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index d694d96d2f..c529ce6052 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -202,18 +202,6 @@ LLOSInfo::LLOSInfo() :
GetSystemInfo(&si); //if it fails get regular system info
//(Warning: If GetSystemInfo it may result in incorrect information in a WOW64 machine, if the kernel fails to load)
- //msdn microsoft finds 32 bit and 64 bit flavors this way..
- //http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx (example code that contains quite a few more flavors
- //of windows than this code does (in case it is needed for the future)
- if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) //check for 64 bit
- {
- mOSStringSimple += "64-bit ";
- }
- else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
- {
- mOSStringSimple += "32-bit ";
- }
-
// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
OSVERSIONINFOEX osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
@@ -261,12 +249,24 @@ LLOSInfo::LLOSInfo() :
// and likely to return 'compatibility' string.
// Check presence of dlls/libs or may be their version.
// Windows 11 detection
- //mOSStringSimple = "Microsoft Windows 10/11";
+ //mOSStringSimple = "Microsoft Windows 10/11 ";
mMajorVer = 11;
LLStringUtil::replaceString(mOSStringSimple, "10", "11");
//
}
- }
+ }
+
+ //msdn microsoft finds 32 bit and 64 bit flavors this way..
+ //http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx (example code that contains quite a few more flavors
+ //of windows than this code does (in case it is needed for the future)
+ if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) //check for 64 bit
+ {
+ mOSStringSimple += "64-bit ";
+ }
+ else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
+ {
+ mOSStringSimple += "32-bit ";
+ }
mOSString = mOSStringSimple;
if (mBuild > 0)
diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp
index 148c18aabe..d4ca7bce65 100644
--- a/indra/llcommon/tests/llerror_test.cpp
+++ b/indra/llcommon/tests/llerror_test.cpp
@@ -61,6 +61,9 @@ namespace
{
#ifdef __clang__
# pragma clang diagnostic ignored "-Wunused-function"
+#endif
+#if __GNUC__
+#pragma GCC diagnostic ignored "-Wunused-function"
#endif
void test_that_error_h_includes_enough_things_to_compile_a_message()
{
diff --git a/indra/llcommon/tests/lleventcoro_test.cpp b/indra/llcommon/tests/lleventcoro_test.cpp
index ccc4d82b34..4a1d4b8ba9 100644
--- a/indra/llcommon/tests/lleventcoro_test.cpp
+++ b/indra/llcommon/tests/lleventcoro_test.cpp
@@ -216,6 +216,7 @@ namespace tut
}
void test_data::postAndWait1()
+ {
BEGIN
{
mSync.bump();
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index a613ef0c59..e0aa3f4297 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -5838,7 +5838,16 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
resizeIndices(grid_size*grid_size*6);
if (!volume->isMeshAssetLoaded())
{
- mEdge.resize(grid_size*grid_size * 6);
+ S32 size = grid_size * grid_size * 6;
+ try
+ {
+ mEdge.resize(size);
+ }
+ catch (std::bad_alloc&)
+ {
+ LL_WARNS("LLVOLUME") << "Resize of mEdge to " << size << " failed" << LL_ENDL;
+ return false;
+ }
}
U16* out = mIndices;
@@ -6647,7 +6656,15 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
if (!volume->isMeshAssetLoaded())
{
- mEdge.resize(num_indices);
+ try
+ {
+ mEdge.resize(num_indices);
+ }
+ catch (std::bad_alloc&)
+ {
+ LL_WARNS("LLVOLUME") << "Resize of mEdge to " << num_indices << " failed" << LL_ENDL;
+ return false;
+ }
}
}
@@ -6875,7 +6892,15 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
LLVector4a* norm = mNormals;
static LLAlignedArray triangle_normals;
- triangle_normals.resize(count);
+ try
+ {
+ triangle_normals.resize(count);
+ }
+ catch (std::bad_alloc&)
+ {
+ LL_WARNS("LLVOLUME") << "Resize of triangle_normals to " << count << " failed" << LL_ENDL;
+ return false;
+ }
LLVector4a* output = triangle_normals.mArray;
LLVector4a* end_output = output+count;
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 66f8fc96dd..b72d006608 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -178,6 +178,14 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mTripleClickTimer.reset();
setText(p.default_text());
+ if (p.initial_value.isProvided()
+ && !p.control_name.isProvided())
+ {
+ // Initial value often is descriptive, like "Type some ID here"
+ // and can be longer than size limitation, ignore size
+ setText(p.initial_value.getValue().asString(), false);
+ }
+
// Initialize current history line iterator
mCurrentHistoryLine = mLineHistory.begin();
@@ -406,6 +414,11 @@ void LLLineEditor::updateTextPadding()
void LLLineEditor::setText(const LLStringExplicit &new_text)
+{
+ setText(new_text, true);
+}
+
+void LLLineEditor::setText(const LLStringExplicit &new_text, bool use_size_limit)
{
// If new text is identical, don't copy and don't move insertion point
if (mText.getString() == new_text)
@@ -424,13 +437,13 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
all_selected = all_selected || (len == 0 && hasFocus() && mSelectAllonFocusReceived);
std::string truncated_utf8 = new_text;
- if (truncated_utf8.size() > (U32)mMaxLengthBytes)
+ if (use_size_limit && truncated_utf8.size() > (U32)mMaxLengthBytes)
{
truncated_utf8 = utf8str_truncate(new_text, mMaxLengthBytes);
}
mText.assign(truncated_utf8);
- if (mMaxLengthChars)
+ if (use_size_limit && mMaxLengthChars)
{
mText.assign(utf8str_symbol_truncate(truncated_utf8, mMaxLengthChars));
}
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index ff536840d2..2387cc1478 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -337,6 +337,8 @@ private:
virtual S32 getPreeditFontSize() const;
virtual LLWString getPreeditString() const { return getWText(); }
+ void setText(const LLStringExplicit &new_text, bool use_size_limit);
+
void setContextMenu(LLContextMenu* new_context_menu);
protected:
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 65ea6b3c71..33a5bfd259 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -2404,6 +2404,16 @@ void LLMenuGL::arrange( void )
(*item_iter)->setRect( rect );
}
}
+
+
+ if (getTornOff())
+ {
+ LLTearOffMenu * torn_off_menu = dynamic_cast(getParent());
+ if (torn_off_menu)
+ {
+ torn_off_menu->updateSize();
+ }
+ }
}
if (mKeepFixedSize)
{
@@ -3930,7 +3940,8 @@ void LLMenuHolderGL::setActivatedItem(LLMenuItemGL* item)
/// Class LLTearOffMenu
///============================================================================
LLTearOffMenu::LLTearOffMenu(LLMenuGL* menup) :
- LLFloater(LLSD())
+ LLFloater(LLSD()),
+ mQuitRequested(false)
{
S32 floater_header_size = getHeaderHeight();
@@ -3945,7 +3956,7 @@ LLTearOffMenu::LLTearOffMenu(LLMenuGL* menup) :
LLRect rect;
menup->localRectToOtherView(LLRect(-1, menup->getRect().getHeight(), menup->getRect().getWidth() + 3, 0), &rect, gFloaterView);
// make sure this floater is big enough for menu
- mTargetHeight = (F32)(rect.getHeight() + floater_header_size);
+ mTargetHeight = rect.getHeight() + floater_header_size;
reshape(rect.getWidth(), rect.getHeight());
setRect(rect);
@@ -3977,19 +3988,24 @@ LLTearOffMenu::~LLTearOffMenu()
void LLTearOffMenu::draw()
{
mMenu->setBackgroundVisible(isBackgroundOpaque());
- mMenu->needsArrange();
if (getRect().getHeight() != mTargetHeight)
{
// animate towards target height
- reshape(getRect().getWidth(), llceil(lerp((F32)getRect().getHeight(), mTargetHeight, LLSmoothInterpolation::getInterpolant(0.05f))));
+ reshape(getRect().getWidth(), llceil(lerp((F32)getRect().getHeight(), (F32)mTargetHeight, LLSmoothInterpolation::getInterpolant(0.05f))));
+ mMenu->needsArrange();
}
LLFloater::draw();
}
void LLTearOffMenu::onFocusReceived()
{
- // if nothing is highlighted, just highlight first item
+ if (mQuitRequested)
+ {
+ return;
+ }
+
+ // if nothing is highlighted, just highlight first item
if (!mMenu->getHighlightedItem())
{
mMenu->highlightNextItem(NULL);
@@ -4065,6 +4081,31 @@ LLTearOffMenu* LLTearOffMenu::create(LLMenuGL* menup)
return tearoffp;
}
+void LLTearOffMenu::updateSize()
+{
+ if (mMenu)
+ {
+ S32 floater_header_size = getHeaderHeight();
+ const LLRect &floater_rect = getRect();
+ LLRect new_rect;
+ mMenu->localRectToOtherView(LLRect(-1, mMenu->getRect().getHeight() + floater_header_size, mMenu->getRect().getWidth() + 3, 0), &new_rect, gFloaterView);
+
+ if (floater_rect.getWidth() != new_rect.getWidth()
+ || mTargetHeight != new_rect.getHeight())
+ {
+ // make sure this floater is big enough for menu
+ mTargetHeight = new_rect.getHeight();
+ reshape(new_rect.getWidth(), mTargetHeight);
+
+ // Restore menu position
+ LLRect menu_rect = mMenu->getRect();
+ menu_rect.setOriginAndSize(1, 1,
+ menu_rect.getWidth(), menu_rect.getHeight());
+ mMenu->setRect(menu_rect);
+ }
+ }
+}
+
void LLTearOffMenu::closeTearOff()
{
removeChild(mMenu);
@@ -4075,6 +4116,7 @@ void LLTearOffMenu::closeTearOff()
mMenu->setVisible(FALSE);
mMenu->setTornOff(FALSE);
mMenu->setDropShadowed(TRUE);
+ mQuitRequested = true;
}
LLContextMenuBranch::LLContextMenuBranch(const LLContextMenuBranch::Params& p)
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 9f7ea44aff..73600f01f3 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -885,6 +885,8 @@ public:
virtual BOOL handleKeyHere(KEY key, MASK mask);
virtual void translate(S32 x, S32 y);
+ void updateSize();
+
private:
LLTearOffMenu(LLMenuGL* menup);
@@ -892,7 +894,8 @@ private:
LLView* mOldParent;
LLMenuGL* mMenu;
- F32 mTargetHeight;
+ S32 mTargetHeight;
+ bool mQuitRequested;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 27fe2cea59..405544ede6 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -1165,6 +1165,24 @@ std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const
return LLUrlEntryBase::getLocation(url);
}
+//
+// LLUrlEntryChat Describes a Second Life chat Url, e.g.,
+// secondlife:///app/chat/42/This%20Is%20a%20test
+//
+
+LLUrlEntryChat::LLUrlEntryChat()
+{
+ mPattern = boost::regex("secondlife:///app/chat/\\d+/\\S+",
+ boost::regex::perl|boost::regex::icase);
+ mMenuName = "menu_url_slapp.xml";
+ mTooltip = LLTrans::getString("TooltipSLAPP");
+}
+
+std::string LLUrlEntryChat::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+ return unescapeUrl(url);
+}
+
// LLUrlEntryParcel statics.
LLUUID LLUrlEntryParcel::sAgentID(LLUUID::null);
LLUUID LLUrlEntryParcel::sSessionID(LLUUID::null);
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index 9b41618413..cfdab0c64c 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -418,6 +418,17 @@ public:
private:
};
+//
+// LLUrlEntryChat Describes a Second Life chat Url, e.g.,
+// secondlife:///app/chat/42/This%20Is%20a%20test
+//
+class LLUrlEntryChat : public LLUrlEntryBase
+{
+public:
+ LLUrlEntryChat();
+ /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+};
+
///
/// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
/// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index d8c1541a6c..8d18780737 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -75,6 +75,7 @@ LLUrlRegistry::LLUrlRegistry()
// LLUrlEntryAgent*Name must appear before LLUrlEntryAgent since
// LLUrlEntryAgent is a less specific (catchall for agent urls)
registerUrl(new LLUrlEntryAgent());
+ registerUrl(new LLUrlEntryChat());
registerUrl(new LLUrlEntryGroup());
registerUrl(new LLUrlEntryParcel());
registerUrl(new LLUrlEntryTeleport());
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index e0cd0bfb46..f3ba4cc6d4 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -325,10 +325,9 @@ void LLWindowSDL::initialiseX11Clipboard()
XA_CLIPBOARD = XInternAtom(mSDL_Display, "CLIPBOARD", False);
- gSupportedAtoms[0] = XA_STRING;
-
+ gSupportedAtoms[0] = XInternAtom(mSDL_Display, "UTF8_STRING", False);
gSupportedAtoms[1] = XInternAtom(mSDL_Display, "COMPOUND_TEXT", False);
- gSupportedAtoms[2] = XInternAtom(mSDL_Display, "UTF8_STRING", False);
+ gSupportedAtoms[2] = XA_STRING;
// TARGETS atom
XA_TARGETS = XInternAtom(mSDL_Display, "TARGETS", False);
@@ -359,7 +358,7 @@ bool LLWindowSDL::getSelectionText( Atom aSelection, Atom aType, LLWString &text
&remaining, &data);
if (data && len)
{
- text = LLWString(
+ text = LLWString(
utf8str_to_wstring(reinterpret_cast< char const *>( data ) )
);
XFree(data);
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 005d5e25ac..89c9473b58 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -4334,7 +4334,8 @@ BOOL LLWindowWin32::handleImeRequests(WPARAM request, LPARAM param, LRESULT *res
S32 context_offset;
LLWString context = find_context(wtext, preedit, preedit_length, &context_offset);
preedit -= context_offset;
- if (preedit_length)
+ preedit_length = llmin(preedit_length, (S32)context.length() - preedit);
+ if (preedit_length && preedit >= 0)
{
// IMR_DOCUMENTFEED may be called when we have an active preedit.
// We should pass the context string *excluding* the preedit string.
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index cc8aea0fd1..2a89564715 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -2375,9 +2375,7 @@ if (WINDOWS)
add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
- add_dependencies(${VIEWER_BINARY_NAME}
- SLPlugin
- )
+ add_dependencies(${VIEWER_BINARY_NAME} SLPlugin)
# sets the 'working directory' for debugging from visual studio.
# Condition for version can be moved to requirements once build agents will be updated (see TOOL-3865)
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 54358db763..cc81d718c3 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.5.4
+6.5.5
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index f9fcc3fc28..0bea094843 100644
--- a/indra/newview/app_settings/cmd_line.xml
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -238,14 +238,6 @@
map-toNoAudio
-
-
- noinvlib
-
- desc
- Do not request the inventory library.
- map-to
- NoInventoryLibrarynonotifications
diff --git a/indra/newview/app_settings/key_bindings.xml b/indra/newview/app_settings/key_bindings.xml
index f3eb303b16..1d6ec5a01a 100644
--- a/indra/newview/app_settings/key_bindings.xml
+++ b/indra/newview/app_settings/key_bindings.xml
@@ -1,5 +1,5 @@
-
+
@@ -17,22 +17,13 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -60,19 +51,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -88,15 +66,6 @@
-
-
-
-
-
-
-
-
-
@@ -104,9 +73,6 @@
-
-
-
@@ -118,14 +84,10 @@
-
-
-
-
-
-
-
+
+
+
@@ -167,16 +129,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -192,15 +144,6 @@
-
-
-
-
-
-
-
-
-
@@ -212,17 +155,12 @@
-
-
-
-
-
-
-
+
+
@@ -240,15 +178,9 @@
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 7f519c03f5..a946bfaeb9 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6940,11 +6940,11 @@
TypeStringValue
- https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&sid=[SESSION_ID]
+ https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&r=[MATURITY]&lang=[LANGUAGE]&sid=[SESSION_ID]Backup0GuidebookURL
@@ -8267,19 +8267,6 @@
Value0
- LoginAsGod
-
- Comment
- Attempt to login with god powers (Linden accounts only)
- Persist
- 1
- Type
- Boolean
- Value
- 0
- Backup
- 0
- LoginLocationComment
@@ -9711,6 +9698,17 @@
Value1000
+ FakeInitialOutfitName
+
+ Comment
+ Pretend that this is first time login and specified name was chosen
+ Persist
+ 1
+ Type
+ String
+ Value
+
+ NearMeRangeComment
@@ -9808,7 +9806,7 @@
NoInventoryLibraryComment
- Do not request inventory library.
+ (Deprecated) Do not request inventory library.Persist0Type
diff --git a/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt b/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt
index 11e5ee0ce5..9103d4faf3 100644
--- a/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt
+++ b/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt
@@ -7,7 +7,7 @@
//
// Bridge platform
- string BRIDGE_VERSION = "2.27"; // This should match fslslbridge.cpp
+ string BRIDGE_VERSION = "2.28"; // This should match fslslbridge.cpp
string gLatestURL;
integer gViewerIsFirestorm;
integer gTryHandshakeOnce = TRUE;
@@ -48,8 +48,8 @@
{
llReleaseURL(gLatestURL);
gLatestURL = "";
- // llRequestSecureURL(); // Uncomment this line and comment next one for HTTPS instead of HTTP (experimental)
- llRequestURL();
+ llRequestSecureURL();
+ // llRequestURL(); -- Uncomment this line and comment the previous one for HTTP instead of HTTPS
}
detachBridge()
diff --git a/indra/newview/fs_viewer_manifest.py b/indra/newview/fs_viewer_manifest.py
index 04d75e6c1d..c41620b5be 100644
--- a/indra/newview/fs_viewer_manifest.py
+++ b/indra/newview/fs_viewer_manifest.py
@@ -194,10 +194,14 @@ class FSViewerManifest:
def fs_save_breakpad_symbols(self, osname):
from glob import glob
import sys
- from os.path import isdir
+ from os.path import isdir, join
from shutil import rmtree
import tarfile
+ components = ['Phoenix',self.app_name(),self.args.get('arch'),'.'.join(self.args['version'])]
+ symbolsName = "_".join(components)
+ symbolsName = symbolsName + "_" + self.args["viewer_flavor"] + "-" + osname + "-" + str(self.address_size) + ".tar.bz2"
+
if isdir( "symbols" ):
rmtree( "symbols" )
@@ -213,12 +217,7 @@ class FSViewerManifest:
if isdir( "symbols" ):
for a in self.args:
print("%s: %s" % (a, self.args[a]))
- symbolsName = "%s/Phoenix_%s_%s_%s_symbols-%s-%d.tar.bz2" % (self.args['configuration'].lower(),
- self.fs_channel_legacy_oneword(),
- '-'.join( self.args['version'] ),
- self.args['viewer_flavor'],
- osname,
- self.address_size)
fTar = tarfile.open( symbolsName, "w:bz2")
fTar.add("symbols", arcname=".")
+ fTar.add( join( self.args["dest"], "build_data.json" ), arcname="build_data.json" )
diff --git a/indra/newview/fsfloaterimport.cpp b/indra/newview/fsfloaterimport.cpp
index 3a45f3d342..2248d8796e 100644
--- a/indra/newview/fsfloaterimport.cpp
+++ b/indra/newview/fsfloaterimport.cpp
@@ -845,8 +845,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
LL_DEBUGS("import") << "Setting clickaction on " << prim_uuid.asString() << " to " << prim["clickaction"].asInteger() << LL_ENDL;
gMessageSystem->newMessageFast(_PREHASH_ObjectClickAction);
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() );
gMessageSystem->addU8("ClickAction", (U8)prim["clickaction"].asInteger());
@@ -860,8 +860,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
LL_DEBUGS("import") << "Setting name on " << prim_uuid.asString() << " to " << prim_name << LL_ENDL;
gMessageSystem->newMessageFast(_PREHASH_ObjectName);
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
gMessageSystem->addU32Fast(_PREHASH_LocalID, object_local_id);
gMessageSystem->addStringFast(_PREHASH_Name, prim_name);
@@ -873,8 +873,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
LL_DEBUGS("import") << "Setting description on " << prim_uuid.asString() << " to " << prim["description"].asString() << LL_ENDL;
gMessageSystem->newMessageFast(_PREHASH_ObjectDescription);
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
gMessageSystem->addU32Fast(_PREHASH_LocalID, object_local_id);
gMessageSystem->addStringFast(_PREHASH_Description, prim["description"].asString());
@@ -887,8 +887,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
LL_DEBUGS("import") << "Setting permissions on " << prim_uuid.asString() << LL_ENDL;
gMessageSystem->newMessageFast(_PREHASH_ObjectPermissions);
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
gMessageSystem->nextBlockFast(_PREHASH_HeaderData);
gMessageSystem->addBOOLFast(_PREHASH_Override, (BOOL)FALSE);
@@ -953,8 +953,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
LL_DEBUGS("import") << "Setting sale info on " << prim_uuid.asString() << LL_ENDL;
gMessageSystem->newMessageFast(_PREHASH_ObjectSaleInfo);
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
gMessageSystem->addU32Fast(_PREHASH_LocalID, object->getLocalID());
sale_info.packMessage(gMessageSystem);
@@ -1155,8 +1155,8 @@ void FSFloaterImport::setPrimPosition(U8 type, LLViewerObject* object, LLVector3
{
gMessageSystem->newMessage(_PREHASH_MultipleObjectUpdate);
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID());
gMessageSystem->addU8Fast(_PREHASH_Type, type);
@@ -1298,7 +1298,7 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
ci_data->asset_type = asset_type;
ci_data->post_asset_upload = false;
LLPointer cb = new FSCreateItemCallback(ci_data);
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+ create_inventory_item(gAgentID, gAgentSessionID,
folder_id, LLTransactionID::tnull, name, description, asset_type, inventory_type,
NO_INV_SUBTYPE, PERM_ALL, cb);
return;
@@ -1322,7 +1322,7 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
ci_data->asset_type = asset_type;
ci_data->post_asset_upload = false;
LLPointer cb = new FSCreateItemCallback(ci_data);
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+ create_inventory_item(gAgentID, gAgentSessionID,
folder_id, LLTransactionID::tnull, name, description, asset_type, inventory_type,
NO_INV_SUBTYPE, PERM_MOVE | PERM_TRANSFER, cb);
return;
@@ -1372,7 +1372,7 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
ci_data->asset_type = asset_type;
ci_data->post_asset_upload = false;
LLPointer cb = new FSCreateItemCallback(ci_data);
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+ create_inventory_item(gAgentID, gAgentSessionID,
folder_id, LLTransactionID::tnull, name, description, asset_type, inventory_type,
NO_INV_SUBTYPE, PERM_ALL, cb);
return;
@@ -1495,7 +1495,7 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
data->mAssetInfo.setDescription(description);
data->mPreferredLocation = folder_type;
- if(!url.empty())
+ if (!url.empty())
{
if (new_file_agent_inventory)
{
@@ -1508,11 +1508,9 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
body["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms(perms_prefix));
body["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms(perms_prefix));
}
-
- boost::shared_ptr< LLResourceData> pData( data, resourceDeleter );
-
- LLCoprocedureManager::instance().enqueueCoprocedure( "FSImporter", "Upload asset", boost::bind( uploadCoroutine, _1, url, body, new_asset_id, asset_type, pData ) );
+ boost::shared_ptr< LLResourceData> pData(data, resourceDeleter);
+ LLCoprocedureManager::instance().enqueueCoprocedure("AssetStorage", "Upload asset", boost::bind( uploadCoroutine, _1, url, body, new_asset_id, asset_type, pData));
LL_DEBUGS("import") << "Asset upload via capability of " << new_asset_id.asString() << " to " << url << " of " << asset_id.asString() << LL_ENDL;
}
@@ -1583,10 +1581,10 @@ void FSFloaterImport::onAssetUploadComplete(const LLUUID& uuid, void* userdata,
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_MoneyTransferRequest);
msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
+ msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->nextBlockFast(_PREHASH_MoneyData);
- msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SourceID, gAgentID);
msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
msg->addU8("Flags", 0);
// we tell the sim how much we were expecting to pay so it
@@ -1613,7 +1611,7 @@ void FSFloaterImport::onAssetUploadComplete(const LLUUID& uuid, void* userdata,
fs_data->post_asset_upload = true;
fs_data->post_asset_upload_id = asset_id;
LLPointer cb = new FSCreateItemCallback(fs_data);
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+ create_inventory_item(gAgentID, gAgentSessionID,
folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
data->mInventoryType, fs_data->wearable_type, next_owner_perms,
@@ -2038,7 +2036,7 @@ void uploadCoroutine( LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &a_httpAdapter
}
LLPermissions new_perms;
- new_perms.init( gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null );
+ new_perms.init( gAgentID, gAgentID, LLUUID::null, LLUUID::null );
new_perms.initMasks( PERM_ALL, PERM_ALL, everyone_perms, group_perms, next_owner_perms );
diff --git a/indra/newview/fsfloaterperformance.cpp b/indra/newview/fsfloaterperformance.cpp
index 7e11d1dadc..eaaf5b32df 100644
--- a/indra/newview/fsfloaterperformance.cpp
+++ b/indra/newview/fsfloaterperformance.cpp
@@ -634,6 +634,7 @@ void FSFloaterPerformance::populateNearbyList()
auto overall_appearance = avatar->getOverallAppearance();
if (overall_appearance == LLVOAvatar::AOA_INVISIBLE)
{
+ char_iter++;
continue;
}
diff --git a/indra/newview/fsfloatersearch.cpp b/indra/newview/fsfloatersearch.cpp
index 2ee7106cb4..d4b308c727 100644
--- a/indra/newview/fsfloatersearch.cpp
+++ b/indra/newview/fsfloatersearch.cpp
@@ -130,7 +130,7 @@ public:
/*virtual*/ void setErrorStatus(S32 status, const std::string& reason)
{
- LL_ERRS("Search") << "Can't complete remote parcel request. Http Status: " << status << ". Reason : " << reason << LL_ENDL;
+ LL_WARNS("Search") << "Can't complete remote parcel request. Http Status: " << status << ". Reason : " << reason << LL_ENDL;
}
private:
std::set mParcelIDs;
diff --git a/indra/newview/fslslbridge.cpp b/indra/newview/fslslbridge.cpp
index e8596296cb..2495242dd1 100644
--- a/indra/newview/fslslbridge.cpp
+++ b/indra/newview/fslslbridge.cpp
@@ -55,7 +55,7 @@
static const std::string FS_BRIDGE_FOLDER = "#LSL Bridge";
static const std::string FS_BRIDGE_CONTAINER_FOLDER = "Landscaping";
static const U32 FS_BRIDGE_MAJOR_VERSION = 2;
-static const U32 FS_BRIDGE_MINOR_VERSION = 27;
+static const U32 FS_BRIDGE_MINOR_VERSION = 28;
static const U32 FS_MAX_MINOR_VERSION = 99;
static const std::string UPLOAD_SCRIPT_CURRENT = "EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt";
static const std::string FS_STATE_ATTRIBUTE = "state=";
diff --git a/indra/newview/fsperfstats.cpp b/indra/newview/fsperfstats.cpp
index 1238bd786d..e01631be37 100644
--- a/indra/newview/fsperfstats.cpp
+++ b/indra/newview/fsperfstats.cpp
@@ -123,7 +123,7 @@ namespace FSPerfStats
FSPerfStats::tunables.userImpostorDistanceTuningEnabled = gSavedSettings.getBOOL("FSAutoTuneImpostorByDistEnabled");
FSPerfStats::tunables.userFPSTuningStrategy = gSavedSettings.getU32("FSTuningFPSStrategy");
FSPerfStats::tunables.userTargetFPS = gSavedSettings.getU32("FSTargetFPS");
- FSPerfStats::tunables.userTargetReflections = gSavedSettings.getU32("FSUserTargetReflections");
+ FSPerfStats::tunables.userTargetReflections = gSavedSettings.getS32("FSUserTargetReflections");
FSPerfStats::tunables.userAutoTuneEnabled = gSavedSettings.getBOOL("FSAutoTuneFPS");
FSPerfStats::tunables.userAutoTuneLock = gSavedSettings.getBOOL("FSAutoTuneLock");
// Note: The Max ART slider is logarithmic and thus we have an intermediate proxy value
diff --git a/indra/newview/installers/linux/appimage.sh b/indra/newview/installers/linux/appimage.sh
deleted file mode 100755
index b06a096fa1..0000000000
--- a/indra/newview/installers/linux/appimage.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/bash
-
-SCRIPT_PATH=`readlink -f $0`
-SCRIPT_PATH=`dirname $SCRIPT_PATH`
-
-echo "Trying to build AppImage in directory $1 into file $3"
-
-# All hope is lost if there is no lsb_release command
-command -v lsb_release >/dev/null 2>/dev/null || exit 0
-
-if [ `lsb_release -is` != "Ubuntu" ]
-then
- echo "Distribution is not Ubuntu, skipping AppImage creation"
- exit 0
-fi
-
-set -e
-
-cd $1
-pushd packaged
-
-wget -q https://github.com/AppImage/AppImages/raw/master/functions.sh -O ./functions.sh
-. ./functions.sh
-rm functions.sh
-
-cp firestorm AppRun
-cp ${SCRIPT_PATH}/firestorm.desktop firestorm.desktop
-
-copy_deps
-copy_deps
-copy_deps
-delete_blacklisted
-
-# Now copy everything to ./lib. The viewer binaries got build with a rpath pointing to ./lib so all so will be magically found there.
-#find ./usr/lib/ -type f -print0 | xargs -0 -Ifile cp file ./lib/
-#find ./lib/x86_64-linux-gnu/ -type f -print0 | xargs -0 -Ifile cp file ./lib/
-
-#rm -rf ./usr/lib/
-#rm -rf ./lib/x86_64-linux-gnu/
-
-find . -empty -type d -delete
-
-popd
-
-wget "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
-chmod a+x appimagetool-x86_64.AppImage
-./appimagetool-x86_64.AppImage --appimage-extract
-rm appimagetool-x86_64.AppImage
-ARCH=x86_64 squashfs-root/AppRun packaged
-
-if [ -f $2 ]
-then
- mv $2 $3
-fi
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 22c47b7a58..92086742a4 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2428,7 +2428,8 @@ void LLAgent::propagate(const F32 dt)
//-----------------------------------------------------------------------------
void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32 mouse_x, const S32 mouse_y)
{
- if (mMoveTimer.getStarted() && mMoveTimer.getElapsedTimeF32() > gSavedSettings.getF32("NotMovingHintTimeout"))
+ static LLCachedControl hint_timeout(gSavedSettings, "NotMovingHintTimeout");
+ if (mMoveTimer.getStarted() && mMoveTimer.getElapsedTimeF32() > hint_timeout)
{
LLFirstUse::notMoving();
}
@@ -2647,7 +2648,8 @@ void LLAgent::endAnimationUpdateUI()
gStatusBar->setVisibleForMouselook(true);
// We don't use the mini location panel in Firestorm
- // if (gSavedSettings.getBOOL("ShowMiniLocationPanel"))
+ // static LLCachedControl show_mini_location_panel(gSavedSettings, "ShowMiniLocationPanel");
+ // if (show_mini_location_panel)
// {
// LLPanelTopInfoBar::getInstance()->setVisible(TRUE);
// }
@@ -4694,10 +4696,9 @@ bool LLAgent::teleportCore(bool is_local)
// yet if the teleport will succeed. Look in
// process_teleport_location_reply
- // close the map panel so we can see our destination.
- // we don't close search floater, see EXT-5840.
- if (!gSavedSettings.getBOOL("FSDoNotHideMapOnTeleport")) // FIRE-17779: Option to not close world map on teleport
- LLFloaterReg::hideInstance("world_map");
+ // FIRE-17779: Option to not close world map on teleport
+ if (!gSavedSettings.getBOOL("FSDoNotHideMapOnTeleport"))
+ LLFloaterReg::hideInstance("world_map");
// hide land floater too - it'll be out of date
LLFloaterReg::hideInstance("about_land");
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 2b4bfe4a1b..ca8370f866 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -6310,14 +6310,18 @@ void LLAppViewer::disconnectViewer()
}
// save inventory if appropriate
- gInventory.cache(gInventory.getRootFolderID(), gAgent.getID());
- if (gInventory.getLibraryRootFolderID().notNull()
- && gInventory.getLibraryOwnerID().notNull())
- {
- gInventory.cache(
- gInventory.getLibraryRootFolderID(),
- gInventory.getLibraryOwnerID());
- }
+ if (gInventory.isInventoryUsable()
+ && gAgent.getID().notNull()) // Shouldn't be null at this stage
+ {
+ gInventory.cache(gInventory.getRootFolderID(), gAgent.getID());
+ if (gInventory.getLibraryRootFolderID().notNull()
+ && gInventory.getLibraryOwnerID().notNull())
+ {
+ gInventory.cache(
+ gInventory.getLibraryRootFolderID(),
+ gInventory.getLibraryOwnerID());
+ }
+ }
LLAvatarNameCache::instance().setCustomNameCheckCallback(LLAvatarNameCache::custom_name_check_callback_t()); // Contact sets
saveNameCache();
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 99716e9ede..c5d90770d7 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -40,16 +40,42 @@
#include
-#include "json/reader.h" // To parse manifest.json from pepperflash
-
-
#include
+#include
+
+#if (__GLIBC__*1000 + __GLIBC_MINOR__) >= 2034
+#pragma message "Compiling with libresolv stubs"
+extern "C"
+{
+ int __res_nquery(res_state statep,
+ const char *dname, int qclass, int type,
+ unsigned char *answer, int anslen)
+ {
+ return res_nquery( statep, dname, qclass, type, answer, anslen );
+ }
+
+ int __dn_expand(const unsigned char *msg,
+ const unsigned char *eomorig,
+ const unsigned char *comp_dn, char *exp_dn,
+ int length)
+ {
+ return dn_expand( msg,eomorig,comp_dn,exp_dn,length);
+ }
+}
+#endif
#if LL_SEND_CRASH_REPORTS
#include "breakpad/client/linux/handler/exception_handler.h"
#include "breakpad/common/linux/http_upload.h"
#include "lldir.h"
#include "../llcrashlogger/llcrashlogger.h"
+// Fix linux compile
+#if LL_USESYSTEMLIBS
+#include "jsoncpp/reader.h" // JSON
+#else
+#include "json/reader.h" // JSON
+#endif
+//
#endif
#include "fsversionvalues.h"
diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h
index f9fe43b215..d9935d42a2 100644
--- a/indra/newview/llappviewerwin32.h
+++ b/indra/newview/llappviewerwin32.h
@@ -51,8 +51,8 @@ protected:
bool initHardwareTest() override; // Win32 uses DX9 to test hardware.
bool initParseCommandLine(LLCommandLineParser& clp) override;
- virtual bool beingDebugged();
- virtual bool restoreErrorTrap();
+ bool beingDebugged() override;
+ bool restoreErrorTrap() override;
bool sendURLToOtherInstance(const std::string& url) override;
diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp
index ca83afb5ab..04dbf03e31 100644
--- a/indra/newview/llavatarrenderinfoaccountant.cpp
+++ b/indra/newview/llavatarrenderinfoaccountant.cpp
@@ -345,6 +345,8 @@ void LLAvatarRenderInfoAccountant::idle()
&& regionp->capabilitiesReceived())
{
// each of these is further governed by and resets its own timer
+ // Note: We can have multiple regions, each launches up to two coroutines,
+ // it likely is expensive
sendRenderInfoToRegion(regionp);
getRenderInfoFromRegion(regionp);
}
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index e55931cfa9..9d22045a88 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -723,7 +723,8 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
{
if(mBuddyInfo.find(agent_id) != mBuddyInfo.end())
{
- if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
+ if (((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
+ && !gAgent.isDoNotDisturb())
{
LLSD args;
// Always show complete name in rights dialogs
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index e31f731fde..a3f68ef93a 100644
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -98,10 +98,14 @@ LLConversationViewSession::~LLConversationViewSession()
{
mActiveVoiceChannelConnection.disconnect();
- if(LLVoiceClient::instanceExists() && mVoiceClientObserver)
- {
- LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
- }
+ if (mVoiceClientObserver)
+ {
+ if (LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
+ }
+ delete mVoiceClientObserver;
+ }
mFlashTimer->unset();
}
@@ -257,7 +261,12 @@ BOOL LLConversationViewSession::postBuild()
mIsInActiveVoiceChannel = true;
if(LLVoiceClient::instanceExists())
{
- LLNearbyVoiceClientStatusObserver* mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);
+ if (mVoiceClientObserver)
+ {
+ LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
+ delete mVoiceClientObserver;
+ }
+ mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);
LLVoiceClient::getInstance()->addObserver(mVoiceClientObserver);
}
break;
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index c6ec168cc2..d09dcc4aa9 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -673,16 +673,12 @@ void LLDrawPoolAlpha::renderEmissives(U32 mask, std::vector& emissi
void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)
{
- // Tweak performance
- //BOOL batch_fullbrights = gSavedSettings.getBOOL("RenderAlphaBatchFullbrights");
- //BOOL batch_emissives = gSavedSettings.getBOOL("RenderAlphaBatchEmissives");
static LLCachedControl batch_fullbrights(gSavedSettings, "RenderAlphaBatchFullbrights");
static LLCachedControl batch_emissives(gSavedSettings, "RenderAlphaBatchEmissives");
- //
- BOOL initialized_lighting = FALSE;
- BOOL light_enabled = TRUE;
+ bool initialized_lighting = false;
+ bool light_enabled = true;
- BOOL use_shaders = gPipeline.canUseVertexShaders();
+ bool use_shaders = gPipeline.canUseVertexShaders();
for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
{
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 527e9c6eeb..70c060379d 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -2315,7 +2315,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
// Niran's optimization
const LLTextureEntry* tex_entry = face->getTextureEntry();
- if (tex_entry && tex_entry->getAlpha() == 0.f)
+ if ( (tex_entry && tex_entry->getAlpha() == 0.f) && ( tex_entry->getGlow() == 0.0 ) )
{
continue;
}
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 5a9cc27f98..2af32b7d95 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -587,18 +587,8 @@ void LLDrawPoolWater::shade2(bool edge, LLGLSLShader* shader, const LLColor3& li
shader->uniform3fv(LLShaderMgr::WATER_EYEVEC, 1, camera.getOrigin().mV); // Factor out instance() calls
shader->uniform3fv(LLShaderMgr::WATER_SPECULAR, 1, light_diffuse.mV);
shader->uniform1f(LLShaderMgr::WATER_SPECULAR_EXP, light_exp);
- if (environment.isCloudScrollPaused()) // Factor out instance() calls
- {
- static const std::array zerowave{ {0.0f, 0.0f} };
-
- shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, zerowave.data());
- shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, zerowave.data());
- }
- else
- {
- shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, pwater->getWave1Dir().mV);
- shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, pwater->getWave2Dir().mV);
- }
+ shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, pwater->getWave1Dir().mV);
+ shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, pwater->getWave2Dir().mV);
shader->uniform3fv(LLShaderMgr::WATER_LIGHT_DIR, 1, light_dir.mV);
shader->uniform3fv(LLShaderMgr::WATER_NORM_SCALE, 1, pwater->getNormalScale().mV);
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index fc95aec90b..0c6c241d9b 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -561,18 +561,18 @@ void LLFloaterCamera::setMode(ECameraControlMode mode)
void LLFloaterCamera::switchMode(ECameraControlMode mode)
{
- setMode(mode);
-
switch (mode)
{
case CAMERA_CTRL_MODE_PRESETS:
case CAMERA_CTRL_MODE_PAN:
sFreeCamera = false;
+ setMode(mode); // depends onto sFreeCamera
clear_camera_tool();
break;
case CAMERA_CTRL_MODE_FREE_CAMERA:
sFreeCamera = true;
+ setMode(mode);
activate_camera_tool();
break;
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index bc67c3685a..2f2cc7d1bb 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -623,8 +623,7 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
LLInventoryItem* item = gInventory.getItem(*it);
if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
{
- LLWString item_name = utf8str_to_wstring(item->getName());
- LLClipboard::instance().addToClipboard(item_name, 0, item_name.size());
+ LLClipboard::instance().addToClipboard(*it);
}
}
}
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index e3404ec9f4..8f186d5ea2 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -386,7 +386,7 @@ void LLFloaterIMSessionTab::draw()
void LLFloaterIMSessionTab::enableDisableCallBtn()
{
- if (LLVoiceClient::instanceExists())
+ if (LLVoiceClient::instanceExists() && mVoiceButton)
{
mVoiceButton->setEnabled(
mSessionID.notNull()
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 2987593788..a92cea23c6 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -3626,7 +3626,16 @@ void LLPanelPreference::saveSettings()
{
view_stack.push_back(*iter);
}
- }
+ }
+
+ if (LLStartUp::getStartupState() == STATE_STARTED)
+ {
+ LLControlVariable* control = gSavedPerAccountSettings.getControl("VoiceCallsFriendsOnly");
+ if (control)
+ {
+ mSavedValues[control] = control->getValue();
+ }
+ }
}
void LLPanelPreference::showMultipleViewersWarning(LLUICtrl* checkbox, const LLSD& value)
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index d90d761aee..c006e67976 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -185,15 +185,6 @@ void LLFloaterSearch::search(const SearchQuery &p)
// add the search query string
subs["QUERY"] = LLURI::escape(p.query);
- // add the permissions token that login.cgi gave us
- // We use "search_token", and fallback to "auth_token" if not present.
- LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
- if (search_token.asString().empty())
- {
- search_token = LLLoginInstance::getInstance()->getResponse("auth_token");
- }
- subs["AUTH_TOKEN"] = search_token.asString();
-
// add the user's preferred maturity (can be changed via prefs)
std::string maturity;
if (gAgent.prefersAdult())
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 4948039dc8..0513d1c4ba 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -56,10 +56,12 @@
#include "llscrolllistctrl.h"
#include "llslurl.h"
#include "lltextbox.h"
+#include "lltoolbarview.h"
#include "lltracker.h"
#include "lltrans.h"
#include "llviewerinventory.h" // LLViewerInventoryItem
#include "llviewermenu.h"
+#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewertexture.h"
@@ -95,6 +97,9 @@ static const F32 MAP_ZOOM_TIME = 0.2f;
// Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
static const S32 MAX_VISIBLE_REGIONS = 512;
+
+const S32 HIDE_BEACON_PAD = 133;
+
// It would be more logical to have this inside the method where it is used but to compile under gcc this
// struct has to be here.
struct SortRegionNames
@@ -394,6 +399,8 @@ LLFloaterWorldMap::~LLFloaterWorldMap()
mFriendObserver = NULL;
gFloaterWorldMap = NULL;
+
+ mTeleportFinishConnection.disconnect();
}
//static
@@ -407,12 +414,16 @@ void LLFloaterWorldMap::onClose(bool app_quitting)
{
// While we're not visible, discard the overlay images we're using
LLWorldMap::getInstance()->clearImageRefs();
+ mTeleportFinishConnection.disconnect();
}
// virtual
void LLFloaterWorldMap::onOpen(const LLSD& key)
{
- bool center_on_target = (key.asString() == "center");
+ mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFinishedCallback(boost::bind(&LLFloaterWorldMap::onTeleportFinished, this));
+
+ bool center_on_target = (key.asString() == "center");
mIsClosing = FALSE;
@@ -1936,6 +1947,13 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
}
}
+void LLFloaterWorldMap::onTeleportFinished()
+{
+ if(isInVisibleChain())
+ {
+ LLWorldMapView::setPan(0, 0, TRUE);
+ }
+}
void LLFloaterWorldMap::onCommitSearchResult()
{
@@ -2012,3 +2030,103 @@ void LLFloaterWorldMap::onFocusLost()
LLWorldMapView* map_panel = (LLWorldMapView*)gFloaterWorldMap->mPanel;
map_panel->mPanning = FALSE;
}
+
+LLPanelHideBeacon::LLPanelHideBeacon() :
+ mHideButton(NULL)
+{
+}
+
+// static
+LLPanelHideBeacon* LLPanelHideBeacon::getInstance()
+{
+ static LLPanelHideBeacon* panel = getPanelHideBeacon();
+ return panel;
+}
+
+
+BOOL LLPanelHideBeacon::postBuild()
+{
+ mHideButton = getChild("hide_beacon_btn");
+ mHideButton->setCommitCallback(boost::bind(&LLPanelHideBeacon::onHideButtonClick, this));
+
+ gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLPanelHideBeacon::updatePosition, this));
+
+ return TRUE;
+}
+
+//virtual
+void LLPanelHideBeacon::draw()
+{
+ if (!LLTracker::isTracking(NULL))
+ {
+ mHideButton->setVisible(false);
+ return;
+ }
+ mHideButton->setVisible(true);
+ updatePosition();
+ LLPanel::draw();
+}
+
+//virtual
+void LLPanelHideBeacon::setVisible(BOOL visible)
+{
+ if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false;
+
+ if (visible)
+ {
+ updatePosition();
+ }
+
+ LLPanel::setVisible(visible);
+}
+
+
+//static
+LLPanelHideBeacon* LLPanelHideBeacon::getPanelHideBeacon()
+{
+ LLPanelHideBeacon* panel = new LLPanelHideBeacon();
+ panel->buildFromFile("panel_hide_beacon.xml");
+
+ LL_INFOS() << "Build LLPanelHideBeacon panel" << LL_ENDL;
+
+ panel->updatePosition();
+ return panel;
+}
+
+void LLPanelHideBeacon::onHideButtonClick()
+{
+ LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance();
+ if (instance)
+ {
+ instance->onClearBtn();
+ }
+}
+
+/**
+* Updates position of the panel (similar to Stand & Stop Flying panel).
+*/
+void LLPanelHideBeacon::updatePosition()
+{
+ S32 bottom_tb_center = 0;
+ if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_BOTTOM))
+ {
+ bottom_tb_center = toolbar_bottom->getRect().getCenterX();
+ }
+
+ S32 left_tb_width = 0;
+ if (LLToolBar* toolbar_left = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT))
+ {
+ left_tb_width = toolbar_left->getRect().getWidth();
+ }
+
+ if (gToolBarView != NULL && gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT)->hasButtons())
+ {
+ S32 x_pos = bottom_tb_center - getRect().getWidth() / 2 - left_tb_width;
+ setOrigin( x_pos + HIDE_BEACON_PAD, 0);
+ }
+ else
+ {
+ S32 x_pos = bottom_tb_center - getRect().getWidth() / 2;
+ setOrigin( x_pos + HIDE_BEACON_PAD, 0);
+ }
+}
diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h
index ae77b86d22..c51ea21be6 100644
--- a/indra/newview/llfloaterworldmap.h
+++ b/indra/newview/llfloaterworldmap.h
@@ -127,7 +127,8 @@ public:
// teleport to the tracked item, if there is one
void teleport();
void onChangeMaturity();
-
+
+ void onClearBtn();
//Slapp instigated avatar tracking
void avatarTrackFromSlapp( const LLUUID& id );
@@ -147,7 +148,6 @@ protected:
void onComboTextEntry( );
void onSearchTextEntry( );
- void onClearBtn();
void onClickTeleportBtn();
void onShowTargetBtn();
void onShowAgentBtn();
@@ -176,7 +176,7 @@ protected:
void onCoordinatesCommit();
void onCommitSearchResult();
- void cacheLandmarkPosition();
+ void onTeleportFinished();
// Parcel details on map
void requestParcelInfo(const LLVector3d& pos_global, const LLVector3d& region_origin);
@@ -227,9 +227,31 @@ private:
LLCtrlListInterface * mListFriendCombo;
LLCtrlListInterface * mListLandmarkCombo;
LLCtrlListInterface * mListSearchResults;
+
+ boost::signals2::connection mTeleportFinishConnection;
};
extern LLFloaterWorldMap* gFloaterWorldMap;
+
+class LLPanelHideBeacon : public LLPanel
+{
+public:
+ static LLPanelHideBeacon* getInstance();
+
+ LLPanelHideBeacon();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void setVisible(BOOL visible);
+ /*virtual*/ void draw();
+
+private:
+ static LLPanelHideBeacon* getPanelHideBeacon();
+ void onHideButtonClick();
+ void updatePosition();
+
+ LLButton* mHideButton;
+
+};
+
#endif
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 00a5037c08..c03821490d 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -492,8 +492,13 @@ void LLGestureMgr::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_ges
mActive[base_item_id] = new_gesture;
- delete old_gesture;
- old_gesture = NULL;
+ // replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id)
+ // replaces ids without repalcing gesture
+ if (old_gesture != new_gesture)
+ {
+ delete old_gesture;
+ old_gesture = NULL;
+ }
if (asset_id.notNull())
{
@@ -926,7 +931,7 @@ void LLGestureMgr::stepGesture(LLMultiGesture* gesture)
else if (gesture->mWaitTimer.getElapsedTimeF32() > MAX_WAIT_ANIM_SECS)
{
// we've waited too long for an animation
- LL_INFOS() << "Waited too long for animations to stop, continuing gesture."
+ LL_INFOS("GestureMgr") << "Waited too long for animations to stop, continuing gesture."
<< LL_ENDL;
gesture->mWaitingAnimations = FALSE;
gesture->mCurrentStep++;
@@ -1124,6 +1129,34 @@ void LLGestureMgr::onLoadComplete(const LLUUID& asset_uuid,
self.setFetchID(item_id);
self.startFetch();
}
+
+ item_map_t::iterator it = self.mActive.find(item_id);
+ if (it == self.mActive.end())
+ {
+ // Gesture is supposed to be present, active, but NULL
+ LL_DEBUGS("GestureMgr") << "Gesture " << item_id << " not found in active list" << LL_ENDL;
+ }
+ else
+ {
+ LLMultiGesture* old_gesture = (*it).second;
+ if (old_gesture && old_gesture != gesture)
+ {
+ LL_DEBUGS("GestureMgr") << "Received dupplicate " << item_id << " callback" << LL_ENDL;
+ // In case somebody managest to activate, deactivate and
+ // then activate gesture again, before asset finishes loading.
+ // LLLoadInfo will have a different pointer, asset storage will
+ // see it as a different request, resulting in two callbacks.
+
+ // deactivateSimilarGestures() did not turn this one off
+ // because of matching item_id
+ self.stopGesture(old_gesture);
+
+ self.mActive.erase(item_id);
+ delete old_gesture;
+ old_gesture = NULL;
+ }
+ }
+
self.mActive[item_id] = gesture;
// Everything has been successful. Add to the active list.
@@ -1158,9 +1191,23 @@ void LLGestureMgr::onLoadComplete(const LLUUID& asset_uuid,
}
else
{
- LL_WARNS() << "Unable to load gesture" << LL_ENDL;
+ LL_WARNS("GestureMgr") << "Unable to load gesture" << LL_ENDL;
- self.mActive.erase(item_id);
+ item_map_t::iterator it = self.mActive.find(item_id);
+ if (it != self.mActive.end())
+ {
+ LLMultiGesture* old_gesture = (*it).second;
+ if (old_gesture)
+ {
+ // Shouldn't happen, just in case
+ LL_WARNS("GestureMgr") << "Gesture " << item_id << " existed when it shouldn't" << LL_ENDL;
+
+ self.stopGesture(old_gesture);
+ delete old_gesture;
+ old_gesture = NULL;
+ }
+ self.mActive.erase(item_id);
+ }
delete gesture;
gesture = NULL;
@@ -1178,9 +1225,23 @@ void LLGestureMgr::onLoadComplete(const LLUUID& asset_uuid,
LLDelayedGestureError::gestureFailedToLoad( item_id );
}
- LL_WARNS() << "Problem loading gesture: " << status << LL_ENDL;
-
- LLGestureMgr::instance().mActive.erase(item_id);
+ LL_WARNS("GestureMgr") << "Problem loading gesture: " << status << LL_ENDL;
+
+ item_map_t::iterator it = self.mActive.find(item_id);
+ if (it != self.mActive.end())
+ {
+ LLMultiGesture* old_gesture = (*it).second;
+ if (old_gesture)
+ {
+ // Shouldn't happen, just in case
+ LL_WARNS("GestureMgr") << "Gesture " << item_id << " existed when it shouldn't" << LL_ENDL;
+
+ self.stopGesture(old_gesture);
+ delete old_gesture;
+ old_gesture = NULL;
+ }
+ self.mActive.erase(item_id);
+ }
}
}
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 4a6c0c75ce..bfe8c5b5da 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -225,7 +225,7 @@ LLFetchLeaveGroupData* gFetchLeaveGroupData = NULL;
void LLGroupActions::search()
{
// Open groups search panel instead of invoking presumed failed websearch
- //LLFloaterReg::showInstance("search", LLSD().with("category", "groups"));
+ //LLFloaterReg::showInstance("search");
LLFloaterReg::showInstance("search", LLSD().with("tab", "groups"));
//
}
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 80f47d5cba..a46b8e7783 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -154,6 +154,8 @@ bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
LLInventoryValidationInfo::LLInventoryValidationInfo():
mFatalErrorCount(0),
mWarningCount(0),
+ mLoopCount(0),
+ mOrphanedCount(0),
mInitialized(false),
mFatalNoRootFolder(false),
mFatalNoLibraryRootFolder(false),
@@ -163,7 +165,10 @@ LLInventoryValidationInfo::LLInventoryValidationInfo():
void LLInventoryValidationInfo::toOstream(std::ostream& os) const
{
- os << "mFatalErrorCount " << mFatalErrorCount << " mWarningCount " << mWarningCount;
+ os << "mFatalErrorCount " << mFatalErrorCount
+ << " mWarningCount " << mWarningCount
+ << " mLoopCount " << mLoopCount
+ << " mOrphanedCount " << mOrphanedCount;
}
@@ -177,6 +182,8 @@ void LLInventoryValidationInfo::asLLSD(LLSD& sd) const
{
sd["fatal_error_count"] = mFatalErrorCount;
sd["warning_count"] = mWarningCount;
+ sd["loop_count"] = mLoopCount;
+ sd["orphaned_count"] = mOrphanedCount;
sd["initialized"] = mInitialized;
sd["missing_system_folders_count"] = LLSD::Integer(mMissingRequiredSystemFolders.size());
sd["fatal_no_root_folder"] = mFatalNoRootFolder;
@@ -361,21 +368,35 @@ const LLViewerInventoryCategory* LLInventoryModel::getFirstDescendantOf(const LL
return NULL;
}
-bool LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const
+LLInventoryModel::EAnscestorResult LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const
{
LLInventoryObject *object = getObject(object_id);
- while (object && object->getParentUUID().notNull())
- {
- LLInventoryObject *parent_object = getObject(object->getParentUUID());
+ if (!object)
+ {
+ LL_WARNS(LOG_INV) << "Unable to trace topmost ancestor, initial object " << object_id << " does not exist" << LL_ENDL;
+ return ANSCESTOR_MISSING;
+ }
+
+ std::set object_ids{ object_id }; // loop protection
+ while (object->getParentUUID().notNull())
+ {
+ LLUUID parent_id = object->getParentUUID();
+ if (object_ids.find(parent_id) != object_ids.end())
+ {
+ LL_WARNS(LOG_INV) << "Detected a loop on an object " << parent_id << " when searching for ancestor of " << object_id << LL_ENDL;
+ return ANSCESTOR_LOOP;
+ }
+ object_ids.insert(parent_id);
+ LLInventoryObject *parent_object = getObject(parent_id);
if (!parent_object)
{
- LL_WARNS(LOG_INV) << "unable to trace topmost ancestor, missing item for uuid " << object->getParentUUID() << LL_ENDL;
- return false;
+ LL_WARNS(LOG_INV) << "unable to trace topmost ancestor of " << object_id << ", missing item for uuid " << parent_id << LL_ENDL;
+ return ANSCESTOR_MISSING;
}
object = parent_object;
}
result = object->getUUID();
- return true;
+ return ANSCESTOR_OK;
}
// Get the object by id. Returns NULL if not found.
@@ -3147,42 +3168,69 @@ bool LLInventoryModel::saveToFile(const std::string& filename,
LL_INFOS(LOG_INV) << "saving inventory to: (" << filename << ")" << LL_ENDL;
- llofstream fileXML(filename.c_str());
- if (!fileXML.is_open())
- {
- LL_WARNS(LOG_INV) << "unable to save inventory to: " << filename << LL_ENDL;
- return false;
- }
+ try
+ {
+ llofstream fileXML(filename.c_str());
+ if (!fileXML.is_open())
+ {
+ LL_WARNS(LOG_INV) << "Failed to open file. Unable to save inventory to: " << filename << LL_ENDL;
+ return false;
+ }
- LLSD cache_ver;
- cache_ver["inv_cache_version"] = sCurrentInvCacheVersion;
+ LLSD cache_ver;
+ cache_ver["inv_cache_version"] = sCurrentInvCacheVersion;
- fileXML << LLSDOStreamer(cache_ver) << std::endl;
+ if (fileXML.fail())
+ {
+ LL_WARNS(LOG_INV) << "Failed to write cache version to file. Unable to save inventory to: " << filename << LL_ENDL;
+ return false;
+ }
- S32 count = categories.size();
- S32 cat_count = 0;
- S32 i;
- for(i = 0; i < count; ++i)
- {
- LLViewerInventoryCategory* cat = categories[i];
- if(cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)
- {
- fileXML << LLSDOStreamer(cat->exportLLSD()) << std::endl;
- cat_count++;
- }
- }
+ fileXML << LLSDOStreamer(cache_ver) << std::endl;
- S32 it_count = items.size();
- for(i = 0; i < it_count; ++i)
- {
- fileXML << LLSDOStreamer(items[i]->asLLSD()) << std::endl;
- }
+ S32 count = categories.size();
+ S32 cat_count = 0;
+ S32 i;
+ for (i = 0; i < count; ++i)
+ {
+ LLViewerInventoryCategory* cat = categories[i];
+ if (cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ fileXML << LLSDOStreamer(cat->exportLLSD()) << std::endl;
+ cat_count++;
+ }
- fileXML.close();
+ if (fileXML.fail())
+ {
+ LL_WARNS(LOG_INV) << "Failed to write a folder to file. Unable to save inventory to: " << filename << LL_ENDL;
+ return false;
+ }
+ }
- LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL;
+ S32 it_count = items.size();
+ for (i = 0; i < it_count; ++i)
+ {
+ fileXML << LLSDOStreamer(items[i]->asLLSD()) << std::endl;
- return true;
+ if (fileXML.fail())
+ {
+ LL_WARNS(LOG_INV) << "Failed to write an item to file. Unable to save inventory to: " << filename << LL_ENDL;
+ return false;
+ }
+ }
+
+ fileXML.close();
+
+ LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL;
+ }
+ catch (...)
+ {
+ LOG_UNHANDLED_EXCEPTION("");
+ LL_INFOS(LOG_INV) << "Failed to save inventory to: (" << filename << ")" << LL_ENDL;
+ return false;
+ }
+
+ return true;
}
// message handling functionality
@@ -4303,20 +4351,23 @@ void LLInventoryModel::dumpInventory() const
LLPointer LLInventoryModel::validate() const
{
LLPointer validation_info = new LLInventoryValidationInfo;
- S32 fatalities = 0;
+ S32 fatal_errs = 0;
S32 warnings = 0;
+ S32 loops = 0;
+ S32 orphaned = 0;
if (getRootFolderID().isNull())
{
LL_WARNS("Inventory") << "Fatal inventory corruption: no root folder id" << LL_ENDL;
validation_info->mFatalNoRootFolder = true;
- fatalities++;
+ fatal_errs++;
}
if (getLibraryRootFolderID().isNull())
{
+ // Probably shouldn't be a fatality, inventory can function without a library
LL_WARNS("Inventory") << "Fatal inventory corruption: no library root folder id" << LL_ENDL;
validation_info->mFatalNoLibraryRootFolder = true;
- fatalities++;
+ fatal_errs++;
}
if (mCategoryMap.size() + 1 != mParentChildCategoryTree.size())
@@ -4348,7 +4399,23 @@ LLPointer LLInventoryModel::validate() const
}
LLUUID topmost_ancestor_id;
// Will leave as null uuid on failure
- getObjectTopmostAncestor(cat_id, topmost_ancestor_id);
+ EAnscestorResult res = getObjectTopmostAncestor(cat_id, topmost_ancestor_id);
+ switch (res)
+ {
+ case ANSCESTOR_MISSING:
+ orphaned++;
+ break;
+ case ANSCESTOR_LOOP:
+ loops++;
+ break;
+ case ANSCESTOR_OK:
+ break;
+ default:
+ LL_WARNS("Inventory") << "Unknown ancestor error for " << cat_id << LL_ENDL;
+ warnings++;
+ break;
+ }
+
if (cat_id != cat->getUUID())
{
LL_WARNS("Inventory") << "cat id/index mismatch " << cat_id << " " << cat->getUUID() << LL_ENDL;
@@ -4448,8 +4515,8 @@ LLPointer LLInventoryModel::validate() const
// Topmost ancestor should be root or library.
LLUUID topmost_ancestor_id;
- bool found = getObjectTopmostAncestor(item_id, topmost_ancestor_id);
- if (!found)
+ EAnscestorResult found = getObjectTopmostAncestor(item_id, topmost_ancestor_id);
+ if (found != ANSCESTOR_OK)
{
LL_WARNS("Inventory") << "unable to find topmost ancestor for " << item_id << LL_ENDL;
warnings++;
@@ -4479,7 +4546,7 @@ LLPointer LLInventoryModel::validate() const
{
LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()
<< "] orphaned - no child cat array for alleged parent " << parent_id << LL_ENDL;
- warnings++;
+ orphaned++;
}
else
{
@@ -4497,6 +4564,7 @@ LLPointer LLInventoryModel::validate() const
{
LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()
<< "] orphaned - not found in child cat array of alleged parent " << parent_id << LL_ENDL;
+ orphaned++;
}
}
}
@@ -4505,7 +4573,7 @@ LLPointer LLInventoryModel::validate() const
LLFolderType::EType folder_type = cat->getPreferredType();
bool cat_is_in_library = false;
LLUUID topmost_id;
- if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) && topmost_id == getLibraryRootFolderID())
+ if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) == ANSCESTOR_OK && topmost_id == getLibraryRootFolderID())
{
cat_is_in_library = true;
}
@@ -4545,6 +4613,7 @@ LLPointer LLInventoryModel::validate() const
if (parent_id.isNull())
{
LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName() << "] has null parent id!" << LL_ENDL;
+ orphaned++;
}
else
{
@@ -4555,6 +4624,7 @@ LLPointer LLInventoryModel::validate() const
{
LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()
<< "] orphaned - alleged parent has no child items list " << parent_id << LL_ENDL;
+ orphaned++;
}
else
{
@@ -4571,6 +4641,7 @@ LLPointer LLInventoryModel::validate() const
{
LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()
<< "] orphaned - not found as child of alleged parent " << parent_id << LL_ENDL;
+ orphaned++;
}
}
@@ -4589,15 +4660,18 @@ LLPointer LLInventoryModel::validate() const
LL_WARNS("Inventory") << "link " << item->getUUID() << " type " << item->getActualType()
<< " missing backlink info at target_id " << target_id
<< LL_ENDL;
+ orphaned++;
}
// Links should have referents.
if (item->getActualType() == LLAssetType::AT_LINK && !target_item)
{
LL_WARNS("Inventory") << "broken item link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
+ orphaned++;
}
else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER && !target_cat)
{
LL_WARNS("Inventory") << "broken folder link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
+ orphaned++;
}
if (target_item && target_item->getIsLinkType())
{
@@ -4669,8 +4743,8 @@ LLPointer LLInventoryModel::validate() const
if (is_automatic)
{
LL_WARNS("Inventory") << "Fatal inventory corruption: cannot create system folder of type " << ft << LL_ENDL;
- fatalities++;
- validation_info->mMissingRequiredSystemFolders.insert(LLFolderType::EType(ft));
+ fatal_errs++;
+ validation_info->mMissingRequiredSystemFolders.insert(folder_type);
}
else
{
@@ -4681,8 +4755,20 @@ LLPointer LLInventoryModel::validate() const
else if (count_under_root > 1)
{
LL_WARNS("Inventory") << "Fatal inventory corruption: system folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL;
- validation_info->mDuplicateRequiredSystemFolders.insert(LLFolderType::EType(ft));
- fatalities++;
+ validation_info->mDuplicateRequiredSystemFolders.insert(folder_type);
+ if (!is_automatic && folder_type != LLFolderType::FT_SETTINGS)
+ {
+ // It is a fatal problem or can lead to fatal problems for COF,
+ // outfits, trash and other non-automatic folders.
+ fatal_errs++;
+ }
+ else
+ {
+ // For automatic folders it's not a fatal issue and shouldn't
+ // break inventory or other functionality further
+ // Exception: FT_SETTINGS is not automatic, but only deserves a warning.
+ warnings++;
+ }
}
if (count_elsewhere > 0)
{
@@ -4708,11 +4794,13 @@ LLPointer LLInventoryModel::validate() const
}
// FIXME need to fail login and tell user to retry, contact support if problem persists.
- bool valid = (fatalities == 0);
- LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatalities << ", warnings: " << warnings << ", valid: " << valid << LL_ENDL;
+ bool valid = (fatal_errs == 0);
+ LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatal_errs << ", warnings: " << warnings << ", valid: " << valid << LL_ENDL;
- validation_info->mFatalErrorCount = fatalities;
+ validation_info->mFatalErrorCount = fatal_errs;
validation_info->mWarningCount = warnings;
+ validation_info->mLoopCount = loops;
+ validation_info->mOrphanedCount = orphaned;
return validation_info;
}
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index d64590db87..cb3e886e16 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -72,6 +72,8 @@ public:
S32 mFatalErrorCount;
S32 mWarningCount;
+ S32 mLoopCount; // Presence of folders whose ansestors loop onto themselves
+ S32 mOrphanedCount; // Missing or orphaned items, links and folders
bool mInitialized;
bool mFatalNoRootFolder;
bool mFatalNoLibraryRootFolder;
@@ -301,9 +303,14 @@ public:
// Check if one object has a parent chain up to the category specified by UUID.
BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const;
-
+
+ enum EAnscestorResult{
+ ANSCESTOR_OK = 0,
+ ANSCESTOR_MISSING = 1,
+ ANSCESTOR_LOOP = 2,
+ };
// Follow parent chain to the top.
- bool getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
+ EAnscestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
// Re-added because of start folder id
// Collect all items in inventory that are linked to item_id.
diff --git a/indra/newview/llkeyconflict.cpp b/indra/newview/llkeyconflict.cpp
index b5ac94b1cd..d3ba18525b 100644
--- a/indra/newview/llkeyconflict.cpp
+++ b/indra/newview/llkeyconflict.cpp
@@ -411,8 +411,16 @@ void LLKeyConflictHandler::loadFromSettings(ESourceMode load_mode)
filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename_default);
if (!gDirUtilp->fileExists(filename) || !loadFromSettings(load_mode, filename, &mControlsMap))
{
- // mind placeholders
- mControlsMap.insert(mDefaultsMap.begin(), mDefaultsMap.end());
+ // Mind placeholders
+ // Do not use mControlsMap.insert(mDefaultsMap) since mControlsMap has
+ // placeholders that won't be added over(to) by insert.
+ // Or instead move generatePlaceholders call to be after copying
+ control_map_t::iterator iter = mDefaultsMap.begin();
+ while (iter != mDefaultsMap.end())
+ {
+ mControlsMap[iter->first].mKeyBind = iter->second.mKeyBind;
+ iter++;
+ }
}
}
mLoadMode = load_mode;
@@ -575,6 +583,8 @@ void LLKeyConflictHandler::saveToSettings(bool temporary)
break;
}
+ keys.xml_version.set(keybindings_xml_version, true);
+
if (temporary)
{
// write to temporary xml and use it for gViewerInput
@@ -667,13 +677,19 @@ void LLKeyConflictHandler::resetToDefault(const std::string &control_name, U32 i
{
return;
}
+ LLKeyConflict &type_data = mControlsMap[control_name];
+ if (!type_data.mAssignable)
+ {
+ return;
+ }
LLKeyData data = getDefaultControl(control_name, index);
- if (data != mControlsMap[control_name].getKeyData(index))
+ if (data != type_data.getKeyData(index))
{
// reset controls that might have been switched to our current control
removeConflicts(data, mControlsMap[control_name].mConflictMask);
mControlsMap[control_name].setKeyData(data, index);
+ mHasUnsavedChanges = true;
}
}
@@ -730,9 +746,9 @@ void LLKeyConflictHandler::resetToDefault(const std::string &control_name)
resetToDefaultAndResolve(control_name, false);
}
-void LLKeyConflictHandler::resetToDefaults(ESourceMode mode)
+void LLKeyConflictHandler::resetToDefaultsAndResolve()
{
- if (mode == MODE_SAVED_SETTINGS)
+ if (mLoadMode == MODE_SAVED_SETTINGS)
{
control_map_t::iterator iter = mControlsMap.begin();
control_map_t::iterator end = mControlsMap.end();
@@ -745,8 +761,16 @@ void LLKeyConflictHandler::resetToDefaults(ESourceMode mode)
else
{
mControlsMap.clear();
- generatePlaceholders(mode);
+
+ // Set key combinations.
+ // Copy from mDefaultsMap before doing generatePlaceholders, otherwise
+ // insert() will fail to add some keys into pre-existing values from
+ // generatePlaceholders()
mControlsMap.insert(mDefaultsMap.begin(), mDefaultsMap.end());
+
+ // Set conflict masks and mark functions (un)assignable
+ generatePlaceholders(mLoadMode);
+
}
mHasUnsavedChanges = true;
@@ -756,7 +780,7 @@ void LLKeyConflictHandler::resetToDefaults()
{
if (!empty())
{
- resetToDefaults(mLoadMode);
+ resetToDefaultsAndResolve();
}
else
{
@@ -766,7 +790,7 @@ void LLKeyConflictHandler::resetToDefaults()
// 3. We are loading 'current' only to replace it
// but it is reliable and works Todo: consider optimizing.
loadFromSettings(mLoadMode);
- resetToDefaults(mLoadMode);
+ resetToDefaultsAndResolve();
}
}
@@ -799,7 +823,7 @@ void LLKeyConflictHandler::resetKeyboardBindings()
void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode)
{
- // These controls are meant to cause conflicts when user tries to assign same control somewhere else
+ // These placeholders are meant to cause conflict resolution when user tries to assign same control somewhere else
// also this can be used to pre-record controls that should not conflict or to assign conflict groups/masks
if (load_mode == MODE_FIRST_PERSON)
@@ -859,24 +883,60 @@ void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode)
registerTemporaryControl("spin_around_ccw_sitting");
registerTemporaryControl("spin_around_cw_sitting");
}
+
+
+ // Special case, mouse clicks passed to scripts have 'lowest' piority
+ // thus do not conflict, everything else has a chance before them
+ // also in ML they have highest priority, but only when script-grabbed,
+ // thus do not conflict
+ // (see AGENT_CONTROL_ML_LBUTTON_DOWN and CONTROL_LBUTTON_DOWN_INDEX)
+ LLKeyConflict *type_data = &mControlsMap[script_mouse_handler_name];
+ type_data->mAssignable = true;
+ type_data->mConflictMask = U32_MAX - CONFLICT_LMOUSE;
}
-bool LLKeyConflictHandler::removeConflicts(const LLKeyData &data, const U32 &conlict_mask)
+bool LLKeyConflictHandler::removeConflicts(const LLKeyData &data, U32 conlict_mask)
{
if (conlict_mask == CONFLICT_NOTHING)
{
// Can't conflict
return true;
}
+
+ if (data.mMouse == CLICK_LEFT
+ && data.mMask == MASK_NONE
+ && data.mKey == KEY_NONE)
+ {
+ if ((conlict_mask & CONFLICT_LMOUSE) == 0)
+ {
+ // Can't conflict
+ return true;
+ }
+ else
+ {
+ // simplify conflict mask
+ conlict_mask = CONFLICT_LMOUSE;
+ }
+ }
+ else
+ {
+ // simplify conflict mask
+ conlict_mask &= ~CONFLICT_LMOUSE;
+ }
+
std::map conflict_list;
control_map_t::iterator cntrl_iter = mControlsMap.begin();
control_map_t::iterator cntrl_end = mControlsMap.end();
for (; cntrl_iter != cntrl_end; ++cntrl_iter)
{
+ const U32 cmp_mask = cntrl_iter->second.mConflictMask;
+ if ((cmp_mask & conlict_mask) == 0)
+ {
+ // can't conflict
+ continue;
+ }
S32 index = cntrl_iter->second.mKeyBind.findKeyData(data);
- if (index >= 0
- && cntrl_iter->second.mConflictMask != CONFLICT_NOTHING
- && (cntrl_iter->second.mConflictMask & conlict_mask) != 0)
+ if (index >= 0)
{
if (cntrl_iter->second.mAssignable)
{
diff --git a/indra/newview/llkeyconflict.h b/indra/newview/llkeyconflict.h
index 2926ca3aeb..23c1adf1e4 100644
--- a/indra/newview/llkeyconflict.h
+++ b/indra/newview/llkeyconflict.h
@@ -66,6 +66,7 @@ public:
};
const U32 CONFLICT_NOTHING = 0;
+ const U32 CONFLICT_LMOUSE = 0x1 << 1;
// at the moment this just means that key will conflict with everything that is identical
const U32 CONFLICT_ANY = U32_MAX;
@@ -128,23 +129,24 @@ public:
// resets current mode to defaults
void resetToDefaults();
- bool empty() { return mControlsMap.empty(); }
+ bool empty() const { return mControlsMap.empty(); }
void clear();
// reloads bindings from last valid user's xml or from default xml
// to keyboard's handler
static void resetKeyboardBindings();
- bool hasUnsavedChanges() { return mHasUnsavedChanges; }
+ bool hasUnsavedChanges() const { return mHasUnsavedChanges; }
void setLoadMode(ESourceMode mode) { mLoadMode = mode; }
- ESourceMode getLoadMode() { return mLoadMode; }
+ ESourceMode getLoadMode() const { return mLoadMode; }
private:
void resetToDefaultAndResolve(const std::string &control_name, bool ignore_conflicts);
- void resetToDefaults(ESourceMode mode);
+ void resetToDefaultsAndResolve();
// at the moment these kind of control is not savable, but takes part in conflict resolution
void registerTemporaryControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask, U32 conflict_mask);
+ // conflict mask 0 means that any conflicts will be ignored
void registerTemporaryControl(const std::string &control_name, U32 conflict_mask = 0);
typedef std::map control_map_t;
@@ -152,7 +154,7 @@ private:
bool loadFromSettings(const ESourceMode &load_mode, const std::string &filename, control_map_t *destination);
void generatePlaceholders(ESourceMode load_mode); //E.x. non-assignable values
// returns false in case user is trying to reuse control that can't be reassigned
- bool removeConflicts(const LLKeyData &data, const U32 &conlict_mask);
+ bool removeConflicts(const LLKeyData &data, U32 conlict_mask);
// removes flags and removes temporary file, returns 'true' if file was removed
bool clearUnsavedChanges();
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index ba175c27ca..7b41a7320c 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -165,13 +165,12 @@ void LLLoginInstance::constructAuthParams(LLPointer user_credentia
//requested_options.append("inventory-meat");
//requested_options.append("inventory-skel-targets");
#if (!defined LL_MINIMIAL_REQUESTED_OPTIONS)
- if(FALSE == gSavedSettings.getBOOL("NoInventoryLibrary"))
- {
- requested_options.append("inventory-lib-root");
- requested_options.append("inventory-lib-owner");
- requested_options.append("inventory-skel-lib");
+
+ // Not requesting library will trigger mFatalNoLibraryRootFolder
+ requested_options.append("inventory-lib-root");
+ requested_options.append("inventory-lib-owner");
+ requested_options.append("inventory-skel-lib");
// requested_options.append("inventory-meat-lib");
- }
requested_options.append("initial-outfit");
requested_options.append("gestures");
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 4a5b6243f3..4626745cb5 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -1182,6 +1182,11 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
}
else
{
+ // Media might be blocked, waiting for a file,
+ // send an empty response to unblock it
+ const std::vector empty_response;
+ self->sendPickFileResponse(empty_response);
+
LLNotificationsUtil::add("MediaFileDownloadUnsupported");
}
};
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index aa2a1325e8..f56ac47e92 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -2949,6 +2949,7 @@ void LLModelPreview::lookupLODModelFiles(S32 lod)
std::string lod_filename = mLODFile[LLModel::LOD_HIGH];
// BUG-230890 fix case-sensitive filename handling
// std::string ext = ".dae";
+ // LLStringUtil::toLower(lod_filename_lower);
// std::string::size_type i = lod_filename.rfind(ext);
// if (i != std::string::npos)
// {
@@ -4030,6 +4031,7 @@ void LLModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
if (!mLODFrozen)
{
genLODs(lod, 3, enforce_tri_limit);
+ mFMP->refresh(); // BUG-231970 Fix b0rken upload floater refresh
refresh();
}
}
diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp
index cb4c07a417..852b39f442 100644
--- a/indra/newview/llpathfindingmanager.cpp
+++ b/indra/newview/llpathfindingmanager.cpp
@@ -61,7 +61,7 @@
#define CAP_SERVICE_NAVMESH_STATUS "NavMeshGenerationStatus"
-#define CAP_SERVICE_OBJECT_LINKSETS "ObjectNavMeshProperties"
+#define CAP_SERVICE_OBJECT_LINKSETS "RegionObjects"
#define CAP_SERVICE_TERRAIN_LINKSETS "TerrainNavMeshProperties"
#define CAP_SERVICE_CHARACTERS "CharacterProperties"
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index bf5ccdc593..afda93c3a3 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -1033,7 +1033,6 @@ void LLPreviewGesture::finishInventoryUpload(LLUUID itemId, LLUUID newAssetId)
// active map with the new pointer.
if (LLGestureMgr::instance().isGestureActive(itemId))
{
- //*TODO: This is crashing for some reason. Fix it.
// Active gesture edited from menu.
LLGestureMgr::instance().replaceGesture(itemId, newAssetId);
gInventory.notifyObservers();
diff --git a/indra/newview/llsearchableui.cpp b/indra/newview/llsearchableui.cpp
index acd325e0af..7548b178b9 100644
--- a/indra/newview/llsearchableui.cpp
+++ b/indra/newview/llsearchableui.cpp
@@ -134,8 +134,11 @@ void ll::statusbar::SearchableItem::setNotHighlighted( )
{
mCtrl->setHighlighted( false );
- if( mWasHiddenBySearch )
- mMenu->setVisible( TRUE );
+ if (mWasHiddenBySearch)
+ {
+ mMenu->setVisible(TRUE);
+ mWasHiddenBySearch = false;
+ }
}
}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 62d33f8620..70d6d4a116 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -3100,10 +3100,6 @@ bool idle_startup()
// Have the agent start watching the friends list so we can update proxies
gAgent.observeFriends();
- if (gSavedSettings.getBOOL("LoginAsGod"))
- {
- gAgent.requestEnterGodMode();
- }
// Start automatic replay if the flag is set.
if (gSavedSettings.getBOOL("StatsAutoRun") || gAgentPilot.getReplaySession())
@@ -3652,19 +3648,34 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
gAgentAvatarp->setSex(gender);
- // try to find the outfit - if not there, create some default
- // wearables.
+ // try to find the requested outfit or folder
+
+ // -- check for existing outfit in My Outfits
+ bool do_copy = false;
LLUUID cat_id = findDescendentCategoryIDByName(
- gInventory.getLibraryRootFolderID(),
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS),
outfit_folder_name);
+
+ // -- check for existing folder in Library
if (cat_id.isNull())
{
+ cat_id = findDescendentCategoryIDByName(
+ gInventory.getLibraryRootFolderID(),
+ outfit_folder_name);
+ if (!cat_id.isNull())
+ {
+ do_copy = true;
+ }
+ }
+
+ if (cat_id.isNull())
+ {
+ // -- final fallback: create standard wearables
LL_DEBUGS() << "standard wearables" << LL_ENDL;
gAgentWearables.createStandardWearables();
}
else
{
- bool do_copy = true;
bool do_append = false;
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
// Need to fetch cof contents before we can wear.
@@ -4671,6 +4682,19 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
}
}
+ std::string fake_initial_outfit_name = gSavedSettings.getString("FakeInitialOutfitName");
+ if (!fake_initial_outfit_name.empty())
+ {
+ gAgent.setFirstLogin(TRUE);
+ sInitialOutfit = fake_initial_outfit_name;
+ if (sInitialOutfitGender.empty())
+ {
+ sInitialOutfitGender = "female"; // just guess, will get overridden when outfit is worn anyway.
+ }
+
+ LL_WARNS() << "Faking first-time login with initial outfit " << sInitialOutfit << LL_ENDL;
+ }
+
// set the location of the Agent Appearance service, from which we can request
// avatar baked textures if they are supported by the current region
std::string agent_appearance_url = response["agent_appearance_service"];
diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp
index 08e26c7214..389c617c0a 100644
--- a/indra/newview/lltoolcomp.cpp
+++ b/indra/newview/lltoolcomp.cpp
@@ -44,6 +44,7 @@
#include "lltoolmgr.h"
#include "lltoolselectrect.h"
#include "lltoolplacer.h"
+#include "llviewerinput.h"
#include "llviewermenu.h"
#include "llviewerobject.h"
#include "llviewerwindow.h"
@@ -763,7 +764,7 @@ BOOL LLToolCompGun::handleHover(S32 x, S32 y, MASK mask)
BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)
{
// if the left button is grabbed, don't put up the pie menu
- if (gAgent.leftButtonGrabbed())
+ if (gAgent.leftButtonGrabbed() && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
{
gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
return FALSE;
@@ -780,7 +781,7 @@ BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)
BOOL LLToolCompGun::handleDoubleClick(S32 x, S32 y, MASK mask)
{
// if the left button is grabbed, don't put up the pie menu
- if (gAgent.leftButtonGrabbed())
+ if (gAgent.leftButtonGrabbed() && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
{
gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
return FALSE;
@@ -848,7 +849,10 @@ BOOL LLToolCompGun::handleRightMouseUp(S32 x, S32 y, MASK mask)
BOOL LLToolCompGun::handleMouseUp(S32 x, S32 y, MASK mask)
{
- gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP);
+ if (gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP);
+ }
setCurrentTool( (LLTool*) mGun );
return TRUE;
}
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index 99138bbbd5..b175175801 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -51,6 +51,7 @@
#include "lltoolmgr.h"
#include "lltoolpie.h"
#include "llviewercamera.h"
+#include "llviewerinput.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
@@ -143,7 +144,6 @@ BOOL LLToolGrabBase::handleMouseDown(S32 x, S32 y, MASK mask)
LL_INFOS() << "LLToolGrab handleMouseDown" << LL_ENDL;
}
- // call the base class to propogate info to sim
LLTool::handleMouseDown(x, y, mask);
// leftButtonGrabbed() checks if controls are reserved by scripts, but does not take masks into account
@@ -153,6 +153,19 @@ BOOL LLToolGrabBase::handleMouseDown(S32 x, S32 y, MASK mask)
gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE);
}
mClickedInMouselook = gAgentCamera.cameraMouselook();
+
+ if (mClickedInMouselook && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
+ {
+ // LLToolCompGun::handleMouseDown handles the event if ML controls are grabed,
+ // but LLToolGrabBase is often the end point for mouselook clicks if ML controls
+ // are not grabbed and LLToolGrabBase::handleMouseDown consumes the event,
+ // so send clicks from here.
+ // We are sending specifically CONTROL_LBUTTON_DOWN instead of _ML_ version.
+ gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);
+
+ // Todo: LLToolGrabBase probably shouldn't consume the event if there is nothing
+ // to grab in Mouselook, it intercepts handling in scanMouse
+ }
return TRUE;
}
@@ -980,9 +993,18 @@ void LLToolGrabBase::handleHoverFailed(S32 x, S32 y, MASK mask)
BOOL LLToolGrabBase::handleMouseUp(S32 x, S32 y, MASK mask)
{
- // call the base class to propogate info to sim
LLTool::handleMouseUp(x, y, mask);
+ if (gAgentCamera.cameraMouselook() && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
+ {
+ // LLToolCompGun::handleMouseUp handles the event if ML controls are grabed,
+ // but LLToolGrabBase is often the end point for mouselook clicks if ML controls
+ // are not grabbed and LToolGrabBase::handleMouseUp consumes the event,
+ // so send clicks from here.
+ // We are sending specifically CONTROL_LBUTTON_UP instead of _ML_ version.
+ gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);
+ }
+
if( hasMouseCapture() )
{
setMouseCapture( FALSE );
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 1833c78136..14ace2ac63 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -445,8 +445,9 @@ BOOL LLToolPie::handleLeftClickPick()
gFocusMgr.setKeyboardFocus(NULL);
}
- BOOL touchable = (object && object->flagHandleTouch())
- || (parent && parent->flagHandleTouch());
+ bool touchable = object
+ && (object->getClickAction() != CLICK_ACTION_DISABLED)
+ && (object->flagHandleTouch() || (parent && parent->flagHandleTouch()));
// Switch to grab tool if physical or triggerable
if (object &&
@@ -754,6 +755,12 @@ bool LLToolPie::teleportToClickedLocation()
LLViewerObject* objp = mHoverPick.getObject();
LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL;
+ if (objp && (objp->getAvatar() == gAgentAvatarp || objp == gAgentAvatarp)) // ex: nametag
+ {
+ // Don't teleport to self, teleporting to other avatars is fine
+ return false;
+ }
+
bool is_in_world = mHoverPick.mObjectID.notNull() && objp && !objp->isHUDAttachment();
bool is_land = mHoverPick.mPickType == LLPickInfo::PICK_LAND;
bool pos_non_zero = !mHoverPick.mPosGlobal.isExactlyZero();
@@ -867,7 +874,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
else if (!mMouseOutsideSlop
&& mMouseButtonDown
// disable camera steering if click on land is not used for moving
- && gViewerInput.isMouseBindUsed(CLICK_LEFT))
+ && gViewerInput.isMouseBindUsed(CLICK_LEFT, MASK_NONE, MODE_THIRD_PERSON))
{
S32 delta_x = x - mMouseDownX;
S32 delta_y = y - mMouseDownY;
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index cb09f52d97..d4a9398259 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -356,7 +356,7 @@ void LLViewerAssetStorage::checkForTimeouts()
// Restore requests
LLCoprocedureManager* manager = LLCoprocedureManager::getInstance();
while (mCoroWaitList.size() > 0
- && manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < LLCoprocedureManager::DEFAULT_QUEUE_SIZE)
+ && manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
{
CoroWaitList &request = mCoroWaitList.front();
@@ -430,7 +430,8 @@ void LLViewerAssetStorage::queueRequestHttp(
if (!duplicate)
{
// Coroutine buffer has fixed size (synchronization buffer, so we have no alternatives), so buffer any request above limit
- if (LLCoprocedureManager::instance().count(VIEWER_ASSET_STORAGE_CORO_POOL) < LLCoprocedureManager::DEFAULT_QUEUE_SIZE)
+ LLCoprocedureManager* manager = LLCoprocedureManager::getInstance();
+ if (manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
{
// [UDP Assets]
//bool with_http = true;
@@ -438,7 +439,7 @@ void LLViewerAssetStorage::queueRequestHttp(
//LLViewerAssetStatsFF::record_enqueue(atype, with_http, is_temp);
// [UDP Assets]
- LLCoprocedureManager::instance().enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL, "LLViewerAssetStorage::assetRequestCoro",
+ manager->enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL, "LLViewerAssetStorage::assetRequestCoro",
boost::bind(&LLViewerAssetStorage::assetRequestCoro, this, req, uuid, atype, callback, user_data));
}
else
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 3ef82e5e26..0a412f983b 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -1127,7 +1127,7 @@ void handleUserTargetDrawDistanceChanged(const LLSD& newValue)
void handleUserTargetReflectionsChanged(const LLSD& newValue)
{
- const auto newval = gSavedSettings.getF32("FSUserTargetReflections");
+ const auto newval = gSavedSettings.getS32("FSUserTargetReflections");
FSPerfStats::tunables.userTargetReflections = newval;
}
diff --git a/indra/newview/llviewerinput.cpp b/indra/newview/llviewerinput.cpp
index 782cf21728..881a7df71a 100644
--- a/indra/newview/llviewerinput.cpp
+++ b/indra/newview/llviewerinput.cpp
@@ -908,13 +908,20 @@ bool toggle_enable_media(EKeystate s)
bool walk_to(EKeystate s)
{
- if (KEYSTATE_DOWN != s) return true;
+ if (KEYSTATE_DOWN != s)
+ {
+ // teleport/walk is usually on mouseclick, mouseclick needs
+ // to let AGENT_CONTROL_LBUTTON_UP happen if teleport didn't,
+ // so return false, but if it causes issues, do some kind of
+ // "return !has_teleported"
+ return false;
+ }
return LLToolPie::getInstance()->walkToClickedLocation();
}
bool teleport_to(EKeystate s)
{
- if (KEYSTATE_DOWN != s) return true;
+ if (KEYSTATE_DOWN != s) return false;
return LLToolPie::getInstance()->teleportToClickedLocation();
}
@@ -942,7 +949,47 @@ bool voice_follow_key(EKeystate s)
return false;
}
-bool agen_control_lbutton_handle(EKeystate s)
+bool script_trigger_lbutton(EKeystate s)
+{
+ // Check for script overriding/expecting left mouse button.
+ // Note that this does not pass event further and depends onto mouselook.
+ // Checks CONTROL_ML_LBUTTON_DOWN_INDEX for mouselook,
+ // CONTROL_LBUTTON_DOWN_INDEX for normal camera
+ if (gAgent.leftButtonGrabbed())
+ {
+ bool mouselook = gAgentCamera.cameraMouselook();
+ switch (s)
+ {
+ case KEYSTATE_DOWN:
+ if (mouselook)
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
+ }
+ else
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);
+ }
+ return true;
+ case KEYSTATE_UP:
+ if (mouselook)
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP);
+ }
+ else
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);
+ }
+ return true;
+ default:
+ break;
+ }
+ }
+ return false;
+}
+
+// Used by scripts, for overriding/handling left mouse button
+// see mControlsTakenCount
+bool agent_control_lbutton_handle(EKeystate s)
{
switch (s)
{
@@ -1014,6 +1061,7 @@ REGISTER_KEYBOARD_ACTION("teleport_to", teleport_to);
REGISTER_KEYBOARD_ACTION("walk_to", walk_to);
REGISTER_KEYBOARD_GLOBAL_ACTION("toggle_voice", toggle_voice);
REGISTER_KEYBOARD_GLOBAL_ACTION("voice_follow_key", voice_follow_key);
+REGISTER_KEYBOARD_ACTION(script_mouse_handler_name, script_trigger_lbutton);
#undef REGISTER_KEYBOARD_ACTION
LLViewerInput::LLViewerInput()
@@ -1286,6 +1334,20 @@ BOOL LLViewerInput::bindMouse(const S32 mode, const EMouseClickType mouse, const
typedef boost::function function_t;
function_t function = NULL;
+ if (mouse == CLICK_LEFT
+ && mask == MASK_NONE
+ && function_name == script_mouse_handler_name)
+ {
+ // Special case
+ // Left click has script overrides and by default
+ // is handled via agent_control_lbutton as last option
+ // In case of mouselook and present overrides it has highest
+ // priority even over UI and is handled in LLToolCompGun::handleMouseDown
+ // so just mark it as having default handler
+ mLMouseDefaultHandling[mode] = true;
+ return TRUE;
+ }
+
LLKeybindFunctionData* result = LLKeyboardActionRegistry::getValue(function_name);
if (result)
{
@@ -1362,7 +1424,8 @@ LLViewerInput::Keys::Keys()
: first_person("first_person"),
third_person("third_person"),
sitting("sitting"),
- edit_avatar("edit_avatar")
+ edit_avatar("edit_avatar"),
+ xml_version("xml_version", 0)
{}
void LLViewerInput::resetBindings()
@@ -1373,6 +1436,7 @@ void LLViewerInput::resetBindings()
mGlobalMouseBindings[i].clear();
mKeyBindings[i].clear();
mMouseBindings[i].clear();
+ mLMouseDefaultHandling[i] = false;
}
}
@@ -1391,6 +1455,65 @@ S32 LLViewerInput::loadBindingsXML(const std::string& filename)
binding_count += loadBindingMode(keys.third_person, MODE_THIRD_PERSON);
binding_count += loadBindingMode(keys.sitting, MODE_SITTING);
binding_count += loadBindingMode(keys.edit_avatar, MODE_EDIT_AVATAR);
+
+ // verify version
+ if (keys.xml_version < 1)
+ {
+ // updating from a version that was not aware of LMouse bindings
+ for (S32 i = 0; i < MODE_COUNT; i++)
+ {
+ mLMouseDefaultHandling[i] = true;
+ }
+
+ // fix missing values
+ KeyBinding mouse_binding;
+ mouse_binding.key = "";
+ mouse_binding.mask = "NONE";
+ mouse_binding.mouse = "LMB";
+ mouse_binding.command = script_mouse_handler_name;
+
+ if (keys.third_person.isProvided())
+ {
+ keys.third_person.bindings.add(mouse_binding);
+ }
+
+ if (keys.first_person.isProvided())
+ {
+ keys.first_person.bindings.add(mouse_binding);
+ }
+
+ if (keys.sitting.isProvided())
+ {
+ keys.sitting.bindings.add(mouse_binding);
+ }
+
+ if (keys.edit_avatar.isProvided())
+ {
+ keys.edit_avatar.bindings.add(mouse_binding);
+ }
+
+ // fix version
+ keys.xml_version.set(keybindings_xml_version, true);
+
+ // Write the resulting XML to file
+ LLXMLNodePtr output_node = new LLXMLNode("keys", false);
+ LLXUIParser write_parser;
+ write_parser.writeXUI(output_node, keys);
+
+ if (!output_node->isNull())
+ {
+ // file in app_settings is supposed to be up to date
+ // this is only for the file from user_settings
+ LL_INFOS("ViewerInput") << "Updating file " << filename << " to a newer version" << LL_ENDL;
+ LLFILE *fp = LLFile::fopen(filename, "w");
+ if (fp != NULL)
+ {
+ LLXMLNode::writeHeaderToFile(fp);
+ output_node->writeToFile(fp);
+ fclose(fp);
+ }
+ }
+ }
}
return binding_count;
}
@@ -1562,17 +1685,6 @@ bool LLViewerInput::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level)
bool res = scanKey(mKeyBindings[mode], mKeyBindings[mode].size(), key, mask, key_down, key_up, key_level, repeat);
- if (!res && agent_control_lbutton.canHandle(CLICK_NONE, key, mask))
- {
- if (key_down && !repeat)
- {
- res = agen_control_lbutton_handle(KEYSTATE_DOWN);
- }
- if (key_up)
- {
- res = agen_control_lbutton_handle(KEYSTATE_UP);
- }
- }
return res;
}
@@ -1696,29 +1808,36 @@ bool LLViewerInput::scanMouse(EMouseClickType click, EMouseState state) const
bool res = false;
S32 mode = getMode();
MASK mask = gKeyboard->currentMask(TRUE);
-
- // By default mouse clicks require exact mask
- // Todo: support for mIgnoreMasks because some functions like teleports
- // expect to be canceled, but for voice it's prefered to ignore mask.
res = scanMouse(mMouseBindings[mode], mMouseBindings[mode].size(), click, mask, state, false);
- // no user defined actions found or those actions can't handle the key/button, handle control if nessesary
- if (!res && agent_control_lbutton.canHandle(click, KEY_NONE, mask))
+
+ // No user defined actions found or those actions can't handle the key/button,
+ // so handle CONTROL_LBUTTON if nessesary.
+ //
+ // Default handling for MODE_FIRST_PERSON is in LLToolCompGun::handleMouseDown,
+ // and sends AGENT_CONTROL_ML_LBUTTON_DOWN, but it only applies if ML controls
+ // are leftButtonGrabbed(), send a normal click otherwise.
+
+ if (!res
+ && mLMouseDefaultHandling[mode]
+ && (mode != MODE_FIRST_PERSON || !gAgent.leftButtonGrabbed())
+ && (click == CLICK_LEFT || click == CLICK_DOUBLELEFT)
+ )
{
switch (state)
{
case MOUSE_STATE_DOWN:
- agen_control_lbutton_handle(KEYSTATE_DOWN);
+ agent_control_lbutton_handle(KEYSTATE_DOWN);
res = true;
break;
case MOUSE_STATE_CLICK:
// might not work best with some functions,
// but some function need specific states too specifically
- agen_control_lbutton_handle(KEYSTATE_DOWN);
- agen_control_lbutton_handle(KEYSTATE_UP);
+ agent_control_lbutton_handle(KEYSTATE_DOWN);
+ agent_control_lbutton_handle(KEYSTATE_UP);
res = true;
break;
case MOUSE_STATE_UP:
- agen_control_lbutton_handle(KEYSTATE_UP);
+ agent_control_lbutton_handle(KEYSTATE_UP);
res = true;
break;
default:
@@ -1748,7 +1867,7 @@ void LLViewerInput::scanMouse()
}
}
-bool LLViewerInput::isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode)
+bool LLViewerInput::isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) const
{
S32 size = mMouseBindings[mode].size();
for (S32 index = 0; index < size; index++)
diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h
index 2efb5c95ba..d5c8e6c8e1 100644
--- a/indra/newview/llviewerinput.h
+++ b/indra/newview/llviewerinput.h
@@ -31,6 +31,8 @@
#include "llinitparam.h"
const S32 MAX_KEY_BINDINGS = 128; // was 60
+const S32 keybindings_xml_version = 1;
+const std::string script_mouse_handler_name = "script_trigger_lbutton";
class LLNamedFunction
{
@@ -100,7 +102,7 @@ public:
third_person,
sitting,
edit_avatar;
-
+ Optional xml_version; // 'xml', because 'version' appears to be reserved
Keys();
};
@@ -131,7 +133,8 @@ public:
BOOL handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down);
void scanMouse();
- bool isMouseBindUsed(const EMouseClickType mouse, const MASK mask = MASK_NONE, const S32 mode = MODE_THIRD_PERSON);
+ bool isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) const;
+ bool isLMouseHandlingDefault(const S32 mode) const { return mLMouseDefaultHandling[mode]; }
private:
bool scanKey(const std::vector &binding,
@@ -171,6 +174,7 @@ private:
// to send what we think function wants based on collection of bools (mKeyRepeated, mKeyLevel, mKeyDown)
std::vector mKeyBindings[MODE_COUNT];
std::vector mMouseBindings[MODE_COUNT];
+ bool mLMouseDefaultHandling[MODE_COUNT]; // Due to having special priority
// keybindings that do not consume event and are handled earlier, before floaters
std::vector mGlobalKeyBindings[MODE_COUNT];
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 2217a10d8e..dd4a806fc8 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -3262,10 +3262,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
case LLViewerMediaObserver::MEDIA_EVENT_FILE_DOWNLOAD:
{
LL_DEBUGS("Media") << "Media event - file download requested - filename is " << plugin->getFileDownloadFilename() << LL_ENDL;
-
- //unblock media plugin
- const std::vector empty_response;
- plugin->sendPickFileResponse(empty_response);
}
break;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index df1afbc78c..126725d6b0 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -159,6 +159,7 @@
#include "llcheckboxctrl.h"
#include "llfloatergridstatus.h"
#include "llfloaterpreference.h"
+#include "llkeyconflict.h"
#include "lllogininstance.h"
#include "llscenemonitor.h"
#include "llsdserialize.h"
@@ -9689,26 +9690,88 @@ class LLToggleShaderControl : public view_listener_t
};
//[FIX FIRE-1927 - enable DoubleClickTeleport shortcut : SJ]
-class LLAdvancedToggleDoubleClickTeleport: public view_listener_t
+// This stuff is based on LLPanelPreferenceControls::setKeyBind() and LLPanelPreferenceControls::canKeyBindHandle()
+void setDoubleClickAction(const std::string& control)
+{
+ constexpr LLKeyConflictHandler::ESourceMode mode{ LLKeyConflictHandler::MODE_THIRD_PERSON };
+ constexpr EMouseClickType click{ EMouseClickType::CLICK_DOUBLELEFT };
+ constexpr KEY key{ KEY_NONE };
+ constexpr MASK mask{ MASK_NONE };
+
+ LLKeyConflictHandler conflictHandler;
+ conflictHandler.setLoadMode(mode);
+ conflictHandler.loadFromSettings(mode);
+
+ if (!conflictHandler.canAssignControl(control))
+ {
+ return;
+ }
+
+ bool is_enabled = conflictHandler.canHandleControl(control, click, key, mask);
+ if (!is_enabled)
+ {
+ // find free spot to add data, if no free spot, assign to first
+ S32 index = 0;
+ for (S32 i = 0; i < 3; i++)
+ {
+ if (conflictHandler.getControl(control, i).isEmpty())
+ {
+ index = i;
+ break;
+ }
+ }
+
+ bool ignore_mask = true;
+ conflictHandler.registerControl(control, index, click, key, mask, ignore_mask);
+ }
+ else
+ {
+ // find specific control and reset it
+ for (S32 i = 0; i < 3; i++)
+ {
+ LLKeyData data = conflictHandler.getControl(control, i);
+ if (data.mMouse == click && data.mKey == key && data.mMask == mask)
+ {
+ conflictHandler.clearControl(control, i);
+ }
+ }
+ }
+
+ conflictHandler.saveToSettings();
+}
+
+bool isDoubleClickActionEnabled(const std::string control)
+{
+ constexpr LLKeyConflictHandler::ESourceMode mode{ LLKeyConflictHandler::MODE_THIRD_PERSON };
+ constexpr EMouseClickType click{ EMouseClickType::CLICK_DOUBLELEFT };
+ constexpr KEY key{ KEY_NONE };
+ constexpr MASK mask{ MASK_NONE };
+
+ LLKeyConflictHandler conflictHandler;
+ conflictHandler.loadFromSettings(mode);
+
+ return conflictHandler.canHandleControl(control, click, key, mask);
+}
+
+class FSAdvancedToggleDoubleClickAction: public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- BOOL checked = gSavedSettings.getBOOL("DoubleClickTeleport");
- if (checked)
- {
- gSavedSettings.setBOOL("DoubleClickTeleport", FALSE);
- report_to_nearby_chat(LLTrans::getString("DoubleClickTeleportDisabled"));
- }
- else
- {
- gSavedSettings.setBOOL("DoubleClickTeleport", TRUE);
- gSavedSettings.setBOOL("DoubleClickAutoPilot", FALSE);
- report_to_nearby_chat(LLTrans::getString("DoubleClickTeleportEnabled"));
- }
+ const std::string& control = userdata.asStringRef();
+ setDoubleClickAction(control);
return true;
}
};
+class FSAdvancedCheckEnabledDoubleClickAction : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ const std::string& control = userdata.asStringRef();
+ return isDoubleClickActionEnabled(control);
+ }
+};
+
// Add telemetry controls to the viewer menus
class FSTelemetryToggleActive : public view_listener_t
{
@@ -11963,7 +12026,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedClickRenderProfile(), "Advanced.ClickRenderProfile");
view_listener_t::addMenu(new LLAdvancedClickRenderBenchmark(), "Advanced.ClickRenderBenchmark");
//[FIX FIRE-1927 - enable DoubleClickTeleport shortcut : SJ]
- view_listener_t::addMenu(new LLAdvancedToggleDoubleClickTeleport, "Advanced.ToggleDoubleClickTeleport");
+ view_listener_t::addMenu(new FSAdvancedToggleDoubleClickAction, "Advanced.SetDoubleClickAction");
+ view_listener_t::addMenu(new FSAdvancedCheckEnabledDoubleClickAction, "Advanced.CheckEnabledDoubleClickAction");
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
view_listener_t::addMenu(new LLAdvancedHandleToggleHackedGodmode(), "Advanced.HandleToggleHackedGodmode");
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 9da25ecbc2..6c015d4b34 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -1316,6 +1316,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num, MAX_OBJECT_BINARY_DATA_SIZE);
mTotalCRC = crc;
+ // Might need to update mSourceMuted here to properly pick up new radius
mSoundCutOffRadius = cutoff;
// Owner ID used for sound muting or particle system muting
@@ -6042,7 +6043,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
else if (flags & LL_SOUND_FLAG_STOP)
{
// Just shut off the sound
- mAudioSourcep->play(LLUUID::null);
+ mAudioSourcep->stop();
}
return;
}
@@ -6089,7 +6090,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
mAudioSourcep->setQueueSounds(queue);
if(!queue) // stop any current sound first to avoid "farts of doom" (SL-1541) -MG
{
- mAudioSourcep->play(LLUUID::null);
+ mAudioSourcep->stop();
}
// Play this sound if region maturity permits
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index a0ae4a9f9b..028bfcd64c 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -3042,6 +3042,21 @@ void LLViewerRegion::unpackRegionHandshake()
}
mCentralBakeVersion = region_protocols & 1; // was (S32)gSavedSettings.getBOOL("UseServerTextureBaking");
+ // Earlier trigger for BOM support on region
+ #ifdef OPENSIM
+ constexpr U64 REGION_SUPPORTS_BOM {(U64)1<<63};
+ if(region_protocols & REGION_SUPPORTS_BOM) // OS sets bit 63 when BOM supported
+ {
+ mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES;
+ mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES;
+ }
+ else
+ {
+ mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_LEFT_ARM;
+ mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_HEAD_UNIVERSAL_TATTOO;
+ }
+ #endif
+ //
LLVLComposition *compp = getComposition();
if (compp)
{
@@ -3226,12 +3241,12 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("ObjectAnimation");
capabilityNames.append("ObjectMedia");
capabilityNames.append("ObjectMediaNavigate");
- capabilityNames.append("ObjectNavMeshProperties");
capabilityNames.append("ParcelPropertiesUpdate");
capabilityNames.append("ParcelVoiceInfoRequest");
capabilityNames.append("ProductInfoRequest");
capabilityNames.append("ProvisionVoiceAccountRequest");
capabilityNames.append("ReadOfflineMsgs"); // Requires to respond reliably: AcceptFriendship, AcceptGroupInvite, DeclineFriendship, DeclineGroupInvite
+ capabilityNames.append("RegionObjects");
capabilityNames.append("RemoteParcelRequest");
capabilityNames.append("RenderMaterials");
capabilityNames.append("RequestTextureDownload");
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index b08f70258c..012fed6ce2 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2506,6 +2506,10 @@ void LLViewerWindow::initWorldUI()
LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance();
panel_ssf_container->addChild(panel_stand_stop_flying);
+ // Leave this out for now until somebody wants to adjust the panel_toolbar_view.xml files...
+ //LLPanelHideBeacon* panel_hide_beacon = LLPanelHideBeacon::getInstance();
+ //panel_ssf_container->addChild(panel_hide_beacon);
+
panel_ssf_container->setVisible(TRUE);
LLMenuOptionPathfindingRebakeNavmesh::getInstance()->initialize();
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 6883bdc364..957cf07b77 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1448,11 +1448,8 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
LL_RECORD_BLOCK_TIME(FTM_AVATAR_EXTENT_UPDATE);
-// not called as often as it used to be but still no harm in optimising
-// S32 box_detail = gSavedSettings.getS32("AvatarBoundingBoxComplexity");
- static const LLCachedControl avatar_bounding_box_complexity(gSavedSettings, "AvatarBoundingBoxComplexity");
- S32 box_detail(avatar_bounding_box_complexity);
-//
+ static LLCachedControl box_detail_cache(gSavedSettings, "AvatarBoundingBoxComplexity");
+ S32 box_detail = box_detail_cache;
if (getOverallAppearance() != AOA_NORMAL)
{
if (isControlAvatar())
@@ -2695,17 +2692,14 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
{
LL_INFOS() << "Warning! Idle on dead avatar" << LL_ENDL;
return;
- }
+ }
// record time and refresh "tooSlow" status
FSPerfStats::RecordAvatarTime T(getID(), FSPerfStats::StatType_t::RENDER_IDLE); // per avatar "idle" time.
updateTooSlow();
// ;
- // Use LLCachedControl
static LLCachedControl disable_all_render_types(gSavedSettings, "DisableAllRenderTypes");
if (!(gPipeline.hasRenderType(mIsControlAvatar ? LLPipeline::RENDER_TYPE_CONTROL_AV : LLPipeline::RENDER_TYPE_AVATAR))
- //&& !(gSavedSettings.getBOOL("DisableAllRenderTypes")) && !isSelf())
- && !(disable_all_render_types) && !isSelf())
- //
+ && !disable_all_render_types && !isSelf())
{
if (!mIsControlAvatar)
{
@@ -2867,12 +2861,9 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
// Don't render the user's own voice visualizer when in mouselook, or when opening the mic is disabled.
if(isSelf())
{
- // Faster debug settings
- //if(gAgentCamera.cameraMouselook() || gSavedSettings.getBOOL("VoiceDisableMic"))
- static LLCachedControl voiceDisableMic(gSavedSettings, "VoiceDisableMic");
+ static LLCachedControl voiceDisableMic(gSavedSettings, "VoiceDisableMic");
static LLCachedControl fsShowMyOwnVoiceVisualizer(gSavedSettings, "FSShowMyOwnVoiceVisualizer"); // FIRE-21210: Don't show my voice visualizer
if (gAgentCamera.cameraMouselook() || voiceDisableMic || !fsShowMyOwnVoiceVisualizer)
- //
{
render_visualizer = false;
}
@@ -3388,16 +3379,12 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
mChats.clear();
}
- static LLCachedControl renderNameShowTime(gSavedSettings, "RenderNameShowTime");
- static LLCachedControl renderNameFadeDuration(gSavedSettings, "RenderNameFadeDuration");
- static LLCachedControl useChatBubbles(gSavedSettings, "UseChatBubbles");
- static LLCachedControl useTypingBubbles(gSavedSettings, "UseTypingBubbles");
- static LLCachedControl renderNameShowSelf(gSavedSettings, "RenderNameShowSelf");
- static LLCachedControl avatarNameTagMode(gSavedSettings, "AvatarNameTagMode");
-
const F32 time_visible = mTimeVisible.getElapsedTimeF32();
- const F32 NAME_SHOW_TIME = F32(renderNameShowTime); // seconds
- const F32 FADE_DURATION = F32(renderNameFadeDuration); // seconds
+ static LLCachedControl NAME_SHOW_TIME(gSavedSettings, "RenderNameShowTime"); // seconds
+ static LLCachedControl FADE_DURATION(gSavedSettings, "RenderNameFadeDuration"); // seconds
+ static LLCachedControl use_chat_bubbles(gSavedSettings, "UseChatBubbles");
+ static LLCachedControl use_typing_bubbles(gSavedSettings, "UseTypingBubbles");
+
// [RLVa:KB] - Checked: RLVa-2.0.1
bool fRlvShowAvTag = true, fRlvShowAvName = true;
if (RlvActions::isRlvEnabled())
@@ -3406,9 +3393,9 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
fRlvShowAvName = (fRlvShowAvTag) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, getID()));
}
// [/RLVa:KB]
- BOOL visible_chat = useChatBubbles && (mChats.size() || mTyping);
- BOOL visible_typing = useTypingBubbles && mTyping;
- BOOL render_name = visible_chat ||
+ bool visible_chat = use_chat_bubbles && (mChats.size() || mTyping);
+ bool visible_typing = use_typing_bubbles && mTyping;
+ bool render_name = visible_chat ||
visible_typing ||
// [RLVa:KB] - Checked: RLVa-2.0.1
((fRlvShowAvTag) &&
@@ -3419,10 +3406,11 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
// draw if we're specifically hiding our own name.
if (isSelf())
{
+ static LLCachedControl render_name_show_self(gSavedSettings, "RenderNameShowSelf");
+ static LLCachedControl name_tag_mode(gSavedSettings, "AvatarNameTagMode");
render_name = render_name
&& !gAgentCamera.cameraMouselook()
- && (visible_chat || (renderNameShowSelf
- && S32(avatarNameTagMode) ));
+ && (visible_chat || (render_name_show_self && name_tag_mode));
}
if ( !render_name )
@@ -3437,7 +3425,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
return;
}
- BOOL new_name = FALSE;
+ bool new_name = FALSE;
if (visible_chat != mVisibleChat)
{
mVisibleChat = visible_chat;
@@ -3520,7 +3508,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
// idleUpdateNameTagAlpha(new_name, alpha);
}
-void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
+void LLVOAvatar::idleUpdateNameTagText(bool new_name)
{
LLNameValue *title = getNVPair("Title");
LLNameValue* firstname = getNVPair("FirstName");
@@ -4137,7 +4125,7 @@ void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
mNameText->setPositionAgent(name_position);
}
-void LLVOAvatar::idleUpdateNameTagAlpha(BOOL new_name, F32 alpha)
+void LLVOAvatar::idleUpdateNameTagAlpha(bool new_name, F32 alpha)
{
llassert(mNameText);
@@ -4336,11 +4324,8 @@ void LLVOAvatar::updateAppearanceMessageDebugText()
{
debug_line += llformat(" - cof: %d req: %d rcv:%d",
curr_cof_version, last_request_cof_version, last_received_cof_version);
- // Use LLCachedControl
- //if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure"))
- static LLCachedControl debug_force_appearance_request_failure(gSavedSettings, "DebugForceAppearanceRequestFailure");
- if (debug_force_appearance_request_failure)
- //
+ static LLCachedControl debug_force_failure(gSavedSettings, "DebugForceAppearanceRequestFailure");
+ if (debug_force_failure)
{
debug_line += " FORCING ERRS";
}
@@ -6681,8 +6666,8 @@ BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL
if (PlayModeUISndTyping)
// FIRE-8190: Preview function for "UI Sounds" Panel
{
- static LLCachedControl uiSndTyping(gSavedSettings, "UISndTyping");
- LLUUID sound_id = LLUUID(uiSndTyping);
+ static LLCachedControl ui_snd_string(gSavedSettings, "UISndTyping");
+ LLUUID sound_id = LLUUID(ui_snd_string);
gAudiop->triggerSound(sound_id, getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_SFX, char_pos_global);
}
}
@@ -6750,7 +6735,7 @@ void LLVOAvatar::resetAnimations()
// animations.
LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
{
- static LLCachedControl use_new_walk_run(gSavedSettings, "UseNewWalkRun");
+ static LLCachedControl use_new_walk_run(gSavedSettings, "UseNewWalkRun");
LLUUID result = id;
// start special case female walk for female avatars
@@ -9225,11 +9210,8 @@ void LLVOAvatar::updateTooSlow()
bool LLVOAvatar::isTooComplex() const
{
bool too_complex;
- // Performance improvement
- //bool render_friend = (LLAvatarTracker::instance().isBuddy(getID()) && gSavedSettings.getBOOL("AlwaysRenderFriends"));
- static LLCachedControl alwaysRenderFriends(gSavedSettings, "AlwaysRenderFriends");
- bool render_friend = ( alwaysRenderFriends && LLAvatarTracker::instance().isBuddy( getID() ) ); // Beq note: isBuddy can be slow only check if we have to
- //
+ static LLCachedControl always_render_friends(gSavedSettings, "AlwaysRenderFriends");
+ bool render_friend = (LLAvatarTracker::instance().isBuddy(getID()) && always_render_friends);
if (isSelf() || render_friend || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
{
@@ -10114,7 +10096,8 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe
// Parse visual params, if any.
S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam);
- bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing
+ static LLCachedControl block_some_avatars(gSavedSettings, "BlockSomeAvatarAppearanceVisualParams");
+ bool drop_visual_params_debug = block_some_avatars && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing
if( num_blocks > 1 && !drop_visual_params_debug)
{
//LL_DEBUGS("Avatar") << avString() << " handle visual params, num_blocks " << num_blocks << LL_ENDL;
@@ -10232,11 +10215,11 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32
//-----------------------------------------------------------------------------
void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
{
- // Use LLCachedControl
- //bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage");
- static LLCachedControl enable_verbose_dumps(gSavedSettings, "DebugAvatarAppearanceMessage");
- //
- if (gSavedSettings.getBOOL("BlockAvatarAppearanceMessages"))
+ static LLCachedControl enable_verbose_dumps(gSavedSettings, "DebugAvatarAppearanceMessage");
+ static LLCachedControl block_avatar_appearance_messages(gSavedSettings, "BlockAvatarAppearanceMessages");
+
+ std::string dump_prefix = getFullname() + "_" + (isSelf()?"s":"o") + "_";
+ if (block_avatar_appearance_messages)
{
LL_WARNS() << "Blocking AvatarAppearance message" << LL_ENDL;
return;
@@ -10286,7 +10269,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
}
// [Legacy Bake]
- if (mLastUpdateReceivedCOFVersion >= thisAppearanceVersion)
+// appearance fail fix from Rye
+ // if (mLastUpdateReceivedCOFVersion >= thisAppearanceVersion)
+ if (appearance_version > 0 && mLastUpdateReceivedCOFVersion >= thisAppearanceVersion)
+//
{
LL_WARNS("Avatar") << "Stale appearance received #" << thisAppearanceVersion <<
" attempt to roll back from #" << mLastUpdateReceivedCOFVersion <<
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index ccbd1eb7c6..0488b861a8 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -289,9 +289,9 @@ public:
void idleUpdateLoadingEffect();
void idleUpdateWindEffect();
void idleUpdateNameTag(const LLVector3& root_pos_last);
- void idleUpdateNameTagText(BOOL new_name);
+ void idleUpdateNameTagText(bool new_name);
void idleUpdateNameTagPosition(const LLVector3& root_pos_last);
- void idleUpdateNameTagAlpha(BOOL new_name, F32 alpha);
+ void idleUpdateNameTagAlpha(bool new_name, F32 alpha);
// Colorize tags
//LLColor4 getNameTagColor(bool is_friend);
LLColor4 getNameTagColor();
@@ -980,8 +980,8 @@ public:
// Get typing status
bool isTyping() const { return mTyping; }
private:
- BOOL mVisibleChat;
- BOOL mVisibleTyping;
+ bool mVisibleChat;
+ bool mVisibleTyping;
//--------------------------------------------------------------------
// Lip synch morphs
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 2035f8b46b..208d1cb041 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -1274,8 +1274,9 @@ void LLVOAvatarSelf::checkBOMRebakeRequired()
{
if(getRegion())
{
- auto newBOMStatus = getRegion()->bakesOnMeshEnabled();
- if(!gSavedSettings.getBOOL("CurrentlyUsingBakesOnMesh") != newBOMStatus)
+ auto bom_can_be_used_here = getRegion()->bakesOnMeshEnabled();
+ static const LLCachedControl using_bom(gSavedSettings, "CurrentlyUsingBakesOnMesh", true);
+ if( using_bom != bom_can_be_used_here)
{
// force a rebake when the last grid we were on (including previous login) had different BOM support
// This replicates forceAppearanceUpdate rather than pulling in the whole of llavatarself.
@@ -1284,7 +1285,7 @@ void LLVOAvatarSelf::checkBOMRebakeRequired()
doAfterInterval(boost::bind(&LLVOAvatarSelf::forceBakeAllTextures, gAgentAvatarp.get(), true), 5.0);
}
// update the setting even if we are in SL so that switch SL to OS and back
- gSavedSettings.setBOOL("CurrentlyUsingBakesOnMesh", newBOMStatus);
+ gSavedSettings.setBOOL("CurrentlyUsingBakesOnMesh", bom_can_be_used_here);
}
}
}
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 4b0a3c8259..e2d548cf74 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -2126,7 +2126,7 @@ bool LLVivoxVoiceClient::waitForChannel()
{
LL_INFOS("Voice") << "Session requesting reprovision and login." << LL_ENDL;
requestRelog();
- break;
+ // break;// Fix broken state model
}
else if (mNextAudioSession)
{
@@ -2135,7 +2135,7 @@ bool LLVivoxVoiceClient::waitForChannel()
if (!runSession(joinSession)) //suspends
{
LL_DEBUGS("Voice") << "runSession returned false; leaving inner loop" << LL_ENDL;
- break;
+ // break; Fix broken state model
}
else
{
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 6785e5e8a7..99aa73f691 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -683,7 +683,9 @@ void LLVOSky::idleUpdate(LLAgent &agent, const F64 &time)
void LLVOSky::forceSkyUpdate()
{
mForceUpdate = TRUE;
+
m_lastAtmosphericsVars = {};
+
mCubeMapUpdateStage = -1;
}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index a9bad65b56..8bfcd51a3d 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -71,6 +71,8 @@
#include "llmediaentry.h"
#include "llmediadataclient.h"
#include "llmeshrepository.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llagent.h"
#include "llviewermediafocus.h"
#include "lldatapacker.h"
@@ -3152,6 +3154,17 @@ void LLVOVolume::mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin,
}
}
break;
+
+ case LLViewerMediaObserver::MEDIA_EVENT_FILE_DOWNLOAD:
+ {
+ // Media might be blocked, waiting for a file,
+ // send an empty response to unblock it
+ const std::vector empty_response;
+ plugin->sendPickFileResponse(empty_response);
+
+ LLNotificationsUtil::add("MediaFileDownloadUnsupported");
+ }
+ break;
default:
break;
@@ -7073,7 +7086,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
// can we safely treat this as an alpha mask?
// Nothing actually sets facecolor use the TE alpha instead.
// if (facep->getFaceColor().mV[3] <= 0.f)
- if (te->getAlpha() <=0.f || facep->getFaceColor().mV[3] <= 0.f)
+ if ((te->getAlpha() <=0.f || facep->getFaceColor().mV[3] <= 0.f) && te->getGlow() == 0.0 )
//
{ //100% transparent, don't render unless we're highlighting transparent
FSZoneN("facep->alpha -> invisible");
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index 601c4ebe84..de2527e497 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -203,19 +203,16 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
// find the grid
std::string current_grid = LLGridManager::getInstance()->getGridId();
std::transform(current_grid.begin(), current_grid.end(), current_grid.begin(), ::tolower);
- if (current_grid == "agni")
+ if (current_grid == "damballah")
{
- substitution["GRID"] = "secondlife.com";
- }
- else if (current_grid == "damballah")
- {
- // Staging grid has its own naming scheme.
- substitution["GRID"] = "secondlife-staging.com";
- }
- else
- {
- substitution["GRID"] = llformat("%s.lindenlab.com", current_grid.c_str());
- }
+ // Staging grid has its own naming scheme.
+ substitution["GRID"] = "secondlife-staging.com";
+ }
+ else
+ {
+ substitution["GRID"] = "secondlife.com";
+ }
+
// expand all of the substitution strings and escape the url
std::string expanded_url = url;
LLStringUtil::format(expanded_url, substitution);
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 3c2fc1d29e..43947e9b95 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -1688,6 +1688,16 @@ public:
virtual void post(ResponsePtr response, const LLSD& context, const LLSD& input) const
{
if (LLApp::isExiting())
+ {
+ return;
+ }
+
+ if (gDisconnected)
+ {
+ return;
+ }
+
+ if (!LLWorld::instanceExists())
{
return;
}
@@ -1700,8 +1710,13 @@ public:
return;
}
- LLHost sim(input["body"]["sim-ip-and-port"].asString());
-
+ LLHost sim(input["body"]["sim-ip-and-port"].asString());
+ if (sim.isInvalid())
+ {
+ LL_WARNS() << "Got EstablishAgentCommunication with invalid host" << LL_ENDL;
+ return;
+ }
+
LLViewerRegion* regionp = LLWorld::getInstance()->getRegion(sim);
if (!regionp)
{
@@ -1710,7 +1725,7 @@ public:
return;
}
LL_DEBUGS("CrossingCaps") << "Calling setSeedCapability from LLEstablishAgentCommunication::post. Seed cap == "
- << input["body"]["seed-capability"] << LL_ENDL;
+ << input["body"]["seed-capability"] << " for region " << regionp->getRegionID() << LL_ENDL;
regionp->setSeedCapability(input["body"]["seed-capability"]);
}
};
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index 36968b04fc..704d7b79d2 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -72,7 +72,7 @@ Fejl detaljer: Beskeden kaldet '[_NAME]' blev ikke fundet i notificati
- Kunne ikke tilslutte til [SECOND_LIFE_GRID].
+ Kunne ikke tilslutte til [CURRENT_GRID].
'[DIAGNOSTIC]'
Check at Internet forbindelsen fungerer korrekt.
@@ -477,7 +477,7 @@ Du kan bruge [CURRENT_GRID] normalt og andre personer vil se dig korrekt.
Hvis det er første gang du bruger [CURRENT_GRID], skal du først oprette en konto for at logge på.
- Der er problemer med at koble på. Der kan være et problem med din Internet forbindelse eller [SECOND_LIFE_GRID].
+ Der er problemer med at koble på. Der kan være et problem med din Internet forbindelse eller [CURRENT_GRID].
Du kan enten checke din Internet forbindelse og prøve igen om lidt, klikke på Hjælp for at se [SUPPORT_SITE] siden, eller klikke på Teleport for at forsøge at teleportere hjem.
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index d128ca3806..3b44691fe4 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -2198,7 +2198,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt [SUPPORT_SITE].
Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
-
+
Skægstubbe
diff --git a/indra/newview/skins/default/xui/de/control_table_contents_media.xml b/indra/newview/skins/default/xui/de/control_table_contents_media.xml
index c594aea187..aafb5cbee7 100644
--- a/indra/newview/skins/default/xui/de/control_table_contents_media.xml
+++ b/indra/newview/skins/default/xui/de/control_table_contents_media.xml
@@ -21,4 +21,7 @@
+
+
+
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index a4ea3de8e6..61ee70cb6e 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -86,7 +86,7 @@ Fehlerdetails: The notification called '[_NAME]' was not found in noti
- Verbindung nicht möglich zum [SECOND_LIFE_GRID].
+ Verbindung nicht möglich zum [CURRENT_GRID].
'[DIAGNOSTIC]'
Stellen Sie sicher, dass Ihre Internetverbindung funktioniert.
@@ -710,7 +710,7 @@ Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
Dateidownload nicht möglich
- Sie haben einen Datei-Download angefordert, der in [SECOND_LIFE] nicht unterstützt wird.
+ Sie haben einen Datei-Download angefordert, der in [APP_NAME] nicht unterstützt wird.
@@ -1513,11 +1513,11 @@ Falls Sie [CURRENT_GRID] zum ersten Mal verwenden, müssen Sie zuerst ein Konto
- Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [SECOND_LIFE_GRID].
+ Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [CURRENT_GRID].
Überprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf Hilfe, um zu [SUPPORT_SITE] zu gelangen, oder klicken Sie auf Teleportieren, um nach Hause zu teleportieren.
- http://de.secondlife.com/support/
+ https://www.firestormviewer.org/support/
- Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [SECOND_LIFE_GRID].
+ Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [CURRENT_GRID].
Überprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf Hilfe, um zu [SUPPORT_SITE] zu gelangen.
- http://de.secondlife.com/support/
+ https://www.firestormviewer.org/support/
-
+
Bartschatten
diff --git a/indra/newview/skins/default/xui/en/control_table_contents_media.xml b/indra/newview/skins/default/xui/en/control_table_contents_media.xml
index ce5d3556b6..43e8d730cd 100644
--- a/indra/newview/skins/default/xui/en/control_table_contents_media.xml
+++ b/indra/newview/skins/default/xui/en/control_table_contents_media.xml
@@ -73,4 +73,14 @@
name="lst_action"
value="Start Gesture" />
+
+
+
diff --git a/indra/newview/skins/default/xui/en/floater_associate_listing.xml b/indra/newview/skins/default/xui/en/floater_associate_listing.xml
index 5606ecf7fe..ff80d86680 100644
--- a/indra/newview/skins/default/xui/en/floater_associate_listing.xml
+++ b/indra/newview/skins/default/xui/en/floater_associate_listing.xml
@@ -20,9 +20,10 @@
name="message">
Listing ID:
+
Stats pause when FPS is limited or in background.
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 6e1f2c08be..1f9a8b32ea 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -3365,10 +3365,11 @@
name="DoubleClick Teleport"
shortcut="control|shift|D">
+ function="Advanced.CheckEnabledDoubleClickAction"
+ parameter="teleport_to"/>
+ function="Advanced.SetDoubleClickAction"
+ parameter="teleport_to"/>
@@ -4807,21 +4808,21 @@
label="Double-Click Auto-Pilot"
name="Double-ClickAuto-Pilot">
+ function="Advanced.CheckEnabledDoubleClickAction"
+ parameter="walk_to" />
+ function="Advanced.SetDoubleClickAction"
+ parameter="walk_to" />
+ function="Advanced.CheckEnabledDoubleClickAction"
+ parameter="teleport_to" />
+ function="Advanced.SetDoubleClickAction"
+ parameter="teleport_to" />
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index d17e4cc0c4..425dc97c01 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -205,7 +205,7 @@ No tutorial is currently available.
name="LoginFailedNoNetwork"
type="alertmodal">
fail
- Could not connect to the [SECOND_LIFE_GRID].
+ Could not connect to the [CURRENT_GRID].
'[DIAGNOSTIC]'
Make sure your Internet connection is working properly.
You have added "[LANDMARK_NAME]" to your [FOLDER_NAME] folder.
@@ -3796,12 +3797,12 @@ Forgetting the logged-in user requires you to log out.
name="LoginPacketNeverReceived"
type="alertmodal">
fail
-We're having trouble connecting. There may be a problem with your Internet connection or the [SECOND_LIFE_GRID].
+We're having trouble connecting. There may be a problem with your Internet connection or the [CURRENT_GRID].
You can either check your Internet connection and try again in a few minutes, click Help to view the [SUPPORT_SITE], or click Teleport to attempt to teleport home.
- http://secondlife.com/support/
+ https://www.firestormviewer.org/support/
- Votre inventaire est filtré actuellement et les objets que vous souhaitez supprimer ne sont pas tous visibles.
+ Votre inventaire est filtré actuellement et les objets que vous souhaitez supprimer ne sont pas tous visibles.
Voulez-vous vraiment les supprimer ?
@@ -2333,7 +2504,7 @@ Voulez-vous vraiment les supprimer ?
- Nous vous remercions d’avoir pris le temps de nous signaler ce problème.
+ Nous vous remercions d’avoir pris le temps de nous signaler ce problème.
Nous lirons votre rapport pour identifier toute violation potentielle et prendrons
les mesures nécessaires.
@@ -2364,9 +2535,9 @@ Les descriptions précises nous permettent de traiter les rapports plus rapideme
Il semble que vous souhaitiez reporter une infraction à des droits de propriété intellectuelle. Pour signaler correctement cette infraction :
-(1) Remplissez un rapport d'infraction. Vous pouvez soumettre un rapport d'infraction si vous pensez qu'un résident exploite le système de droits de [SECOND_LIFE], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l'encontre du résident non respectueux des [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Conditions d'utilisation] ou des [http://secondlife.com/corporate/cs.php Règles communautaires]. Sachez toutefois que l'équipe chargée des infractions ne supprimera pas de contenu à l'intérieur de [SECOND_LIFE].
+(1) Remplissez un rapport d'infraction. Vous pouvez soumettre un rapport d'infraction si vous pensez qu'un résident exploite le système de droits de [CURRENT_GRID], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l'encontre du résident non respectueux des [CURRENT_GRID] [http://secondlife.com/corporate/tos.php Conditions d'utilisation] ou des [http://secondlife.com/corporate/cs.php Règles communautaires]. Sachez toutefois que l'équipe chargée des infractions ne supprimera pas de contenu à l'intérieur de [CURRENT_GRID].
-(2) Demandez à ce que du contenu à l'intérieur de Second Life soit supprimé. Pour demander à ce que du contenu soit supprimé de [SECOND_LIFE], vous devez soumettre un rapport d'infraction valide, tel que fourni dans notre [http://secondlife.com/corporate/dmca.php Règlement contre les violations des droits d'auteur].
+(2) Demandez à ce que du contenu à l'intérieur de Second Life soit supprimé. Pour demander à ce que du contenu soit supprimé de [CURRENT_GRID], vous devez soumettre un rapport d'infraction valide, tel que fourni dans notre [http://secondlife.com/corporate/dmca.php Règlement contre les violations des droits d'auteur].
Si vous souhaitez toujours reporter cette infraction, veuillez fermer cette fenêtre et soumettre votre rapport. Vous devrez peut-être sélectionner la catégorie CopyBot ou exploitation abusive des droits.
@@ -2400,6 +2571,16 @@ Voulez-vous désactiver Ne pas déranger avant de terminer cette transaction ?
+
+ Cet endroit diffuse des médias :
+[URL]
+Voulez-vous les jouer ?
+
+
+
+
+
+
Le dossier [FOLDERNAME] est un dossier système. La suppression d'un dossier système peut provoquer une instabilité. Voulez-vous vraiment le supprimer ?
@@ -2424,6 +2605,14 @@ Voulez-vous désactiver Ne pas déranger avant de terminer cette transaction ?
Voulez-vous vraiment vider le cache de votre client ?
+
+ Êtes-vous sûr de vouloir vider votre cache d'inventaire ?
+
+
+
+ Êtes-vous sûr de vouloir vider le cache de votre navigateur web ? (Nécessite un redémarrage)?
+
+
Êtes-vous certain de vouloir supprimer vos cookies ?
@@ -2436,6 +2625,11 @@ Voulez-vous désactiver Ne pas déranger avant de terminer cette transaction ?
Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ?
+
+ Vous êtes sur le point de remplacer un lien vers la partie du corps '[TYPE]' par un élément qui ne correspond pas au type.
+Êtes-vous sûr de vouloir continuer ?
+
+
La SLurl suivante a été copiée dans votre presse-papiers :
[SLURL]
@@ -2459,11 +2653,11 @@ Liez-la à partir d'une page web pour permettre aux autres résidents d&apo
Impossible d'appliquer les réglages à la région. Raison : [FAIL_REASON]
- Une texture locale est utilisée sur la piste [TRACK], le cadre n° [FRAMENO] ([FRAME]%) dans le champ [FIELD].
+ Une texture locale est utilisée sur la piste [TRACK], le cadre n° [FRAMENO] ([FRAME]%) dans le champ [FIELD].
Les paramètres ne seront peut-être pas enregistrés en utilisant les textures locales
- Une texture locale est utilisée dans le champ [FIELD].
+ Une texture locale est utilisée dans le champ [FIELD].
Les paramètres ne seront peut-être pas enregistrés en utilisant les textures locales
@@ -2516,7 +2710,7 @@ Les paramètres ne seront peut-être pas enregistrés en utilisant les textures
L'accès à cet endroit est limité aux plus de 18 ans.
- Pour pouvoir pénétrer dans cette zone, vous devez avoir enregistré vos informations de paiement. Souhaitez-vous aller sur [SECOND_LIFE] et enregistrer vos informations de paiement ?
+ Pour pouvoir pénétrer dans cette zone, vous devez avoir enregistré vos informations de paiement. Souhaitez-vous aller sur [CURRENT_GRID] et enregistrer vos informations de paiement ?
[_URL]
@@ -2527,11 +2721,81 @@ Les paramètres ne seront peut-être pas enregistrés en utilisant les textures
The string [STRING_NAME] is missing from strings.xml
-
- [MESSAGE]
+
+ La lecture de médias ou de musique peut exposer votre identité à des sites extérieurs à [CURRENT_GRID]. Vous pouvez activer un filtre qui vous permettra de sélectionner les sites qui recevront les demandes de médias, et vous donnera un meilleur contrôle sur votre vie privée.
+
+Activer le filtre média ?
+(Vous pouvez modifier cette option ultérieurement sous Préférences > Son et Média & Média.)
+
+
+
+
-
- [MESSAGE]
+
+ Cette parcelle fournit des médias de :
+
+Domaine : [MEDIADOMAIN]
+URL : [MEDIAURL]
+
+
+
+
+
+
+ Voulez-vous vous souvenir de votre choix et [LCONDITION] autoriser les médias de cette source ?
+
+Domaine : [MEDIADOMAIN]
+URL : [MEDIAURL]
+
+
+
+
+
+
+
+ Cette parcelle fournit des médias de :
+
+Domaine : [MEDIADOMAIN]
+URL : [MEDIAURL]
+
+
+
+
+
+
+
+
+ Cette parcelle fournit la musique de :
+
+Domaine : [AUDIODOMAIN]
+URL : [AUDIOURL]
+
+
+
+
+
+
+ Voulez-vous vous souvenir de votre choix et [LCONDITION] autoriser la musique de cette source ?
+
+Domaine : [AUDIODOMAIN]
+URL : [AUDIOURL]
+
+
+
+
+
+
+
+ Voulez-vous vous souvenir de votre choix et [LCONDITION] autoriser la musique de cette source ?
+
+Domaine : [AUDIODOMAIN]
+URL : [AUDIOURL]
+
+
+
+
+
+
Annulé
@@ -2617,12 +2881,18 @@ Cela risque d'impacter votre mot de passe.
Tous les éléments que vous souhaitez transférer ne sont pas encore disponibles sur le serveur.
Merci d'essayer à nouveau dans une minute.
+
+ L'article auquel vous accédez n'est pas encore disponible localement. Veuillez réessayer dans une minute.
+
Vous ne pouvez pas modifier de catégories protégées.
Vous ne pouvez pas supprimer de catégories protégées.
+
+ Vous avez donné une carte de visite à [NAME].
+
Achat impossible durant le chargement de l'objet.
Merci de réessayer.
@@ -2664,10 +2934,10 @@ Veuillez sélectionner un seul objet.
Pour vous téléporter vers un lieu tel que [NAME], cliquez sur le bouton Endroits,
- puis sélectionnez l'onglet Repères dans la fenêtre qui s'ouvre. Cliquez sur n'importe quel
- repère pour le sélectionner, puis sur Téléportation en bas de la fenêtre.
- (Vous pouvez aussi double-cliquer sur le repère ou cliquer-droit dessus et
- choisir Téléportation).
+puis sélectionnez l'onglet Repères dans la fenêtre qui s'ouvre. Cliquez sur n'importe quel
+repère pour le sélectionner, puis sur Téléportation en bas de la fenêtre.
+(Vous pouvez aussi double-cliquer sur le repère ou cliquer-droit dessus et
+choisir Téléportation).
Pour ouvrir une conversation privée avec une autre personne, cliquez-droit sur son avatar et choisissez IM dans le menu.
@@ -2706,18 +2976,6 @@ Voulez-vous autoriser [APP_NAME] à poster sur votre compte Flickr?
Votre photo est visible maintenant [http://www.flickr.com/photos/upload/edit/?ids=[ID] ici].
-
- [MESSAGE]
-
-
- [MESSAGE]
-
-
- [MESSAGE]
-
-
- [MESSAGE]
-
Avis d'événement :
@@ -2749,7 +3007,7 @@ Pour voir les vidéos sur les terrains qui le permettent, allez sur le [http://w
Le Media Plugin suivant a échoué :
- [PLUGIN]
+[PLUGIN]
Si le problème persiste, veuillez réinstaller le plugin ou contacter le vendeur.
@@ -2766,8 +3024,8 @@ Si le problème persiste, veuillez réinstaller le plugin ou contacter le vendeu
Les objets sur la parcelle de terrain sélectionnée appartenant au résident [NAME] ont été rendus à leur propriétaire.
- Les objets sélectionnés sur la parcelle de terrain partagée avec le groupe <nolink>[GROUPNAME]</nolink> ont été renvoyés dans l'inventaire de leur propriétaire.
-Les objets donnés transférables ont étés renvoyés à leur propriétaire.
+ Les objets sélectionnés sur la parcelle de terrain partagée avec le groupe <nolink>[GROUPNAME]</nolink> ont été renvoyés dans l'inventaire de leur propriétaire.
+Les objets donnés transférables ont étés renvoyés à leur propriétaire.
Les objets non transférables donnés au groupe ont été supprimés.
@@ -2828,6 +3086,9 @@ Aucun script ne marche ici à part ceux du propriétaire du terrain.
La région que vous essayez de visiter comporte du contenu dont le niveau dépasse celui de vos préférences actuelles. Vous pouvez modifier vos préférences en accédant à Moi > Préférences > Général.
+
+ La région dans laquelle vous essayez d'entrer est sur le point de fermer.
+
Vous avez été banni de cette région.
@@ -2924,6 +3185,20 @@ Veuillez réessayer dans quelques minutes.
+
+ [NAME_SLURL] vous a donné ceci : [OBJECTTYPE]:
+[ITEM_SLURL]
+Voulez-vous le garder ? "Ignorer" bloquera toutes les offres ou messages futurs de [NAME_SLURL].
+
+
+
+
+
+
+
+
+
+
[NAME]
@@ -2966,10 +3241,50 @@ Cette région comporte du contenu [REGION_CONTENT_MATURITY] alors que vos préf
<icon>[MATURITY_ICON]</icon> - [MATURITY_STR]
Toutefois, cette région comporte du contenu uniquement accessible aux adultes.
+
+
+ [NAME_SLURL] a proposé de vous téléporter à son emplacement ([POS_SLURL]):
+
+[MESSAGE]
+<icon>[MATURITY_ICON]</icon> - [MATURITY_STR]
+
+
+
+
+
+
+ [NAME_SLURL] a proposé de vous téléporter à son emplacement ([POS_SLURL]):
+
+[MESSAGE]
+<icon>[MATURITY_ICON]</icon> - [MATURITY_STR]
+
+Cette région contient du contenu [REGION_CONTENT_MATURITY], mais vos préférences actuelles sont définies pour exclure le contenu [REGION_CONTENT_MATURITY]. Nous pouvons modifier vos préférences et continuer la téléportation, ou vous pouvez annuler cette téléportation.
+
+
+
+
+
+
+ [NAME_SLURL] a proposé de vous téléporter à son emplacement ([POS_SLURL]):
+
+[MESSAGE]
+<icon>[MATURITY_ICON]</icon> - [MATURITY_STR]
+
+Toutefois, cette région contient des contenus accessibles uniquement aux adultes.
Offre de téléportation envoyée à [TO_NAME]
+
+ [NAME_SLURL] demande à être téléporté à votre emplacement.
+[MESSAGE]
+
+Téléporter ?
+
+
+
+
+
[MESSAGE]
[URL]
@@ -3028,6 +3343,14 @@ Si vous restez dans cette région, vous serez déconnecté(e).
La région va redémarrer dans [SECONDS] secondes.
Si vous restez dans cette région, vous serez déconnecté(e).
+
+
+ La région "[NAME]" va redémarrer dans [MINUTES] minutes.
+Si vous restez dans cette région au moment du redémarrage, vous serez déconnecté.
+
+
+ La région "[NAME]" va redémarrer dans [SECONDS] seconds.
+Si vous restez dans cette région au moment du redémarrage, vous serez déconnecté.
Charger la page Web [URL] ?
@@ -3062,7 +3385,7 @@ Acceptez-vous ?
Impossible d’acquérir une nouvelle expérience :
- [ERROR_MESSAGE]
+[ERROR_MESSAGE]
@@ -3101,13 +3424,13 @@ Il est possible que d’autres expériences avec clé soient disponibles.
Un objet a été autorisé à [EventType] par l’expérience secondlife:///app/experience/[public_id]/profile.
- Propriétaire : secondlife:///app/agent/[OwnerID]/inspect
- Nom de l’objet : [ObjectName]
- Nom de la parcelle : [ParcelName]
+Propriétaire : secondlife:///app/agent/[OwnerID]/inspect
+Nom de l’objet : [ObjectName]
+Nom de la parcelle : [ParcelName]
Une pièce jointe a été autorisée à [EventType] par l’expérience secondlife:///app/experience/[public_id]/profile.
- Propriétaire : secondlife:///app/agent/[OwnerID]/inspect
+Propriétaire : secondlife:///app/agent/[OwnerID]/inspect
« <nolink>[OBJECTNAME]</nolink> », un objet appartenant à « [NAME] », demande votre participation à l’expérience [GRID_WIDE] :
@@ -3116,7 +3439,7 @@ Il est possible que d’autres expériences avec clé soient disponibles.
Une fois l’autorisation accordée, vous ne verrez plus ce message pour cette expérience, sauf si elle est révoquée dans le profil de l’expérience.
-Les scripts associés à cette expérience pourront effectuer les actions suivantes dans les régions dans lesquelles l’expérience est active :
+Les scripts associés à cette expérience pourront effectuer les actions suivantes dans les régions dans lesquelles l’expérience est active :
[QUESTIONS]Acceptez-vous ?
@@ -3128,7 +3451,7 @@ Les scripts associés à cette expérience pourront effectuer les actions suivan
Avertissement : l'objet <nolink>[OBJECTNAME]</nolink> souhaite un accès total à votre compte en Linden dollars. Si vous autorisez cet accès, il pourra supprimer des fonds de votre compte à tout moment ou le vider entièrement de façon continue sans avis préalable.
-
+
N'autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l'objet souhaite accéder à votre compte.
@@ -3144,7 +3467,7 @@ N'autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l
@@ -3191,7 +3514,7 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
[NAME] a reçu une offre d'inventaire et n'est donc plus ignoré.
- [NAME] a rejoint un chat vocal avec le groupe <nolink>[GROUP]</nolink>.
+ [NAME] a rejoint un chat vocal avec le groupe <nolink>[GROUP]</nolink>.
Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer.
@@ -3239,20 +3562,20 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
Échec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
- Au moins l'un des effets de voix auxquels vous êtes abonné a expiré.
-[[URL] Cliquez ici] pour renouveler votre abonnement.
+ Au moins l'un des effets de voix auxquels vous êtes abonné a expiré.
+[[URL] Cliquez ici] pour renouveler votre abonnement.
Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix.
L'effet de voix actif a expiré. Vos paramètres de voix normaux ont été rétablis.
-[[URL] Cliquez ici] pour renouveler votre abonnement.
+[[URL] Cliquez ici] pour renouveler votre abonnement.
Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix.
- Au moins l'un de vos effets de voix expirera dans moins de [INTERVAL] jours.
-[[URL] Cliquez ici] pour renouveler votre abonnement.
+ Au moins l'un de vos effets de voix expirera dans moins de [INTERVAL] jours.
+[[URL] Cliquez ici] pour renouveler votre abonnement.
Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix.
@@ -3315,6 +3638,11 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité.
Impossible de remplacer le préréglage par défaut.
+
+ '[NAME]' est utilisé. Vous pouvez remplacer
+ce préréglage ou choisir un autre nom.
+
+
Erreur de suppression du préréglage [NAME].
@@ -3342,6 +3670,10 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité.
Ceci permettra de charger [COUNT] éléments pour un coût total de L$[COST]. Souhaitez-vous poursuivre le téléchargement ?
+
+ Votre solde actuel de [BALANCE]L$ n'est pas suffisant pour télécharger [COUNT] articles pour un coût total de L$[COST].
+
+
Les fichiers sélectionnés ne peuvent pas être téléchargés en masse.
@@ -3366,11 +3698,11 @@ Le bouton sera affiché quand il y aura suffisamment de place.
Sélectionnez les résidents avec lesquels partager l'élément.
- [LABEL] n'a pas pu être téléchargé : [MESSAGE]
+ [LABEL] n'a pas pu être téléchargé : [MESSAGE]
[DETAILS]Voir SecondLife.log pour plus de détails
- Échec de chargement de [LABEL] : [MESSAGE]
+ Échec de chargement de [LABEL] : [MESSAGE]
Voir SecondLife.log pour plus de détails.
@@ -3434,6 +3766,9 @@ Tenue figée au bout de [TIME] secondes.
Mise à jour de votre apparence transmise au bout de [TIME] secondes.
[STATUS]
+
+ Le visualiseur a détecté que vous pouvez apparaître comme un nuage et tente de corriger cela automatiquement.
+
([EXISTENCE] secondes d'existence)
Transformation de l'avatar [NAME] en nuage.
@@ -3460,7 +3795,7 @@ Veuillez vérifier la configuration de votre réseau et de votre pare-feu.
- La connexion au serveur vocal est impossible :
+ La connexion au serveur vocal est impossible :
[HOSTID]
@@ -3468,8 +3803,8 @@ Les ports autorisés pour la voix sont :
:TCP: 80, 443
:UDP: 3478, 3479, 5060, 5062, 6250, 12000-32000
-Veuillez vérifier la configuration de votre réseau et de votre pare-feu.
-Veuillez désactiver toute fonctionnalité SIP ALG dans votre routeur.
+Veuillez vérifier la configuration de votre réseau et de votre pare-feu.
+Veuillez désactiver toute fonctionnalité SIP ALG dans votre routeur.
Aucune communication vocale n'est disponible.
@@ -3532,7 +3867,7 @@ Si vous masquez le bouton Parler, la fonction Voix sera désactivée.
Pour marcher ou courir, cliquez sur le bouton Bouger, puis naviguez à l'aide des flèches directionnelles. Vous pouvez également utiliser les touches fléchées de votre clavier.
-
+
1. Cliquer pour marcher
Cliquez n'importe où sur le sol pour vous diriger vers ce point en marchant.
@@ -3614,51 +3949,57 @@ Cliquez sur un point dans le monde et faites glisser votre souris pour faire tou
-
+
+ Le changement de mode vous oblige à quitter et à redémarrer.
+
+Changer de mode et quitter ?
+
+
+
Pour créer et modifier des petites annonces, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? Le sélecteur de mode se trouve sur l'écran de connexion.
-
+
Pour créer et modifier des groupes, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? Le sélecteur de mode se trouve sur l'écran de connexion.
-
+
L'affichage du profil du lieu est uniquement disponible en mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? Le sélecteur de mode se trouve sur l'écran de connexion.
-
+
Pour créer et modifier des favoris, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? Le sélecteur de mode se trouve sur l'écran de connexion.
-
+
Pour afficher la carte du monde, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ? Le sélecteur de mode se trouve sur l'écran de connexion.
-
+
Les appels vocaux sont uniquement disponibles en mode Avancé. Voulez-vous quitter l'application afin de changer de mode ?
-
+
Le partage est uniquement disponible en mode Avancé. Voulez-vous quitter l'application afin de changer de mode ?
-
+
Pour pouvoir payer d'autres résidents, vous devez utiliser le mode Avancé. Voulez-vous quitter l'application afin de changer de mode ?
-
+
L'affichage de l'inventaire est uniquement disponible en mode Avancé. Voulez-vous quitter l'application afin de changer de mode ?
-
+
L'Éditeur d'apparence est uniquement disponible en mode Avancé. Voulez-vous quitter l'application afin de changer de mode ?
-
+
La recherche est uniquement disponible en mode Avancé. Voulez-vous quitter l'application afin de changer de mode ?
-
+
Cette action masquera tous les boutons et articles de menu. Pour les récupérer, cliquez de nouveau sur [SHORTCUT].
@@ -3718,34 +4059,277 @@ Voulez-vous continuer ?
L'objet sélectionné affecte le maillage de navigation. Si vous le modifiez en Flexibilité, il sera supprimé de ce maillage.
+
+ Vous ne semblez pas répondre à la configuration matérielle requise pour [APP_NAME]. [APP_NAME] requiert le support des shaders OpenGL 2.0 ou plus. Si c'est le cas, vérifiez que vous disposez des derniers pilotes pour votre carte graphique et des derniers Service Packs et correctifs pour votre système d'exploitation.
+
+Si vous continuez à rencontrer des problèmes, veuillez consulter le [SUPPORT_SITE].
+
Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les pilotes les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d'exploitation.
Si vous avez toujours des problèmes, veuillez consulter la page [SUPPORT_SITE].
-
- 796
-
-
- 510
+
+ Le pilote graphique Intel installé pour [GPUNAME], version [VERSION], est obsolète et connu pour provoquer un nombre excessif de plantages du programme. Il est conseillé de mettre à jour le pilote Intel.
+
+Voulez-vous consulter le site web des pilotes Intel ?
- Votre carte graphique ne remplit pas les conditions minimum requises.
+
+ - Votre CPU ne répond pas aux exigences minimales.
+
- Votre mémoire système ne remplit pas les conditions minimum requises.
-
+
+ Le lancement du service de mise à jour [UPDATER_APP] a échoué. Veuillez vérifier que le visualiseur est correctement installé et qu'il dispose des autorisations nécessaires pour s'exécuter. Si vous continuez à rencontrer des problèmes, veuillez consulter le [SUPPORT_SITE].
+
+
Si vous possédez un terrain, vous pouvez le définir comme domicile.
Sinon, consultez la carte et trouvez les " infohubs ".
Vous êtes mort et avez été téléporté à votre domicile.
+
+ Etes-vous sûr de vouloir effacer l'url de débogage de la recherche ?
+
+
+
+ Êtes-vous sûr de vouloir choisir l'url de recherche actuelle comme url de débogage de la recherche ?
+
+
+
+ Êtes-vous sûr de vouloir supprimer [REMOVE_GRID] de la liste de grilles ?
+
+
+
+ Vous ne pouvez pas supprimer [REMOVE_GRID] tout en y étant connecté.
+
+
+
+ Spécifiez un nom pour le nouvel ensemble d'AO :
+(Le nom peut contenir tout caractère ASCII, sauf ":" ou "|")
+
+
+ Nouvel ensemble d'AO
+
+
+
+
+
+
+ Impossible de créer un nouvel ensemble d'AO "[AO_SET_NAME]".
+Le nom ne peut contenir que des caractères ASCII, sauf ":" et "|".
+
+
+
+ Impossible de renommer l'ensemble d'AO "[AO_SET_NAME]".
+Le nom ne peut contenir que des caractères ASCII, sauf ":" et "|".
+
+
+
+ Retirer l'ensemble d'AO "[AO_SET_NAME]" de la liste ?
+
+
+
+ L'AO a trouvé au moins un élément qui n'avait pas sa place dans la configuration. Veuillez vérifier dans votre dossier "Objets trouvés" les éléments qui ont été déplacés hors de la configuration de l'AO.
+
+
+ Un ensemble d'animations portant ce nom existe déjà.
+
+
+ Permissions insuffisantes pour lire la notice.
+
+
+ Erreur lors de la création d'un ensemble d'importation.
+
+
+ Impossible de télécharger la notice.
+
+
+ La notice est vide ou illisible.
+
+
+ Je n'ai pas trouvé de dossier pour lire les animations.
+
+
+ La ligne [LINE] de la notice ne contient pas de préfixe [ valide.
+
+
+ La ligne [LINE] de la notice ne contient pas de délimiteur ] valide.
+
+
+ Nom de l'état [NAME] n'a pas été trouvé.
+
+
+ Impossible de trouver l'animation [NAME]. Veuillez vous assurer qu'elle se trouve dans le même dossier que la notice d'importation.
+
+
+ La notice ne contenait aucune donnée utilisable. Annulation de l'importation.
+
+
+ Impossible de créer un dossier d'importation pour le jeu d'animations [NAME]. Réessai ...
+
+
+ Impossible de créer un dossier d'importation pour le jeu d'animations [NAME]. Abandon.
+
+
+ Échec de la création d'un lien d'animation pour l'animation "[NAME]" !
+
+
+ Cela enverra les informations suivantes à la session actuelle d'IM :
+
+[SYSINFO]
+
+
+
+ Cette version de test de [APP_NAME] a expiré et ne peut plus être utilisé.
+
+
+
+ [NAME] demande que vous leur envoyiez des informations sur votre configuration de [APP_NAME].
+(Il s'agit des mêmes informations que celles que l'on peut trouver en se rendant à Aide->À propos de [APP_NAME])
+[REASON]
+Voulez-vous leur envoyer ces informations ?
+
+
+
+
+
+
+ Mode fantôme activé.
+
+
+ Mode fantôme désactivé.
+
+
+ Mode avatar figé activé. Utilisez > Déplacements > Figer pour le désactiver.
+
+
+ Mode avatar figé désactivé.
+
+
+ Activation du mode avatar figé...
+
+
+ Désactivation du mode avatar figé...
+
+
+ L'assistance au vol est activée
+
+
+ La réinitialisation de tous les paramètres peut s'avérer utile si vous rencontrez des problèmes ; toutefois, vous devrez refaire toutes les personnalisations que vous avez apportées à la configuration par défaut.
+
+Êtes-vous sûr de vouloir réinitialiser tous les paramètres ?
+
+
+
+ Les paramètres seront effacés après le redémarrage de [APP_NAME].
+
+
+ Impossible d'ajouter [GRID] à la liste de grilles.
+[REASON] contactez le support de [GRID].
+
+
+
+ Impossible de trouver dans l'inventaire un dossier pour le nouveau script.
+
+
+ Impossible de créer un nouveau script pour ce système de particules.
+
+
+ Impossible de trouver le script nouvellement créé pour ce système de particules.
+
+
+ Impossible de créer un fichier temporaire pour le téléchargement du script.
+
+
+ Le script de particules a été injecté avec succès.
+
+
+
+
+
+ Échec de l'injection du script dans l'objet. La demande de capacités a renvoyé une adresse vide.
+
+
+ Le script LSL pour créer ce système de particules a été copié dans votre presse-papiers. Vous pouvez maintenant le coller dans un nouveau script pour l'utiliser.
+
+
+
+
+
+ Attention ! L'utilisation de la fenêtre 'Paramètres de débogage' n'est pas prise en charge ! La modification des paramètres de débogage peut avoir un impact important sur votre expérience et peut entraîner une perte de données, de fonctionnalités ou même d'accès au service. Veuillez ne pas modifier les valeurs sans savoir exactement ce que vous faites.
+
+
+
+
+
+ Le nom de ce paramètre de débogage a été copié dans votre presse-papiers. Vous pouvez maintenant le coller ailleurs pour l'utiliser.
+
+
+
+
+
+ [APP_NAME] a détecté un problème possible avec vos paramètres :
+
+[SANITY_MESSAGE]
+
+Raison : [SANITY_COMMENT]
+
+Paramètres actuels : [CURRENT_VALUE]
+
+
+
+
+
+
+
+
+Le comportement des instructions switch() sans cas par défaut était auparavant incorrect et a été corrigé.
+Consultez FIRE-17710 pour plus de détails.
+
+
+ La téléportation vers cet avatar est impossible, car sa position exacte est inconnue.
+
+
+ Impossible de zoomer sur cet avatar, car il est hors de portée.
+
+
+ Impossible de suivre cet avatar, car il est hors de portée des radars.
+
+
+ Le cache du visualiseur est vide. Le téléchargement du nouveau contenu peut entraîner un ralentissement de la vitesse d'affichage et du chargement de l'inventaire pendant une courte période.
+
+
+ Bienvenue dans le groupe de support aux téléspectateurs de Phoenix/Firestorm !
+
+Pour faciliter le support, il est recommandé d'annoncer la version de votre visualiseur au groupe. Ces informations comprennent la version actuelle du visualiseur, le skin du visualiseur, le système d'exploitation et le statut RLVa. Vous pouvez choisir d'afficher la version de votre visualiseur en face de toute discussion que vous envoyez au groupe. Nos membres de l'assistance peuvent vous donner immédiatement des conseils plus pertinents s'ils connaissent la version du visualiseur que vous utilisez.
+
+Vous pouvez activer et désactiver cette fonction à tout moment en utilisant la case à cocher dans la fenêtre de conversation de groupe.
+
+Voulez-vous activer l'affichage automatique de la version du visualiseur ?
+
+
+
+
+
+
+
+
+ Êtes-vous sûr de vouloir modifier les scripts des objets sélectionnés ?
+
+
Impossible de mettre à jour [FNAME] car le fichier est introuvable.
Désactivation des mises à jour futures de ce fichier...
+
+ Impossible d'enregistrer <nolink>'[OBJ_NAME]'</nolink> dans le contenu de l'objet parce que vous n'avez pas la permission de transférer la propriété de l'objet.
+
[NRETRIES] tentatives d'ouverture ou de décodage de [FNAME] ont échoué. Le fichier est désormais considéré comme endommagé.
Désactivation des mises à jour futures de ce fichier...
@@ -3804,6 +4388,10 @@ Désactivation des mises à jour futures de ce fichier...
Essayez de vous rapprocher. Impossible de vous asseoir sur l'objet car
il ne se trouve pas dans la même région que vous.
+
+ Le fichier d'historique des chats est occupé à traiter l'opération précédente. Réessayez dans quelques minutes ou choisissez une autre personne pour le chat.
+
+
Création d'un nouvel objet impossible. La région est pleine.
@@ -3832,7 +4420,7 @@ il ne se trouve pas dans la même région que vous.
Impossible de dupliquer les objets - la parcelle sur laquelle ils sont est introuvable.
- Création de l'objet impossible car
+ Création de l'objet impossible car
la parcelle est pleine.
@@ -3861,6 +4449,10 @@ Veuillez réessayer dans une minute.
Votre présence ici n'est plus autorisée et vous disposez de [EJECT_TIME] secondes pour partir.
+
+ Vous ne pouvez pas entrer dans la région "[NAME]".
+Elle est peut-être pleine ou sur le point de redémarrer.
+
Le réenregistrement dans l'inventaire a été désactivé.
@@ -4191,6 +4783,9 @@ Veuillez réessayer dans une minute.
Ressources de script insuffisantes pour attacher cet objet.
+
+ Impossible d'attacher l'objet car il a déjà été retiré.
+
Vous ne pouvez pas déposer d'objets ici. Essayez la zone de période d'essai gratuite.
@@ -4424,10 +5019,26 @@ Veuillez sélectionner un terrain plus petit.
Impossible de créer de grands prims qui rejoignent d'autres résidents. Veuillez essayer à nouveau lorsque les autres résidents seront partis.
+
+ Les changements ne prendront effet qu'après le redémarrage de [APP_NAME].
+
+
+ [NAME_SLURL] a demandé à recevoir une liste de vos restrictions RLV actuellement actives.
+
+
+
+
+
+
+
Cela supprimera les journaux des conversations précédentes, ainsi que toute copie de sauvegarde de ce fichier.
+
+ Voulez-vous rétablir les valeurs par défaut des paramètres ?
+
+
Cela supprimera les transcriptions de toutes les conversations précédentes. La liste des conversations passées ne sera pas affectée. Tous les fichiers avec les suffixes .txt et txt.backup dans le dossier [FOLDER] seront supprimés.
@@ -4440,14 +5051,244 @@ Veuillez sélectionner un terrain plus petit.
Problème lors de l'enregistrement des droits d'objet par défaut : [REASON]. Réessayez de définir les droits par défaut ultérieurement.
-
- Le fichier d'historique des chats est occupé à traiter l'opération précédente. Réessayez dans quelques minutes ou choisissez une autre personne pour le chat.
-
-
[REASON]
+
+ Sur la page suivante, choisissez un montant de L$
+et cliquez sur le bouton "Passer la commande". Vous aurez
+la possibilité d'ajouter un mode de paiement à la caisse.
+
+
+
+
+
+
+ La chaîne de couleur LSL a été copiée dans votre presse-papiers. Vous pouvez maintenant la coller dans votre script pour l'utiliser.
+
+
+
+
+
+ Nous vous recommandons vivement de ne pas régler la bande passante au-dessus de 1500 KBPS. Il est peu probable que cela fonctionne bien et cela n'améliorera presque certainement pas vos performances.
+
+
+
+ Attention : Utilisez 'Ignorer l'interdiction de voler' de manière responsable ! L'utilisation de cette fonction sans l'autorisation du propriétaire du terrain peut entraîner le bannissement de votre avatar de la parcelle dans laquelle vous volez.
+
+
+
+ La région où vous venez d'entrer utilise une version différente de simulateur.
+Simulateur actuel : [NEWVERSION]
+Simulateur précédent : [OLDVERSION]
+
+
+ Erreur dans l'expression régulière :
+[EWHAT]
+
+
+ Certaines fonctions comme [FEATURE] ne sont pas incluses dans cette version de [APP_NAME]. Si vous souhaitez utiliser [FEATURE], veuillez télécharger une version de [APP_NAME] prenant en charge Havok depuis
+[DOWNLOAD_URL]
+
+
+
+
+
+ Exportation réussie de la liste des flux en XML sous [FILENAME].
+
+
+ Importation réussie de la liste des flux depuis le fichier XML.
+
+
+ ♫ Lecture en cours :
+[TITLE]
+[ARTIST] ♫
+
+
+ ♫ Lecture en cours :
+[TITLE] ♫
+
+
+ Vos paramètres ont été sauvegardés.
+
+
+ Le chemin de sauvegarde est vide. Veuillez d'abord fournir un emplacement pour sauvegarder et restaurer vos paramètres.
+
+
+ Le chemin de sauvegarde n'a pas pu être trouvé ou créé.
+
+
+ Le chemin de sauvegarde n'a pas pu être trouvé.
+
+
+ Êtes-vous sûr de vouloir enregistrer une sauvegarde dans ce répertoire ?
+
+[DIRECTORY]
+
+Toutes les sauvegardes existantes dans cet emplacement seront écrasées !
+
+
+
+ Settings restore requires a viewer restart. Do you want to restore your settings and quit the viewer now?
+
+
+
+ Restauration terminée ! Veuillez redémarrer votre visualiseur maintenant.
+
+
+
+ Cette action remettra immédiatement vos préférences rapides à leurs paramètres par défaut.
+
+Vous ne pouvez pas annuler cette action.
+
+
+
+ Le paramètre a déjà été ajouté. Veuillez en sélectionner un autre.
+
+
+
+ Exportation terminée et sauvegardée dans [FILENAME].
+
+
+ L'exportation a échoué de manière inattendue. Veuillez consulter le journal pour plus de détails.
+
+
+ Enregistrement réussi de [OBJECT] dans [FILENAME].
+
+
+ L'exportation de [OBJECT] vers [FILENAME] a échoué.
+
+
+ La valeur que vous avez définie, [VALUE], pour le nombre de requêtes simultanées pour charger des objets maillés (paramètre de débogage [DEBUGNAME]) est supérieure au maximum de [MAX]. Elle a été réinitialisée à la valeur par défaut de [DEFAULT].
+
+
+ Importation réussie [COUNT] [OBJECT].
+
+
+ AntiSpam : blocage de [SOURCE] pour avoir envoyé des spams une [QUEUE] ([COUNT]) fois en [PERIOD]. seconds.
+
+
+ AntiSpam : blocage de [SOURCE] pour avoir envoyé un message instantané de plus de [COUNT] lignes.
+
+
+ AntiSpam : blocage de [SOURCE] pour avoir envoyé un message de chat de plus de [COUNT] lignes.
+
+
+ [MESSAGE]
+
+
+
+
+
+ Créer un nouveau groupe de contacts avec le nom :
+
+
+ Nouveau groupe de contacts
+
+
+
+
+
+
+ Êtes-vous sûr de vouloir supprimer [SET_NAME] ? Vous ne pourrez pas le restaurer.
+
+
+
+ Êtes-vous sûr de vouloir supprimer [TARGET] de [SET_NAME] ?
+
+
+
+ Êtes-vous sûr de vouloir supprimer ces avatars [TARGET] de [SET_NAME] ?
+
+
+
+ [NAME] a été ajouté à [SET].
+
+
+ [COUNT] avatars ont été ajoutés à [SET].
+
+
+ Entrez un alias pour [AVATAR] :
+
+
+
+
+
+
+ Impossible de renommer le groupe '[SET]' en '[NEW_NAME]' car un groupe portant le même nom existe déjà ou le nouveau nom n'est pas valide.
+
+
+ Il y a eu un problème lors de l'importation de [FILENAME]. Veuillez consulter le journal pour plus de détails.
+
+
+ L'importation de la silhouette a échoué. Êtes-vous sûr que [FILENAME] est un fichier avatar ?
+
+
+ Entrez un nom de domaine à ajouter à la [LIST] :
+
+
+
+
+
+
+ La remise à la dernière position n'est pas autorisée pour les éléments non copiable afin d'éviter une éventuelle perte de contenu.
+
+
+ Supprimer les identifiants enregistrés pour <nolink>[NAME]</nolink> ?
+
+
+
+
+
+
+ Quelle étiquette souhaitez-vous utiliser pour
+la région "[REGION]" ?
+
+
+
+
+
+
+ Durée en secondes de la pause de la discussion de groupe :
+
+
+
+
+
+
+ Veuillez entrer un nombre valide pour la durée de la pause !
+
+
+
+ Impossible de créer un autre favori car le nombre maximum de favoris a déjà été créé.
+
+
+
+ En raison de la charge du serveur, le basculement massif de la visibilité du statut en ligne peut prendre un certain temps avant d'être effectif. Veuillez être patient.
+
+
+
+ AVERTISSEMENT : Le facteur de niveau de détail (LOD) est élevé.
+
+Pour l'utilisation quotidienne, un facteur LOD de l'ordre de 1 à 3 suffit.
+Envisagez de remplacer les objets qui semblent déformés avec de telles valeurs.
+
+Facteur LOD >3: Ajoute au lag. Conseillé uniquement pour la photographie.
+Facteur LOD >4: A utiliser dans des circonstances particulières. Se réinitialise après une nouvelle connexion.
+Facteur LOD >8: N'a pas d'effet réel. Peut provoquer des erreurs.
+
+
+
+ Cette région a choisi de spécifier un portail monétaire tiers.
+Veuillez noter que les achats de devises effectués par le biais de Firestorm Viewer sont des transactions entre vous (l'utilisateur) et le(s) fournisseur(s) ou vendeur(s) de la devise.
+Ni Firestorm Viewer, ni le Phoenix Firestorm Viewer Project Inc. ni son équipe ne peuvent être tenus responsables de tout coût ou dommage résultant directement ou indirectement d'une telle transaction.
+Si vous n'acceptez pas ces conditions d'utilisation, vous ne devez pas effectuer de transactions financières en utilisant ce visualiseur.
+
+
+
+ L'activation de la prise en charge de HiDPI peut avoir des effets indésirables et nuire aux performances.
+
Impossible de charger les paramètres de [NOM] à partir de la base de données.
@@ -4460,7 +5301,7 @@ Veuillez sélectionner un terrain plus petit.
Cette région ne prend pas en charge les paramètres environnementaux.
-
+
Enregistrer les paramètres environnementaux actuels sous :
@@ -4471,44 +5312,44 @@ Veuillez sélectionner un terrain plus petit.
- Impossible d'importer les paramètres Windlight [NAME] hérités de
-[FILE].
+ Impossible d'importer les paramètres Windlight [NAME] hérités de
+[FILE].
[REASONS]
- Impossible de définir l'environnement pour cette parcelle.
+ Impossible de définir l'environnement pour cette parcelle.
Veuillez entrer ou sélectionner une parcelle que vous avez le droit de modifier.
- Les paramètres ne sont pas pris en charge dans cette région.
+ Les paramètres ne sont pas pris en charge dans cette région.
Veuillez vous déplacer dans une région où les paramètres sont activés et relancer votre action.
- Vous êtes sur le point de perdre les modifications que vous avez apportées à ce [TYPE] nommé "[NAME]".
+ Vous êtes sur le point de perdre les modifications que vous avez apportées à ce [TYPE] nommé "[NAME]".
Voulez-vous vraiment continuer ?
- Vous êtes sur le point de supprimer tous les paramètres appliqués.
+ Vous êtes sur le point de supprimer tous les paramètres appliqués.
Voulez-vous vraiment continuer ?
- Vous êtes sur le point de supprimer tous les paramètres d'éclairage personnel appliqués.
+ Vous êtes sur le point de supprimer tous les paramètres d'éclairage personnel appliqués.
Voulez-vous vraiment continuer ?
- Vous êtes sur le point d'importer des paramètres non transférables dans ce cycle de jour. Si vous continuez, les paramètres que vous modifiez deviennent également non transférables.
+ Vous êtes sur le point d'importer des paramètres non transférables dans ce cycle de jour. Si vous continuez, les paramètres que vous modifiez deviennent également non transférables.
-Cette modification ne peut être être annulée.
+Cette modification ne peut être être annulée.
Voulez-vous vraiment continuer ?
- Vous ne pouvez pas modifier les paramètres directement à partir de la bibliothèque.
+ Vous ne pouvez pas modifier les paramètres directement à partir de la bibliothèque.
Veuillez copier vers votre inventaire puis réessayer
@@ -4520,4 +5361,32 @@ Veuillez copier vers votre inventaire puis réessayer
Impossible de charger la piste de [TRACK1] dans [TRACK2].
+
+Résultat du test de compression de fichier pour gzip au niveau 6 avec [FILE] de taille [SIZE] KB :
+Compression : [PACK_TIME]s [PSIZE]KB
+Décompression : [UNPACK_TIME]s [USIZE]KB
+
+
+ Aucun paramètre d'environnement valide n'a été sélectionné.
+
+Veuillez noter que "Utiliser l'environnement partagé" et "Basé sur le cycle journalier" ne peuvent pas être sélectionnés !
+
+
+ Ne peut pas être créé : [NAME]
+
+
+ L'importation par lot des réglages Windlights est terminée.
+
+
+ Superviseur d'animation Firestorm : [AO_MESSAGE]
+
+
+ Un objet attaché "[NAME]" contient du mesh lié à l'avatar mais est attaché au point HUD "[HUD_POINT]". Cela signifie que vous le verrez correctement affiché, mais que les autres ne pourront pas le voir. Retirez et de réattachez à un point d'attachement normal du corps.
+
+
+ L'URL de l'écran d'accueil de connexion est remplacée à des fins de test.
+
+Remettre l'URL par défaut ?
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_group_creation_sidetray.xml b/indra/newview/skins/default/xui/fr/panel_group_creation_sidetray.xml
new file mode 100644
index 0000000000..279a89436d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_group_creation_sidetray.xml
@@ -0,0 +1,58 @@
+
+
+
+ (Votre abonnement)
+
+
+
+ Nom du groupe :
+
+
+
+
+
+
+
+
+
+
+ Statut du groupe
+
+
+
+
+
+
+
+
+ - Sélectionnez le type de contenu -
+
+
+
+
+
+
+
+
+ Les frais de création d'un groupe dépendent de votre niveau d'abonnement. [https://secondlife.com/my/account/membership.php Plus d'informations]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Note : après 2 jours, un groupe qui a moins de 2 membres autres que le créateur est supprimé !
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 270f65925b..67e98a0d46 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -19,6 +19,9 @@
Vidage du cache...
+
+ Nettoyage du cache des textures...
+
Initialisation du cache des textures...
@@ -37,6 +40,11 @@
SLURL : <nolink>[SLURL]</nolink>
(coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
+[SERVER_RELEASE_NOTES_URL]
+
+
+Vous êtes à [REGION]
+[SERVER_VERSION]
[SERVER_RELEASE_NOTES_URL]
@@ -53,6 +61,28 @@ Mémoire de cartes graphiques : [GRAPHICS_CARD_MEMORY] MB
Version OpenGL : [OPENGL_VERSION]
+
+Mode de réglage : [MODE]
+Skin du visualiseur: [SKIN] ([THEME])
+Taille de la fenêtre : [WINDOW_WIDTH]x[WINDOW_HEIGHT] px
+Police utilisée : [FONT] ([FONT_SCREEN_DPI] dpi)
+Taille de la police : [FONT_SIZE] pt
+Mise à l'échelle de l'UI : [UI_SCALE_FACTOR]
+Distance d'affichage : [DRAW_DISTANCE] m
+Bande passante : [BANDWIDTH] kbit/s
+Facteur LOD : [LOD]
+Qualité du rendu : [RENDERQUALITY]
+Modèle d'éclairage avancé : [ALMSTATUS]
+
+
+ Mémoire des textures : [TEXTUREMEMORY] MB ([TEXTUREMEMORYMULTIPLIER])
+
+
+ Mémoire des textures : Dynamique ([TEXTUREMEMORYMIN] Mo min / [TEXTUREMEMORYCACHERESERVE]% Cache / [TEXTUREMEMORYGPURESERVE]% VRAM)
+
+
+ Cache disque : [DISK_CACHE_INFO]
+
Mode d'affichage HiDPI : [HIDPI]
@@ -160,9 +190,15 @@ Version serveur vocal : [VOICE_VERSION]
Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l'administrateur de la grille.
+
+ Impossible de charger le certificat. Veuillez contacter votre administrateur de grille.
+
Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille.
+
+ Échec de l'allocation de la mémoire openssl pour le certificat.
+
Erreur réseau : impossible d'établir la connexion. Veuillez vérifier votre connexion réseau.
@@ -181,9 +217,6 @@ Version serveur vocal : [VOICE_VERSION]
Grille de test bêta Second Life (Aditi)
-
- http://secondlife.com/download
-
Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante :
http://secondlife.com/download
@@ -239,7 +272,7 @@ l'Assistance à l'adresse suivante : support@secondlife.com.
[TIME], heure du Pacifique.
- Impossible de traiter votre demande à l'heure actuelle.
+ Impossible de traiter votre demande à l'heure actuelle.
Pour obtenir de l'aide, veuillez contacter l'Assistance Second Life à la page suivante : http://support.secondlife.com.
@@ -256,7 +289,7 @@ Si vous pensez qu'il s'agit d'une erreur, contactez l'Assist
Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion.
- Le système est en train de vous déconnecter.
+ Le système est en train de vous déconnecter.
Veuillez réessayer de vous connecter dans une minute.
@@ -457,6 +490,39 @@ Veuillez réessayer de vous connecter dans une minute.
Il s’agit d’un lien vers une page dans le domaine officiel SecondLife.com ou LindenLab.com.
+
+ Script
+
+
+ Physiques
+
+
+ Toucher
+
+
+ Supprimer l'inventaire
+
+
+ Fantôme
+
+
+ Temporaire
+
+
+ Prims : [COUNT]
+
+
+ , Impact sur le terrain : [PEWEIGHT]
+
+
+ , Impact sur le terrain du chargement...
+
+
+ Distance : [DISTANCE] m
+
+
+ Position : [POSITION]
+
Vous ne pouvez pas rezzer (charger) des articles du dossier Annonces de la Place de marché
@@ -499,6 +565,12 @@ Veuillez réessayer de vous connecter dans une minute.
tous les articles d'un dossier de stock doivent avoir le même type et droit
+
+ Vous pouvez uniquement placer des articles ou des tenues de votre inventaire personnel dans "Mes tenues".
+
+
+ Un ou plusieurs articles ne peuvent pas être utilisés dans des "Mes tenues".
+
Impossible de déplacer un dossier vers son enfant
@@ -559,6 +631,12 @@ Veuillez réessayer de vous connecter dans une minute.
Cliquez pour exécuter la commande secondlife://
+
+ Cliquez pour ouvrir la fenêtre des paramètres de débogage pour ce paramètre
+
+
+ Cliquez pour porter le contenu d'un dossier d'inventaire
+
Cliquez pour composer un message
@@ -614,13 +692,16 @@ Veuillez réessayer de vous connecter dans une minute.
Afficher l'aide
+
+ Veille
+
- Les éléments de ce type ne peuvent pas être attachés
+ Les éléments de ce type ne peuvent pas être attachés
aux notes de cette région.
- Seuls des éléments avec des autorisation
-illimitées pour le 'prochain propriétaire'
+ Seuls des éléments avec des autorisation
+illimitées pour le 'prochain propriétaire'
peuvent être joints aux notes.
@@ -638,6 +719,12 @@ peuvent être joints aux notes.
Chargement...
+
+ verrouillé
+
+
+ protégé
+
(personne)
@@ -696,7 +783,7 @@ peuvent être joints aux notes.
Services non disponible ou la durée du chargement est dépassée.
- Erreur dans la demande de chargement. Veuillez consulter le site :
+ Erreur dans la demande de chargement. Veuillez consulter le site :
http://secondlife.com/support pour vous aider à résoudre ce problème.
@@ -804,6 +891,12 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
Bloqué(e)
+
+ Réponse automatique
+
+
+ Écrit
+
Effrayé
@@ -1041,6 +1134,9 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
(Distance: [DISTANCE] m)
+
+ La caméra ne peut pas faire la mise au point sur l'utilisateur parce qu'il est en dehors de votre distance d'affichage.
+
OK
@@ -1050,6 +1146,9 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
Impossible de trouver ROOT ou JOINT.
+
+ (sans nom)
+
Chat près de moi
@@ -1122,12 +1221,21 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
Vous téléporter
+
+ Gérez vos biens discrètement
+
+
+ Modifiez vos animations par défaut
+
Forcez votre avatar à s’asseoir
Changer vos paramètres d'environnement
+
+ Photo enregistrée : [FILENAME]
+
Pas connecté(e)
@@ -1177,6 +1285,9 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
Continent / Région entière
+
+ Maisons Linden / Région entière
+
Tous fichiers
@@ -1234,6 +1345,24 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
Dictionnaires
+
+ Sauvegardes d'objets
+
+
+ Modèles COLLADA
+
+
+ Valeurs séparées par des virgules
+
+
+ Recompiler
+
+
+ Images JPEG
+
+
+ Fichiers de programmes exécutables
+
Silhouette
@@ -1291,6 +1420,15 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
aucun
+
+ Ciel
+
+
+ Eau
+
+
+ Cycle du jour
+
Chemise non portée
@@ -1417,6 +1555,9 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
Enregistrer la pièce jointe
+
+ Envoyée par [SENDER], [GROUPNAME]
+
Offre de téléportation
@@ -1471,6 +1612,9 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
Faites glisser un repère ici pour l'ajouter à vos Favoris.
+
+ Vous n'avez pas encore de listing.
+
Aucun article trouvé. Vérifiez l'orthographe de votre chaîne de recherche et réessayez.
@@ -1674,9 +1818,14 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
+
+
+
+
+
Mon inventaire
@@ -1776,6 +1925,9 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
Tout
+
+ Ma valise
+
Aucun élément attaché porté
@@ -2151,6 +2303,12 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
recompiler
+
+ Prétraitement : [SCRIPT]
+
+
+ Prétraitement du script [SCRIPT] terminé
+
Réinitialiser les progrès
@@ -2169,6 +2327,15 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
arrêter
+
+ Supprimer la progression
+
+
+ Suppression
+
+
+ Compilation de [NAME]
+
Compilation réussie !
@@ -2219,6 +2386,9 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
Aucune donnée trouvée pour le groupe
+
+ Vous êtes déjà dans ce groupe
+
domaine parent
@@ -2249,6 +2419,9 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
Groupes toujours autorisés : [ALLOWEDGROUPS], max [MAXACCESS])
+
+ Gérants du domaine : ([ESTATEMANAGERS], max [MAXMANAGERS])
+
Toujours interdits : ([BANNEDAGENTS], max. [MAXBANNED])
@@ -2393,11 +2566,11 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
Estomac
-
- Pectoral droit
+
+ Pectoraux gauches
-
- Pectoral gauche
+
+ Pectoraux droits
HUD centre 2
@@ -2495,6 +2668,24 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
Ce résident a activé Ne pas déranger et verra votre message plus tard.
+
+ Le résident auquel vous avez envoyé un message a activé le mode réponse automatique du visualiseur [APP_NAME], ce qui signifie qu'il a demandé à ne pas être dérangé. Votre message sera quand même affiché dans la fenêtre de messagerie instantanée pour être consulté ultèrieurement.
+
+
+ Le résident auquel vous avez envoyé un message a activé le mode réponse automatique du visualiseur [APP_NAME], ce qui signifie qu'il a demandé à ne pas être dérangé. Votre message sera quand même affiché dans la fenêtre de messagerie instantanée pour être consulté ultèrieurement.
+
+
+ Le résident auquel vous avez envoyé un message a activé le mode rejet de toutes les offres ou demandes de téléportation du visualiseur [APP_NAME], ce qui signifie qu'il a demandé à ne pas être dérangé par les offres ou demandes de téléportations. Vous pouvez quand même lui envoyer un message privé.
+
+
+ Le résident auquel vous avez envoyé un message a activé le mode rejet de toutes les demandes d'amitié du visualiseur [APP_NAME], ce qui signifie qu'il a demandé à ne pas être dérangé par les demandes de d'amitié. Vous pouvez quand même lui envoyer un message privé.
+
+
+ Le résident à qui vous avez envoyé un message a bloqué l'envoi de tous message de votre part.
+
+
+ Le résident auquel vous avez envoyé un message est actuellement absent. Votre message sera affiché dans la fenêtre de messagerie instantanée pour être consulté ultèrieurement.
+
(par nom)
@@ -2567,6 +2758,18 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
Chargement...
+
+ Vous n'avez pas créé de favoris.
+
+
+ L'utilisateur n'a pas de favoris.
+
+
+ Vous n'avez pas créé d'annonces. Cliquez sur le bouton Plus ci-dessous pour créer une annonce.
+
+
+ L'utilisateur n'a pas d'annonces
+
Prévisualiser
@@ -2591,9 +2794,21 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
vous a donné
+
+ Vous refusez
+
Vous refusez l'offre [DESC] de [NAME].
+
+ de
+
+
+ Un objet nommé [OBJECT_NAME] vous a donné cet(te) [OBJECT_TYPE] : [DESC]
+
+
+ [USER_NAME] vous a donné cet(te) [OBJECT_TYPE] : [DESC]
+
Total
@@ -2636,9 +2851,6 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
Le chargement de [NAME] coûte [AMOUNT] L$
-
- Cet achat coûte [AMOUNT] L$
-
Extension de fichier inconnue .%s
.wav, .tga, .bmp, .jpg, .jpeg, ou .anim acceptés
@@ -2843,6 +3055,9 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
Lire/pauser le média
+
+ En cours de lecture :
+
http://www.intel.com/p/fr_FR/support/detect/graphics
@@ -2850,7 +3065,7 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life
http://www.nvidia.com/Download/index.aspx?lang=fr
- http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ https://www.amd.com/fr/support
Une erreur est survenue lors de la lecture de la ligne de commande.
@@ -2870,6 +3085,14 @@ Si le problème persiste, vous devrez peut-être complètement désinstaller pui
Erreur fatale
+
+ Erreur de l'application - Ne paniquez pas
+
+
+ Nous sommes désolés, mais [NOM_Application] a planté et doit être fermé. Si vous constatez que ce problème se répète, veuillez contacter notre équipe d'assistance et soumettre le message suivant :
+
+[ERROR_DETAILS]
+
[APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure).
@@ -2947,8 +3170,8 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
-
- Peu
+
+ Ombre de 5 heures
Tout blancs
@@ -4495,6 +4718,21 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Hors ligne
+
+ L'utilisateur n'est pas en ligne - le message sera stocké et remis ultérieurement.
+
+
+ L'utilisateur n'est pas en ligne - l'inventaire a été sauvegardé.
+
+
+ Message entrant de [NAME]
+
+
+ Réponse automatique envoyée : [MESSAGE]
+
+
+ Élément de réponse automatique envoyé : [ITEM_NAME]
+
Votre appel a fait l'objet d'une réponse
@@ -4534,15 +4772,15 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Dossier de l’inventaire [ITEM_NAME] offert
+
+ Article d'inventaire offert à [NAME]
+
Faire glisser les objets de l'inventaire ici
Vous avez publié sur Flickr.
-
- Vous avez publié sur Twitter.
-
(Session IM inexistante)
@@ -4612,6 +4850,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
[SOURCES] ont dit quelque chose de nouveau
+
+ Vous êtes maintenant à
+
Expiration du délai d'initialisation de la session
@@ -4624,6 +4865,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
https://secondlife.com/destination/voice-morphing-premium
+
+ https://land.secondlife.com/fr-Fr/lindenhomes/my-home.php
+
[NAME] vous a payé [AMOUNT] L$ [REASON].
@@ -4687,9 +4931,6 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
pour publier une petite annonce
-
- Donner [AMOUNT] L$
-
Le chargement coûte [AMOUNT] L$
@@ -4702,6 +4943,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Cet objet coûte [AMOUNT] L$
+
+ Vous voulez donner
+
Tous
@@ -4902,6 +5146,9 @@ du rapport d'infraction
Nouveau ciel
+
+ Nouveaux paramètres
+
/s'incliner
@@ -5006,19 +5253,19 @@ du rapport d'infraction
Malgré nos efforts, une erreur inattendue s’est produite.
Veuillez vous reporter à https://secondlife-status.statuspage.io afin de déterminer si un problème connu existe avec ce service.
- Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu.
+Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu.
- Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
+ Dimanche:Lundi:Mardi:Mercredi:Jeudi:Vendredi:Samedi
- Sun:Mon:Tue:Wed:Thu:Fri:Sat
+ Dim:Lun:Mar:Mer:Jeu:Ven:Sam
- January:February:March:April:May:June:July:August:September:October:November:December
+ Janvier:Février:Mars:Avril:Mai:Juin:Juillet:Août:Septembre:Octobre:Novembre:Décembre
- Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec
+ Jan:Fév:Mar:Avr:Mai:Juin:Juil:Août:Sep:Oct:Nov:Déc
[MDAY]
@@ -5083,6 +5330,12 @@ Veuillez vous reporter à https://secondlife-status.statuspage.io afin de déter
Premium Plus
+
+ Passer au compte Premium
+
+
+ Mon abonnement Premium
+
Supprimer les articles sélectionnés ?
@@ -5145,6 +5398,18 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
CapsLock
+
+ Flèche Gauche
+
+
+ Flèche Droite
+
+
+ Flèche Haut
+
+
+ Flèche Bas
+
Début
@@ -5421,6 +5686,9 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
Z
+
+ Double clic
+
Affichage des balises de particule (bleu)
@@ -5448,6 +5716,9 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
Masquage des particules
+
+ Photo 360°
+
À propos du terrain
@@ -5505,12 +5776,12 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
Marcher / Courir / Voler
-
- Boîte d'envoi vendeur
-
Personnes
+
+ Performance graphique
+
Favoris
@@ -5535,47 +5806,35 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
Parler
-
- Twitter
-
Caméra
- Paramètres vocaux
+ Discussion vocale à proximité
+
+
+ Préférences rapides
Remplacement d'animations
-
- Recherche Zonale
-
-
- Liste Noire active
-
-
- Liste noire
-
-
- Balises
+
+ Navigateur web
- Conversation
+ Chat
-
- Cercles de contacts
-
-
- Enregistrement de conversation
-
-
- Creation de repère
+
+ Recherche Zonale
Paramètres de débogage
-
- Vêtements préférés
+
+ Statistiques
+
+
+ Région/Domaine
Voler
@@ -5583,11 +5842,11 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
S'asseoir au sol
-
- Titres de Groupe
+
+ Explorateur de sons
-
- Immobiliser
+
+ Liste Noire active
Outils photo
@@ -5595,42 +5854,60 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
Outils caméra
-
- Préférences rapides
-
-
- Suivi de région
-
-
- Région/Domaine
-
-
- Resynchroniser les animations
-
-
- Ne montrer que les amis
-
-
- Photo sur disque
-
-
- Explorateur de sons
-
-
- Statistiques
-
-
- Historique de téléportation
-
-
- Navigateur web
+
+ Cercles de contacts
Vue subjective
+
+ Creation de repère
+
+
+ Historique de téléportation
+
Pose Stand
+
+ Photo sur disque
+
+
+ Radar
+
+
+ Enregistrement des conversations
+
+
+ Immobiliser
+
+
+ Liste noire
+
+
+ Resynchroniser les animations
+
+
+ Suivi de région
+
+
+ Titres de Groupe
+
+
+ Vêtements préférés
+
+
+ Ne montrer que les amis
+
+
+ Ne pas afficher les animesh
+
+
+ Balises
+
+
+ Capturez une image équirectangulaire de 360°.
+
Information sur le terrain que vous visitez
@@ -5688,12 +5965,12 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
Faire bouger votre avatar
-
- Transférer des articles vers votre place de marché afin de les vendre.
-
Amis, groupes et personnes près de vous
+
+ Régler les paramètres graphiques
+
Lieux à afficher comme favoris dans votre profil
@@ -5718,15 +5995,102 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
Parler aux personnes près de vous en utilisant votre micro
-
- Twitter
-
Changer l'angle de la caméra
Commandes de réglage du volume des appels et des personnes près de vous dans Second Life.
+
+ Préférences rapides pour modifier des paramètres souvent utilisés
+
+
+ Remplacement d'animation
+
+
+ Ouvre le navigateur web interne (CTRL+SHIFT+Z)
+
+
+ Montre ou cache la barre de conversation
+
+
+ Recherche des objets dans la zone
+
+
+ Changer les paramètres de débogage du logiciel (CTRL+ALT+SHIFT+S)
+
+
+ Affiche les statistiques du navigateur (CTRL+SHIFT+1)
+
+
+ Ouvre les outils de gestion région et domaine (ALT+R)
+
+
+ S'asseoir sur le sol/Se relever (CTRL+ALT+S)
+
+
+ Ouvre l'explorateur de sons
+
+
+ Affiche la liste de tous les éléments mis dans la liste noire
+
+
+ Outils pour la création d'image (ATL+P).
+
+
+ Contrôles avancés de la caméra (CTRL+SHIFT+C)
+
+
+ Gestion des cercles de contacts (CTRL+ALT+SHIFT+C)
+
+
+ Passer en mode Vue subjective (M)
+
+
+ Crée un repère à votre position actuelle
+
+
+ Ouverture de l'historique de téléportation (ALT+H)
+
+
+ Met l'avatar en pose pour ajuster les objets attachés
+
+
+ Prend un cliché rapide et le sauvegarde sur le disque dur
+
+
+ Ouvre le radar pour détecter les avatars à proximité
+
+
+ Ouvre l'historique des conversations pour consulter les transcriptions des conversations passées
+
+
+ Immobilise l'avatar dans sa position actuelle (CTRL+ALT+P)
+
+
+ Ouvre la liste des éléments bloqués/ignorés
+
+
+ Synchronise les animations de l'avatar
+
+
+ Suivre le statut de différentes régions
+
+
+ Modifier le titre de groupe affiché
+
+
+ Ouvre la liste des vêtements préférés
+
+
+ Ne montrez que vos amis, tous les autres avatars seront supprimés. Une fois activé, une téléportation est nécessaire pour rétablir la visibilité des autres.
+
+
+ Ne pas afficher les objets animés (aka Animesh) - Ne pas afficher temporairement tous les animesh visibles (attachés et en liberté). Les animesh qui ne sont pas affichés réapparaitront aprés une téléportation
+
+
+ Montrer les balises
+
actuellement dans la barre d'outils du bas
@@ -5736,101 +6100,20 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
actuellement dans la barre d'outils de droite
+
+ Voler/Arrêter de voler (HOME)
+
Arrêter l'animation
Arrêter l'animation
-
- Remplacement d'animation
+
+ Discord
-
- Recherche des objets dans la zone
-
-
- Affiche la liste de tous les éléments mis dans la liste noire
-
-
- Ouvre la liste des éléments bloqués/ignorés
-
-
- Montrer les balises
-
-
- Montre ou cache la barre de conversation
-
-
- Gestion des cercles de contacts (CTRL+ALT+SHIFT+C)
-
-
- Ouvre l'historique des conversations pour consulter les transcriptions des conversations passées
-
-
- Crée un repère à votre position actuelle
-
-
- Changer les paramètres de débogage du logiciel (CTRL+ALT+SHIFT+S)
-
-
- Ouvre la liste des vêtements préférés
-
-
- Voler/Arrêter de voler (HOME)
-
-
- S'asseoir sur le sol/Se relever (CTRL+ALT+S)
-
-
- Modifier le titre de groupe affiché
-
-
- Immobilise l'avatar dans sa position actuelle (CTRL+ALT+P)
-
-
- Outils pour la création d'image (ATL+P).
-
-
- Contrôles avancés de la caméra (CTRL+SHIFT+C)
-
-
- Préférences rapides pour modifier des paramètres souvent utilisés
-
-
- Suivre le statut de différentes régions
-
-
- Ouvre les outils de gestion région et domaine (ALT+R)
-
-
- Synchronise les animations de l'avatar
-
-
- Ne montrez que vos amis, tous les autres avatars seront supprimés. Une fois activé, une téléportation est nécessaire pour rétablir la visibilité des autres.
-
-
- Prend un cliché rapide et le sauvegarde sur le disque dur
-
-
- Ouvre l'explorateur de sons
-
-
- Affiche les statistiques du navigateur (CTRL+SHIFT+1)
-
-
- Ouverture de l'historique de téléportation (ALT+H)
-
-
- Ouvre le navigateur web interne (CTRL+SHIFT+Z)
-
-
- Passer en mode Vue subjective (M)
-
-
- Met l'avatar en pose pour ajuster les objets attachés
-
-
- Ouvre le radar pour détecter les avatars à proximité
+
+ Discord
Garder%
@@ -5886,12 +6169,145 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
Très élevée
+
+ IM :
+
+
+ Le contrôle du paramètre "[CONTROL_NAME]" doit être à [VALUE_1].
+
+
+ Le contrôle du paramètre "[CONTROL_NAME]" ne doit pas être à [VALUE_1].
+
+
+ Le contrôle du paramètre "[CONTROL_NAME]" doit être inférieur à [VALUE_1].
+
+
+ Le contrôle du paramètre "[CONTROL_NAME]" doit être supérieur à [VALUE_1].
+
+
+ Le contrôle du paramètre "[CONTROL_NAME]" doit être inférieur ou égal à [VALUE_1].
+
+
+ Le contrôle du paramètre "[CONTROL_NAME]" doit être supérieur ou égal à [VALUE_1].
+
+
+ Le contrôle du paramètre "[CONTROL_NAME]" doit être entre [VALUE_1] et [VALUE_2].
+
+
+ Le contrôle du paramètre "[CONTROL_NAME]" ne doit pas être entre [VALUE_1] et [VALUE_2].
+
+
+ Autoriser
+
+
+ Refuser
+
+
+ Toujours
+
+
+ toujours
+
+
+ Ne jamais
+
+
+ ne jamais
+
+
+ Les médias du domaine [DOMAIN] ont été bloqués.
+
+
+ Les médias du domaine [DOMAIN] seront toujours joués.
+
+
+ Les médias du [DOMAIN] ne seront jamais joués.
+
+
+ Les médias de l'URL [MEDIAURL] seront toujours joués.
+
+
+ Les médias de l'URL [MEDIAURL] ne seront jamais joués.
+
+
+ Le flux audio du domaine [DOMAIN] a été bloqué.
+
+
+ Le flux audio du domaine [DOMAIN] sera toujours joué.
+
+
+ Le flux audio du domaine [DOMAIN] ne sera jamais joué.
+
+
+ Le flux audio de l'URL [MEDIAURL] sera toujours joué.
+
+
+ Le flux audio de l'URL [MEDIAURL] ne sera jamais joué.
+
+
+ blacklist
+
+
+ whitelist
+
+
+ (région inconnue)
+
+
+ (position inconnue)
+
+
+ [AGENT][REGION](Double clic pour ouvrir la carte, Maj-glisser pour vous déplacer)
+
+
+ [REGION](Double clic pour vous téléporter, Maj-glisser pour vous déplacer)
+
+
+ [NAME] vous avez été heurté.
+
+
+ [NAME] vous a poussé avec un script.
+
+
+ [NAME] vous a frappé avec un objet.
+
+
+ [NAME] vous a frappé avec un objet scripté.
+
+
+ [NAME] vous a frappé avec un objet physique.
+
+
+ [NAME] a causé une collision de type inconnu.
+
+
+ Avatar > Mouvement > Movelock est activé
+
+ réponse en cas d'occupation
+
Le résident ne peut pas visiter cette région.
[User]
+
+ (redémarrage en cours)
+
+
+ RLVa a été [STATE] (aucun redémarrage requis)
+
+
+ RLVa sera [STATE] après que vous ayez redémarré
+
+ activé
+
+
+ désactivé
+
+
+ (désactivé)
+
Expérience
@@ -6022,23 +6438,23 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique.
- DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]).
-Veuillez vérifier que vous parvenez à vous connecter au site www.secondlife.com.
-Si c'est le cas, et que vous continuez à recevoir ce message d'erreur, veuillez vous
+ DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]).
+Veuillez vérifier que vous parvenez à vous connecter au site www.secondlife.com.
+Si c'est le cas, et que vous continuez à recevoir ce message d'erreur, veuillez vous
rendre à la section Support et signaler ce problème
- Le serveur d'identification a rencontré une erreur de connexion SSL.
-Si vous continuez à recevoir ce message d'erreur,
-veuillez vous rendre à la section Support du site web
+ Le serveur d'identification a rencontré une erreur de connexion SSL.
+Si vous continuez à recevoir ce message d'erreur,
+veuillez vous rendre à la section Support du site web
SecondLife.com et signaler ce problème
- Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur.
-Veuillez aller à Tableaux de bord et assurez-vous que l'heure et la date sont réglés
-correctement. Vérifiez également que votre réseau et votre pare-feu sont configurés
-correctement. Si vous continuez à recevoir ce message d'erreur, veuillez vous rendre
-à la section Support du site web SecondLife.com et signaler ce problème.
+ Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur.
+Veuillez aller à Tableaux de bord et assurez-vous que l'heure et la date sont réglés
+correctement. Vérifiez également que votre réseau et votre pare-feu sont configurés
+correctement. Si vous continuez à recevoir ce message d'erreur, veuillez vous rendre
+à la section Support du site web SecondLife.com et signaler ce problème.
[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances]
@@ -6331,7 +6747,7 @@ Votre position actuelle : [AVATAR_POS]
Vous avez été invité à une conférence (ad-hoc) par [AVATAR_NAME], mais la visionneuse l'a automatiquement ignoré à cause de vos réglages.
-
+
L'appareil photo ne peut pas faire la mise au point sur l'utilisateur [AVATARNAME] parce qu'il est en dehors de votre distance d'affichage.
diff --git a/indra/newview/skins/default/xui/it/floater_360capture.xml b/indra/newview/skins/default/xui/it/floater_360capture.xml
new file mode 100644
index 0000000000..0accec0db1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_360capture.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ Livello qualità
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Clicca e trascina per ruotare la panoramica
+
+
+
diff --git a/indra/newview/skins/default/xui/it/floater_performance.xml b/indra/newview/skins/default/xui/it/floater_performance.xml
index ec853eefc7..cf883de378 100644
--- a/indra/newview/skins/default/xui/it/floater_performance.xml
+++ b/indra/newview/skins/default/xui/it/floater_performance.xml
@@ -1,13 +1,19 @@
-
+
+
+ Frame: [TOT_FRAME_TIME]ms - Scenario:[SCENERY_FRAME_PCT]% Avatar:[AV_FRAME_PCT]% UI:[UI_FRAME_PCT]% HUD:[HUDS_FRAME_PCT]% Swap:[SWAP_FRAME_PCT]% Tasks:[IDLE_FRAME_PCT]%
+
Limita FPS: [FPSCAP] fps
-
- Obbiett.: [FPSTARGET] fps
-
- Sfondo
+ In Background
+
+
+ Attendi 5-10 sec per l'aggiornamento
+
+
+ Stats in pausa se FPS limitati / in background
Totale: [TOT_AV] ([TOT_AV_TIME]μs)
@@ -18,28 +24,39 @@
- fotogr. al secondo
+ frame per secondo
+
+
+ Limita FPS: [FPSCAP] fps
- Attendi 5-10 Sec per aggiornamento modifiche
+ Stats in pausa se FPS limitati / in background
[------------ La suddivisione del frame apparirà qui ------------]
-
- Autoregolazione Frame Rate
+
+ Auto Tune:
-
+
+ Target Frame Rate (fps)
+
+
+
+
+
+
+
- Autoregola impostazioni per mantenere FPS
+ Modalità di Ottimizzazione
-
-
+
+
-
+
@@ -48,7 +65,7 @@
Impostazioni grafiche
- Scegli impostazioni per distanza, acqua, illuminazione e altro.
+ Scegli impostazioni per distanza, acqua, luci e altro.
@@ -56,33 +73,33 @@
Avatar nelle vicinanze
- Gestisci quali avatar vicini vengono visti completamente.
+ Gestisci visualizzazione degli avatar nelle vicinanze.
-Tempo trasc.
+Tempo speso
a disegnare
-avatar
+gli avatar
- La tua complessita
+ La tua complessità
- Sii un buon cittadino. Gestisci l'impatto del tuo avatar.
+ Rispetta gli altri utenti. Gestisci l'impatto del tuo avatar.
- I tuoi HUD attivi
+ I tuoi HUD
- Rimuovi HUD non necessari. Migliora la velocita.
+ Migliora la velocità rimuovendo gli HUD non necessari.
-Tempo trasc.
+Tempo speso
a disegnare
-HUD
+gli HUD
diff --git a/indra/newview/skins/default/xui/it/inspect_group.xml b/indra/newview/skins/default/xui/it/inspect_group.xml
index ba5baeae30..78156d186a 100644
--- a/indra/newview/skins/default/xui/it/inspect_group.xml
+++ b/indra/newview/skins/default/xui/it/inspect_group.xml
@@ -13,6 +13,6 @@
Sei iscritto
-
+
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 8ef9babc45..bcf2fbfe75 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -106,6 +106,7 @@
+
-
+
Barba leggera
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 35ba0671e9..63cffdd740 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -85,7 +85,7 @@
- [SECOND_LIFE_GRID] に接続できませんでした。
+ [CURRENT_GRID] に接続できませんでした。
「[DIAGNOSTIC]」
インターネット接続が正常かご確認ください。
@@ -1564,7 +1564,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries を参照してく
- 接続がなかなかできません。 お使いのインターネット接続か、[SECOND_LIFE_GRID] の問題と考えられます。
+ 接続がなかなかできません。 お使いのインターネット接続か、[CURRENT_GRID] の問題と考えられます。
インターネット接続を確認してから数分後に再接続するか、ヘルプをクリックして [SUPPORT_SITE] をご覧になるか、テレポートをクリックしてホームに移動してみてください。
@@ -1577,7 +1577,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries を参照してく
- 接続がなかなかできません。 お使いのインターネット接続か、[SECOND_LIFE_GRID] の問題と考えられます。
+ 接続がなかなかできません。 お使いのインターネット接続か、[CURRENT_GRID] の問題と考えられます。
インターネット接続を確認してから数分後に再接続するか、ヘルプをクリックして [SUPPORT_SITE] をご覧ください。
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 8d0368885f..344b040e8d 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -3062,7 +3062,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
-
+
うっすらとしたヒゲ
diff --git a/indra/newview/skins/default/xui/pl/floater_performance.xml b/indra/newview/skins/default/xui/pl/floater_performance.xml
index 1c45a49d1b..cff8bd0151 100644
--- a/indra/newview/skins/default/xui/pl/floater_performance.xml
+++ b/indra/newview/skins/default/xui/pl/floater_performance.xml
@@ -16,7 +16,7 @@
Poczekaj 5-10 sekund, by nastąpiły zmiany.
- Statystyki pauzują, gdy FPS jest limitowane lub w tle.
+ Statystyki pauzują, gdy FPS ma limit, lub w tle.
Łącznie: [TOT_AV] ([TOT_AV_TIME]μs)
@@ -30,7 +30,7 @@
klatek na sekundę
- Statystyki pauzują, gdy FPS jest limitowane lub w tle.
+ Statystyki pauzują, gdy FPS ma limit, lub w tle.
[----------------- Tutaj pojawi się analiza klatek. -----------------]
diff --git a/indra/newview/skins/default/xui/pl/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/pl/floater_scene_load_stats.xml
index b42cb6327f..46b803e0cc 100644
--- a/indra/newview/skins/default/xui/pl/floater_scene_load_stats.xml
+++ b/indra/newview/skins/default/xui/pl/floater_scene_load_stats.xml
@@ -16,6 +16,10 @@
+
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/pl/floater_texture_fetch_debugger.xml
index ee857443d6..5f67b555f0 100644
--- a/indra/newview/skins/default/xui/pl/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/pl/floater_texture_fetch_debugger.xml
@@ -62,6 +62,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index 7b527812d8..eee91ddb7a 100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -608,6 +608,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index a27cfbdf39..f09b2c9bf1 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -34,9 +34,14 @@ Szczegóły błędu: Błąd o nazwie '[_NAME]' nie został odnaleziony
Instalacja [APP_NAME] jest uszkodzona. Proszę [https://www.firestormviewer.org/downloads pobrać nową kopię] przeglądarki i ponownie ją zainstalować.
- Nie można połączyć z [SECOND_LIFE_GRID].
+ Nie można połączyć z [CURRENT_GRID].
'[DIAGNOSTIC]'
Upewnij się, że Twoje połączenie z internetem działa.
+
+
+ Przeglądarka otrzymała zniekształconą odpowiedź z serwera. Upewnij się, że połączenie internetowe działa prawidłowo i spróbuj ponownie później.
+
+Jeśli uważasz, że to błąd - skontaktuj się z pomocą techniczną.
Szablon komunikatu dla [PATH] nie został odnaleziony.
@@ -1139,6 +1144,9 @@ Zazwyczaj jest to tymczasowy problem. Możesz kontynuować modyfikacje i zapisa
[MESSAGE]
+
+ Wystąpił problem podczas ładowania szafy. Spróbuj się wylogować i zalogować ponownie. Jeśli zobaczysz ten komunikat jeszcze raz, to skontaktuj się z pomocą techniczną, aby rozwiązać problem.
+
Nie możesz kupić działek dla grupy.
Nie masz praw kupowania działek dla Twojej aktywnej grupy.
@@ -1412,7 +1420,7 @@ Czy chcesz przejść na stronę [https://www.firestormviewer.org/join-secondlife
- Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID].
+ Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [CURRENT_GRID].
Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut, połączyć się ze stroną pomocy technicznej ([SUPPORT_SITE]) lub wybrać Teleportuj, by teleportować się do swojego miejsca startu.
@@ -1421,7 +1429,7 @@ Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kil
- Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID].
+ Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [CURRENT_GRID].
Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut lub połączyć się ze stroną pomocy technicznej [SUPPORT_SITE].
@@ -4824,7 +4832,7 @@ Spróbuj zaznaczyć mniejszy obszar ziemi.
Na następnej stronie wybierz kwotę L$
i kliknij przycisk składania zamówienia.
-Będziesz mógł/a dodać metodę płatności w kasie.
+Będziesz mógł/a dodać metodę płatności w kasie.
@@ -5147,6 +5155,11 @@ Skopiuj do własnej szafy i spróbuj ponownie.
Nie można załadować ścieżki z [TRACK1] do [TRACK2].
+
+Wynik testu kompresji pliku dla gzip na poziomie 6 z [FILE] o rozmiarze [SIZE] KB:
+Pakowanie: [PACK_TIME]s [PSIZE]KB
+Rozpakowywanie: [UNPACK_TIME]s [USIZE]KB
+
Nie wybrano prawidłowego ustawienia otoczenia.
diff --git a/indra/newview/skins/default/xui/pl/panel_group_creation_sidetray.xml b/indra/newview/skins/default/xui/pl/panel_group_creation_sidetray.xml
index a2e765b15c..99c7685c0c 100644
--- a/indra/newview/skins/default/xui/pl/panel_group_creation_sidetray.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_creation_sidetray.xml
@@ -49,7 +49,7 @@
- Uwaga: Po 7 dniach grupa bez członków (poza jej twórcą) zostanie usunięta!
+ Uwaga: grupa, która ma mniej niż 2 członków przez 48 godzin, zostaje usunięta!
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
index 68a250afcf..fa19e6f79d 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
@@ -33,10 +33,7 @@
-
-
- Zostaną użyte ustawienia proxy Twojego systemu.
-
+
Strona startowa:
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 8ab53bd1f1..9c5b7d78bb 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -3056,7 +3056,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
-
+
Cień na godzinie 5
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index ab03572b54..efe8b4f04a 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -85,7 +85,7 @@ Detalhes do erro: O aviso '[_NAME]' não foi localizado no arquivo not
- Falha de conexão com o [SECOND_LIFE_GRID].
+ Falha de conexão com o [CURRENT_GRID].
'[DIAGNOSTIC]'
Verifique se a conexão à internet está funcionando.
@@ -1387,7 +1387,7 @@ Voltar para [https://www.firestormviewer.org/join-secondlife/ firestormviewer.or
- Estamos detectando um problema de conexão. Pode haver um problema com a sua conexão à internet ou com o [SECOND_LIFE_GRID].
+ Estamos detectando um problema de conexão. Pode haver um problema com a sua conexão à internet ou com o [CURRENT_GRID].
Cheque sua conexão e tente em alguns minutos, clique na Ajuda para acessar o [SUPPORT_SITE], ou tente voltar para casa clicando em 'Teletransportar'.
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index cc0de1f604..f4946e5a96 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -2790,7 +2790,7 @@ Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].
If you continue to receive this message, contact the [SUPPORT_SITE].
-
+
Barba por fazer
diff --git a/indra/newview/skins/default/xui/ru/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/ru/floater_scene_load_stats.xml
index e14ca4ee18..d491033512 100644
--- a/indra/newview/skins/default/xui/ru/floater_scene_load_stats.xml
+++ b/indra/newview/skins/default/xui/ru/floater_scene_load_stats.xml
@@ -19,8 +19,12 @@
+
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml
index 628e6c5c87..37f8a85d2a 100644
--- a/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/ru/floater_texture_fetch_debugger.xml
@@ -65,6 +65,7 @@
+
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index 869edd6b89..43228e92ae 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -648,6 +648,7 @@
+
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index 2bccaea303..33288bb27e 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -40,9 +40,14 @@
Произошла ошибка при обновлении [APP_NAME]. [https://www.firestormviewer.org/downloads Загрузите последнюю версию] клиента.
- Не удалось подключиться к [SECOND_LIFE_GRID].
+ Не удалось подключиться к [CURRENT_GRID].
"[DIAGNOSTIC]"
Убедитесь, что подключение к интернету работает нормально.
+
+
+Вьювер получил искаженный ответ от сервера. Пожалуйста, убедитесь, что ваше интернет-соединение работает нормально и повторите попытку позже.
+
+Если вы считаете что это ошибка, обратитесь в службу поддержки.
Шаблон сообщения [PATH] не найден.
@@ -349,7 +354,7 @@
- ВНИМАНИЕ! При выборе "продавать кому угодно" ваша земля станет доступной всему сообществу [SECOND_LIFE], даже тем, кто находится не в этом регионе.
+ ВНИМАНИЕ! При выборе "продавать кому угодно" ваша земля станет доступной всему сообществу [CURRENT_GRID], даже тем, кто находится не в этом регионе.
Выбранные [LAND_SIZE] м² земли выставляются на продажу.
Ваша цена продажи: $[SALE_PRICE], разрешена продажа для [NAME].
@@ -453,7 +458,7 @@
Ошибка при передаче снимка отчета по следующей причине: [REASON]
- Для входа в [SECOND_LIFE] вы должны принять условия Пользовательского соглашения.
+ Для входа в [CURRENT_GRID] вы должны принять условия Пользовательского соглашения.
[TITLE]
@@ -481,7 +486,7 @@
Что-то осталось незаполненным.
Необходимо ввести имя пользователя для вашего аватара.
-Для входа в [SECOND_LIFE] нужен аккаунт. Создать его?
+Для входа в [CURRENT_GRID] нужен аккаунт. Создать его?
[create_account_url]
@@ -1167,6 +1172,9 @@
[MESSAGE]
+
+ Не удалось загрузить ваш инвентарь. Во-первых, попробуйте выйти из системы и войти снова. Если вы снова увидите это сообщение, обратитесь в службу поддержки чтобы решить проблему.
+
Невозможно купить землю для группы:
У вас нет прав на покупку земли для вашей активной группы.
@@ -1421,7 +1429,7 @@
Ваша одежда все еще загружается.
-Вы можете использовать [SECOND_LIFE] как обычно, другие пользователи будут видеть вас нормально.
+Вы можете использовать [APP_NAME] как обычно, другие пользователи будут видеть вас нормально.
@@ -1442,7 +1450,7 @@
Установка [APP_NAME] завершена.
-Если вы используете [SECOND_LIFE] впервые, для входа в программу вам потребуется создать аккаунт.
+Если вы используете [CURRENT_GRID] впервые, для входа в программу вам потребуется создать аккаунт.
@@ -1453,7 +1461,7 @@
- Возникли неполадки при подключении. Возможно, проблема с вашим подключением к интернету или [SECOND_LIFE_GRID] временно недоступна.
+ Возникли неполадки при подключении. Возможно, проблема с вашим подключением к интернету или [CURRENT_GRID] временно недоступна.
Вы можете проверить подключение к интернету, повторить попытку через несколько минут, нажать кнопку «Помощь» для перехода на [SUPPORT_SITE] или нажать кнопку «Телепортация», чтобы телепортироваться домой.
@@ -1466,7 +1474,7 @@
- Возникли неполадки при подключении. Возможно, проблема с вашим подключением к интернету или [SECOND_LIFE_GRID] временно недоступна.
+ Возникли неполадки при подключении. Возможно, проблема с вашим подключением к интернету или [CURRENT_GRID] временно недоступна.
Вы можете проверить подключение к интернету, повторить попытку через несколько минут, нажать кнопку «Справка» для перехода на [SUPPORT_SITE].
@@ -1483,7 +1491,7 @@
Ваш персонаж появится через мгновение.
Для ходьбы нажимайте клавиши со стрелками.
-В любой момент можно нажать клавишу F1 для получения справки или информации о [SECOND_LIFE].
+В любой момент можно нажать клавишу F1 для получения справки или информации о [CURRENT_GRID].
Выберите мужской или женский аватар. Этот выбор затем можно будет изменить.
@@ -5270,6 +5278,11 @@ https://wiki.firestormviewer.org/fs_voice
Невозможно загрузить дорожку из [TRACK1] в [TRACK2].
+
+Результат теста на сжатие gzip 6 уровня с файлом [FILE] размером [SIZE] КБ:
+Упаковка: [PACK_TIME]с [PSIZE]КБ
+Распаковка: [UNPACK_TIME]с [USIZE]КБ
+
Не выбрана допустимая настройка окружающей среды.
diff --git a/indra/newview/skins/default/xui/ru/panel_group_creation_sidetray.xml b/indra/newview/skins/default/xui/ru/panel_group_creation_sidetray.xml
index 63cbb87fce..c47e7b81bd 100644
--- a/indra/newview/skins/default/xui/ru/panel_group_creation_sidetray.xml
+++ b/indra/newview/skins/default/xui/ru/panel_group_creation_sidetray.xml
@@ -47,7 +47,7 @@
- Примечание: через 7 дней группа без участников (кроме создателя) удаляется!
+ Примечание: группа, в которой менее 2 участников, удаляется в течение 48 часов!
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 9ea296b758..ad0b7f5242 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
@@ -34,10 +34,7 @@
-
-
- Будут использованы существующие настройки прокси вашей системы.
-
+
Домашняя страница браузера:
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
index 275982aede..adc71e1287 100644
--- a/indra/newview/skins/default/xui/tr/notifications.xml
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -86,7 +86,7 @@ Hata ayrıntıları: '[_NAME]' adlı bildirim notifications.xml içind
- [SECOND_LIFE_GRID] ile bağlantı kurulamadı.
+ [CURRENT_GRID] ile bağlantı kurulamadı.
'[DIAGNOSTIC]'
İnternet bağlantınızın düzgün çalıştığından emin olun.
@@ -417,7 +417,7 @@ Satış fiyatınız L$ [SALE_PRICE] olacak ve [NAME] için satışa açık olaca
- DİKKAT: 'Herkes için satışa açık' seçeneğinin tıklanması, arazinizi tüm [SECOND_LIFE] topluluğuna açık hale getirir, bu bölgede bulunmayanlar da buna dahildir.
+ DİKKAT: 'Herkes için satışa açık' seçeneğinin tıklanması, arazinizi tüm [CURRENT_GRID] topluluğuna açık hale getirir, bu bölgede bulunmayanlar da buna dahildir.
Seçili [LAND_SIZE] m² arazi satışa çıkarılmak üzere ayarlanıyor.
Satış fiyatınız L$ [SALE_PRICE] olacak ve [NAME] için satışa açık olacaktır.
@@ -521,7 +521,7 @@ Ortamı sadece bir yüze yerleştirmek için, Yüz Seç'i seçin ve ardınd
Aşağıdaki nedenden dolayı, bir raporun ekran görüntüsü karşıya yüklenirken bir sorun oluştu: [REASON]
- [SECOND_LIFE]'ta oturum açmaya devam etmek için Second Life Şartlar ve Koşullar'ı, Gizlilik Politikası'nı ve Hizmet Koşulları'nı kabul etmelisiniz.
+ [CURRENT_GRID]'ta oturum açmaya devam etmek için Second Life Şartlar ve Koşullar'ı, Gizlilik Politikası'nı ve Hizmet Koşulları'nı kabul etmelisiniz.
Dış görünüm eklenemedi.
@@ -544,7 +544,7 @@ Dış görünüm klasöründe hiç giysi, vücut bölümü ya da aksesuar yok.
Hata! Boş bırakılan alan(lar) var.
Avatarınızın Kullanıcı adını girmeniz gerekmektedir.
-[SECOND_LIFE]'a giriş yapmak için bir hesabınız olması gerekir. Şimdi bir hesap oluşturmak ister misiniz?
+[CURRENT_GRID]'a giriş yapmak için bir hesabınız olması gerekir. Şimdi bir hesap oluşturmak ister misiniz?
[create_account_url]
@@ -586,7 +586,7 @@ Devam etmek istediğinize emin misiniz?
- [SECOND_LIFE] etkinlikleri web sayfasına gidilsin mi?
+ [CURRENT_GRID] etkinlikleri web sayfasına gidilsin mi?
http://secondlife.com/events/
@@ -618,7 +618,7 @@ Not: Bu işlem önbelleği temizleyecek.
Dil değişikliği, [APP_NAME] uygulamasını yeniden başlattıktan sonra geçerli olacak.
- Açık arttırma detaylarını görmek veya teklif vermek için [SECOND_LIFE] web sayfasına gidilsin mi?
+ Açık arttırma detaylarını görmek veya teklif vermek için [CURRENT_GRID] web sayfasına gidilsin mi?
http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
@@ -681,7 +681,7 @@ Nesne aralık dışında ya da silinmiş olabilir.
Dosya karşıdan yüklenemiyor.
- [SECOND_LIFE] içinde desteklenmeyen bir dosya indirmeyi talep ettiniz.
+ [APP_NAME] içinde desteklenmeyen bir dosya indirmeyi talep ettiniz.
@@ -1174,7 +1174,7 @@ Arazi birleştirilsin mi?
Bu genellikle geçici bir arızadır. Lütfen giyilebilir öğeyi birkaç dakika sonra yeniden özelleştirip kaydedin.
- Üzgünüz. [SECOND_LIFE] oturumunuz kapandı.
+ Üzgünüz. [CURRENT_GRID] oturumunuz kapandı.
[MESSAGE]
@@ -1419,7 +1419,7 @@ Yeni bir ana konum ayarlamak isteyebilirsiniz.
Giysileriniz hala karşıdan yükleniyor.
-[SECOND_LIFE]'ı normal şekilde kullanmaya devam edebilirsiniz, diğer insanlar sizi düzgün bir şekilde görecektir.
+[APP_NAME]'ı normal şekilde kullanmaya devam edebilirsiniz, diğer insanlar sizi düzgün bir şekilde görecektir.
@@ -1440,11 +1440,11 @@ Yeni bir ana konum ayarlamak isteyebilirsiniz.
[APP_NAME] yüklemesi tamamlandı.
-[SECOND_LIFE]'ı ilk kez kullanıyorsanız, oturum açmadan önce bir hesap oluşturmalısınız.
+[CURRENT_GRID]'ı ilk kez kullanıyorsanız, oturum açmadan önce bir hesap oluşturmalısınız.
- Bağlantıda sorun yaşıyoruz. İnternet bağlantınızda ya da [SECOND_LIFE_GRID] uygulamasında bir problem olabilir.
+ Bağlantıda sorun yaşıyoruz. İnternet bağlantınızda ya da [CURRENT_GRID] uygulamasında bir problem olabilir.
İnternet bağlantınızı kontrol edip bir kaç dakika sonra yeniden bağlanmayı deneyebilir, [SUPPORT_SITE] sayfasına gitmek için Yardım'ı tıklatabilir ya da ana konumunuza ışınlanmak için Işınla'yı tıklatabilirsiniz.
@@ -1460,7 +1460,7 @@ Yeni bir ana konum ayarlamak isteyebilirsiniz.
Karakteriniz birazdan görünecek.
Yürümek için ok tuşlarını kullanın.
-Yardım almak ya da [SECOND_LIFE] hakkında daha fazla bilgi edinmek için istediğiniz zaman F1 tuşuna basın.
+Yardım almak ya da [CURRENT_GRID] hakkında daha fazla bilgi edinmek için istediğiniz zaman F1 tuşuna basın.
Lütfen bir erkek ya da kadın avatar seçin. Fikrinizi daha sonra değiştirebilirsiniz.
@@ -1657,15 +1657,15 @@ Devam edilsin mi?
- Bir güvenlik sorununun nasıl bildireceği ile ilgili ayrıntıları öğrenmek için [SECOND_LIFE] Wiki'yi aç.
+ Bir güvenlik sorununun nasıl bildireceği ile ilgili ayrıntıları öğrenmek için [CURRENT_GRID] Wiki'yi aç.
- [SECOND_LIFE] Wiki'nin Kalite Güvencesi sayfasını ziyaret edin.
+ [CURRENT_GRID] Wiki'nin Kalite Güvencesi sayfasını ziyaret edin.
- Hataları ve diğer sorunları bildirebileceğiniz [SECOND_LIFE] Kamuya Açık Sorun Takip sayfasını ziyaret edin.
+ Hataları ve diğer sorunları bildirebileceğiniz [CURRENT_GRID] Kamuya Açık Sorun Takip sayfasını ziyaret edin.
@@ -2361,9 +2361,9 @@ Doğru bir anlatım yapılması, kötüye kullanım bildirimlerini dosyalamamız
Fikri mülkiyet ihlali konusunda bir bildirim yapıyorsunuz. Konuyu doğru bir şekilde bildirdiğinizden emin olun:
-(1) Kötüye Kullanımı Bildirme Süreci. Bir Second Life Sakininin, CopyBot ya da benzeri bir kopyalama aracı kullanma vb. yollarla, fikri mülkiyet haklarını ihlal edecek şekilde [SECOND_LIFE]'ın verdiği izinleri kötüye kullandığını düşünüyorsanız bir kötüye kullanım bildirimi sunabilirsiniz. Kötüye Kullanımla Mücadele Ekibi [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Hizmet Sözleşmesi] veya [http://secondlife.com/corporate/cs.php Topluluk Standartları] kurallarını ihlal eden davranışları inceleyecek ve uygun disiplin cezalarını verecektir. Ancak, Kötüye Kullanımla Mücadele Ekibi, içeriğin [SECOND_LIFE] ortamından kaldırılma taleplerine yanıt vermeyecektir.
+(1) Kötüye Kullanımı Bildirme Süreci. Bir Second Life Sakininin, CopyBot ya da benzeri bir kopyalama aracı kullanma vb. yollarla, fikri mülkiyet haklarını ihlal edecek şekilde [CURRENT_GRID]'ın verdiği izinleri kötüye kullandığını düşünüyorsanız bir kötüye kullanım bildirimi sunabilirsiniz. Kötüye Kullanımla Mücadele Ekibi [CURRENT_GRID] [http://secondlife.com/corporate/tos.php Hizmet Sözleşmesi] veya [http://secondlife.com/corporate/cs.php Topluluk Standartları] kurallarını ihlal eden davranışları inceleyecek ve uygun disiplin cezalarını verecektir. Ancak, Kötüye Kullanımla Mücadele Ekibi, içeriğin [CURRENT_GRID] ortamından kaldırılma taleplerine yanıt vermeyecektir.
-(2) DMCA veya İçerik Kaldırma Süreci. İçeriğin [SECOND_LIFE] ortamından kaldırılmasını talep etmek için, [http://secondlife.com/corporate/dmca.php DMCA İlkeleri]'nde belirtildiği şekilde geçerli bir ihlal bildirimi sunmuş olmanız GEREKLİDİR.
+(2) DMCA veya İçerik Kaldırma Süreci. İçeriğin [CURRENT_GRID] ortamından kaldırılmasını talep etmek için, [http://secondlife.com/corporate/dmca.php DMCA İlkeleri]'nde belirtildiği şekilde geçerli bir ihlal bildirimi sunmuş olmanız GEREKLİDİR.
Kötüye kullanım bildirme sürecine devam etmek için, lütfen bu pencereyi kapatın ve bildiriminizi gönderme işlemini tamamlayın. 'CopyBot veya İzin İhlali' kategorisini seçmeniz gerekebilir.
@@ -2513,7 +2513,7 @@ Ayarlar yerel dokular kullanılarak kaydedilemez.
Konum, 18 veya üzeri bir yaşta olanlara kısıtlanmıştır.
- Bu alanı ziyaret edebilmek için ödeme bilgilerinizin kayıtlı olması gerekir. [SECOND_LIFE] web sitesine gitmek ve bunu ayarlamak istiyor musunuz?
+ Bu alanı ziyaret edebilmek için ödeme bilgilerinizin kayıtlı olması gerekir. [CURRENT_GRID] web sitesine gitmek ve bunu ayarlamak istiyor musunuz?
[_URL]
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index 94aacbb0fd..f00595d9b3 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -2956,7 +2956,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
-
+
Bir Günlük Sakal
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
index 844fc7cc3e..d1560648da 100644
--- a/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -86,7 +86,7 @@
- 無法連接到 [SECOND_LIFE_GRID]。
+ 無法連接到 [CURRENT_GRID]。
([DIAGNOSTIC])
請確定你的網路連線沒有問題。
@@ -1379,7 +1379,7 @@
- 連線出現問題。 問題可能出在你的網路連線或 [SECOND_LIFE_GRID]。
+ 連線出現問題。 問題可能出在你的網路連線或 [CURRENT_GRID]。
請檢查你的網路連線,幾分鐘後再試一次,或者點按幫助瀏覽 [SUPPORT_SITE],或點按瞬間傳送試著回到你的家。
@@ -2266,7 +2266,7 @@ SHA1 指紋:[MD5_DIGEST]
你似乎正在舉報有人侵犯智慧財產權。 請確定你舉報內容確鑿無誤:
-(1) 違規舉報處理程序。 你若相信有居民利用 [CURRENT_GRID] 權限遂行侵犯智慧財產權,如使用複製機器程式碼(CopyBot)或其他類似複製工具,得以舉報此情事。 違規處理小組會就任何違反[SECOND_LIFE][http://secondlife.com/corporate/tos.php 服務條款]或[http://secondlife.com/corporate/cs.php 社群準則]的行為展開調查,並採取適當處置。 然而,違規處理小組並不受理要求將某內容自[SECOND_LIFE]虛擬世界刪除,這類要求將不予回應。
+(1) 違規舉報處理程序。 你若相信有居民利用 [CURRENT_GRID] 權限遂行侵犯智慧財產權,如使用複製機器程式碼(CopyBot)或其他類似複製工具,得以舉報此情事。 違規處理小組會就任何違反[CURRENT_GRID][http://secondlife.com/corporate/tos.php 服務條款]或[http://secondlife.com/corporate/cs.php 社群準則]的行為展開調查,並採取適當處置。 然而,違規處理小組並不受理要求將某內容自[CURRENT_GRID]虛擬世界刪除,這類要求將不予回應。
(2) DMCA(刪除內容作業程序)。 若欲要求刪除[CURRENT_GRID]內容,你必須按照[http://secondlife.com/corporate/dmca.php DMCA 政策]提出有效的侵權通知。
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index 2c6ddaebcb..4c455304f3 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -2877,7 +2877,7 @@ http://secondlife.com/support 求助解決問題。
如果你繼續看到此訊息,請聯絡 [SUPPORT_SITE]。
-
+
下午五點的新鬍渣
diff --git a/indra/newview/skins/starlightcui/themes/custom_dark/colors.xml b/indra/newview/skins/starlightcui/themes/custom_dark/colors.xml
index 0a597d76bd..72328f968c 100755
--- a/indra/newview/skins/starlightcui/themes/custom_dark/colors.xml
+++ b/indra/newview/skins/starlightcui/themes/custom_dark/colors.xml
@@ -840,6 +840,12 @@
+
+
+
+
diff --git a/indra/newview/skins/starlightcui/themes/custom_light/colors.xml b/indra/newview/skins/starlightcui/themes/custom_light/colors.xml
index 6ad8300036..417d97de02 100755
--- a/indra/newview/skins/starlightcui/themes/custom_light/colors.xml
+++ b/indra/newview/skins/starlightcui/themes/custom_light/colors.xml
@@ -851,6 +851,12 @@
+
+
+
+
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index da2328c404..f025540706 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -1767,9 +1767,8 @@ class DarwinManifest(ViewerManifest):
]
for attempt in range(3):
if attempt: # second or subsequent iteration
- print >> sys.stderr, \
- ("codesign failed, waiting %d seconds before retrying" %
- sign_retry_wait)
+ print("codesign failed, waiting {:d} seconds before retrying".format(sign_retry_wait),
+ file=sys.stderr)
time.sleep(sign_retry_wait)
sign_retry_wait*=2
@@ -1799,7 +1798,7 @@ class DarwinManifest(ViewerManifest):
# 'err' goes out of scope
sign_failed = err
else:
- print >> sys.stderr, "Maximum codesign attempts exceeded; giving up"
+ print("Maximum codesign attempts exceeded; giving up", file=sys.stderr)
raise sign_failed
self.run_command(['spctl', '-a', '-texec', '-vvvv', app_in_dmg])
self.run_command([self.src_path_of("installers/darwin/apple-notarize.sh"), app_in_dmg])
@@ -2042,19 +2041,17 @@ class LinuxManifest(ViewerManifest):
# Vivox runtimes
# Currentelly, the 32-bit ones will work with a 64-bit client.
- with self.prefix(src=os.path.join(pkgdir, 'lib', 'release'), dst="bin"):
+ with self.prefix(src=os.path.join(pkgdir, 'bin32' ), dst="bin"):
self.path("SLVoice")
+ with self.prefix(src=os.path.join(pkgdir ), dst="bin"):
self.path("win32")
self.path("win64")
- with self.prefix(src=os.path.join(pkgdir, 'lib', 'release'), dst="lib"):
- self.path("libortp.so")
- self.path("libsndfile.so.1")
- # Vivox wants this library even if it's present already in the viewer
- self.path("libvivoxoal.so.1")
- self.path("libvivoxsdk.so")
- self.path("libvivoxplatform.so")
-
+ with self.prefix(src=os.path.join(pkgdir, 'lib32' ), dst="lib32"):
+ self.path("libvivox*")
+ self.path("libortp*")
+ self.path("libsndfile*")
+ self.path("*.crt")
def package_finish(self):
# a standard map of strings for replacing in the templates
@@ -2080,10 +2077,6 @@ class LinuxManifest(ViewerManifest):
# name in the tarfile
realname = self.get_dst_prefix()
tempname = self.build_path_of(installer_name)
- self.run_command([
- self.args["source"] + "/installers/linux/appimage.sh", self.args["build"],
- self.args["build"] + "/Firestorm-x86_64.AppImage", self.args["build"] + "/" + installer_name + ".AppImage"
- ] )
self.run_command(["mv", realname, tempname])
try:
# only create tarball if it's a release build.
diff --git a/indra/test/lltut.h b/indra/test/lltut.h
index 9835565bb6..fd5d70462c 100644
--- a/indra/test/lltut.h
+++ b/indra/test/lltut.h
@@ -79,10 +79,18 @@ namespace tut
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
+#if __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
+#endif
+
#include
#if __clang__
#pragma clang diagnostic pop
#endif
+#if __GNUC__
+#pragma GCC diagnostic pop
+#endif
// The functions BELOW this point actually consume tut.hpp functionality.
namespace tut
diff --git a/indra/test/sync.h b/indra/test/sync.h
index ca8b7262d6..bd837cb730 100644
--- a/indra/test/sync.h
+++ b/indra/test/sync.h
@@ -89,25 +89,26 @@ public:
/// suspend until "somebody else" has bumped mCond by n steps
void yield(int n=1)
{
- return yield_until(STRINGIZE("Sync::yield_for(" << n << ") timed out after "
- << int(mTimeout.value()) << "ms"),
- mCond.get() + n);
+ return yield_until("Sync::yield_for", n, mCond.get() + n);
}
/// suspend until "somebody else" has bumped mCond to a specific value
void yield_until(int until)
{
- return yield_until(STRINGIZE("Sync::yield_until(" << until << ") timed out after "
- << int(mTimeout.value()) << "ms"),
- until);
+ return yield_until("Sync::yield_until", until, until);
}
private:
- void yield_until(const std::string& desc, int until)
+ void yield_until(const char* func, int arg, int until)
{
std::string name(llcoro::logname());
LL_DEBUGS() << name << " yield_until(" << until << ") suspending" << LL_ENDL;
- tut::ensure(name + ' ' + desc, mCond.wait_for_equal(mTimeout, until));
+ if (! mCond.wait_for_equal(mTimeout, until))
+ {
+ tut::fail(STRINGIZE(name << ' ' << func << '(' << arg << ") timed out after "
+ << int(mTimeout.value()) << "ms (expected " << until
+ << ", actual " << mCond.get() << ')'));
+ }
// each time we wake up, bump mCond
bump();
}