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 b2372749a0..66665df586 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -76,9 +76,9 @@
archivenamelinux
@@ -1150,11 +1150,11 @@
archivenamedarwin
@@ -1164,11 +1164,11 @@
archivenamelinux64
@@ -1178,11 +1178,11 @@
archivenamewindows
@@ -1192,18 +1192,18 @@
archivenamewindows64version
- 2.02.05
+ 2.02.06fontconfigversion
- 202201010217.567162
+ 202202010217.567974llphysicsextensions_source
@@ -3580,9 +3580,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
@@ -3616,9 +3616,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
@@ -3629,7 +3629,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
source_typehgversion
- 3.0.568552
+ 3.0.569958vlc-bin
@@ -3681,7 +3681,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
version
- 2.2.8.538966
+ 3.0.16.565299xmlrpc-epi
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 b092b991a3..91c44f8c27 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
@@ -882,7 +883,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)
{
LL_PROFILE_ZONE_SCOPED
@@ -943,9 +944,9 @@ LLSD drill(const LLSD& blob, const LLSD& path)
{
LL_PROFILE_ZONE_SCOPED
- // 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 dd113327c0..7c35dd794f 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/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index f6838aa53a..650fc25e85 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -5857,7 +5857,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;
@@ -6670,7 +6679,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;
+ }
}
}
@@ -6898,7 +6915,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 73df98870b..ac3516d170 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -2386,6 +2386,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)
{
@@ -3912,7 +3922,8 @@ void LLMenuHolderGL::setActivatedItem(LLMenuItemGL* item)
/// Class LLTearOffMenu
///============================================================================
LLTearOffMenu::LLTearOffMenu(LLMenuGL* menup) :
- LLFloater(LLSD())
+ LLFloater(LLSD()),
+ mQuitRequested(false)
{
S32 floater_header_size = getHeaderHeight();
@@ -3927,7 +3938,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);
@@ -3959,19 +3970,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);
@@ -4047,6 +4063,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);
@@ -4057,6 +4098,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 fea1f59e92..551b11a537 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -4451,7 +4451,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 403cd15d47..a8dff4c8f5 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -2373,9 +2373,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/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index 5d3ed52221..1d6d19b367 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
- NoInventoryLibrarynoninteractive
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 cf0453ac0a..08577e72bc 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6951,11 +6951,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
@@ -8278,19 +8278,6 @@
Value0
- LoginAsGod
-
- Comment
- Attempt to login with god powers (Linden accounts only)
- Persist
- 1
- Type
- Boolean
- Value
- 0
- Backup
- 0
- LoginLocationComment
@@ -9722,6 +9709,17 @@
Value1000
+ FakeInitialOutfitName
+
+ Comment
+ Pretend that this is first time login and specified name was chosen
+ Persist
+ 1
+ Type
+ String
+ Value
+
+ NearMeRangeComment
@@ -9819,7 +9817,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/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 301bab11ea..1aade3788f 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 1d9a2ffb4d..40503dc567 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2422,7 +2422,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();
}
@@ -2620,7 +2621,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);
// }
@@ -4667,10 +4669,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 0fb3b865e4..4a801bd1ff 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -6304,14 +6304,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 1d440fe309..b75f17a9ee 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -724,7 +724,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/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 3cec0df07b..5ca1876081 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -3574,7 +3574,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 c1e5e5faed..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
@@ -736,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();
@@ -751,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;
@@ -762,7 +780,7 @@ void LLKeyConflictHandler::resetToDefaults()
{
if (!empty())
{
- resetToDefaults(mLoadMode);
+ resetToDefaultsAndResolve();
}
else
{
@@ -772,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();
}
}
@@ -805,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)
@@ -865,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/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index b687942db1..259d332e9d 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -3123,6 +3123,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)
// {
@@ -4185,6 +4186,7 @@ void LLModelPreview::onLODMeshOptimizerParamCommit(S32 requested_lod, bool enfor
if (!mLODFrozen)
{
genMeshOptimizerLODs(requested_lod, mode, 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 c47a1cd040..d799581de0 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -1039,7 +1039,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 8a66c21820..617151a1f1 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -3090,10 +3090,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())
@@ -3642,19 +3638,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.
@@ -4661,6 +4672,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 666436cafb..82a5d9bd15 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 ea0f80871f..d796296f54 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -1120,7 +1120,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/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 2dc0bef614..c733d950c2 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"
@@ -9643,26 +9644,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 LLProfilerToggleActive : public view_listener_t
{
@@ -11918,7 +11981,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 66b26e9f75..4d65345c62 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -1330,6 +1330,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
@@ -6053,7 +6054,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;
}
@@ -6100,7 +6101,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 bc43fb8f76..5fa1373b38 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2497,6 +2497,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 2e11b1da15..513eceaaf9 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1458,11 +1458,8 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
-// 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())
@@ -2701,17 +2698,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)
{
@@ -2870,12 +2864,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;
}
@@ -3423,16 +3414,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())
@@ -3441,9 +3428,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) &&
@@ -3454,10 +3441,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 )
@@ -3472,7 +3460,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;
@@ -3555,7 +3543,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");
@@ -4172,7 +4160,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);
@@ -4371,11 +4359,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";
}
@@ -6697,8 +6682,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);
}
}
@@ -6766,7 +6751,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
@@ -9274,11 +9259,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)
{
@@ -10167,7 +10149,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;
@@ -10285,11 +10268,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;
@@ -10339,7 +10322,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 bbecd16bf0..374f3d4fd3 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -287,9 +287,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();
@@ -1010,8 +1010,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 8938df88fc..a0ff720680 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 a3ce9df41c..e998a25104 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -661,7 +661,7 @@ void LLVOSky::forceSkyUpdate()
{
mForceUpdate = TRUE;
- memset(&m_lastAtmosphericsVars, 0x00, sizeof(AtmosphericsVars));
+ m_lastAtmosphericsVars = {};
mCubeMapUpdateStage = -1;
}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 5a967197db..58a73fb6a7 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -7002,7 +7002,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
LL_PROFILE_ZONE_NAMED_CATEGORY_VOLUME("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 0c7a0bde29..3b23c183dc 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -1689,6 +1689,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;
}
@@ -1701,8 +1711,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)
{
@@ -1711,7 +1726,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/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 05df2c3dca..a416ec729a 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/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index a6b4f427fb..542f2f684d 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -3265,7 +3265,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
-
+
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 5506bbfc5f..70455d3d0c 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -3353,10 +3353,11 @@
name="DoubleClick Teleport"
shortcut="control|shift|D">
+ function="Advanced.CheckEnabledDoubleClickAction"
+ parameter="teleport_to"/>
+ function="Advanced.SetDoubleClickAction"
+ parameter="teleport_to"/>
@@ -4795,21 +4796,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 88c8ce2bde..77236200aa 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -2405,6 +2405,7 @@ Please try again later.
You have added "[LANDMARK_NAME]" to your [FOLDER_NAME] folder.
@@ -13569,7 +13570,7 @@ This Region does not support environmental settings.
diff --git a/indra/newview/skins/default/xui/en/panel_hide_beacon.xml b/indra/newview/skins/default/xui/en/panel_hide_beacon.xml
new file mode 100644
index 0000000000..7cab285f77
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_hide_beacon.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/panel_performance_nearby.xml b/indra/newview/skins/default/xui/en/panel_performance_nearby.xml
index 2a03344471..4e4c0fc5b7 100644
--- a/indra/newview/skins/default/xui/en/panel_performance_nearby.xml
+++ b/indra/newview/skins/default/xui/en/panel_performance_nearby.xml
@@ -142,7 +142,7 @@ top="0">
follows="left|top|right"
layout="topleft"
sort_column="art_value"
- short_names="true"
+ short_names="false"
name="nearby_list"
name_column="name"
top_pad="10"
diff --git a/indra/newview/skins/default/xui/fr/floater_360capture.xml b/indra/newview/skins/default/xui/fr/floater_360capture.xml
new file mode 100644
index 0000000000..389ebea056
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_360capture.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ Qualité
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cliquez et glissez pour vous déplacer dans la vue
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index 0dfb89f3c2..12c743d252 100644
--- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
@@ -44,4 +44,5 @@
[WIDTH]px (Largeur) x [HEIGHT]px (Hauteur)[SIZE] Ko
+
diff --git a/indra/newview/skins/default/xui/fr/inspect_group.xml b/indra/newview/skins/default/xui/fr/inspect_group.xml
index d2ef1aef40..15b1d9934b 100644
--- a/indra/newview/skins/default/xui/fr/inspect_group.xml
+++ b/indra/newview/skins/default/xui/fr/inspect_group.xml
@@ -2,14 +2,14 @@
Groupe privéInscription gratuite
- [AMOUNT] L$ pour rejoindre
+ [AMOUNT] L$ pour adhérerVous êtes membre123 membres
- A group of folks charged with creating a room with a moose.
- Fear the moose! Fear it! And the mongoose too!
+Un groupe de personnes chargées de créer une chambre avec un élan.
+Craignez l'élan ! Craignez-le ! Et la mangouste aussi !
- L$123 to join
+ 123 L$ pour adhérer
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 980a634b1a..732ea3f525 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -59,6 +59,7 @@
+
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 19047cbe1a..b27970cda2 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -4,7 +4,7 @@
Ne plus afficher
- Ne plus afficher
+ Ne plus afficher
(pour cette session)
@@ -87,7 +87,7 @@ Détails de l'erreur : La notification, appelée '[_NAME]', est i
Connexion à [CURRENT_GRID] impossible.
- '[DIAGNOSTIC]'
+'[DIAGNOSTIC]'
Veuillez vérifier votre connexion Internet.
@@ -95,6 +95,7 @@ Veuillez vérifier votre connexion Internet.
Le visualiseur a reçu une réponse brouillée du serveur. Assurez-vous que votre connexion Internet fonctionne correctement et réessayez plus tard.
Si vous pensez qu'il s'agit d'une erreur, veuillez contacter le service d'assistance.
+
Le modèle de message [PATH] est introuvable.
@@ -102,7 +103,7 @@ Si vous pensez qu'il s'agit d'une erreur, veuillez contacter le service d'assist
Enregistrer les changements dans la partie du corps/les habits actuels ?
-
+
Vous n'êtes pas autorisé à copier un ou plusieurs de ces articles dans la boîte d'envoi vendeur. Vous pouvez les déplacer ou les laisser.
@@ -143,20 +144,24 @@ L'initialisation de la Place du marché a échoué en raison d'une err
Échec de la copie ou du déplacement vers le dossier de stock. Erreur :
-
- '[ERROR_CODE]'
+
+'[ERROR_CODE]'
+
+
+
+ Un ou plusieurs articles ne peuvent pas être utilisés dans « Mes tenues".
Échec de la copie ou du déplacement vers les annonces Place du marché. Erreur :
-
- '[ERROR_CODE]'
+
+'[ERROR_CODE]'
La transaction avec la Place du marché a échoué en renvoyant l’erreur suivante :
-
- [ERROR_REASON][ERROR_DESCRIPTION]
+
+[ERROR_REASON][ERROR_DESCRIPTION]
@@ -165,14 +170,14 @@ L'initialisation de la Place du marché a échoué en raison d'une err
Échec de la publication d'une annonce sur la Place du marché. Erreur :
-
- '[ERROR_CODE]'
+
+'[ERROR_CODE]'
Échec de l'activation de ce dossier de version. Erreur :
- '[ERROR_CODE]'
+'[ERROR_CODE]'
@@ -328,7 +333,7 @@ Tout membre ayant un rôle doté de ce pouvoir disposera aussi des pouvoirs «
*AVERTISSEMENT*
En supprimant ce pouvoir, vous ne supprimez PAS les pouvoirs « [ACTION_NAME_2] » et « [ACTION_NAME_3] ».
-
+
Si vous ne voulez plus que ce rôle dispose de ces pouvoirs, désactivez-les immédiatement.
@@ -362,7 +367,7 @@ Voulez-vous continuer ?
- Vous vous apprêtez à rejoindre le groupe <nolink>[NAME]</nolink>.
+ Vous vous apprêtez à rejoindre le groupe <nolink>[NAME]</nolink>.
Souhaitez-vous continuer ?
@@ -393,19 +398,15 @@ Veuillez inviter des membres d'ici 48 heures.
- Vous ne pouvez pas rejoindre '<nolink>[group_name]</nolink>':
+ Vous ne pouvez pas rejoindre '<nolink>[group_name]</nolink>':
Vous êtes déjà membre des [group_count] groupes, le nombre maximum autorisé est de [max_groups]
- Vous ne pouvez pas rejoindre '<nolink>[group_name]</nolink>':
+ Vous ne pouvez pas rejoindre '<nolink>[group_name]</nolink>':
Le groupe n'accepte plus de nouveaux adhérents.
-
- Vous avez été ajouté au groupe.
-
-
Impossible de transférer la cotisation exigée de L$ [membership_fee].
@@ -431,9 +432,9 @@ Votre prix de vente sera de [SALE_PRICE]L$ et la vente sera disponible à [NAME]
- Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe '<nolink>[NAME]</nolink>' sur cette parcelle de terrain dans l'inventaire du propriétaire précédent ?
+ Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe '<nolink>[NAME]</nolink>' sur cette parcelle de terrain dans l'inventaire du propriétaire précédent ?
-*AVERTISSEMENT* Cela supprimera les objets non transférables cédés au groupe !
+*AVERTISSEMENT* Cela supprimera les objets non transférables cédés au groupe !
Objets : [N]
@@ -477,7 +478,7 @@ Objets : [N]
- Renvoyer les objets de cette parcelle qui ne sont PAS partagés avec le groupe <nolink>[NAME]</nolink> à leur propriétaire ?
+ Renvoyer les objets de cette parcelle qui ne sont PAS partagés avec le groupe <nolink>[NAME]</nolink> à leur propriétaire ?
Objets : [N]
@@ -530,6 +531,11 @@ Pour ne placer le média que sur une seule face, choisissez Sélectionner une fa
Vous devez accepter lestermes et conditions; la Politique de confidentialité et les Conditions d'utilisation de Second Life pour poursuivre votre connexion à [CURRENT_GRID].
+
+[TITLE]
+[MESSAGE]
+
+
Impossible de mettre cet ensemble.
Ce dossier ne contient pas d'habits, de parties du corps ni de pièces jointes.
@@ -592,6 +598,10 @@ Voulez-vous vraiment continuer ?
Supprimer la ou les tenues sélectionnées ?
+
+ Supprimer la tenue "[NAME]"?
+
+
Aller à la page web de [CURRENT_GRID] réservée aux événements ?
@@ -608,10 +618,16 @@ Voulez-vous vraiment continuer ?
Le cache sera vidé après le redémarrage de [APP_NAME].
+
+ Si vous désactivez Javascript, la fonction de recherche ne fonctionnera pas correctement et vous ne pourrez pas l'utiliser.
+
Le cache sera déplacé après le redémarrage de [APP_NAME].
Remarque : cela videra le cache.
+
+ Le cache du son sera déplacé après le redémarrage de [APP_NAME].
+
Les paramètres du port prendront effet après le redémarrage de [APP_NAME].
@@ -689,7 +705,7 @@ L'objet est peut-être inaccessible ou a peut-être été supprimé.
Impossible de télécharger le fichier
-
+
Vous avez demandé un téléchargement de fichier, qui n’est pas pris en charge dans [APP_NAME].
@@ -705,13 +721,10 @@ Consulter [_URL] pour en savoir plus ?
-
- Veuillez ne pas exécuter la visionneuse directement. Actualiser tout raccourci existant pour lancer SL_Launcher
-
Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d’améliorer considérablement les performances.
- Visiter la page [URL] pour rechercher d’éventuelles mises à jour de pilotes ?
+Visiter la page [URL] pour rechercher d’éventuelles mises à jour de pilotes ?
[URL]
@@ -738,7 +751,7 @@ La qualité des graphiques peut être augmentée à la section Préférences >
Vous n'êtes pas autorisé(e) à terraformer la parcelle [PARCEL].
- Vous n'êtes pas autorisé à copier les objets suivants :
+ Vous n'êtes pas autorisé à copier les objets suivants :
<nolink>[ITEMS]</nolink>
et il disparaîtra de votre inventaire si vous le donnez. Voulez-vous vraiment offrir ces articles ?
@@ -773,6 +786,14 @@ Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le M
Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde.
+
+ Figer les avatars suivants ?
+
+[RESIDENTS]
+
+Ils seront temporairement incapables de se déplacer, de discuter ou d'interagir avec le monde.
+
+
Expulser [AVATAR_NAME] de votre terrain ?
@@ -785,6 +806,18 @@ Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le M
Expulser [AVATAR_NAME] de votre terrain ?
+
+ Expulser les avatars suivants de votre terrain ?
+
+[RESIDENTS]
+
+
+
+ Expulser les avatars suivants de votre terrain ?
+
+[RESIDENTS]
+
+
Vous avez expulsé [AVATAR_NAME] du groupe <nolink>[GROUP_NAME]</nolink>
@@ -920,6 +953,13 @@ Veuillez réessayer ultérieurement.
Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l'autorise pas.
+
+ Choisissez un nom pour le dossier :
+
+
Impossible d'effectuer les recompilations.
Sélectionnez un objet avec un script.
@@ -933,6 +973,11 @@ Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
Impossible d'effectuer la réinitialisation.
Veuillez sélectionner des objets avec des scripts.
+
+
+ Impossible d'effectuer la 'suppression'.
+
+Sélectionner des objets avec des scripts.
Impossible d'effectuer la réinitialisation.
@@ -1001,6 +1046,9 @@ Veuillez réessayer dans un moment.
Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
+
+ Désolé, mais le système n'a pas pu lancer votre téléportation. Veuillez réessayer dans quelques minutes.
+
Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes.
@@ -1064,6 +1112,17 @@ plusieurs parcelles sélectionnées.
Essayez de ne sélectionner qu'une seule parcelle.
+
+ Cet emplacement fournit des médias en streaming qui peuvent occuper une plus grande partie de la bande passante de votre réseau.
+
+Lire les médias en streaming lorsqu'ils sont disponibles ?
+(Vous pouvez modifier cette option ultérieurement sous Préférences > Son et Média.)
+
+
Cession du terrain impossible :
rapport de propriété sur le point d'être envoyé par le serveur.
@@ -1214,7 +1273,7 @@ Proposer à [NAME] de devenir votre ami(e) ?
Le nom [DUPNAME] est déjà utilisé.
- Saisissez un nouveau nom unique :
+Saisissez un nouveau nom unique :
Impossible de copier
- [FROM_NAME]
- vers
- [TO_NAME]
+[FROM_NAME]
+vers
+[TO_NAME]
Enregistrer ce que je porte comme nouvelle tenue :
@@ -1271,6 +1330,20 @@ Voir https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
+
+ Nouveau nom du geste :
+
+
+
+ Choisissez un nouveau nom pour [NAME]
+
+
Voulez-vous supprimer <nolink>[NAME]</nolink> de votre liste d'amis ?
@@ -1380,16 +1453,16 @@ Par contre, vous pouvez prendre les objets sélectionnés.
Veuillez sélectionner une zone plus petite et réessayer.
- La cession de cette parcelle requiert que le groupe dispose en permanence d'un crédit suffisant pour payer les frais d'occupation de terrain.
-Le prix d'achat du terrain n'est pas remboursé au propriétaire. Si une parcelle cédée est vendue, son prix de vente est redistribué à part égale entre les membres du groupe.
+ La cession de cette parcelle requiert que le groupe dispose en permanence d'un crédit suffisant pour payer les frais d'occupation de terrain.
+Le prix d'achat du terrain n'est pas remboursé au propriétaire. Si une parcelle cédée est vendue, son prix de vente est redistribué à part égale entre les membres du groupe.
Céder ces [AREA] m² de terrain au groupe '<nolink>[GROUP_NAME]</nolink>'?
- La cession de cette parcelle requiert que le groupe dispose en permanence d'un crédit suffisant pour payer les frais d'occupation de terrain.
-Elle inclura une contribution simultanée au groupe de la part de '[NAME]' Le prix d'achat du terrain n'est pas remboursé au propriétaire.
-Si une parcelle cédée est vendue, son prix de vente est redistribué à part égale entre les membres du groupe.
+ La cession de cette parcelle requiert que le groupe dispose en permanence d'un crédit suffisant pour payer les frais d'occupation de terrain.
+Elle inclura une contribution simultanée au groupe de la part de '[NAME]' Le prix d'achat du terrain n'est pas remboursé au propriétaire.
+Si une parcelle cédée est vendue, son prix de vente est redistribué à part égale entre les membres du groupe.
Céder ces [AREA] m² de terrain au groupe '<nolink>[GROUP_NAME]</nolink>'?
@@ -1461,6 +1534,19 @@ Vérifiez votre connexion Internet et réessayez dans quelques minutes, cliquez
+
+ Nous avons des problèmes de connexion. Il se peut qu'il y ait un problème avec votre connexion Internet ou avec la [CURRENT_GRID].
+
+Vous pouvez soit vérifier votre connexion Internet et réessayer dans quelques minutes, soit cliquer sur Aide pour afficher [SUPPORT_SITE].
+
+
+
+ Les données locales que vous supprimez sont partagées entre plusieurs grilles, êtes-vous sûr de vouloir les supprimer ?
+
+
Votre personnage va apparaître dans un moment.
@@ -1474,6 +1560,11 @@ Vous pourrez revenir sur votre décision plus tard.
Téléportation vers [SLURL] impossible car cet endroit existe sur une grille ([GRID]) différente de la grille actuelle ([CURRENT_GRID]). Veuillez fermer votre client et réessayer.
+
+ Impossible de se connecter au serveur.
+[REASON]
+
+
Connexion au serveur impossible.
[REASON]
@@ -1627,22 +1718,22 @@ Veuillez choisir un objet à vendre et réessayer.
[DOWNLOAD_PATH].
- La version [VERSION] est nécessaire pour vous connecter.
+ La version [VERSION] est nécessaire pour vous connecter.
Veuillez télécharger la dernière version sur https://secondlife.com/support/downloads/
- La version [VERSION] est nécessaire pour vous connecter.
+ La version [VERSION] est nécessaire pour vous connecter.
Cliquez sur OK pour télécharger et installer.
- La version [VERSION] a été téléchargée et est prête à être installée.
+ La version [VERSION] a été téléchargée et est prête à être installée.
Cliquez sur OK pour installer.
- La version [VERSION] a été téléchargée et est prête à être installée.
+ La version [VERSION] a été téléchargée et est prête à être installée.
Continuer ?
@@ -1698,8 +1789,10 @@ Continuer ?
Quitter le groupe ?
-
- Vous avez quitté le groupe '<nolink>[group_name]</nolink>'.
+
+ Vous êtes actuellement membre du groupe <nolink>[GROUP]</nolink>. Une nouvelle adhésion coûtera [AMOUNT]L$.
+Quitter le groupe ?
+
Impossible de quitter le groupe. Vous ne pouvez pas quitter le groupe car vous en êtes le dernier propriétaire. Vous devez d'abord affecter le rôle de propriétaire à un autre membre.
@@ -1743,6 +1836,36 @@ Quitter le groupe ?
- Les appels vocaux seront refusés.
+
+ Le mode de autoréponse est activé.
+Les messages instantanés entrants seront désormais traités avec la réponse automatique que vous avez configurée.
+
+
+
+ Le mode de réponse automatique pour les non-amis est activé.
+Les messages instantanés entrants provenant d'une personne qui n'est pas votre ami seront désormais traités avec la réponse automatique que vous avez configurée.
+
+
+
+ Le mode rejet de toutes les offres et demandes de téléportation est activé.
+Les offres et les demandes de téléportation provenant de n'importe qui seront désormais rejetées avec votre réponse automatique. Vous ne serez pas notifié de ce fait.
+
+
+
+ Vous ne pouvez pas envoyer de demande de téléportation pour le moment, car le mode 'rejeter toutes les offres et demandes de téléportation' est activé.
+Allez dans le menu 'Communiquer' > 'Statut de connexion' si vous souhaitez le désactiver.
+
+
+
+ Le mode Rejeter toutes les demandes d'amitié est activé.
+Toutes les demandes d'amitié seront désormais rejetées avec votre réponse automatique. Vous ne serez pas notifié de ce fait.
+
+
+
+ Le mode Rejeter toutes les invitations de groupe est activé.
+Toutes les invitations de groupe seront désormais rejetées automatiquement. Vous ne serez pas notifié de ce fait.
+
+
Vous avez atteint le nombre de groupes maximum. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre.
[NAME] vous invite à rejoindre un groupe.
@@ -1759,7 +1882,7 @@ Les adhésions premium permettent jusqu'à [MAX_PREMIUM]. [https://secondlife.co
Les résidents ayant une adhésion de base peuvent s'inscrire à [MAX_BASIC] groupes maximum.
-Les adhésions premium permettent jusqu'à [MAX_PREMIUM]. Les adhésions à Premium Plus permettent
+Les adhésions premium permettent jusqu'à [MAX_PREMIUM]. Les adhésions à Premium Plus permettent
jusqu'à [MAX_PREMIUM_PLUS]. [https://secondlife.com/my/account/membership.php? En savoir plus ou actualiser]
@@ -1831,7 +1954,7 @@ Veuillez réessayer ultérieurement.
Impossible de définir le nom demandé car il contient un terme interdit.
-
+
Veuillez essayer avec un nom différent.
@@ -1843,6 +1966,15 @@ Veuillez réessayer ultérieurement.
[OLD_NAME] ([SLID]) a désormais le nom [NEW_NAME].
+
+ [OLD_NAME] ([SLID]) est désormais connu sous le nom de [NEW_NAME].
+Cet agent a défini un alias qui remplacera [NEW_NAME]
+Voulez-vous le supprimer ?
+
+
Proposez une téléportation avec le message suivant ?
+
+ Demande de téléportation à [NAME] avec le message suivant
+
+
Exiger du résident qu'il vienne vous rejoindre ?
-
+
@@ -2169,7 +2333,6 @@ Publier cette petite annonce maintenant pour [AMOUNT] L$ ?
Saisissez un message qui sera envoyé à tous les résidents présents dans cette région.
-
@@ -2318,7 +2481,7 @@ Vous ne pouvez pas l'annuler.
Cette action replacera tous les boutons dans la boîte à outils de sorte que vos barres d'outils seront vides.
-
+
Vous ne pouvez pas l'annuler.
@@ -2331,7 +2494,7 @@ Vous ne pouvez pas l'annuler.
- 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 ?
@@ -2341,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.
@@ -2408,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 ?
@@ -2432,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 ?
@@ -2444,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]
@@ -2467,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
@@ -2535,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é
@@ -2625,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.
@@ -2672,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.
@@ -2714,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 :
@@ -2757,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.
@@ -2774,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.
@@ -2836,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.
@@ -2932,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]
@@ -2974,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]
@@ -3036,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] ?
@@ -3070,7 +3385,7 @@ Acceptez-vous ?
Impossible d’acquérir une nouvelle expérience :
- [ERROR_MESSAGE]
+[ERROR_MESSAGE]
@@ -3109,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] :
@@ -3124,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 ?
@@ -3136,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.
@@ -3152,7 +3467,7 @@ N'autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l
@@ -3199,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.
@@ -3247,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.
@@ -3323,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].
@@ -3350,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.
@@ -3374,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.
@@ -3442,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.
@@ -3468,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]
@@ -3476,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.
@@ -3540,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.
@@ -3622,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].
@@ -3726,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...
@@ -3812,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.
@@ -3840,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.
@@ -3869,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é.
@@ -4199,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.
@@ -4432,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.
@@ -4448,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.
@@ -4468,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 :
@@ -4479,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
@@ -4554,6 +5387,6 @@ Veuillez noter que "Utiliser l'environnement partagé" et "Basé sur le cycle jo
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/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index f6b563d1d2..1a4abf114d 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/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index c990bc4205..00570abef9 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/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index bb7b0a2abe..f09b2c9bf1 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -2577,7 +2577,7 @@ URL: [MEDIAURL]
Domena: [MEDIADOMAIN]
URL: [MEDIAURL]
-
+
@@ -4832,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.
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 6adb0c9a38..39deeff004 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/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index d2240e1c48..9816a05e6c 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/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index 27082fbc09..d941ea098b 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/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index a78afb2d2a..ea97f781dd 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/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 86740489d1..e8ba864c5c 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -1758,9 +1758,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
@@ -1790,7 +1789,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])
@@ -2040,7 +2039,10 @@ class LinuxManifest(ViewerManifest):
self.path("win64")
with self.prefix(src=os.path.join(pkgdir, 'lib32' ), dst="lib32"):
- self.path("*")
+ 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
@@ -2066,10 +2068,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/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();
}