From 71f6b139f8de3ea6bf2b925e095fc0f7864c0274 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 29 May 2020 20:10:04 +0300 Subject: [PATCH 001/193] SL-13348 Thread crashing singleton #1 --- indra/llcorehttp/_httpoprequest.cpp | 14 +++------ indra/llmessage/llproxy.cpp | 45 ++++++++++++++++++----------- indra/llmessage/llproxy.h | 8 ++++- indra/newview/llappviewer.cpp | 1 + 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index 0f76ff23ea..6909a650da 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -567,16 +567,9 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service) // Use the viewer-based thread-safe API which has a // fast/safe check for proxy enable. Would like to // encapsulate this someway... - if (LLProxy::instanceExists()) - { - // Make sure proxy won't be initialized from here, - // it might conflict with LLStartUp::startLLProxy() - LLProxy::getInstance()->applyProxySettings(mCurlHandle); - } - else - { - LL_WARNS() << "Proxy is not initialized!" << LL_ENDL; - } + // Make sure proxy won't be getInstance() from here, + // it is not thread safe + LLProxy::applyProxySettings(mCurlHandle); } else if (gpolicy.mHttpProxy.size()) @@ -817,6 +810,7 @@ size_t HttpOpRequest::readCallback(void * data, size_t size, size_t nmemb, void const size_t do_size((std::min)(req_size, body_size - op->mCurlBodyPos)); const size_t read_size(op->mReqBody->read(op->mCurlBodyPos, static_cast(data), do_size)); + // FIXME: singleton's instance() is Thread unsafe! Even if stats accumulators inside are. HTTPStats::instance().recordDataUp(read_size); op->mCurlBodyPos += read_size; return read_size; diff --git a/indra/llmessage/llproxy.cpp b/indra/llmessage/llproxy.cpp index 950599217f..d11a1487ab 100644 --- a/indra/llmessage/llproxy.cpp +++ b/indra/llmessage/llproxy.cpp @@ -40,6 +40,7 @@ // incoming packet just to do a simple bool test. The getter for this // member is also static bool LLProxy::sUDPProxyEnabled = false; +LLProxy* LLProxy::sProxyInstance = NULL; // Some helpful TCP static functions. static apr_status_t tcp_blocking_handshake(LLSocket::ptr_t handle, char * dataout, apr_size_t outlen, char * datain, apr_size_t maxinlen); // Do a TCP data handshake @@ -60,11 +61,21 @@ LLProxy::LLProxy(): LLProxy::~LLProxy() { - if (ll_apr_is_initialized()) - { - stopSOCKSProxy(); - disableHTTPProxy(); - } + if (ll_apr_is_initialized()) + { + // locks mutex + stopSOCKSProxy(); + disableHTTPProxy(); + } + // The primary safety of sProxyInstance is the fact that by the + // point SUBSYSTEM_CLEANUP(LLProxy) gets called, nothing should + // be capable of using proxy + sProxyInstance = NULL; +} + +void LLProxy::initSingleton() +{ + sProxyInstance = this; } /** @@ -424,28 +435,28 @@ void LLProxy::cleanupClass() void LLProxy::applyProxySettings(CURL* handle) { // Do a faster unlocked check to see if we are supposed to proxy. - if (mHTTPProxyEnabled) + if (sProxyInstance && sProxyInstance->mHTTPProxyEnabled) { - // We think we should proxy, lock the proxy mutex. - LLMutexLock lock(&mProxyMutex); + // We think we should proxy, lock the proxy mutex. sProxyInstance is not protected by mutex + LLMutexLock lock(&sProxyInstance->mProxyMutex); // Now test again to verify that the proxy wasn't disabled between the first check and the lock. - if (mHTTPProxyEnabled) + if (sProxyInstance->mHTTPProxyEnabled) { - LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXY, mHTTPProxy.getIPString().c_str()), CURLOPT_PROXY); - LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYPORT, mHTTPProxy.getPort()), CURLOPT_PROXYPORT); + LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXY, sProxyInstance->mHTTPProxy.getIPString().c_str()), CURLOPT_PROXY); + LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYPORT, sProxyInstance->mHTTPProxy.getPort()), CURLOPT_PROXYPORT); - if (mProxyType == LLPROXY_SOCKS) + if (sProxyInstance->mProxyType == LLPROXY_SOCKS) { - LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5), CURLOPT_PROXYTYPE); - if (mAuthMethodSelected == METHOD_PASSWORD) + LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5), CURLOPT_PROXYTYPE); + if (sProxyInstance->mAuthMethodSelected == METHOD_PASSWORD) { - std::string auth_string = mSocksUsername + ":" + mSocksPassword; - LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYUSERPWD, auth_string.c_str()), CURLOPT_PROXYUSERPWD); + std::string auth_string = sProxyInstance->mSocksUsername + ":" + sProxyInstance->mSocksPassword; + LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYUSERPWD, auth_string.c_str()), CURLOPT_PROXYUSERPWD); } } else { - LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP), CURLOPT_PROXYTYPE); + LLCore::LLHttp::check_curl_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP), CURLOPT_PROXYTYPE); } } } diff --git a/indra/llmessage/llproxy.h b/indra/llmessage/llproxy.h index 87891901ad..f2eefb26d0 100644 --- a/indra/llmessage/llproxy.h +++ b/indra/llmessage/llproxy.h @@ -225,6 +225,8 @@ class LLProxy: public LLSingleton LLSINGLETON(LLProxy); LOG_CLASS(LLProxy); + /*virtual*/ void initSingleton(); + public: // Static check for enabled status for UDP packets. Call from main thread only. static bool isSOCKSProxyEnabled() { return sUDPProxyEnabled; } @@ -250,7 +252,7 @@ public: // Apply the current proxy settings to a curl request. Doesn't do anything if mHTTPProxyEnabled is false. // Safe to call from any thread. - void applyProxySettings(CURL* handle); + static void applyProxySettings(CURL* handle); // Start a connection to the SOCKS 5 proxy. Call from main thread only. S32 startSOCKSProxy(LLHost host); @@ -343,6 +345,10 @@ private: /*########################################################################################### END OF SHARED MEMBERS ###########################################################################################*/ + + // A hack to get arround getInstance() and capture_dependency() which are unsafe to use inside threads + // set/reset on init/cleanup, strictly for use in applyProxySettings + static LLProxy* sProxyInstance; }; #endif diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ff921dcfdb..da1a58efd9 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2116,6 +2116,7 @@ bool LLAppViewer::cleanup() LLWeb::loadURLExternal( gLaunchFileOnQuit, false ); LL_INFOS() << "File launched." << LL_ENDL; } + // make sure nothing uses applyProxySettings by this point. LL_INFOS() << "Cleaning up LLProxy." << LL_ENDL; SUBSYSTEM_CLEANUP(LLProxy); LLCore::LLHttp::cleanup(); From 372ed555ed3c895850700be463bd6775d66f6862 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 29 May 2020 20:13:23 +0300 Subject: [PATCH 002/193] SL-13348 Thread crashing singleton #2 Reverted LLImage to singleton conversion --- indra/llimage/llimage.cpp | 34 +++++++++++++++++++++----------- indra/llimage/llimage.h | 32 ++++++++++++++---------------- indra/llimage/llimagej2c.cpp | 4 ++-- indra/llrender/llrender2dutils.h | 1 + indra/newview/llappviewer.cpp | 3 ++- 5 files changed, 42 insertions(+), 32 deletions(-) diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 7a0c8cd8f5..aed8943439 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -583,29 +583,39 @@ static void bilinear_scale(const U8 *src, U32 srcW, U32 srcH, U32 srcCh, U32 src // LLImage //--------------------------------------------------------------------------- -LLImage::LLImage(bool use_new_byte_range, S32 minimal_reverse_byte_range_percent) +//static +std::string LLImage::sLastErrorMessage; +LLMutex* LLImage::sMutex = NULL; +bool LLImage::sUseNewByteRange = false; +S32 LLImage::sMinimalReverseByteRangePercent = 75; + +//static +void LLImage::initClass(bool use_new_byte_range, S32 minimal_reverse_byte_range_percent) { - mMutex = new LLMutex(); - mUseNewByteRange = use_new_byte_range; - mMinimalReverseByteRangePercent = minimal_reverse_byte_range_percent; + sUseNewByteRange = use_new_byte_range; + sMinimalReverseByteRangePercent = minimal_reverse_byte_range_percent; + sMutex = new LLMutex(); } -LLImage::~LLImage() +//static +void LLImage::cleanupClass() { - delete mMutex; - mMutex = NULL; + delete sMutex; + sMutex = NULL; } -const std::string& LLImage::getLastErrorMessage() +//static +const std::string& LLImage::getLastError() { static const std::string noerr("No Error"); - return mLastErrorMessage.empty() ? noerr : mLastErrorMessage; + return sLastErrorMessage.empty() ? noerr : sLastErrorMessage; } -void LLImage::setLastErrorMessage(const std::string& message) +//static +void LLImage::setLastError(const std::string& message) { - LLMutexLock m(mMutex); - mLastErrorMessage = message; + LLMutexLock m(sMutex); + sLastErrorMessage = message; } //--------------------------------------------------------------------------- diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 9f8d061293..f66b1666d7 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -30,7 +30,6 @@ #include "lluuid.h" #include "llstring.h" #include "llpointer.h" -#include "llsingleton.h" #include "lltrace.h" const S32 MIN_IMAGE_MIP = 2; // 4x4, only used for expand/contract power of 2 @@ -88,26 +87,25 @@ typedef enum e_image_codec //============================================================================ // library initialization class +// LLImage is frequently used in threads so do not convert it to LLSingleton -class LLImage : public LLParamSingleton +class LLImage { - LLSINGLETON(LLImage, bool use_new_byte_range = false, S32 minimal_reverse_byte_range_percent = 75); - ~LLImage(); public: + static void initClass(bool use_new_byte_range = false, S32 minimal_reverse_byte_range_percent = 75); + static void cleanupClass(); - const std::string& getLastErrorMessage(); - static const std::string& getLastError() { return getInstance()->getLastErrorMessage(); }; - void setLastErrorMessage(const std::string& message); - static void setLastError(const std::string& message) { getInstance()->setLastErrorMessage(message); } - - bool useNewByteRange() { return mUseNewByteRange; } - S32 getReverseByteRangePercent() { return mMinimalReverseByteRangePercent; } - -private: - LLMutex* mMutex; - std::string mLastErrorMessage; - bool mUseNewByteRange; - S32 mMinimalReverseByteRangePercent; + static const std::string& getLastError(); + static void setLastError(const std::string& message); + + static bool useNewByteRange() { return sUseNewByteRange; } + static S32 getReverseByteRangePercent() { return sMinimalReverseByteRangePercent; } + +protected: + static LLMutex* sMutex; + static std::string sLastErrorMessage; + static bool sUseNewByteRange; + static S32 sMinimalReverseByteRangePercent; }; //============================================================================ diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 71cab0554d..4bff21610f 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -281,7 +281,7 @@ S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 r S32 bytes; S32 new_bytes = (S32) (sqrt((F32)(w*h))*(F32)(comp)*rate*1000.f/layer_factor); S32 old_bytes = (S32)((F32)(w*h*comp)*rate); - bytes = (LLImage::getInstance()->useNewByteRange() && (new_bytes < old_bytes) ? new_bytes : old_bytes); + bytes = (LLImage::useNewByteRange() && (new_bytes < old_bytes) ? new_bytes : old_bytes); bytes = llmax(bytes, calcHeaderSizeJ2C()); return bytes; } @@ -322,7 +322,7 @@ S32 LLImageJ2C::calcDiscardLevelBytes(S32 bytes) { S32 bytes_needed = calcDataSize(discard_level); // Use TextureReverseByteRange percent (see settings.xml) of the optimal size to qualify as correct rendering for the given discard level - if (bytes >= (bytes_needed*LLImage::getInstance()->getReverseByteRangePercent()/100)) + if (bytes >= (bytes_needed*LLImage::getReverseByteRangePercent()/100)) { break; } diff --git a/indra/llrender/llrender2dutils.h b/indra/llrender/llrender2dutils.h index 70ab006fd6..8c01784071 100644 --- a/indra/llrender/llrender2dutils.h +++ b/indra/llrender/llrender2dutils.h @@ -32,6 +32,7 @@ #include "llpointer.h" // LLPointer<> #include "llrect.h" +#include "llsingleton.h" #include "llglslshader.h" class LLColor4; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index da1a58efd9..e067ab6778 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2073,6 +2073,7 @@ bool LLAppViewer::cleanup() LLUIImageList::getInstance()->cleanUp(); // This should eventually be done in LLAppViewer + SUBSYSTEM_CLEANUP(LLImage); SUBSYSTEM_CLEANUP(LLVFSThread); SUBSYSTEM_CLEANUP(LLLFSThread); @@ -2182,7 +2183,7 @@ bool LLAppViewer::initThreads() { static const bool enable_threads = true; - LLImage::initParamSingleton(gSavedSettings.getBOOL("TextureNewByteRange"),gSavedSettings.getS32("TextureReverseByteRange")); + LLImage::initClass(gSavedSettings.getBOOL("TextureNewByteRange"),gSavedSettings.getS32("TextureReverseByteRange")); LLVFSThread::initClass(enable_threads && false); LLLFSThread::initClass(enable_threads && false); From cf2f0eddeb066d862151154d0d35f7e9f716270b Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Mon, 1 Jun 2020 18:24:52 +0300 Subject: [PATCH 003/193] SL-13278 FIXED Creating default clothing not accessible through "Edit My Outfit" for any type that does not already exist --- indra/newview/llpaneloutfitedit.cpp | 1 + indra/newview/llwearableitemslist.cpp | 58 ++++++++++++++++++- indra/newview/llwearableitemslist.h | 7 +++ .../xui/en/menu_wearable_list_item.xml | 11 ++++ 4 files changed, 74 insertions(+), 3 deletions(-) diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 1d87aa6f5d..dd1130aeba 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -1282,6 +1282,7 @@ void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type //e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE applyListViewFilter(static_cast(LVIT_SHAPE + type)); + mWearableItemsList->setMenuWearableType(type); } static void update_status_widget_rect(LLView * widget, S32 right_border) diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index e7bbee5efd..3d1bc5249d 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -639,6 +639,7 @@ LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p) : LLInventoryItemsList(p) { setSortOrder(E_SORT_BY_TYPE_LAYER, false); + mMenuWearableType = LLWearableType::WT_NONE; mIsStandalone = p.standalone; if (mIsStandalone) { @@ -730,10 +731,15 @@ void LLWearableItemsList::onRightClick(S32 x, S32 y) getSelectedUUIDs(selected_uuids); if (selected_uuids.empty()) { - return; + if ((mMenuWearableType != LLWearableType::WT_NONE) && (size() == 0)) + { + ContextMenu::instance().show(this, mMenuWearableType, x, y); + } + } + else + { + ContextMenu::instance().show(this, selected_uuids, x, y); } - - ContextMenu::instance().show(this, selected_uuids, x, y); } void LLWearableItemsList::setSortOrder(ESortOrder sort_order, bool sort_now) @@ -784,6 +790,46 @@ void LLWearableItemsList::ContextMenu::show(LLView* spawning_view, const uuid_ve mParent = NULL; // to avoid dereferencing an invalid pointer } +void LLWearableItemsList::ContextMenu::show(LLView* spawning_view, LLWearableType::EType w_type, S32 x, S32 y) +{ + mParent = dynamic_cast(spawning_view); + LLContextMenu* menup = mMenuHandle.get(); + if (menup) + { + //preventing parent (menu holder) from deleting already "dead" context menus on exit + LLView* parent = menup->getParent(); + if (parent) + { + parent->removeChild(menup); + } + delete menup; + mUUIDs.clear(); + } + + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("Wearable.CreateNew", boost::bind(createNewWearableByType, w_type)); + menup = createFromFile("menu_wearable_list_item.xml"); + if (!menup) + { + LL_WARNS() << "Context menu creation failed" << LL_ENDL; + return; + } + setMenuItemVisible(menup, "create_new", true); + setMenuItemEnabled(menup, "create_new", true); + setMenuItemVisible(menup, "wearable_attach_to", false); + setMenuItemVisible(menup, "wearable_attach_to_hud", false); + + std::string new_label = LLTrans::getString("create_new_" + LLWearableType::getTypeName(w_type)); + LLMenuItemGL* menu_item = menup->getChild("create_new"); + menu_item->setLabel(new_label); + + mMenuHandle = menup->getHandle(); + menup->show(x, y); + LLMenuGL::showPopup(spawning_view, menup, x, y); + + mParent = NULL; // to avoid dereferencing an invalid pointer +} + // virtual LLContextMenu* LLWearableItemsList::ContextMenu::createMenu() { @@ -1004,4 +1050,10 @@ void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id) LLAgentWearables::createWearable(item->getWearableType(), true); } +// static +void LLWearableItemsList::ContextMenu::createNewWearableByType(LLWearableType::EType type) +{ + LLAgentWearables::createWearable(type, true); +} + // EOF diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index f3182ed163..ba8488b237 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -415,6 +415,8 @@ public: public: /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); + void show(LLView* spawning_view, LLWearableType::EType w_type, S32 x, S32 y); + protected: enum { MASK_CLOTHING = 0x01, @@ -431,6 +433,7 @@ public: static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val); static void updateMask(U32& mask, LLAssetType::EType at); static void createNewWearable(const LLUUID& item_id); + static void createNewWearableByType(LLWearableType::EType type); LLWearableItemsList* mParent; }; @@ -469,6 +472,8 @@ public: void setSortOrder(ESortOrder sort_order, bool sort_now = true); + void setMenuWearableType(LLWearableType::EType type) { mMenuWearableType = type; } + protected: friend class LLUICtrlFactory; LLWearableItemsList(const LLWearableItemsList::Params& p); @@ -479,6 +484,8 @@ protected: bool mWornIndicationEnabled; ESortOrder mSortOrder; + + LLWearableType::EType mMenuWearableType; }; #endif //LL_LLWEARABLEITEMSLIST_H diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml index aa56b4ba63..7370dace7f 100644 --- a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml @@ -4,6 +4,7 @@ @@ -11,6 +12,7 @@ @@ -18,6 +20,7 @@ @@ -25,6 +28,7 @@ @@ -32,6 +36,7 @@ @@ -47,6 +52,7 @@ @@ -54,6 +60,7 @@ @@ -61,6 +68,7 @@ @@ -68,6 +76,7 @@ @@ -75,6 +84,7 @@ From c471392ef1c0633423ea66158c21ba4d81f2473b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 1 Jun 2020 21:34:12 +0300 Subject: [PATCH 004/193] SL-13346 Hi-Res snapshots save a zoomed portion on 4K+ resolutions --- indra/newview/llviewermenufile.cpp | 7 +++++-- indra/newview/llviewerwindow.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index d1d3a7fc12..7603a6b18c 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -683,7 +683,8 @@ class LLFileTakeSnapshotToDisk : public view_listener_t S32 width = gViewerWindow->getWindowWidthRaw(); S32 height = gViewerWindow->getWindowHeightRaw(); - if (gSavedSettings.getBOOL("HighResSnapshot")) + BOOL high_res = gSavedSettings.getBOOL("HighResSnapshot"); + if (high_res) { width *= 2; height *= 2; @@ -695,7 +696,9 @@ class LLFileTakeSnapshotToDisk : public view_listener_t TRUE, FALSE, gSavedSettings.getBOOL("RenderUIInSnapshot"), - FALSE)) + FALSE, + LLSnapshotModel::SNAPSHOT_TYPE_COLOR, + high_res ? S32_MAX : MAX_SNAPSHOT_IMAGE_SIZE)) //per side { LLPointer formatted; LLSnapshotModel::ESnapshotFormat fmt = (LLSnapshotModel::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat"); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 385bbd57e5..601140d9d2 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -137,7 +137,7 @@ private: }; -static const U32 MAX_SNAPSHOT_IMAGE_SIZE = 6 * 1024; // max snapshot image size 6144 * 6144 +static const U32 MAX_SNAPSHOT_IMAGE_SIZE = 7680; // max snapshot image size 7680 * 7680 UHDTV2 class LLViewerWindow : public LLWindowCallbacks { From 47e474244f42f0e28c8a041d5d34d6656c27db85 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Tue, 2 Jun 2020 18:45:03 +0300 Subject: [PATCH 005/193] SL-13362 The worn wearables shouldn't be shareable --- indra/newview/llgiveinventory.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 3ab8fed2c6..127055459d 100644 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -129,23 +129,14 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item) switch(item->getType()) { case LLAssetType::AT_OBJECT: - if (get_is_item_worn(item->getUUID())) - { - acceptable = false; - } - break; case LLAssetType::AT_BODYPART: case LLAssetType::AT_CLOTHING: { - BOOL copyable = false; - if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true; - - if (!copyable && get_is_item_worn(item->getUUID())) + if (get_is_item_worn(item->getUUID())) { - // worn no-copy items can't be transfered, - // but it is valid to transfer a copy of a worn item acceptable = false; } + break; } break; default: From 13b78a0c5a788c617866e3530c65dae616e6520f Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 2 Jun 2020 10:29:15 -0400 Subject: [PATCH 006/193] SL-13361: Distill redundant create_console() code to set_stream(). There are separate stanzas in llappviewerwin32.cpp's create_console() function for each of STD_INPUT_HANDLE, STD_OUTPUT_HANDLE and STD_ERROR_HANDLE. SL-13361 wants to add more code to each. Factor out new local set_stream() function and make create_console() call it three times. --- indra/newview/llappviewerwin32.cpp | 59 +++++++++++++++--------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index d208e135bb..1f66177c37 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -501,11 +501,12 @@ void LLAppViewerWin32::disableWinErrorReporting() const S32 MAX_CONSOLE_LINES = 500; -static bool create_console() -{ - int h_con_handle; - long l_std_handle; +namespace { +FILE* set_stream(const char* which, DWORD handle_id, const char* mode); + +bool create_console() +{ CONSOLE_SCREEN_BUFFER_INFO coninfo; FILE *fp; @@ -518,50 +519,48 @@ static bool create_console() SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); // redirect unbuffered STDOUT to the console - l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE); - h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); - if (h_con_handle == -1) + FILE* fp = set_stream("stdout", STD_OUTPUT_HANDLE, "w"); + if (fp) { - LL_WARNS() << "create_console() failed to open stdout handle" << LL_ENDL; - } - else - { - fp = _fdopen( h_con_handle, "w" ); *stdout = *fp; - setvbuf( stdout, NULL, _IONBF, 0 ); } // redirect unbuffered STDIN to the console - l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE); - h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); - if (h_con_handle == -1) + fp = set_stream("stdin", STD_INPUT_HANDLE, "r"); + if (fp) { - LL_WARNS() << "create_console() failed to open stdin handle" << LL_ENDL; - } - else - { - fp = _fdopen( h_con_handle, "r" ); *stdin = *fp; - setvbuf( stdin, NULL, _IONBF, 0 ); } // redirect unbuffered STDERR to the console - l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE); - h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); + fp = set_stream("stderr", STD_ERROR_HANDLE, "w"); + if (fp) + { + *stderr = *fp; + } + + return isConsoleAllocated; +} + +FILE* set_stream(const char* which, DWORD handle_id, const char* mode) +{ + long l_std_handle = (long)GetStdHandle(handle_id); + int h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); if (h_con_handle == -1) { - LL_WARNS() << "create_console() failed to open stderr handle" << LL_ENDL; + LL_WARNS() << "create_console() failed to open " << which << " handle" << LL_ENDL; + return nullptr; } else { - fp = _fdopen( h_con_handle, "w" ); - *stderr = *fp; - setvbuf( stderr, NULL, _IONBF, 0 ); + FILE* fp = _fdopen( h_con_handle, mode ); + setvbuf( fp, NULL, _IONBF, 0 ); + return fp; } - - return isConsoleAllocated; } +} // anonymous namespace + LLAppViewerWin32::LLAppViewerWin32(const char* cmd_line) : mCmdLine(cmd_line), mIsConsoleAllocated(false) From 0b61150e698537a7e42a4cdae02496da500399d9 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 2 Jun 2020 16:44:22 -0400 Subject: [PATCH 007/193] SL-13361: Enable color processing on Windows 10 debug console. --- indra/llcommon/llerror.cpp | 5 ++--- indra/newview/llappviewerwin32.cpp | 21 ++++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index b46f49ba34..0a83c4a3d7 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -39,6 +39,8 @@ #if !LL_WINDOWS # include # include +#else +# include #endif // !LL_WINDOWS #include #include "string.h" @@ -231,14 +233,11 @@ namespace { bool checkANSI(void) { -#if LL_LINUX || LL_DARWIN // Check whether it's okay to use ANSI; if stderr is // a tty then we assume yes. Can be turned off with // the LL_NO_ANSI_COLOR env var. return (0 != isatty(2)) && (NULL == getenv("LL_NO_ANSI_COLOR")); -#endif // LL_LINUX - return FALSE; // works in a cygwin shell... ;) } }; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 1f66177c37..f0aa355342 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -500,6 +500,10 @@ void LLAppViewerWin32::disableWinErrorReporting() } const S32 MAX_CONSOLE_LINES = 500; +// Only defined in newer SDKs than we currently use +#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 4 +#endif namespace { @@ -507,13 +511,11 @@ FILE* set_stream(const char* which, DWORD handle_id, const char* mode); bool create_console() { - CONSOLE_SCREEN_BUFFER_INFO coninfo; - FILE *fp; - // allocate a console for this app const bool isConsoleAllocated = AllocConsole(); // set the screen buffer to be big enough to let us scroll text + CONSOLE_SCREEN_BUFFER_INFO coninfo; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); coninfo.dwSize.Y = MAX_CONSOLE_LINES; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); @@ -542,19 +544,24 @@ bool create_console() return isConsoleAllocated; } -FILE* set_stream(const char* which, DWORD handle_id, const char* mode) +FILE* set_stream(const char* desc, DWORD handle_id, const char* mode) { - long l_std_handle = (long)GetStdHandle(handle_id); - int h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); + auto l_std_handle = GetStdHandle(handle_id); + int h_con_handle = _open_osfhandle(reinterpret_cast(l_std_handle), _O_TEXT); if (h_con_handle == -1) { - LL_WARNS() << "create_console() failed to open " << which << " handle" << LL_ENDL; + LL_WARNS() << "create_console() failed to open " << desc << " handle" << LL_ENDL; return nullptr; } else { FILE* fp = _fdopen( h_con_handle, mode ); setvbuf( fp, NULL, _IONBF, 0 ); + // Enable color processing on Windows 10 console windows. + DWORD dwMode = 0; + GetConsoleMode(l_std_handle, &dwMode); + dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(l_std_handle, dwMode); return fp; } } From 6fddbeb3973c3cd2135ba101afc13329a8c9fe49 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 4 Jun 2020 22:43:55 +0300 Subject: [PATCH 008/193] SL-12748 Blocked username displays old name after name change --- indra/llmessage/llavatarnamecache.cpp | 17 ++++++ indra/llmessage/llavatarnamecache.h | 4 ++ indra/newview/llmutelist.cpp | 78 +++++++++++++++++++++++++-- indra/newview/llmutelist.h | 6 ++- 4 files changed, 100 insertions(+), 5 deletions(-) diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 6a287f0cc5..6ada12962c 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -285,12 +285,27 @@ void LLAvatarNameCache::processName(const LLUUID& agent_id, const LLAvatarName& return; } + bool updated_account = true; // assume obsolete value for new arrivals by default + + std::map::iterator it = mCache.find(agent_id); + if (it != mCache.end() + && (*it).second.getAccountName() == av_name.getAccountName()) + { + updated_account = false; + } + // Add to the cache mCache[agent_id] = av_name; // Suppress request from the queue mPendingQueue.erase(agent_id); + // notify mute list about changes + if (updated_account && mAccountNameChangedCallback) + { + mAccountNameChangedCallback(agent_id, av_name); + } + // Signal everyone waiting on this name signal_map_t::iterator sig_it = mSignalMap.find(agent_id); if (sig_it != mSignalMap.end()) @@ -303,6 +318,8 @@ void LLAvatarNameCache::processName(const LLUUID& agent_id, const LLAvatarName& delete signal; signal = NULL; } + + } void LLAvatarNameCache::requestNamesViaCapability() diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h index ba89d569f3..549d1703fa 100644 --- a/indra/llmessage/llavatarnamecache.h +++ b/indra/llmessage/llavatarnamecache.h @@ -42,6 +42,7 @@ class LLAvatarNameCache : public LLSingleton ~LLAvatarNameCache(); public: typedef boost::signals2::signal use_display_name_signal_t; + typedef boost::function account_name_changed_callback_t; // Import/export the name cache to file. bool importFile(std::istream& istr); @@ -103,6 +104,8 @@ public: void addUseDisplayNamesCallback(const use_display_name_signal_t::slot_type& cb); + void setAccountNameChangedCallback(const account_name_changed_callback_t& cb) { mAccountNameChangedCallback = cb; } + private: // Handle name response off network. void processName(const LLUUID& agent_id, @@ -141,6 +144,7 @@ private: private: use_display_name_signal_t mUseDisplayNamesSignal; + account_name_changed_callback_t mAccountNameChangedCallback; // Cache starts in a paused state until we can determine if the // current region supports display names. diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 64df449c26..8a10a38b37 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -169,6 +169,14 @@ LLMuteList::LLMuteList() : gMessageSystem.callWhenReady(boost::bind(&LLMessageSystem::setHandlerFuncFast, _1, _PREHASH_UseCachedMuteList, processUseCachedMuteList, static_cast(NULL))); + + // make sure mute list's instance gets initialized before we start any name requests + LLAvatarNameCache::getInstance()->setAccountNameChangedCallback([this](const LLUUID& id, const LLAvatarName& av_name) + { + // it would be better to just pass LLAvatarName instead of doing unnesssesary copies + // but this way is just more convinient + onAccountNameChanged(id, av_name.getUserName()); + }); } //----------------------------------------------------------------------------- @@ -179,6 +187,11 @@ LLMuteList::~LLMuteList() } +void LLMuteList::cleanupSingleton() +{ + LLAvatarNameCache::getInstance()->setAccountNameChangedCallback(NULL); +} + BOOL LLMuteList::isLinden(const std::string& name) const { std::string username = boost::replace_all_copy(name, ".", " "); @@ -232,8 +245,8 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags) LL_WARNS() << "Trying to self; ignored" << LL_ENDL; return FALSE; } - - S32 mute_list_limit = gSavedSettings.getS32("MuteListLimit"); + + static LLCachedControl mute_list_limit(gSavedSettings, "MuteListLimit", 1000); if (getMutes().size() >= mute_list_limit) { LL_WARNS() << "Mute limit is reached; ignored" << LL_ENDL; @@ -358,6 +371,10 @@ void LLMuteList::updateAdd(const LLMute& mute) msg->addU32("MuteFlags", mute.mFlags); gAgent.sendReliableMessage(); + if (!mIsLoaded) + { + LL_WARNS() << "Added elements to non-initialized block list" << LL_ENDL; + } mIsLoaded = TRUE; // why is this here? -MG } @@ -412,7 +429,6 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags) // Must be after erase. notifyObserversDetailed(localmute); - setLoaded(); // why is this here? -MG } else { @@ -426,7 +442,6 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags) mLegacyMutes.erase(legacy_it); // Must be after erase. notifyObserversDetailed(mute); - setLoaded(); // why is this here? -MG } } @@ -584,6 +599,19 @@ BOOL LLMuteList::loadFromFile(const std::string& filename) } fclose(fp); setLoaded(); + + // server does not maintain up-to date account names (not display names!) + // in this list, so it falls to viewer. + pending_names_t::iterator iter = mPendingAgentNameUpdates.begin(); + pending_names_t::iterator end = mPendingAgentNameUpdates.end(); + while (iter != end) + { + // this will send updates to server, make sure mIsLoaded is set + onAccountNameChanged(iter->first, iter->second); + iter++; + } + mPendingAgentNameUpdates.clear(); + return TRUE; } @@ -767,6 +795,48 @@ void LLMuteList::onFileMuteList(void** user_data, S32 error_code, LLExtStat ext_ delete local_filename_and_path; } +void LLMuteList::onAccountNameChanged(const LLUUID& id, const std::string& username) +{ + if (mIsLoaded) + { + LLMute mute(id, username, LLMute::AGENT); + mute_set_t::iterator mute_it = mMutes.find(mute); + if (mute_it != mMutes.end() + && mute_it->mName != mute.mName + && mute_it->mType == LLMute::AGENT) // just in case, it is std::set, not map + { + // existing mute, but name changed, copy data + mute.mFlags = mute_it->mFlags; + + // erase old variant + mMutes.erase(mute_it); + + // (re)add the mute entry. + { + std::pair result = mMutes.insert(mute); + if (result.second) + { + LL_INFOS() << "Muting " << mute.mName << " id " << mute.mID << " flags " << mute.mFlags << LL_ENDL; + updateAdd(mute); + // Do not notify observers here, observers do not know or need to handle name changes + // Example: block list considers notifyObserversDetailed as a selection update; + // Various chat/voice statuses care only about id and flags + // Since apropriate update time for account names is considered to be in 'hours' it is + // fine not to update UI (will be fine after restart or couple other changes) + + } + } + } + } + else + { + // Delay update until we load file + // Ex: Buddies list can arrive too early since we prerequest + // names from Buddies list before we load blocklist + mPendingAgentNameUpdates[id] = username; + } +} + void LLMuteList::addObserver(LLMuteListObserver* observer) { mObservers.insert(observer); diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index f2fcf3dbb3..0d426fbd48 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -73,6 +73,7 @@ class LLMuteList : public LLSingleton { LLSINGLETON(LLMuteList); ~LLMuteList(); + /*virtual*/ void cleanupSingleton(); public: // reasons for auto-unmuting a resident enum EAutoReason @@ -131,6 +132,7 @@ private: static void processUseCachedMuteList(LLMessageSystem* msg, void**); static void onFileMuteList(void** user_data, S32 code, LLExtStat ext_status); + void onAccountNameChanged(const LLUUID& id, const std::string& username); private: struct compare_by_name @@ -155,7 +157,9 @@ private: }; typedef std::set mute_set_t; mute_set_t mMutes; - + typedef std::map pending_names_t; + pending_names_t mPendingAgentNameUpdates; + typedef std::set string_set_t; string_set_t mLegacyMutes; From 39cf42e6eb0460e6b752a90e4920d8869d83ed51 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Tue, 9 Jun 2020 15:24:03 +0300 Subject: [PATCH 009/193] SL-13405 FIXED Preview Asset Types of Content tab in one window no longer works --- indra/newview/llinventoryfunctions.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 646d92b9e1..0083ab0397 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2397,16 +2397,19 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root { bool open_multi_preview = true; - for (std::set::iterator set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter) + if ("open" == action) { - LLFolderViewItem* folder_item = *set_iter; - if (folder_item) + for (std::set::iterator set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter) { - LLInvFVBridge* bridge = dynamic_cast(folder_item->getViewModelItem()); - if (!bridge || !bridge->isMultiPreviewAllowed()) + LLFolderViewItem* folder_item = *set_iter; + if (folder_item) { - open_multi_preview = false; - break; + LLInvFVBridge* bridge = dynamic_cast(folder_item->getViewModelItem()); + if (!bridge || !bridge->isMultiPreviewAllowed()) + { + open_multi_preview = false; + break; + } } } } From 5afedc9177893daa4c60ee2c20471241b4b38dc8 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 9 Jun 2020 18:29:46 +0300 Subject: [PATCH 010/193] SL-3584 Alpha masked textures occasionally changing to alpha mode none --- indra/newview/llvovolume.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 2ffd462ac3..34b801a097 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -2319,7 +2319,8 @@ bool LLVOVolume::notifyAboutCreatingTexture(LLViewerTexture *texture) //setup new materials for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it) { - LLMaterialMgr::getInstance()->put(getID(), it->first, *it->second); + // These are placeholder materials, they shouldn't be sent to server + LLMaterialMgr::getInstance()->setLocalMaterial(getRegion()->getRegionID(), it->second); LLViewerObject::setTEMaterialParams(it->first, it->second); } From 161ea5b13579cb21c07cbd04062a44d09064517e Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Wed, 10 Jun 2020 14:14:38 +0300 Subject: [PATCH 011/193] SL-13413 FIXED Camera behaviour changed on ESC in Camera Presets viewer --- indra/newview/llviewermenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index b6c7be2ed3..f5f8b87ed5 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4104,7 +4104,7 @@ void handle_reset_view() // switching to outfit selector should automagically save any currently edited wearable LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "my_outfits")); } - + gAgentCamera.setFocusOnAvatar(TRUE, FALSE, FALSE); reset_view_final( TRUE ); LLFloaterCamera::resetCameraMode(); } From 9608b6dcac894c5251d9419c66943d6473fa5d41 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 11 Jun 2020 17:41:59 +0300 Subject: [PATCH 012/193] SL-13433 Viewer should recognizes ipv6 links --- indra/llui/llurlentry.cpp | 39 ++++++++++++++++++++++++++++++++++++ indra/llui/llurlentry.h | 13 ++++++++++++ indra/llui/llurlregistry.cpp | 1 + 3 files changed, 53 insertions(+) diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 333d03f208..ac86101f69 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -1475,4 +1475,43 @@ void LLUrlEntryExperienceProfile::onExperienceDetails( const LLSD& experience_de callObservers(experience_details[LLExperienceCache::EXPERIENCE_ID].asString(), name, LLStringUtil::null); } +// +// LLUrlEntryEmail Describes an IPv6 address +// +LLUrlEntryIPv6::LLUrlEntryIPv6() + : LLUrlEntryBase() +{ + mHostPath = "https?://\\[([a-f0-9:]+:+)+[a-f0-9]+]"; + mPattern = boost::regex(mHostPath + "(:\\d{1,5})?(/\\S*)?", + boost::regex::perl | boost::regex::icase); + mMenuName = "menu_url_http.xml"; + mTooltip = LLTrans::getString("TooltipHttpUrl"); +} +std::string LLUrlEntryIPv6::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ + boost::regex regex = boost::regex(mHostPath, boost::regex::perl | boost::regex::icase); + boost::match_results matches; + + if (boost::regex_search(url, matches, regex)) + { + return url.substr(0, matches[0].length()); + } + else + { + return url; + } +} + +std::string LLUrlEntryIPv6::getQuery(const std::string &url) const +{ + boost::regex regex = boost::regex(mHostPath, boost::regex::perl | boost::regex::icase); + boost::match_results matches; + + return boost::regex_replace(url, regex, ""); +} + +std::string LLUrlEntryIPv6::getUrl(const std::string &string) const +{ + return string; +} diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 78c149d9fd..0a0c247a6a 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -513,5 +513,18 @@ public: /*virtual*/ std::string getUrl(const std::string &string) const; }; +/// +/// LLUrlEntryEmail Describes an IPv6 address +/// +class LLUrlEntryIPv6 : public LLUrlEntryBase +{ +public: + LLUrlEntryIPv6(); + /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ std::string getUrl(const std::string &string) const; + /*virtual*/ std::string getQuery(const std::string &url) const; + + std::string mHostPath; +}; #endif diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index ba6fa1e2e9..321a0ec5b9 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -79,6 +79,7 @@ LLUrlRegistry::LLUrlRegistry() mUrlEntrySLLabel = new LLUrlEntrySLLabel(); registerUrl(mUrlEntrySLLabel); registerUrl(new LLUrlEntryEmail()); + registerUrl(new LLUrlEntryIPv6()); } LLUrlRegistry::~LLUrlRegistry() From 905005be3c7e15429d8380c99d7590e677482286 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 11 Jun 2020 20:54:09 +0300 Subject: [PATCH 013/193] SL-13433 Add tests for new url entry --- indra/llui/tests/llurlentry_test.cpp | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 3c34fd269e..4a4fdb72e3 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -903,4 +903,38 @@ namespace tut "and even no www something lindenlab.com", ""); } + + template<> template<> + void object::test<16>() + { + // + // test LLUrlEntryIPv6 + // + LLUrlEntryIPv6 url; + + // Regex tests. + testRegex("match urls with a protocol", url, + "this url should match http://[::1]", + "http://[::1]"); + + testRegex("match urls with a protocol and query", url, + "this url should match http://[::1]/file.mp3", + "http://[::1]/file.mp3"); + + testRegex("match urls with a protocol", url, + "this url should match http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]", + "http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]"); + + testRegex("match urls with port", url, + "let's specify some port http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]:8080", + "http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]:8080"); + + testRegex("don't match urls w/o protocol", url, + "looks like an url something [2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d] but no https prefix", + ""); + + testRegex("don't match incorrect urls", url, + "http://[ 2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d ]", + ""); + } } From b95d780b2ec38078100a96ed3b5760c29598a0db Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Mon, 15 Jun 2020 16:07:05 +0300 Subject: [PATCH 014/193] SL-13457 FIXED Crash in LLFolderViewGroupedItemBridge::canWearSelected --- indra/newview/llinventorybridge.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 657c65c68d..b1de884f06 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -7655,8 +7655,7 @@ bool LLFolderViewGroupedItemBridge::canWearSelected(uuid_vec_t item_ids) for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it) { LLViewerInventoryItem* item = gInventory.getItem(*it); - LLAssetType::EType asset_type = item->getType(); - if (!item || (asset_type >= LLAssetType::AT_COUNT) || (asset_type <= LLAssetType::AT_NONE)) + if (!item || (item->getType() >= LLAssetType::AT_COUNT) || (item->getType() <= LLAssetType::AT_NONE)) { return false; } From 307534c9781b312608ccce6a9b4e12499a66170a Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Tue, 16 Jun 2020 17:26:39 +0300 Subject: [PATCH 015/193] SL-13463 Add 'Reset scripts' button to Content tab of Build floater --- indra/newview/llpanelcontents.cpp | 11 ++ indra/newview/llpanelcontents.h | 1 + indra/newview/llviewermenu.cpp | 100 +++++++++--------- indra/newview/llviewermenu.h | 2 + .../skins/default/xui/en/floater_tools.xml | 13 ++- 5 files changed, 77 insertions(+), 50 deletions(-) diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 3bae0cebfb..116b23e595 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -54,6 +54,7 @@ #include "lltrans.h" #include "llviewerassettype.h" #include "llviewerinventory.h" +#include "llviewermenu.h" #include "llviewerobject.h" #include "llviewerregion.h" #include "llviewerwindow.h" @@ -82,6 +83,7 @@ BOOL LLPanelContents::postBuild() childSetAction("button new script",&LLPanelContents::onClickNewScript, this); childSetAction("button permissions",&LLPanelContents::onClickPermissions, this); + childSetAction("btn_reset_scripts", &LLPanelContents::onClickResetScripts, this); mPanelInventoryObject = getChild("contents_inventory"); @@ -106,6 +108,7 @@ void LLPanelContents::getState(LLViewerObject *objectp ) if( !objectp ) { getChildView("button new script")->setEnabled(FALSE); + getChildView("btn_reset_scripts")->setEnabled(FALSE); return; } @@ -125,6 +128,8 @@ void LLPanelContents::getState(LLViewerObject *objectp ) ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1) || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1))); + getChildView("btn_reset_scripts")->setEnabled(editable); + getChildView("button permissions")->setEnabled(!objectp->isPermanentEnforced()); mPanelInventoryObject->setEnabled(!objectp->isPermanentEnforced()); } @@ -206,3 +211,9 @@ void LLPanelContents::onClickPermissions(void *userdata) LLPanelContents* self = (LLPanelContents*)userdata; gFloaterView->getParentFloater(self)->addDependentFloater(LLFloaterReg::showInstance("bulk_perms")); } + +// static +void LLPanelContents::onClickResetScripts(void *userdata) +{ + handle_selected_script_action("reset"); +} diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h index 6ecc78afa0..5b1a57de42 100644 --- a/indra/newview/llpanelcontents.h +++ b/indra/newview/llpanelcontents.h @@ -53,6 +53,7 @@ public: static void onClickNewScript(void*); static void onClickPermissions(void*); + static void onClickResetScripts(void*); // Key suffix for "tentative" fields static const char* TENTATIVE_SUFFIX; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index f5f8b87ed5..ef31f5e3bf 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7202,58 +7202,62 @@ class LLToolsSelectedScriptAction : public view_listener_t { bool handleEvent(const LLSD& userdata) { - std::string action = userdata.asString(); - bool mono = false; - std::string msg, name; - std::string title; - if (action == "compile mono") - { - name = "compile_queue"; - mono = true; - msg = "Recompile"; - title = LLTrans::getString("CompileQueueTitle"); - } - if (action == "compile lsl") - { - name = "compile_queue"; - msg = "Recompile"; - title = LLTrans::getString("CompileQueueTitle"); - } - else if (action == "reset") - { - name = "reset_queue"; - msg = "Reset"; - title = LLTrans::getString("ResetQueueTitle"); - } - else if (action == "start") - { - name = "start_queue"; - msg = "SetRunning"; - title = LLTrans::getString("RunQueueTitle"); - } - else if (action == "stop") - { - name = "stop_queue"; - msg = "SetRunningNot"; - title = LLTrans::getString("NotRunQueueTitle"); - } - LLUUID id; id.generate(); - - LLFloaterScriptQueue* queue =LLFloaterReg::getTypedInstance(name, LLSD(id)); - if (queue) - { - queue->setMono(mono); - queue_actions(queue, msg); - queue->setTitle(title); - } - else - { - LL_WARNS() << "Failed to generate LLFloaterScriptQueue with action: " << action << LL_ENDL; - } + handle_selected_script_action(userdata.asString()); return true; } }; +void handle_selected_script_action(const std::string& action) +{ + bool mono = false; + std::string msg, name; + std::string title; + if (action == "compile mono") + { + name = "compile_queue"; + mono = true; + msg = "Recompile"; + title = LLTrans::getString("CompileQueueTitle"); + } + if (action == "compile lsl") + { + name = "compile_queue"; + msg = "Recompile"; + title = LLTrans::getString("CompileQueueTitle"); + } + else if (action == "reset") + { + name = "reset_queue"; + msg = "Reset"; + title = LLTrans::getString("ResetQueueTitle"); + } + else if (action == "start") + { + name = "start_queue"; + msg = "SetRunning"; + title = LLTrans::getString("RunQueueTitle"); + } + else if (action == "stop") + { + name = "stop_queue"; + msg = "SetRunningNot"; + title = LLTrans::getString("NotRunQueueTitle"); + } + LLUUID id; id.generate(); + + LLFloaterScriptQueue* queue = LLFloaterReg::getTypedInstance(name, LLSD(id)); + if (queue) + { + queue->setMono(mono); + queue_actions(queue, msg); + queue->setTitle(title); + } + else + { + LL_WARNS() << "Failed to generate LLFloaterScriptQueue with action: " << action << LL_ENDL; + } +} + void handle_selected_texture_info(void*) { for (LLObjectSelection::valid_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_begin(); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 6882405407..74a15af50c 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -110,6 +110,8 @@ void handle_object_return(); void handle_object_delete(); void handle_object_edit(); +void handle_selected_script_action(const std::string& action); + void handle_buy_land(); // Takes avatar UUID, or if no UUID passed, uses last selected object diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 0abee2ff80..1377bad6cf 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2575,13 +2575,22 @@ even though the user gets a free copy. border_visible="true" bevel_style="in" follows="left|top|right" - height="325" + height="300" layout="topleft" left="10" name="contents_inventory" top="50" width="275" /> - + + + + + + + + + + + + + + + + + + + + + + + + "" + + + + + + + + + + "" + + + + + + + + + + "" + + + + + + + + + + + + + "" + + + + + + + + + + "" + + + + + + + + + + "" + + + + diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 4dc07478d7..06fafea440 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -238,11 +238,9 @@ label="Camera Controls" name="Camera Controls"> + function="View.CheckCameraFloater" /> + function="View.ToggleCameraFloater" /> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_UI.xml b/indra/newview/skins/default/xui/en/panel_preferences_UI.xml index 7b78bba2bd..56701cc4a1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_UI.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_UI.xml @@ -783,11 +783,11 @@ name="FSInspectAvatarSlurlOpensProfile" tool_tip="If enabled, Firestorm will open the profile of an avatar directly when clicking on a link with its name" initial_value="true" - top_pad="8" + top_pad="6" left="10" width="250" /> + Date: Thu, 10 Dec 2020 14:53:13 +0100 Subject: [PATCH 139/193] Fix wrong arrow colors in camera floater in AnsaStorm skins --- .../textures/bottomtray/Cam_Rotate_In.png | Bin 0 -> 404 bytes .../textures/bottomtray/Cam_Tracking_In.png | Bin 0 -> 323 bytes .../blood/textures/bottomtray/Cam_Rotate_In.png | Bin 0 -> 405 bytes .../blood/textures/bottomtray/Cam_Tracking_In.png | Bin 0 -> 332 bytes .../textures/bottomtray/Cam_Rotate_In.png | Bin 0 -> 403 bytes .../textures/bottomtray/Cam_Tracking_In.png | Bin 0 -> 328 bytes .../textures/bottomtray/Cam_Rotate_In.png | Bin 0 -> 404 bytes .../textures/bottomtray/Cam_Tracking_In.png | Bin 0 -> 331 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 indra/newview/skins/ansastorm/textures/bottomtray/Cam_Rotate_In.png create mode 100644 indra/newview/skins/ansastorm/textures/bottomtray/Cam_Tracking_In.png create mode 100644 indra/newview/skins/ansastorm/themes/blood/textures/bottomtray/Cam_Rotate_In.png create mode 100644 indra/newview/skins/ansastorm/themes/blood/textures/bottomtray/Cam_Tracking_In.png create mode 100644 indra/newview/skins/ansastorm/themes/classic_brown/textures/bottomtray/Cam_Rotate_In.png create mode 100644 indra/newview/skins/ansastorm/themes/classic_brown/textures/bottomtray/Cam_Tracking_In.png create mode 100644 indra/newview/skins/ansastorm/themes/ectoplasma/textures/bottomtray/Cam_Rotate_In.png create mode 100644 indra/newview/skins/ansastorm/themes/ectoplasma/textures/bottomtray/Cam_Tracking_In.png diff --git a/indra/newview/skins/ansastorm/textures/bottomtray/Cam_Rotate_In.png b/indra/newview/skins/ansastorm/textures/bottomtray/Cam_Rotate_In.png new file mode 100644 index 0000000000000000000000000000000000000000..afcfbf607196993820d35f8ada0785e3547ffb6e GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j1|<7dDaZmT#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!22D>F$B>G+w^#N3m>orqe{5uG+QQ}T)Z`GN zAh34Ts>f2IcbaGW>|o_w%7Y^mI#0I z)qDK5!|KE8X)){G+Pu%dWToroeLwX@>*=S*&UODwdw%%Q-d}o-+A(^;*80C^``^>O z*ZuzN%a+rrY0pFJKd&|K{{E&qSn6TX%-cV2^B+9*$oA(wpWg*L@7%gs%kwWO^P^mC zzSCR#clWlh*LAbE|L@*j7izeshvyLM%2w;OJv>_r)Td5#+@WxYRZy>^z_Eo}DP}^{ zj>o4?Jm}?q)C=SZJZ!phNH)}s?O_v#xXTWOtp&}eP6Tj&Pbf||-e~#x<+pd+-$??) e2@`B!54y!5#iPoRJu8DBB<<!lvI6;>1s;*b3=DjSL74G){)!Z!;0;d~$B>G+w^t749&!+9yU1IAK$&mj8DCoprhHRkh^T zL$+?xr;e@`&9lB0pcOZ_;QV6V)JIo2zHiTP?yPvv|2=BU!?zz-{e4{bYg_KE=|Atq z+E-32P<-fgsI`TgQ(Q<-CB|dN1OfspqISGbJ$JfBulU90cdvJU?eqQo^v3r4^X@VN e{Q?Ie*KUc%JF7FrXr-S733|HvxvX!lvI6;>1s;*b3=DjSL74G){)!Z!1}#q)$B>G+w^wbwm;*)H9(KBMZ`{nyqNAhZ zqT{2=(d26O$nH+p?hOJh4O4qhh=_?f9Vq<~`)tCo`Kyqb-XP+^y6OudUu6WAlCE?G4<^Gt{k?9nMW%S>eAidIQ(;3}e~fhu=;% zKU&?h*K&42SJ|@12|H?Ehklex%0HzvXHo2nA8*?qxPE+>oWHEn!gcm*4f*E%FGSy) zeN(&h@A10izmt;w{`g~`d*o%(b|W*6=}*M+mK&MfIg}fIjP2nhj_EEtR1T>M>U9=) z<~`h|mE3Hu*9k-go-N)*+~(_gc;S*}+R2A?@AN+NDqeN7TeJG-S{r6yKw*Mw4%cfL X64q#&?D|o?7$oiK>gTe~DWM4fCoQ7F literal 0 HcmV?d00001 diff --git a/indra/newview/skins/ansastorm/themes/blood/textures/bottomtray/Cam_Tracking_In.png b/indra/newview/skins/ansastorm/themes/blood/textures/bottomtray/Cam_Tracking_In.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ce710bf698764bbe41a49c99fe0b4029139ec0 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j1|<7dDaZmT#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!;6qOr$B>G+w^#P&GC7L0UOei$gU3su=+OyX z2lo<&R)Ih!-5mne;b&C-6bsM0V0r2Co}0d5@f(=))3(pZUzT~jDDADzQr2j>{KMa} z>m#=A?J0Wbx2W{#qp4iws!`!uaWf0b7nPnfvbo9_HCAXUOnf$*=0N1+4l-h<{AFa jd_6PzJ!lvI6;>1s;*b3=DjSL74G){)!Z!1`SUa$B>G+w^w!joE=5l9zF~=*aBM?OEYR ztGo7E&o1aHTlzRsGIhKhU4n^cYDF_-i?ksR1T>M>U9=)ws!lvI6;>1s;*b3=DjSL74G){)!Z!;9XA_$B>G+w^uG^GC7L0UA(CD##3O8!UEZw zjf~MA?qWjah0jzkuK3?Qy?`&~*|~S8KiTFyo^P3Zt8iYOZu-UZK~)>>e!XUAzwg$* z_o-93zboGg(2HAHP`-$F>7%Kf-xY2JsKs>__`6Aa9jUI~A-o6&cAxF+XWuV8oq2g%?cb;C g%YptufTdf@7(Yv@lx4o<7XgWSy85}Sb4q9e0JVgC$p8QV literal 0 HcmV?d00001 diff --git a/indra/newview/skins/ansastorm/themes/ectoplasma/textures/bottomtray/Cam_Rotate_In.png b/indra/newview/skins/ansastorm/themes/ectoplasma/textures/bottomtray/Cam_Rotate_In.png new file mode 100644 index 0000000000000000000000000000000000000000..be2bb347bcb51484ec38435540cac804d8b4b46f GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j1|<7dDaZmT#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!22D>F$B>G+w^wbwoE=5l9=^_3EPL6~(7M32 zOC&1t=FW+44%aRz5-$r2Gt&%`*ucS2_U>T*j&_qkb<5Vzg7?_@iq*DP?|f2r!?5|~ z)6khaZr$v@+||@uGUw~|cb~I2%{ZQSSZ~gv-cp|5w@3;oL$gWw)*j+{eNG@evC`XKczHh(cPCfzBqqaR&jo#`DGg*_qB$6bM6_@_nP0- z?)-Z!m-KgH(%+wd?B5=L`Dlxg8OQV|V(*q1ncX=g8-9%K;UtdfE<02XsS4_K7I@}8 z?9)naHrML}q5{tr?;`H<2ubM{Z>1Qahm(LBLXNdX?{GisQoL63$dtW*!samo!wC~u bFL=F=F=e_|-)TSg{UB*iS3j3^P6!lvI6;>1s;*b3=DjSL74G){)!Z!-~&$=$B>G+w^ugiGC2ygT|BI-aFJ=N#UfUY z7wvNxZWXdGv7~d&%CvDPNcPW=D};%Zx`6) z?l;TTUmUYT{^G8pk6x|2h1Y6}uJ_qdzo<0z(NvD_30u~=?3vzPZ4~wWQ^nPPh0nL$ zGdZU9d9VE2C!U8|TevyJh4fTnJa$YdP<-e_Kwx3k!+pnZ_I|cJx9IE^|MSbr?- Date: Thu, 10 Dec 2020 15:02:56 +0100 Subject: [PATCH 140/193] Automatically switch to other camera floater when flipping small camera floater option while it is visible --- indra/newview/llviewercontrol.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 48f9ed7477..eebce59f9a 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -1019,6 +1019,20 @@ void handleRenderHiDPIChanged(const LLSD& newvalue) } // FIRE-24081 +// Optional small camera floater +void handleSmallCameraFloaterChanged(const LLSD& newValue) +{ + std::string old_floater_name = newValue.asBoolean() ? "camera" : "fs_camera_small"; + std::string new_floater_name = newValue.asBoolean() ? "fs_camera_small" : "camera"; + + if (LLFloaterReg::instanceVisible(old_floater_name)) + { + LLFloaterReg::hideInstance(old_floater_name); + LLFloaterReg::showInstance(new_floater_name); + } +} +// + //////////////////////////////////////////////////////////////////////////// void settings_setup_listeners() @@ -1263,6 +1277,9 @@ void settings_setup_listeners() // Dynamic texture memory calculation gSavedSettings.getControl("FSDynamicTextureMemory")->getSignal()->connect(boost::bind(&handleDynamicTextureMemoryChanged, _2)); + + // Optional small camera floater + gSavedSettings.getControl("FSUseSmallCameraFloater")->getSignal()->connect(boost::bind(&handleSmallCameraFloaterChanged, _2)); } #if TEST_CACHED_CONTROL From adfc8ec1ced5e90f8b54f1c76402c64b94eb1305 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Thu, 10 Dec 2020 15:51:58 +0100 Subject: [PATCH 141/193] Open correct camera floater from camera presets pulldown --- indra/newview/llpanelpresetscamerapulldown.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanelpresetscamerapulldown.cpp b/indra/newview/llpanelpresetscamerapulldown.cpp index d21a484fb0..b1cbbe7931 100644 --- a/indra/newview/llpanelpresetscamerapulldown.cpp +++ b/indra/newview/llpanelpresetscamerapulldown.cpp @@ -146,5 +146,9 @@ void LLPanelPresetsCameraPulldown::onViewButtonClick(const LLSD& user_data) // close the minicontrol, we're bringing up the big one setVisible(FALSE); - LLFloaterReg::toggleInstanceOrBringToFront("camera"); + // Optional small camera floater + //LLFloaterReg::toggleInstanceOrBringToFront("camera"); + std::string floater_name = gSavedSettings.getBOOL("FSUseSmallCameraFloater") ? "fs_camera_small" : "camera"; + LLFloaterReg::toggleInstanceOrBringToFront(floater_name); + // } From 72f10f9ccf7cfb270357daaacec3c55fca64839b Mon Sep 17 00:00:00 2001 From: Ansariel Date: Fri, 11 Dec 2020 11:06:15 +0100 Subject: [PATCH 142/193] FIRE-10883: Prevent context menu from going off screen --- indra/llui/llmenugl.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 1b2d49ea36..2252f5f5dd 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -4202,6 +4202,9 @@ void LLContextMenu::show(S32 x, S32 y, LLView* spawning_view) { y += height; } + + // FIRE-10883: Prevent context menu from going off screen + y = llmin(y, menu_region_rect.mTop); } // Open out to the left if menu extends past right edge @@ -4215,6 +4218,9 @@ void LLContextMenu::show(S32 x, S32 y, LLView* spawning_view) { x -= width; } + + // FIRE-10883: Prevent context menu from going off screen + x = llmax(x, menu_region_rect.mLeft); } S32 local_x, local_y; From 84d25e8098f053b1d56f826d2bfab057df7b4025 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Fri, 11 Dec 2020 12:12:58 +0100 Subject: [PATCH 143/193] FIRE-30571: Comboboxes select all items then pressing Page-Up --- indra/llui/llscrolllistctrl.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 0c3fff25a5..f5206462a4 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -932,6 +932,8 @@ BOOL LLScrollListCtrl::selectFirstItem() // virtual BOOL LLScrollListCtrl::selectNthItem( S32 target_index ) { + // FIRE-30571: Comboboxes select all items then pressing Page-Up + target_index = llclamp(target_index, 0, (S32)mItemList.size() - 1); return selectItemRange(target_index, target_index); } From d68dcdcbed4e0c033374384839394b302a1e829e Mon Sep 17 00:00:00 2001 From: Ansariel Date: Fri, 11 Dec 2020 22:27:48 +0100 Subject: [PATCH 144/193] FIRE-30583: Fix settings from marketplace folder being shown in quickprefs --- indra/newview/quickprefs.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/indra/newview/quickprefs.cpp b/indra/newview/quickprefs.cpp index 81570ce6e7..b9d272ec4f 100644 --- a/indra/newview/quickprefs.cpp +++ b/indra/newview/quickprefs.cpp @@ -61,12 +61,17 @@ class FSSettingsCollector : public LLInventoryCollectFunctor { public: - FSSettingsCollector() {} + FSSettingsCollector() + { + mMarketplaceFolderUUID = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false); + } + virtual ~FSSettingsCollector() {} bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) { if (item && item->getType() == LLAssetType::AT_SETTINGS && + !gInventory.isObjectDescendentOf(item->getUUID(), mMarketplaceFolderUUID) && mSeen.find(item->getAssetUUID()) == mSeen.end()) { mSeen.insert(item->getAssetUUID()); @@ -79,6 +84,7 @@ public: } protected: + LLUUID mMarketplaceFolderUUID; std::set mSeen; }; From c5835b95b744a2901eba421e7cf06621325e43f4 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sat, 12 Dec 2020 00:12:08 +0100 Subject: [PATCH 145/193] FIRE-30582: Fix out of range crash --- indra/newview/lllogchat.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 6a23d9acf1..3a8397fa37 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -470,7 +470,13 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list& m if (is_group) { std::string old_name(file_name); - old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size()); + // FIRE-30582: Fix out of range crash + //old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size()); + if (LLStringUtil::endsWith(old_name, GROUP_CHAT_SUFFIX)) + { + old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size()); + } + // fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "r"); if (fptr) { @@ -1234,7 +1240,13 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list FIRE-30582: Fix out of range crash + //old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size()); + if (LLStringUtil::endsWith(old_name, GROUP_CHAT_SUFFIX)) + { + old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size()); + } + // fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "r"); if (fptr) { From 0321670277fedd3455c83d82cbf92f7be99ea1b0 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sat, 12 Dec 2020 00:36:10 +0100 Subject: [PATCH 146/193] Fix conversation history for group chats sometimes displaying old (outdated) chat --- indra/newview/llfloaterconversationpreview.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index 75d2341ed8..3bd05cd86d 100644 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -102,11 +102,15 @@ BOOL LLFloaterConversationPreview::postBuild() file = "chat"; } mChatHistoryFileName = file; - // Obsolete because of https://bitbucket.org/lindenlab/viewer/commits/57b32eb01cd35bbac440569df885036eb24f2369 - //if (mIsGroup && !LLStringUtil::endsWith(mChatHistoryFileName, GROUP_CHAT_SUFFIX)) - //{ - // mChatHistoryFileName += GROUP_CHAT_SUFFIX; - //} + // Broken version got removed in https://bitbucket.org/lindenlab/viewer/commits/57b32eb01cd35bbac440569df885036eb24f2369 + // but this is actually needed in the fixed form: If a group chat + // log is stored in conversation.log without the suffix, the filename + // will not be updated until the conversation is removed from the log, + // resulting in the old chat log being displayed. + if (mIsGroup && !LLStringUtil::endsWith(mChatHistoryFileName, GROUP_CHAT_SUFFIX)) + { + mChatHistoryFileName += GROUP_CHAT_SUFFIX; + } // LLStringUtil::format_map_t args; args["[NAME]"] = name; From 5fa3005a5d34f5503e4fca46225cb8c4d26d582e Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sat, 12 Dec 2020 14:03:17 +0100 Subject: [PATCH 147/193] FIRE-9466: Fix scroll lists affecting camera zoom when using scroll wheel while list is scrolled at top/bottom --- indra/newview/skins/default/xui/en/widgets/scroll_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml index e43989c6c7..89418ca132 100644 --- a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml +++ b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml @@ -13,7 +13,7 @@ draw_stripes="true" scroll_bar_bg_visible="false" scroll_bar_bg_color="black" - mouse_wheel_opaque="false" + mouse_wheel_opaque="true" mouse_opaque="true" background_visible="true" heading_height="23" From 292cbfa6253c2c0b886e578697fa532befd76b11 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sun, 13 Dec 2020 18:11:26 +0100 Subject: [PATCH 148/193] FIRE-30598: Unmaintained skin updates... --- indra/newview/skins/starlightcui/xui/en/floater_preferences.xml | 2 +- indra/newview/skins/vintage/xui/en/floater_preferences.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml b/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml index 068240969f..baa8b32b4f 100644 --- a/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml +++ b/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml @@ -212,7 +212,7 @@ https://accounts.secondlife.com/change_email/ diff --git a/indra/newview/skins/vintage/xui/en/floater_preferences.xml b/indra/newview/skins/vintage/xui/en/floater_preferences.xml index 7824f47c80..53b56ef1ea 100644 --- a/indra/newview/skins/vintage/xui/en/floater_preferences.xml +++ b/indra/newview/skins/vintage/xui/en/floater_preferences.xml @@ -194,7 +194,7 @@ https://accounts.secondlife.com/change_email/ From 5717f384110d8a5c8e9437157b562e598406c93d Mon Sep 17 00:00:00 2001 From: Ansariel Date: Wed, 16 Dec 2020 11:25:15 +0100 Subject: [PATCH 149/193] FIRE-30611: "You" in transcript is underlined --- indra/llui/llurlentry.cpp | 24 ++++++++++++++++++++++++ indra/llui/llurlentry.h | 14 ++++++++++++++ indra/llui/llurlregistry.cpp | 1 + indra/newview/fschathistory.cpp | 13 +++---------- indra/newview/llpanelprofile.cpp | 14 ++++++++++++++ 5 files changed, 56 insertions(+), 10 deletions(-) diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 1b158bbead..28c39e2250 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -953,6 +953,30 @@ std::string LLUrlEntryAgentRLVAnonymizedName::getName(const LLAvatarName& avatar } // [/RLVa:KB] +// FIRE-30611: "You" in transcript is underlined +/// +/// FSUrlEntryAgentSelf Describes the agent's Second Life agent Url, e.g., +/// secondlife:///app/agentself/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about +FSUrlEntryAgentSelf::FSUrlEntryAgentSelf() : LLUrlEntryAgent() +// +{ + mPattern = boost::regex(APP_HEADER_REGEX "/agentself/[\\da-f-]+/\\w+", + boost::regex::perl|boost::regex::icase); +} + +std::string FSUrlEntryAgentSelf::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ + if (LLUI::getInstance()->mSettingGroups["config"]->getBOOL("FSChatHistoryShowYou")) + { + return LLTrans::getString("AgentNameSubst"); + } + else + { + return LLUrlEntryAgent::getLabel(url, cb); + } +} +// + // // LLUrlEntryGroup Describes a Second Life group Url, e.g., // secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 4e9b7cb066..a3b2f09c4e 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -362,6 +362,20 @@ private: }; // [/RLVa:KB] +// FIRE-30611: "You" in transcript is underlined +/// +/// FSUrlEntryAgentSelf Describes the agent's Second Life agent Url, e.g., +/// secondlife:///app/agentself/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about +class FSUrlEntryAgentSelf : public LLUrlEntryAgent +{ +public: + FSUrlEntryAgentSelf(); +private: + /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +}; +// + + /// /// LLUrlEntryExperienceProfile Describes a Second Life experience profile Url, e.g., /// secondlife:///app/experience/0e346d8b-4433-4d66-a6b0-fd37083abc4c/profile diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 568ac92a4c..aa02f32b90 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -71,6 +71,7 @@ LLUrlRegistry::LLUrlRegistry() // [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Added: RLVa-1.2.2a registerUrl(new LLUrlEntryAgentRLVAnonymizedName()); // [/RLVa:KB] + registerUrl(new FSUrlEntryAgentSelf());// FIRE-30611: "You" in transcript is underlined // LLUrlEntryAgent*Name must appear before LLUrlEntryAgent since // LLUrlEntryAgent is a less specific (catchall for agent urls) registerUrl(new LLUrlEntryAgent()); diff --git a/indra/newview/fschathistory.cpp b/indra/newview/fschathistory.cpp index 262d0fe1f2..61bcf6b519 100644 --- a/indra/newview/fschathistory.cpp +++ b/indra/newview/fschathistory.cpp @@ -1505,17 +1505,10 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL } name_params.use_default_link_style = false; - name_params.link_href = LLSLURL("agent", chat.mFromID, "inspect").getSLURLString(); + name_params.link_href = LLSLURL(from_me ? "agentself" : "agent", chat.mFromID, "inspect").getSLURLString(); - if (from_me && gSavedSettings.getBOOL("FSChatHistoryShowYou")) - { - appendText(LLTrans::getString("AgentNameSubst"), prependNewLineState, name_params); - } - else - { - // Add link to avatar's inspector and delimiter to message. - appendText(std::string(name_params.link_href), prependNewLineState, name_params); - } + // Add link to avatar's inspector and delimiter to message. + appendText(std::string(name_params.link_href), prependNewLineState, name_params); prependNewLineState = false; diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index b17b52ccea..345ac191e3 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -213,6 +213,20 @@ public: }; LLAgentHandler gAgentHandler; +// FIRE-30611: "You" in transcript is underlined +class FSAgentSelfHandler : public LLCommandHandler +{ +public: + // requires trusted browser to trigger + FSAgentSelfHandler() : LLCommandHandler("agentself", UNTRUSTED_THROTTLE) { } + + bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) + { + return gAgentHandler.handle(params, query_map, web); + } +}; +FSAgentSelfHandler gAgentSelfHandler; +// //-- LLPanelProfile::ChildStack begins ---------------------------------------- LLPanelProfile::ChildStack::ChildStack() From 103867a468d959e40b2a5a2e9a8aa929cb8627c9 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Wed, 16 Dec 2020 14:22:58 +0100 Subject: [PATCH 150/193] Fix crashes in send_ObjectGrab_message & send_ObjectDeGrab_message --- indra/newview/lltoolgrab.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index a0513b8c44..99138bbbd5 100644 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -1162,7 +1162,9 @@ LLVector3d LLToolGrabBase::getGrabPointGlobal() void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset) { - if (!object) return; + // Crash fix + //if (!object) return; + if (!object || !object->getRegion()) return; LLMessageSystem *msg = gMessageSystem; @@ -1199,7 +1201,9 @@ void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, co void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick) { - if (!object) return; + // Crash fix + //if (!object) return; + if (!object || !object->getRegion()) return; LLMessageSystem *msg = gMessageSystem; From 4f5af772a314213b18a68a2a2594da967c8a2d93 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Wed, 16 Dec 2020 14:26:17 +0100 Subject: [PATCH 151/193] Fix crash in writeToRecorders --- indra/llcommon/llerror.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 58d90d46df..59f27c20bf 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -1208,7 +1208,9 @@ namespace { LLError::RecorderPtr r = *i; - if (!r->enabled()) + // Crash fix + //if (!r->enabled()) + if (!r || !r->enabled()) { continue; } From 2014962ff8a155eaae2c16355f6fbd64ef62774e Mon Sep 17 00:00:00 2001 From: Ansariel Date: Wed, 16 Dec 2020 16:04:39 +0100 Subject: [PATCH 152/193] Properly encode ampersands --- indra/newview/skins/starlightcui/xui/en/floater_preferences.xml | 2 +- indra/newview/skins/vintage/xui/en/floater_preferences.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml b/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml index baa8b32b4f..4bcb36ef8a 100644 --- a/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml +++ b/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml @@ -212,7 +212,7 @@ https://accounts.secondlife.com/change_email/ diff --git a/indra/newview/skins/vintage/xui/en/floater_preferences.xml b/indra/newview/skins/vintage/xui/en/floater_preferences.xml index 53b56ef1ea..fd0a663bdb 100644 --- a/indra/newview/skins/vintage/xui/en/floater_preferences.xml +++ b/indra/newview/skins/vintage/xui/en/floater_preferences.xml @@ -194,7 +194,7 @@ https://accounts.secondlife.com/change_email/ From 040baf9cbe31157ec80b6aee10e7c73d881d4b00 Mon Sep 17 00:00:00 2001 From: Liny Date: Thu, 17 Dec 2020 04:51:19 -0800 Subject: [PATCH 153/193] More EEP cleanup of basic shaders being always on --- indra/newview/llfloaterpreference.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 7b41808c94..fdcba05c3e 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -2513,7 +2513,7 @@ void LLFloaterPreference::disableUnavailableSettings() LLComboBox* ctrl_reflections = getChild("Reflections"); LLCheckBoxCtrl* ctrl_avatar_vp = getChild("AvatarVertexProgram"); LLCheckBoxCtrl* ctrl_avatar_cloth = getChild("AvatarCloth"); - LLCheckBoxCtrl* ctrl_shader_enable = getChild("BasicShaders"); + //LLCheckBoxCtrl* ctrl_shader_enable = getChild("BasicShaders"); // More EEP cleanup of basic shaders being always on LLCheckBoxCtrl* ctrl_wind_light = getChild("WindLightUseAtmosShaders"); LLCheckBoxCtrl* ctrl_deferred = getChild("UseLightShaders"); LLComboBox* ctrl_shadows = getChild("ShadowDetail"); @@ -2521,6 +2521,7 @@ void LLFloaterPreference::disableUnavailableSettings() LLCheckBoxCtrl* ctrl_dof = getChild("UseDoF"); LLSliderCtrl* sky = getChild("SkyMeshDetail"); + /* More EEP cleanup of basic shaders being always on // if vertex shaders off, disable all shader related products if (!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")) { @@ -2553,6 +2554,7 @@ void LLFloaterPreference::disableUnavailableSettings() ctrl_deferred->setEnabled(FALSE); ctrl_deferred->setValue(FALSE); } + */ // disabled windlight if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")) From 51cc4534ccf8da356e3561f7458267673ac5f082 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Thu, 17 Dec 2020 18:55:54 +0100 Subject: [PATCH 154/193] This can go entirely --- indra/newview/llfloaterpreference.cpp | 36 --------------------------- 1 file changed, 36 deletions(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index fdcba05c3e..f7ef007017 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -2513,7 +2513,6 @@ void LLFloaterPreference::disableUnavailableSettings() LLComboBox* ctrl_reflections = getChild("Reflections"); LLCheckBoxCtrl* ctrl_avatar_vp = getChild("AvatarVertexProgram"); LLCheckBoxCtrl* ctrl_avatar_cloth = getChild("AvatarCloth"); - //LLCheckBoxCtrl* ctrl_shader_enable = getChild("BasicShaders"); // More EEP cleanup of basic shaders being always on LLCheckBoxCtrl* ctrl_wind_light = getChild("WindLightUseAtmosShaders"); LLCheckBoxCtrl* ctrl_deferred = getChild("UseLightShaders"); LLComboBox* ctrl_shadows = getChild("ShadowDetail"); @@ -2521,41 +2520,6 @@ void LLFloaterPreference::disableUnavailableSettings() LLCheckBoxCtrl* ctrl_dof = getChild("UseDoF"); LLSliderCtrl* sky = getChild("SkyMeshDetail"); - /* More EEP cleanup of basic shaders being always on - // if vertex shaders off, disable all shader related products - if (!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")) - { - ctrl_shader_enable->setEnabled(FALSE); - ctrl_shader_enable->setValue(FALSE); - - ctrl_wind_light->setEnabled(FALSE); - ctrl_wind_light->setValue(FALSE); - - sky->setEnabled(FALSE); - - ctrl_reflections->setEnabled(FALSE); - ctrl_reflections->setValue(0); - - ctrl_avatar_vp->setEnabled(FALSE); - ctrl_avatar_vp->setValue(FALSE); - - ctrl_avatar_cloth->setEnabled(FALSE); - ctrl_avatar_cloth->setValue(FALSE); - - ctrl_shadows->setEnabled(FALSE); - ctrl_shadows->setValue(0); - - ctrl_ssao->setEnabled(FALSE); - ctrl_ssao->setValue(FALSE); - - ctrl_dof->setEnabled(FALSE); - ctrl_dof->setValue(FALSE); - - ctrl_deferred->setEnabled(FALSE); - ctrl_deferred->setValue(FALSE); - } - */ - // disabled windlight if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")) { From d0156575c09ff4011a2a446098e2cab91a224e19 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Sun, 20 Dec 2020 23:46:51 +0100 Subject: [PATCH 155/193] Updated Polish translation, correcting minor mistake in Italian --- .../xui/it/floater_phototools_camera.xml | 2 +- .../xui/pl/floater_fs_camera_small.xml | 38 +++++++++++++++++++ .../default/xui/pl/panel_preferences_UI.xml | 1 + 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 indra/newview/skins/default/xui/pl/floater_fs_camera_small.xml diff --git a/indra/newview/skins/default/xui/it/floater_phototools_camera.xml b/indra/newview/skins/default/xui/it/floater_phototools_camera.xml index e40a20f586..296f55b88c 100644 --- a/indra/newview/skins/default/xui/it/floater_phototools_camera.xml +++ b/indra/newview/skins/default/xui/it/floater_phototools_camera.xml @@ -27,7 +27,7 @@ Vista laterale - /> + Vista retro diff --git a/indra/newview/skins/default/xui/pl/floater_fs_camera_small.xml b/indra/newview/skins/default/xui/pl/floater_fs_camera_small.xml new file mode 100644 index 0000000000..edfb94bd9e --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_fs_camera_small.xml @@ -0,0 +1,38 @@ + + + + Obróć kamerę wokół punktu skupienia + + + Przybliż kamerę do punktu skupienia + + + Poruszaj kamerą w górę, w dół, w lewo i w prawo + + + Pokaż obiekt + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml b/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml index b147a6bf58..82f2e915e5 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml @@ -111,6 +111,7 @@ + Używaj osobnych okien dla: From e4a3fd79bf50a46afc222dbcbf9ec87f9bf81a42 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Mon, 21 Dec 2020 17:09:03 +0100 Subject: [PATCH 156/193] FIRE-30628 [EEP] Inventory filter lacks Settings inventory object type in pulldown --- indra/newview/llpanelmaininventory.cpp | 1 + indra/newview/skins/ansastorm/xui/en/panel_main_inventory.xml | 1 + indra/newview/skins/ansastorm/xui/pl/panel_main_inventory.xml | 1 + indra/newview/skins/default/xui/en/panel_main_inventory.xml | 1 + indra/newview/skins/default/xui/pl/panel_main_inventory.xml | 1 + indra/newview/skins/starlight/xui/en/panel_main_inventory.xml | 1 + indra/newview/skins/starlightcui/xui/en/panel_main_inventory.xml | 1 + indra/newview/skins/vintage/xui/en/panel_main_inventory.xml | 1 + indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml | 1 + 9 files changed, 9 insertions(+) diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 3621570aa2..de780f17ac 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -182,6 +182,7 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p) mFilterMap["filter_type_textures"] = 0x01 << LLInventoryType::IT_TEXTURE; mFilterMap["filter_type_snapshots"] = 0x01 << LLInventoryType::IT_SNAPSHOT; mFilterMap["filter_type_meshes"] = 0x01 << LLInventoryType::IT_MESH; + mFilterMap["filter_type_settings"] = 0x01 << LLInventoryType::IT_SETTINGS; // initialize empty filter mask mFilterMask = 0; diff --git a/indra/newview/skins/ansastorm/xui/en/panel_main_inventory.xml b/indra/newview/skins/ansastorm/xui/en/panel_main_inventory.xml index 0e67c9e937..20cda26f42 100644 --- a/indra/newview/skins/ansastorm/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/ansastorm/xui/en/panel_main_inventory.xml @@ -522,6 +522,7 @@ + diff --git a/indra/newview/skins/ansastorm/xui/pl/panel_main_inventory.xml b/indra/newview/skins/ansastorm/xui/pl/panel_main_inventory.xml index a68437d9c1..5194cc65b2 100644 --- a/indra/newview/skins/ansastorm/xui/pl/panel_main_inventory.xml +++ b/indra/newview/skins/ansastorm/xui/pl/panel_main_inventory.xml @@ -92,6 +92,7 @@ + diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index e00f5a5062..d6d215a565 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -86,6 +86,7 @@ + diff --git a/indra/newview/skins/default/xui/pl/panel_main_inventory.xml b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml index 3b93978f47..9bf6050672 100644 --- a/indra/newview/skins/default/xui/pl/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml @@ -30,6 +30,7 @@ + diff --git a/indra/newview/skins/starlight/xui/en/panel_main_inventory.xml b/indra/newview/skins/starlight/xui/en/panel_main_inventory.xml index 3e9e644e80..102ec44adb 100644 --- a/indra/newview/skins/starlight/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/starlight/xui/en/panel_main_inventory.xml @@ -75,6 +75,7 @@ + diff --git a/indra/newview/skins/starlightcui/xui/en/panel_main_inventory.xml b/indra/newview/skins/starlightcui/xui/en/panel_main_inventory.xml index cdb2f557f9..13d10bfe31 100644 --- a/indra/newview/skins/starlightcui/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/starlightcui/xui/en/panel_main_inventory.xml @@ -77,6 +77,7 @@ + diff --git a/indra/newview/skins/vintage/xui/en/panel_main_inventory.xml b/indra/newview/skins/vintage/xui/en/panel_main_inventory.xml index 87070ce13b..c0c37d2d9f 100644 --- a/indra/newview/skins/vintage/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/vintage/xui/en/panel_main_inventory.xml @@ -528,6 +528,7 @@ + diff --git a/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml b/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml index 4c3c5a64e2..70065a2053 100644 --- a/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml +++ b/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml @@ -91,6 +91,7 @@ + From dbe10ba130c2358b54f9aff2b1eec747986fd83c Mon Sep 17 00:00:00 2001 From: Ansariel Date: Mon, 21 Dec 2020 18:44:37 +0100 Subject: [PATCH 157/193] Update German translation --- indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml | 3 ++- indra/newview/skins/default/xui/de/panel_main_inventory.xml | 3 ++- indra/newview/skins/vintage/xui/de/panel_main_inventory.xml | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml b/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml index cda2003bd7..0ce6df3cfe 100644 --- a/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml +++ b/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml @@ -93,7 +93,8 @@ - + + diff --git a/indra/newview/skins/default/xui/de/panel_main_inventory.xml b/indra/newview/skins/default/xui/de/panel_main_inventory.xml index d8990fe940..e60c1bbef5 100644 --- a/indra/newview/skins/default/xui/de/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/de/panel_main_inventory.xml @@ -28,7 +28,8 @@ - + + diff --git a/indra/newview/skins/vintage/xui/de/panel_main_inventory.xml b/indra/newview/skins/vintage/xui/de/panel_main_inventory.xml index 30d535a2cb..63e5c8e57d 100644 --- a/indra/newview/skins/vintage/xui/de/panel_main_inventory.xml +++ b/indra/newview/skins/vintage/xui/de/panel_main_inventory.xml @@ -101,7 +101,8 @@ - + + From 9d0576be83239a6db02bab59eaf5953ddf8b856a Mon Sep 17 00:00:00 2001 From: Ansariel Date: Mon, 21 Dec 2020 18:48:04 +0100 Subject: [PATCH 158/193] Update FMOD Studio to 2.01.07 on Windows --- autobuild.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4d9638e3f1..136a1a7365 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -992,11 +992,11 @@ archive hash - b88e70667efc230a00d6a2d982af8fc5 + 9e9f303912776014519c18a0205250ee hash_algorithm md5 url - file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.05-windows-202860859.tar.bz2 + file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.07-windows-203561745.tar.bz2 name windows @@ -1006,18 +1006,18 @@ archive hash - 401829b65cac61a2f96179fadf7eb015 + ae336fe814a6867f6449d0401ea7a9e4 hash_algorithm md5 url - file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.05-windows64-202860900.tar.bz2 + file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.07-windows64-203561747.tar.bz2 name windows64 version - 2.01.05 + 2.01.07 fontconfig From 4827a78c15d14bde759929d1a5953485c297e696 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Tue, 22 Dec 2020 00:55:14 +0100 Subject: [PATCH 159/193] FIRE-30624 French translation update --- .../default/xui/fr/floater_model_preview.xml | 152 +++++++++++++----- 1 file changed, 113 insertions(+), 39 deletions(-) diff --git a/indra/newview/skins/default/xui/fr/floater_model_preview.xml b/indra/newview/skins/default/xui/fr/floater_model_preview.xml index e4bbf31e4b..0103aaea5e 100644 --- a/indra/newview/skins/default/xui/fr/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_model_preview.xml @@ -235,7 +235,6 @@ Échelle (1 = aucune) : - Dimensions : @@ -243,38 +242,140 @@ [X] X [Y] X [Z] - - Modèles d'avatar uniquement : - + + Décalage Z (élever/abaisser l'avatar) : - + + Trop d'articulations texturées + + + Le modèle a des articulations inconnues + + + Articulations : + + + [CONFLICTS] Conflits dans la/les articulations [JOINTS_COUNT] + + + Position annulée pour l'articulation '[JOINT]': + + + + + + + + + + + + + + Chargement des modèles : + + + + + Couleurs de l'aperçu des modèles : + + + Général : + + + + + Physiques : + + + + + Pb des physiques : + + +