From 89cc18bf53ceb9302123bc22a5ad06353faef96f Mon Sep 17 00:00:00 2001 From: Rider Linden Date: Thu, 10 Sep 2026 09:59:06 -0700 Subject: RPC Doc update from https://github.com/secondlife/sl-vscode-plugin/pull/136 --- doc/external-editor-json-rpc.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/doc/external-editor-json-rpc.md b/doc/external-editor-json-rpc.md index 570388ac7c..0c32c043fe 100644 --- a/doc/external-editor-json-rpc.md +++ b/doc/external-editor-json-rpc.md @@ -1806,6 +1806,17 @@ nothing" toggle. } ``` +```json +{ + "jsonrpc": "2.0", + "id": 8, + "result": { "success": true } +} +``` + +The extension implements `editor.show_message`. It accepts `level` values of `"info"`, +`"warn"`, or `"error"`; when omitted, `level` defaults to `"info"`. + --- ### CommandList @@ -1858,5 +1869,4 @@ interface CommandParamInfo { | Command | Required params | Description | |---------|----------------|-------------| -| `editor.open_file` | `path: string` | Open a file in the editor. Optional `line: number`. | | `editor.show_message` | `message: string` | Show a notification. Optional `level: "info" \| "warn" \| "error"`. | -- cgit v1.3 From 9e41808c31146950b34a5ea78ded2adda2bf3e8f Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com> Date: Wed, 9 Sep 2026 22:28:42 +0300 Subject: p#587 Make sure app uses correct model id at runtime --- indra/newview/llvelopack.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/indra/newview/llvelopack.cpp b/indra/newview/llvelopack.cpp index 927a5bbc2c..eb849ab52d 100644 --- a/indra/newview/llvelopack.cpp +++ b/indra/newview/llvelopack.cpp @@ -46,6 +46,7 @@ #if LL_WINDOWS #include "llappviewerwin32.h" #include +#include #include #include #include @@ -984,6 +985,19 @@ static void on_log_message(void* user_data, const char* level, const char* messa OutputDebugStringA("\n"); } +static void set_runtime_app_user_model_id() +{ + // Ensure taskbar grouping uses a stable ID independent of exe path + // (wrapper exe vs current\ exe). + const std::wstring app_user_model_id = get_app_user_model_id(); + HRESULT appid_hr = SetCurrentProcessExplicitAppUserModelID(app_user_model_id.c_str()); + if (FAILED(appid_hr)) + { + LL_WARNS("Velopack") << "SetCurrentProcessExplicitAppUserModelID failed: 0x" + << std::hex << appid_hr << LL_ENDL; + } +} + #elif LL_DARWIN // macOS-specific hooks @@ -1178,6 +1192,11 @@ static void ensure_update_manager(bool allow_downgrade) bool velopack_initialize() { +#if LL_WINDOWS + // Needs to be called on each run for consistent taskbar behavior. + set_runtime_app_user_model_id(); +#endif + vpkc_set_logger(on_log_message, nullptr); vpkc_app_set_auto_apply_on_startup(false); -- cgit v1.3 From a6176095af3766222739a7c3ad51894aa3406b05 Mon Sep 17 00:00:00 2001 From: Rider Linden Date: Fri, 11 Sep 2026 09:56:12 -0700 Subject: Issue #6304: On name change notify the plugin to update. --- indra/newview/llscripteditorws.cpp | 3 +++ indra/newview/llselectmgr.cpp | 10 ++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/indra/newview/llscripteditorws.cpp b/indra/newview/llscripteditorws.cpp index 93b1bd5eb0..017d9a5540 100644 --- a/indra/newview/llscripteditorws.cpp +++ b/indra/newview/llscripteditorws.cpp @@ -1060,6 +1060,9 @@ LLSD LLScriptEditorWSServer::handleObjectModify(U32 connection_id, const LLSD& p msg->sendReliable(host); } + // Force a properties reply so the editor sees the change without an in-world selection. + LLSelectMgr::instance().requestObjectPropertiesFamily(prim); + // Step 4: Return Success Response LLSD response; response["success"] = true; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index a09b54ffac..432678b132 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6108,11 +6108,13 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data node->mInventorySerial = inv_serial; node->mSitName.assign(sit_name); node->mTouchName.assign(touch_name); + } - if (auto ws_server = LLScriptEditorWSServer::getServer()) - { - ws_server->onObjectPropertyChanged(id, name, desc, inv_serial); - } + // Published objects need property updates even when not selected. + LLScriptEditorWSServer::ptr_t ws_server = LLScriptEditorWSServer::getServer(); + if (ws_server) + { + ws_server->onObjectPropertyChanged(id, name, desc, inv_serial); } } -- cgit v1.3 From 28f4e9b352a34d4fe551e13d37d3967b41bd5893 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Mon, 14 Sep 2026 12:35:52 +0300 Subject: #6310 Harden inventory view lifetime handling --- indra/llui/llfolderviewitem.cpp | 17 +++++++++++++++-- indra/newview/llinventorypanel.cpp | 5 +++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index c8ef421677..7c51574fc2 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -234,7 +234,11 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p) // Destroys the object LLFolderViewItem::~LLFolderViewItem() { - mViewModelItem = NULL; + if (mViewModelItem) + { + mViewModelItem->setFolderViewItem(nullptr); + mViewModelItem = nullptr; + } gFocusMgr.removeKeyboardFocusWithoutCallback(this); } @@ -356,7 +360,12 @@ bool LLFolderViewItem::isPotentiallyVisible(S32 filter_generation) void LLFolderViewItem::refresh() { - LLFolderViewModelItem& vmi = *getViewModelItem(); + LLFolderViewModelItem* vmi_ptr = getViewModelItem(); + if (!vmi_ptr) + { + return; + } + LLFolderViewModelItem& vmi = *vmi_ptr; mLabel = utf8str_to_wstring(vmi.getDisplayName()); mLabelFontBuffer.reset(); @@ -387,6 +396,10 @@ void LLFolderViewItem::refresh() void LLFolderViewItem::refreshSuffix() { LLFolderViewModelItem const* vmi = getViewModelItem(); + if (!vmi) + { + return; + } // icons are slightly expensive to get, can be optimized // see LLInventoryIcon::getIcon() diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 301a0a0cc9..92cf302a8d 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -602,8 +602,8 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve if (model_item && view_item && viewmodel_item) { const LLUUID idp = viewmodel_item->getUUID(); - view_item->destroyView(); removeItemID(idp); + view_item->destroyView(); } LLInventoryObject const* objectp = mInventory->getObject(item_id); @@ -709,6 +709,7 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve LLFolderViewModelItem* old_parent_vmi = old_parent->getViewModelItem(); LLFolderViewModelItemInventory* viewmodel_folder = static_cast(old_parent_vmi); LLFolderViewFolder* new_parent = getFolderByID(model_item->getParentUUID()); + const bool was_favorite = view_item->isFavorite(); if (old_parent != new_parent // Item has been moved. && (new_parent != NULL || !isInRootContent(item_id, view_item)) // item is not or shouldn't be in root content @@ -748,7 +749,7 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve old_parent_vmi->dirtyDescendantsFilter(); } - if (view_item->isFavorite()) + if (was_favorite) { if (old_parent) { -- cgit v1.3 From e400a2f20031da67a228b0d23aea31756beca754 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 15 Sep 2026 19:07:35 +0300 Subject: #6318 Change compiler entry to LSL on Luau --- indra/newview/skins/default/xui/en/panel_script_ed.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index 1a978a7629..54e9eca19a 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -250,7 +250,7 @@ name="compile_target_lsl2" value="lsl2" /> Date: Tue, 15 Sep 2026 19:07:17 +0300 Subject: #3988 Add a toggle for sculpty area validation for QA purposes --- indra/llmath/llvolume.cpp | 8 ++++---- indra/llmath/llvolume.h | 2 +- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llfloaterimagepreview.cpp | 3 ++- indra/newview/llvovolume.cpp | 3 ++- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index ece52db1b1..28ce4ef4b0 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -3289,7 +3289,7 @@ S32 sculpt_sides(F32 detail) } } -static bool validate_sculpt_geometry(const LLVolume* volume) +static bool validate_sculpt_geometry(const LLVolume* volume, bool validate_area) { if (!volume || volume->getNumVolumeFaces() == 0) { @@ -3365,7 +3365,7 @@ static bool validate_sculpt_geometry(const LLVolume* volume) F32 area_ratio = total_triangle_area / bounding_surface; constexpr F32 MAX_AREA_TO_AREA_RATIO = 16.0f; - if (area_ratio > MAX_AREA_TO_AREA_RATIO) + if (validate_area && area_ratio > MAX_AREA_TO_AREA_RATIO) { LL_DEBUGS("LLVOLUME") << "Sculpt rejected: excessive triangle area." << " Face index: " << face_idx @@ -3417,7 +3417,7 @@ static void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 deta } // sculpt replaces generate() for sculpted surfaces -void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level, bool visible_placeholder) +void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level, bool visible_placeholder, bool validate_area) { U8 sculpt_type = mParams.getSculptType(); @@ -3528,7 +3528,7 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, // Todo: can this be backed into createVolumeFaces? // Or calculated without having to call createVolumeFaces first? // Todo 2: should the same be done for meshes? - valid_geometry = validate_sculpt_geometry(this); + valid_geometry = validate_sculpt_geometry(this, validate_area); mSculptValidationCache[sculpt_level] = valid_geometry ? LLSculptValidationState::Valid : LLSculptValidationState::Invalid; if (!valid_geometry) diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index 86a7bf0e6a..40e6f8e220 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -1095,7 +1095,7 @@ public: U32 mFaceMask; // bit array of which faces exist in this volume LLVector3 mLODScaleBias; // vector for biasing LOD based on scale - void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level, bool visible_placeholder); + void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level, bool visible_placeholder, bool validate_area); void copyVolumeFaces(const LLVolume* volume); void copyFacesTo(std::vector &faces) const; void copyFacesFrom(const std::vector &faces); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 459f8c1b42..85100254bc 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -15953,6 +15953,17 @@ Value 1000 + ValidateSculptyAreaRatio + + Comment + Version information generated by running the viewer + Persist + 1 + Type + Boolean + Value + 1 + VersionChannelName Comment diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index bbff3e4c86..116286c872 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -926,8 +926,9 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance) if (imagep) { + static LLCachedControl validate_area(gSavedSettings, "ValidateSculptyAreaRatio", true); LLImageDataSharedLock lock(imagep); - mVolume->sculpt(imagep->getWidth(), imagep->getHeight(), imagep->getComponents(), imagep->getData(), 0, false); + mVolume->sculpt(imagep->getWidth(), imagep->getHeight(), imagep->getComponents(), imagep->getData(), 0, false, validate_area()); } const LLVolumeFace &vf = mVolume->getVolumeFace(0); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 076e5eb22e..4a2d2da10c 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1444,7 +1444,8 @@ void LLVOVolume::sculpt() } } - getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level, mSculptTexture->isMissingAsset()); + static LLCachedControl validate_area(gSavedSettings, "ValidateSculptyAreaRatio", true); + getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level, mSculptTexture->isMissingAsset(), validate_area()); } } -- cgit v1.3 From 9e8cae39e56b22f443569b89ad7f6238f9cfda6c Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com> Date: Tue, 15 Sep 2026 21:36:36 +0300 Subject: #5856 Fix default state not restoring --- indra/newview/llappviewer.cpp | 3 ++- indra/newview/llappviewer.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 386ffe9601..139f8dd426 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -6006,9 +6006,10 @@ void LLAppViewer::setPermitOSHibernation(bool permit) } else { + // User is active, check settings and set OS hibernation mode accordingly static LLCachedControl os_hibernation_mode(gSavedSettings, "OSHibernationMode", 0); eHibernationMode mode = static_cast(os_hibernation_mode()); - if (mode != LL_HIBERNATE_MODE_DEFAULT && mCurrentHibernationMode != mode) + if (mCurrentHibernationMode != mode) { setOSHibernationMode(mode); mCurrentHibernationMode = mode; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 837b598ae5..022769b88c 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -270,6 +270,8 @@ public: // Note: mQuitRequested can be aborted by user. void outOfMemorySoftQuit(); + // If permit is true, will allow OS hibernation/sleep. + // If false, will act based of OSHibernationMode. virtual void setPermitOSHibernation(bool permit); #ifdef LL_DISCORD -- cgit v1.3 From 0e1d25f52e6caf4210c86b6e0e4b4ac992a2b8cd Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 16 Sep 2026 14:21:23 +0300 Subject: #5806 enable reset environment after teleport only for new users --- indra/newview/app_settings/settings.xml | 2 +- indra/newview/llagent.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 85100254bc..a526a745fe 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -13359,7 +13359,7 @@ Type Boolean Value - 1 + 0 PreferredBrowserBehavior diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 2f0ad15d18..8d0150f228 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -579,6 +579,9 @@ void LLAgent::setFirstLogin(bool b) { setFeatureVersion(UI_FEATURE_VERSION, UI_FEATURE_FLAGS); } + + // Shared environment on teleport should only be enabled by default for new users; + gSavedSettings.setBOOL("SwitchToSharedEnvAfterTeleport", true); } } -- cgit v1.3 From 56d7fbfcea5a6e22cbce67eb6b5c2b1f73ac1d7e Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 16 Sep 2026 13:44:34 -0700 Subject: Voice wasn't automatically reconnecting after a voice server crash or restart Shutdown code was added that cleaned up voice connections, which we should do during shutdown. However, we do reuse voice connections in cases like reconnects so we can't totally clean up the connections. Fixes #6251 --- indra/llwebrtc/llwebrtc.cpp | 23 +++++++++++++---------- indra/llwebrtc/llwebrtc_impl.h | 5 ++++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index b6b205e858..31bc0cf0c1 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -478,7 +478,7 @@ bool LLWebRTCImpl::terminate() { for (auto& connection : connections) { - connection->closeOnSignalingThread(); + connection->closeOnSignalingThread(true); } // Destroy the connections here, on the signaling thread, while // it's still running. @@ -1137,13 +1137,13 @@ void LLWebRTCPeerConnectionImpl::terminate() mWebRTCImpl->PostSignalingTask( [self]() { - self->closeOnSignalingThread(); + self->closeOnSignalingThread(false); self->mPendingJobs--; }); } // Signaling thread only. -void LLWebRTCPeerConnectionImpl::closeOnSignalingThread() +void LLWebRTCPeerConnectionImpl::closeOnSignalingThread(bool webrtc_terminate) { // Stop issuing stats requests; one may already be in flight, and // Close() below will flush it. @@ -1194,13 +1194,16 @@ void LLWebRTCPeerConnectionImpl::closeOnSignalingThread() observer->OnPeerConnectionClosed(); } - // Nothing may call back into the viewer past this point. Connections - // closed while the viewer is still running unset themselves as observers - // when they're destroyed, but any that are left for llwebrtc::terminate() - // to close deliberately don't -- they're torn down as soon as it returns, - // so a late callback would be reaching into freed memory. - mSignalingObserverList.clear(); - mDataObserverList.clear(); + if (webrtc_terminate) + { + // Nothing may call back into the viewer past this point. Connections + // closed while the viewer is still running unset themselves as observers + // when they're destroyed, but any that are left for llwebrtc::terminate() + // to close deliberately don't -- they're torn down as soon as it returns, + // so a late callback would be reaching into freed memory. + mSignalingObserverList.clear(); + mDataObserverList.clear(); + } } void LLWebRTCPeerConnectionImpl::setSignalingObserver(LLWebRTCSignalingObserver *observer) { mSignalingObserverList.emplace_back(observer); } diff --git a/indra/llwebrtc/llwebrtc_impl.h b/indra/llwebrtc/llwebrtc_impl.h index ae3a6a4903..c980b28d6e 100644 --- a/indra/llwebrtc/llwebrtc_impl.h +++ b/indra/llwebrtc/llwebrtc_impl.h @@ -600,10 +600,13 @@ class LLWebRTCPeerConnectionImpl : public LLWebRTCPeerConnectionInterface, void init(LLWebRTCImpl * webrtc_impl); // Posts closeOnSignalingThread() and returns immediately. void terminate(); + // The actual close. Signaling thread only. Callable directly (via a // BlockingCall) when the caller needs the connection to be fully closed // before it continues -- see LLWebRTCImpl::terminate(). - void closeOnSignalingThread(); + // webrtc_terminate indicates we're shutting down the webrtc library, + // if not, we'll be reusing the peer connection for a reconnection + void closeOnSignalingThread(bool webrtc_terminate); virtual void AddRef() const override = 0; virtual webrtc::RefCountReleaseStatus Release() const override = 0; -- cgit v1.3 From f2586370166a41b0be95c607df2f8df98589458f Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:50:49 +0300 Subject: #6315 Separate voice queue from main queue Voice should not 'runFor' main app loop on shutdown. --- indra/newview/llvoicewebrtc.cpp | 51 ++++++++++++++++++++++++++++------------- indra/newview/llvoicewebrtc.h | 7 ++++-- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index c82a005a77..73277bd7e1 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -288,7 +288,26 @@ void LLWebRTCVoiceClient::initWebRTC() mWebRTCDeviceInterface = llwebrtc::getDeviceInterface(); mWebRTCDeviceInterface->setDevicesObserver(this); - mMainQueue = LL::WorkQueue::getInstance("mainloop"); + + if (!mVoiceWorkQueue) + { + mVoiceWorkQueue = std::make_shared("VoiceWebRTC"); + // Service this queue every idle tick, on the main thread. + doOnIdleRepeating( + [queue = LL::WorkQueue::weak_t(mVoiceWorkQueue)]() -> bool + { + auto locked = queue.lock(); + if (!locked || locked->isClosed()) + { + // Done + return true; + } + locked->runPending(); + // Returning false means "call me again next idle". + return false; + }); + } + refreshDeviceLists(); } @@ -351,11 +370,11 @@ void LLWebRTCVoiceClient::drainConnections() LLTimer timer; while (!sessionState::allSessionsClosed() && timer.getElapsedTimeF32() < DRAIN_TIMEOUT_SECONDS) { - // OnPeerConnectionClosed comes back through the main queue, so it has + // OnPeerConnectionClosed comes back through the queue, so it has // to be pumped or the state machines never see connections finish. - if (auto main_queue = mMainQueue.lock()) + if (mVoiceWorkQueue) { - main_queue->runFor(std::chrono::milliseconds(DRAIN_POLL_MS)); + mVoiceWorkQueue->runFor(std::chrono::milliseconds(DRAIN_POLL_MS)); } sessionState::processSessionStates(); @@ -707,7 +726,7 @@ void LLWebRTCVoiceClient::voiceConnectionCoro() updatePosition(); } } - LL::WorkQueue::postMaybe(mMainQueue, + LL::WorkQueue::postMaybe(mVoiceWorkQueue, [=, this] { if (sShuttingDown) { @@ -829,7 +848,7 @@ void LLWebRTCVoiceClient::OnDevicesChanged(const llwebrtc::LLWebRTCVoiceDeviceLi const llwebrtc::LLWebRTCVoiceDeviceList& capture_devices) { - LL::WorkQueue::postMaybe(mMainQueue, + LL::WorkQueue::postMaybe(mVoiceWorkQueue, [=, this] { OnDevicesChangedImpl(render_devices, capture_devices); @@ -2517,7 +2536,7 @@ LLVoiceWebRTCConnection::LLVoiceWebRTCConnection(const LLUUID ®ionID, const s mWebRTCPeerConnectionInterface = llwebrtc::newPeerConnection(); mWebRTCPeerConnectionInterface->setSignalingObserver(this); - mMainQueue = LL::WorkQueue::getInstance("mainloop"); + mVoiceMainQueue = LLWebRTCVoiceClient::getInstance()->getVoiceWorkQueue(); } LLVoiceWebRTCConnection::~LLVoiceWebRTCConnection() @@ -2551,7 +2570,7 @@ LLVoiceWebRTCConnection::~LLVoiceWebRTCConnection() // callback from llwebrtc void LLVoiceWebRTCConnection::OnIceGatheringState(llwebrtc::LLWebRTCSignalingObserver::EIceGatheringState state) { - LL::WorkQueue::postMaybe(mMainQueue, + LL::WorkQueue::postMaybe(mVoiceMainQueue, [=, this] { LL_DEBUGS("Voice") << "Ice Gathering voice account. " << state << LL_ENDL; @@ -2575,7 +2594,7 @@ void LLVoiceWebRTCConnection::OnIceGatheringState(llwebrtc::LLWebRTCSignalingObs // callback from llwebrtc void LLVoiceWebRTCConnection::OnIceCandidate(const llwebrtc::LLWebRTCIceCandidate& candidate) { - LL::WorkQueue::postMaybe(mMainQueue, [=, this] { mIceCandidates.push_back(candidate); }); + LL::WorkQueue::postMaybe(mVoiceMainQueue, [=, this] { mIceCandidates.push_back(candidate); }); } void LLVoiceWebRTCConnection::processIceUpdates() @@ -2691,7 +2710,7 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection) void LLVoiceWebRTCConnection::OnOfferAvailable(const std::string &sdp) { connectionPtr_t connection = shared_from_this(); - LL::WorkQueue::postMaybe(mMainQueue, + LL::WorkQueue::postMaybe(mVoiceMainQueue, [=] { if (connection->mShutDown) { @@ -2719,7 +2738,7 @@ void LLVoiceWebRTCConnection::OnOfferAvailable(const std::string &sdp) void LLVoiceWebRTCConnection::OnAudioEstablished(llwebrtc::LLWebRTCAudioInterface* audio_interface) { connectionPtr_t connection = shared_from_this(); - LL::WorkQueue::postMaybe(mMainQueue, + LL::WorkQueue::postMaybe(mVoiceMainQueue, [=] { if (connection->mShutDown) { @@ -2742,7 +2761,7 @@ void LLVoiceWebRTCConnection::OnAudioEstablished(llwebrtc::LLWebRTCAudioInterfac // callback from llwebrtc void LLVoiceWebRTCConnection::OnRenegotiationNeeded() { - LL::WorkQueue::postMaybe(mMainQueue, + LL::WorkQueue::postMaybe(mVoiceMainQueue, [=, this] { LL_DEBUGS("Voice") << "Voice channel requires renegotiation." << LL_ENDL; setVoiceConnectionState(VOICE_STATE_SESSION_RETRY); @@ -2753,7 +2772,7 @@ void LLVoiceWebRTCConnection::OnRenegotiationNeeded() // callback from llwebrtc void LLVoiceWebRTCConnection::OnPeerConnectionClosed() { - LL::WorkQueue::postMaybe(mMainQueue, + LL::WorkQueue::postMaybe(mVoiceMainQueue, [=, this] { LL_DEBUGS("Voice") << "Peer connection has closed." << LL_ENDL; if (mVoiceConnectionState == VOICE_STATE_WAIT_FOR_CLOSE) @@ -3264,7 +3283,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() // llwebrtc callback void LLVoiceWebRTCConnection::OnDataReceived(const std::string& data, bool binary) { - LL::WorkQueue::postMaybe(mMainQueue, [=, this] { LLVoiceWebRTCConnection::OnDataReceivedImpl(data, binary); }); + LL::WorkQueue::postMaybe(mVoiceMainQueue, [=, this] { LLVoiceWebRTCConnection::OnDataReceivedImpl(data, binary); }); } // @@ -3493,7 +3512,7 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b void LLVoiceWebRTCConnection::OnDataChannelReady(llwebrtc::LLWebRTCDataInterface *data_interface) { connectionPtr_t connection = shared_from_this(); - LL::WorkQueue::postMaybe(mMainQueue, + LL::WorkQueue::postMaybe(mVoiceMainQueue, [=] { if (connection->mShutDown) { @@ -3535,7 +3554,7 @@ void LLVoiceWebRTCConnection::sendJoin() void LLVoiceWebRTCConnection::OnStatsDelivered(const llwebrtc::LLWebRTCStatsMap& stats_data) { - LL::WorkQueue::postMaybe(mMainQueue, [=, this] + LL::WorkQueue::postMaybe(mVoiceMainQueue, [=, this] { if (mShutDown) { diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index ec01b8c08c..87c31f389b 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -40,6 +40,7 @@ class LLWebRTCProtocolParser; #include "llcoros.h" #include "llparcel.h" #include "llmutelist.h" +#include "workqueue.h" #include #include "boost/json.hpp" @@ -85,6 +86,8 @@ public: // drainConnections() and ~LLVoiceWebRTCConnection(). static bool isWebRTCTerminated() { return sWebRTCTerminated; } + LL::WorkQueue::weak_t getVoiceWorkQueue() const { return mVoiceWorkQueue; } + const LLVoiceVersionInfo& getVersion() override; void updateVersion(); @@ -468,7 +471,7 @@ private: /// llwebrtc::terminate(). Bounded and best effort. void drainConnections(); - LL::WorkQueue::weak_t mMainQueue; + LL::WorkQueue::ptr_t mVoiceWorkQueue; F32 mTuningMicGain; int mTuningSpeakerVolume; @@ -688,7 +691,7 @@ class LLVoiceWebRTCConnection : } EVoiceConnectionState; EVoiceConnectionState mVoiceConnectionState; - LL::WorkQueue::weak_t mMainQueue; + LL::WorkQueue::weak_t mVoiceMainQueue; void setVoiceConnectionState(EVoiceConnectionState new_voice_connection_state) { -- cgit v1.3 From c8e39fa4bda02c23f5cd7c1eef2d278e3c3ee583 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com> Date: Mon, 14 Sep 2026 11:38:40 +0300 Subject: #6109 StopPlayout crash --- indra/llwebrtc/llwebrtc.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index b6b205e858..3b3e7ea3ba 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -768,8 +768,14 @@ void LLWebRTCImpl::workerDeployDevices() // Stop first so the start helpers (which no-op when already running) will // re-select the now-current device. - mDeviceModule->StopPlayout(); - mDeviceModule->ForceStopRecording(); + if (mDeviceModule->Playing()) + { + mDeviceModule->StopPlayout(); + } + if (mDeviceModule->Recording()) + { + mDeviceModule->ForceStopRecording(); + } workerStartRecording(); workerStartPlayout(); @@ -1061,7 +1067,10 @@ void LLWebRTCImpl::freePeerConnection(LLWebRTCPeerConnectionInterface* peer_conn { if (mDeviceModule) { - mDeviceModule->StopPlayout(); + if (mDeviceModule->Playing()) + { + mDeviceModule->StopPlayout(); + } if (!mVoiceEnabled) { mDeviceModule->ForceStopRecording(); -- cgit v1.3 From fcb962905ef06da639fd64fbb8e1149963b39533 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com> Date: Thu, 17 Sep 2026 17:44:41 +0300 Subject: #5856 Update labels --- indra/newview/skins/default/xui/en/panel_preferences_setup.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index d5f2f69df7..ab4a9c9ef6 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -257,7 +257,7 @@ mouse_opaque="false" top_pad="8" width="300"> - Prevent OS from hibernating if not Away: + When I am active (not away), my computer: -- cgit v1.3 From 31b0748d86f18904ff42c1b6b61553d993d625c7 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 17 Sep 2026 20:10:37 +0300 Subject: #6334 Remove unnecessary popups when user doesn't have a payment method on file --- indra/newview/CMakeLists.txt | 2 - indra/newview/app_settings/settings.xml | 22 ++++ indra/newview/llfloateraddpaymentmethod.cpp | 84 ------------ indra/newview/llfloateraddpaymentmethod.h | 52 -------- indra/newview/llfloaterbuycurrency.cpp | 7 +- indra/newview/llviewerfloaterreg.cpp | 3 - .../default/xui/en/floater_add_payment_method.xml | 142 --------------------- .../default/xui/ja/floater_add_payment_method.xml | 25 ---- .../default/xui/pl/floater_add_payment_method.xml | 19 --- 9 files changed, 28 insertions(+), 328 deletions(-) delete mode 100644 indra/newview/llfloateraddpaymentmethod.cpp delete mode 100644 indra/newview/llfloateraddpaymentmethod.h delete mode 100644 indra/newview/skins/default/xui/en/floater_add_payment_method.xml delete mode 100644 indra/newview/skins/default/xui/ja/floater_add_payment_method.xml delete mode 100644 indra/newview/skins/default/xui/pl/floater_add_payment_method.xml diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c9db55c52d..b5443cd96a 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -190,7 +190,6 @@ set(viewer_SOURCE_FILES llfloaterabout.cpp llfloateravatarwelcomepack.cpp llfloaterbvhpreview.cpp - llfloateraddpaymentmethod.cpp llfloaterauction.cpp llfloaterautoreplacesettings.cpp llfloateravatarpicker.cpp @@ -875,7 +874,6 @@ set(viewer_HEADER_FILES llfloaterabout.h llfloateravatarwelcomepack.h llfloaterbvhpreview.h - llfloateraddpaymentmethod.h llfloaterauction.h llfloaterautoreplacesettings.h llfloateravatarpicker.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a526a745fe..f068e7fb7a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1194,6 +1194,28 @@ Value https://accounts.secondlife.com/packs/floater?lang=[LANGUAGE]&shortfall=[SHORTFALL] + PaymentMethodURL + + Comment + URL for adding a payment method + Persist + 1 + Type + String + Value + https://secondlife.com/my/lindex/buy.php?associate_for_viewer=1 + + PaymentMethodStagingURL + + Comment + URL for adding a payment method on the Damballah + Persist + 1 + Type + String + Value + https://secondlife-staging.com/my/lindex/buy.php?associate_for_viewer=1 + EnableButtonFlashing Comment diff --git a/indra/newview/llfloateraddpaymentmethod.cpp b/indra/newview/llfloateraddpaymentmethod.cpp deleted file mode 100644 index 64bd7b6aa1..0000000000 --- a/indra/newview/llfloateraddpaymentmethod.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file llfloateraddpaymentmethod.cpp - * @brief LLFloaterAddPaymentMethod class implementation - * - * $LicenseInfo:firstyear=2020&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2020, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llfloateraddpaymentmethod.h" -#include "llnotificationsutil.h" -#include "lluictrlfactory.h" -#include "llviewernetwork.h" -#include "llweb.h" - - -LLFloaterAddPaymentMethod::LLFloaterAddPaymentMethod(const LLSD& key) - : LLFloater(key) -{ -} - -LLFloaterAddPaymentMethod::~LLFloaterAddPaymentMethod() -{ -} - -bool LLFloaterAddPaymentMethod::postBuild() -{ - setCanDrag(false); - getChild("continue_btn")->setCommitCallback(boost::bind(&LLFloaterAddPaymentMethod::onContinueBtn, this)); - getChild("close_btn")->setCommitCallback(boost::bind(&LLFloaterAddPaymentMethod::onCloseBtn, this)); - return true; -} - -void LLFloaterAddPaymentMethod::onOpen(const LLSD& key) -{ - centerOnScreen(); -} - -void LLFloaterAddPaymentMethod::onContinueBtn() -{ - closeFloater(); - LLNotificationsUtil::add("AddPaymentMethod", LLSD(), LLSD(), - [this](const LLSD¬if, const LLSD&resp) - { - S32 opt = LLNotificationsUtil::getSelectedOption(notif, resp); - if (opt == 0) - { - const std::string& grid_id = LLGridManager::getInstance()->getGridId(); - const std::string& grid_id_lower = utf8str_tolower(grid_id); - LLWeb::loadURL(getString(grid_id_lower == "damballah" ? "continue_staging_url" : "continue_url")); - } - }); -} - -void LLFloaterAddPaymentMethod::onCloseBtn() -{ - closeFloater(); -} - -void LLFloaterAddPaymentMethod::centerOnScreen() -{ - LLVector2 window_size = LLUI::getInstance()->getWindowSize(); - centerWithin(LLRect(0, 0, ll_round(window_size.mV[VX]), ll_round(window_size.mV[VY]))); -} - diff --git a/indra/newview/llfloateraddpaymentmethod.h b/indra/newview/llfloateraddpaymentmethod.h deleted file mode 100644 index 252caf8f5b..0000000000 --- a/indra/newview/llfloateraddpaymentmethod.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file llfloateraddpaymentmethod.h - * @brief LLFloaterAddPaymentMethod class definition - * - * $LicenseInfo:firstyear=2020&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2020, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_FLOATER_ADDPAYMENTMETHOD_H -#define LL_FLOATER_ADDPAYMENTMETHOD_H - -#include "llfloater.h" - -class LLFloaterAddPaymentMethod: - public LLFloater -{ - friend class LLFloaterReg; -public: - bool postBuild() override; - void onOpen(const LLSD& key) override; - -private: - LLFloaterAddPaymentMethod(const LLSD& key); - - void centerOnScreen(); - - void onCloseBtn(); - void onContinueBtn(); - - /*virtual*/ ~LLFloaterAddPaymentMethod(); - -}; - -#endif diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index 506cff31f4..56b3229fda 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -40,6 +40,8 @@ #include "llviewchildren.h" #include "llviewerwindow.h" #include "lluictrlfactory.h" +#include "llviewercontrol.h" +#include "llviewernetwork.h" #include "llweb.h" #include "llwindow.h" #include "llappviewer.h" @@ -336,7 +338,10 @@ void LLFloaterBuyCurrency::handleBuyCurrency(bool has_piof, bool has_target, con } else { - LLFloaterReg::showInstance("add_payment_method"); + const std::string& grid_id = LLGridManager::getInstance()->getGridId(); + const std::string& grid_id_lower = utf8str_tolower(grid_id); + const std::string url = gSavedSettings.getString(grid_id_lower == "damballah" ? "PaymentMethodStagingURL" : "PaymentMethodURL"); + LLWeb::loadURL(url); } } diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 0cfbcc06c0..efd3d99a31 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -36,7 +36,6 @@ #include "llfasttimerview.h" #include "llfloater360capture.h" #include "llfloaterabout.h" -#include "llfloateraddpaymentmethod.h" #include "llfloaterauction.h" #include "llfloaterautoreplacesettings.h" #include "llfloateravatarpicker.h" @@ -240,7 +239,6 @@ public: const std::list blacklist_untrusted = { "360capture", "block_timers", - "add_payment_method", "appearance", "associate_listing", "avatar_picker", @@ -330,7 +328,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("360capture", "floater_360capture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("block_timers", "floater_fast_timers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("add_payment_method", "floater_add_payment_method.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("associate_listing", "floater_associate_listing.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/skins/default/xui/en/floater_add_payment_method.xml b/indra/newview/skins/default/xui/en/floater_add_payment_method.xml deleted file mode 100644 index 18f5f2af32..0000000000 --- a/indra/newview/skins/default/xui/en/floater_add_payment_method.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - https://secondlife.com/my/lindex/buy.php?associate_for_viewer=1 - - - https://secondlife-staging.com/my/lindex/buy.php?associate_for_viewer=1 - - - - Add a payment method to buy Linden dollars and enjoy more of Second Life. - - - - When I am active (not away), my computer: - - - - - - - diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml index 27b3c407cf..36888850c4 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml @@ -36,12 +36,4 @@ Configuración de proxy: