diff options
| author | Erik Kundiman <erik@megapahit.org> | 2025-05-22 05:50:50 +0800 | 
|---|---|---|
| committer | Erik Kundiman <erik@megapahit.org> | 2025-05-22 05:50:50 +0800 | 
| commit | 0a11db8b5d0ace1b83c1b542bc966913fecb3f2a (patch) | |
| tree | 3ab0baf0cc0d0a281f21be67ffcae7bc770c17a1 /indra | |
| parent | f900a9ae67c61b3e53c36c119440cbc3710a2f7c (diff) | |
| parent | a31b7ae2419b4f644ddf559274f650e34212338e (diff) | |
Merge tag 'Second_Life_Release#a31b7ae2-Second_Life_Release#a31b7ae-2025.04' into 2025.04
Diffstat (limited to 'indra')
42 files changed, 207 insertions, 144 deletions
| diff --git a/indra/llui/llchatmentionhelper.cpp b/indra/llui/llchatmentionhelper.cpp index f7769b2cbe..5745389a58 100644 --- a/indra/llui/llchatmentionhelper.cpp +++ b/indra/llui/llchatmentionhelper.cpp @@ -98,7 +98,14 @@ void LLChatMentionHelper::showHelper(LLUICtrl* host_ctrl, S32 local_x, S32 local      LLRect rect = av_picker_floater->getRect();      rect.setLeftTopAndSize(floater_x, floater_y + rect.getHeight(), rect.getWidth(), rect.getHeight());      av_picker_floater->setRect(rect); -    av_picker_floater->openFloater(LLSD().with("av_name", av_name)); +    if (av_picker_floater->isShown()) +    { +        av_picker_floater->onOpen(LLSD().with("av_name", av_name)); +    } +    else +    { +        av_picker_floater->openFloater(LLSD().with("av_name", av_name)); +    }  }  void LLChatMentionHelper::hideHelper(const LLUICtrl* ctrl) diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index 9b3dde4d0f..2ee6d912c1 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -432,9 +432,7 @@ void ll_set_device_module_capture_device(rtc::scoped_refptr<webrtc::AudioDeviceM      // has it at 0      device_module->SetRecordingDevice(device + 1);  #endif -    device_module->SetStereoRecording(false);      device_module->InitMicrophone(); -    device_module->InitRecording();  }  void LLWebRTCImpl::setCaptureDevice(const std::string &id) @@ -475,6 +473,8 @@ void LLWebRTCImpl::setCaptureDevice(const std::string &id)                  ll_set_device_module_capture_device(mPeerDeviceModule, recordingDevice);                  if (recording)                  { +                    mPeerDeviceModule->SetStereoRecording(false); +                    mPeerDeviceModule->InitRecording();                      mPeerDeviceModule->StartRecording();                  }              }); @@ -496,9 +496,7 @@ void ll_set_device_module_render_device(rtc::scoped_refptr<webrtc::AudioDeviceMo  #else      device_module->SetPlayoutDevice(device + 1);  #endif -    device_module->SetStereoPlayout(true);      device_module->InitSpeaker(); -    device_module->InitPlayout();  }  void LLWebRTCImpl::setRenderDevice(const std::string &id) @@ -542,6 +540,8 @@ void LLWebRTCImpl::setRenderDevice(const std::string &id)                  ll_set_device_module_render_device(mPeerDeviceModule, playoutDevice);                  if (playing)                  { +                    mPeerDeviceModule->SetStereoPlayout(true); +                    mPeerDeviceModule->InitPlayout();                      mPeerDeviceModule->StartPlayout();                  }              }); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f65294b3ec..3156439181 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7907,7 +7907,7 @@    <key>RenderMinFreeMainMemoryThreshold</key>    <map>      <key>Comment</key> -    <string>Minimum of available physical memory in MB before textures get scaled down</string> +    <string>If available free physical memory is below this value textures get agresively scaled down</string>      <key>Persist</key>      <integer>0</integer>      <key>Type</key> diff --git a/indra/newview/icons/release/secondlife.icns b/indra/newview/icons/release/secondlife.icnsBinary files differ index a30b51b67a..00d9867814 100644 --- a/indra/newview/icons/release/secondlife.icns +++ b/indra/newview/icons/release/secondlife.icns diff --git a/indra/newview/icons/release/secondlife.iconset/icon_128x128.png b/indra/newview/icons/release/secondlife.iconset/icon_128x128.pngBinary files differ new file mode 100644 index 0000000000..4c519db265 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_128x128.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.pngBinary files differ new file mode 100644 index 0000000000..2a3a0092b2 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_16x16.png b/indra/newview/icons/release/secondlife.iconset/icon_16x16.pngBinary files differ new file mode 100644 index 0000000000..fda2f276ee --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_16x16.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.pngBinary files differ new file mode 100644 index 0000000000..aa4a74f204 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_256x256.png b/indra/newview/icons/release/secondlife.iconset/icon_256x256.pngBinary files differ new file mode 100644 index 0000000000..2a3a0092b2 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_256x256.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.pngBinary files differ new file mode 100644 index 0000000000..4c28add76c --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_32x32.png b/indra/newview/icons/release/secondlife.iconset/icon_32x32.pngBinary files differ new file mode 100644 index 0000000000..aa4a74f204 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_32x32.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.pngBinary files differ new file mode 100644 index 0000000000..23a36f66cb --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_512x512.png b/indra/newview/icons/release/secondlife.iconset/icon_512x512.pngBinary files differ new file mode 100644 index 0000000000..4c28add76c --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_512x512.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.pngBinary files differ new file mode 100644 index 0000000000..a53a6697f1 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png diff --git a/indra/newview/icons/release/secondlife_1024.png b/indra/newview/icons/release/secondlife_1024.pngBinary files differ new file mode 100644 index 0000000000..a53a6697f1 --- /dev/null +++ b/indra/newview/icons/release/secondlife_1024.png diff --git a/indra/newview/icons/release/secondlife_128.png b/indra/newview/icons/release/secondlife_128.pngBinary files differ deleted file mode 100644 index 2f21c1c7fc..0000000000 --- a/indra/newview/icons/release/secondlife_128.png +++ /dev/null diff --git a/indra/newview/icons/release/secondlife_16.png b/indra/newview/icons/release/secondlife_16.pngBinary files differ deleted file mode 100644 index 68f1427309..0000000000 --- a/indra/newview/icons/release/secondlife_16.png +++ /dev/null diff --git a/indra/newview/icons/release/secondlife_256.png b/indra/newview/icons/release/secondlife_256.pngBinary files differ deleted file mode 100644 index 8f324910e7..0000000000 --- a/indra/newview/icons/release/secondlife_256.png +++ /dev/null diff --git a/indra/newview/icons/release/secondlife_32.png b/indra/newview/icons/release/secondlife_32.pngBinary files differ deleted file mode 100644 index 2b7cdef03d..0000000000 --- a/indra/newview/icons/release/secondlife_32.png +++ /dev/null diff --git a/indra/newview/icons/release/secondlife_48.png b/indra/newview/icons/release/secondlife_48.pngBinary files differ deleted file mode 100644 index c2ef372dd7..0000000000 --- a/indra/newview/icons/release/secondlife_48.png +++ /dev/null diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 1db7d63309..f6bc59c748 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -351,7 +351,8 @@ void LLAvatarListItem::setShowProfileBtn(bool show)  void LLAvatarListItem::showSpeakingIndicator(bool visible)  { -    if (mSpeakingIndicator) +    // used only to hide indicator to not contradict with SpeakingIndicatorManager functionality +    if (mSpeakingIndicator && !visible)      {          mSpeakingIndicator->setIsActiveChannel(visible);          mSpeakingIndicator->setShowParticipantsSpeaking(visible); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 4017cd9629..0a941403f2 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3263,7 +3263,11 @@ void LLIMMgr::addMessage(              //Play sound for new conversations              if (!skip_message && !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation")))              { -                make_ui_sound("UISndNewIncomingIMSession"); +                static LLCachedControl<bool> play_snd_mention_pref(gSavedSettings, "PlaySoundChatMention", false); +                if (!play_snd_mention_pref || !LLUrlRegistry::getInstance()->containsAgentMention(msg)) +                { +                    make_ui_sound("UISndNewIncomingIMSession"); +                }              }          }          else diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index adfd0aadba..25025038d2 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2981,12 +2981,16 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,                      if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit)                      {                          // turn it into outfit -                        dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_OUTFIT, cb); +                        dropToMyOutfitsSubfolder(inv_cat, mUUID, cb);                      }                      else                      { -                        // or link it? -                        dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_NONE, cb); +                        LLInvFVBridge::changeCategoryParent( +                            model, +                            (LLViewerInventoryCategory*)inv_cat, +                            mUUID, +                            move_is_into_trash); +                        if (cb) cb->fire(inv_cat->getUUID());                      }                      break;                  case MY_OUTFITS_SUBFOLDER: @@ -4114,10 +4118,14 @@ void LLFolderBridge::perform_pasteFromClipboard()                  }                  if (move_is_into_outfit)                  { -                    if (!move_is_into_my_outfits && item && can_move_to_outfit(item, move_is_into_current_outfit)) +                    bool handled = false; +                    if (mUUID != my_outifts_id +                        && dest_folder->getPreferredType() == LLFolderType::FT_OUTFIT +                        && item +                        && can_move_to_outfit(item, move_is_into_current_outfit))                      { -                        // todo: this is going to create dupplicate folders?                          dropToOutfit(item, move_is_into_current_outfit, cb); +                        handled = true;                      }                      else if (move_is_into_my_outfits && LLAssetType::AT_CATEGORY == obj->getType())                      { @@ -4128,39 +4136,39 @@ void LLFolderBridge::perform_pasteFromClipboard()                              if (mUUID == my_outifts_id)                              {                                  dropToMyOutfits(cat, cb); +                                handled = true;                              } -                            else if (move_is_into_my_outfits) +                            else                              { -                                EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); -                                if (res == MY_OUTFITS_SUBFOLDER) +                                EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); +                                if (dest_res == MY_OUTFITS_SUBFOLDER)                                  {                                      // turn it into outfit -                                    dropToMyOutfitsSubfolder(cat, mUUID, LLFolderType::FT_OUTFIT, cb); -                                } -                                else -                                { -                                    dropToMyOutfitsSubfolder(cat, mUUID, LLFolderType::FT_NONE, cb); +                                    dropToMyOutfitsSubfolder(cat, mUUID, cb); +                                    handled = true;                                  }                              }                          } -                        else if (cat && can_move_to_my_outfits_as_subfolder(model, cat)) +                        if (!handled && cat && can_move_to_my_outfits_as_subfolder(model, cat))                          { -                            if (LLClipboard::instance().isCutMode()) +                            EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); +                            if (dest_res == MY_OUTFITS_SUBFOLDER || mUUID == my_outifts_id)                              { -                                changeCategoryParent(model, cat, parent_id, false); +                                if (LLClipboard::instance().isCutMode()) +                                { +                                    changeCategoryParent(model, cat, parent_id, false); +                                } +                                else +                                { +                                    copy_inventory_category(model, cat, parent_id); +                                }                                  if (cb) cb->fire(item_id); -                            } -                            else -                            { -                                copy_inventory_category(model, cat, parent_id); +                                handled = true;                              }                          } -                        else -                        { -                            LLNotificationsUtil::add("MyOutfitsPasteFailed"); -                        }                      } -                    else + +                    if (!handled)                      {                          LLNotificationsUtil::add("MyOutfitsPasteFailed");                      } @@ -5502,12 +5510,11 @@ void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLI                                   inv_cat->getThumbnailUUID());  } -void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLFolderType::EType preferred_type, LLPointer<LLInventoryCallback> cb) +void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLPointer<LLInventoryCallback> cb)  { -    const LLUUID outfits_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);      inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel);      getInventoryModel()->createNewCategory(dest_id, -        preferred_type, +        LLFolderType::FT_OUTFIT,          inv_cat->getName(),          func,          inv_cat->getThumbnailUUID()); diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index a101c7368a..b7bdef9b21 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -369,7 +369,7 @@ protected:      void dropToFavorites(LLInventoryItem* inv_item, LLPointer<LLInventoryCallback> cb = NULL);      void dropToOutfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit, LLPointer<LLInventoryCallback> cb = NULL);      void dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLInventoryCallback> cb = NULL); -    void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLFolderType::EType preferred_type, LLPointer<LLInventoryCallback> cb = NULL); +    void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLPointer<LLInventoryCallback> cb = NULL);      //--------------------------------------------------------------------      // Messy hacks for handling folder options diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 9967318e92..1077ce74ae 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -438,7 +438,13 @@ void copy_inventory_category(LLInventoryModel* model,      {          copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items);      }; -    gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID()); +    LLFolderType::EType type = LLFolderType::FT_NONE; +    if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) +    { +        // at the moment only permitting copy of outfits and normal folders +        type = LLFolderType::FT_OUTFIT; +    } +    gInventory.createNewCategory(parent_id, type, cat->getName(), func, cat->getThumbnailUUID());  }  void copy_inventory_category(LLInventoryModel* model, @@ -460,6 +466,25 @@ void copy_inventory_category(LLInventoryModel* model,      gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID());  } +void copy_inventory_category(LLInventoryModel* model, +    LLViewerInventoryCategory* cat, +    const LLUUID& parent_id, +    const LLUUID& root_copy_id, +    bool move_no_copy_items, +    LLPointer<LLInventoryCallback> callback) +{ +    // Create the initial folder +    inventory_func_type func = [model, cat, root_copy_id, move_no_copy_items, callback](const LLUUID& new_id) +    { +        copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items); +        if (callback) +        { +            callback.get()->fire(new_id); +        } +    }; +    gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID()); +} +  void copy_cb(const LLUUID& dest_folder, const LLUUID& root_id)  {      // Decrement the count in root_id since that one item won't be copied over @@ -2365,6 +2390,12 @@ bool can_move_to_my_outfits_as_subfolder(LLInventoryModel* model, LLInventoryCat          return false;      } +    if (inv_cat->getPreferredType() != LLFolderType::FT_NONE) +    { +        // only normal folders can become subfodlers +        return false; +    } +      constexpr size_t MAX_CONTENT = 255;      if (cats->size() > MAX_CONTENT)      { diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index f56413bf5d..b23f82a189 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -78,6 +78,7 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s  void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null, bool move_no_copy_items = false);  void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id, bool move_no_copy_items, inventory_func_type callback); +void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id, bool move_no_copy_items, LLPointer<LLInventoryCallback> callback);  void copy_inventory_category_content(const LLUUID& new_cat_uuid, LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& root_copy_id, bool move_no_copy_items); diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 3222dff1b2..43d4edb069 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -65,7 +65,7 @@ const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value imm  bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, bool drop, std::string& tooltip_msg, bool is_link);  bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop, std::string& tooltip_msg, bool user_confirm);  void dropToMyOutfits(LLInventoryCategory* inv_cat); -void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLFolderType::EType preferred_type); +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id);  class LLGalleryPanel: public LLPanel  { @@ -3964,11 +3964,14 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,                      if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit)                      {                          // turn it into outfit -                        dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_OUTFIT); +                        dropToMyOutfitsSubfolder(inv_cat, dest_id);                      }                      else                      { -                        dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_NONE); +                        gInventory.changeCategoryParent( +                            (LLViewerInventoryCategory*)inv_cat, +                            dest_id, +                            move_is_into_trash);                      }                      break;                  case MY_OUTFITS_SUBFOLDER: @@ -4147,10 +4150,10 @@ void dropToMyOutfits(LLInventoryCategory* inv_cat)      gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID());  } -void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id, LLFolderType::EType preferred_type) +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id)  {      // Note: creation will take time, so passing folder id to callback is slightly unreliable,      // but so is collecting and passing descendants' ids      inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1); -    gInventory.createNewCategory(dest_id, preferred_type, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); +    gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID());  } diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index cbc3744aa3..4bffe7feac 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -329,6 +329,15 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)      LL_DEBUGS("LLLogin") << "reason " << reason_response                           << " message " << message_response                           << LL_ENDL; + +    if (response.has("mfa_hash")) +    { +        mRequestData["params"]["mfa_hash"] = response["mfa_hash"]; +        mRequestData["params"]["token"] = ""; + +        saveMFAHash(response); +    } +      // For the cases of critical message or TOS agreement,      // start the TOS dialog. The dialog response will be handled      // by the LLLoginInstance::handleTOSResponse() callback. @@ -593,6 +602,24 @@ bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & respon      return true;  } +void LLLoginInstance::saveMFAHash(LLSD const& response) +{ +    std::string grid(LLGridManager::getInstance()->getGridId()); +    std::string user_id(LLStartUp::getUserId()); + +    // Only save mfa_hash for future logins if the user wants their info remembered. +    if (response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && LLLoginInstance::getInstance()->saveMFA()) +    { +        gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]); +    } +    else if (!LLLoginInstance::getInstance()->saveMFA()) +    { +        gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); +    } +    // TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically +    gSecAPIHandler->syncProtectedMap(); +} +  std::string construct_start_string()  {      std::string start; diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index 748909c069..941b378b14 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -70,6 +70,8 @@ public:      void setNotificationsInterface(LLNotificationsInterface* ni) { mNotifications = ni; }      LLNotificationsInterface& getNotificationsInterface() const { return *mNotifications; } +    void saveMFAHash(LLSD const& response); +  private:      typedef std::shared_ptr<LLEventAPI::Response> ResponsePtr;      void constructAuthParams(LLPointer<LLCredential> user_credentials); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 851107b3be..e7e95034b2 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -5976,13 +5976,7 @@ bool LLMeshRepository::meshUploadEnabled()  bool LLMeshRepository::meshRezEnabled()  {      static LLCachedControl<bool> mesh_enabled(gSavedSettings, "MeshEnabled"); -    LLViewerRegion *region = gAgent.getRegion(); -    if(mesh_enabled && -       region) -    { -        return region->meshRezEnabled(); -    } -    return false; +    return mesh_enabled;  }  // Threading:  main thread only diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index d8e05e1d01..c73282dad3 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -2498,6 +2498,8 @@ void LLModelPreview::updateStatusMessages()      S32 phys_tris = 0;      S32 phys_hulls = 0;      S32 phys_points = 0; +    S32 which_mode = 0; +    S32 file_mode = 1;      //get the triangle count for the whole scene      for (LLModelLoader::scene::iterator iter = mScene[LLModel::LOD_PHYSICS].begin(), endIter = mScene[LLModel::LOD_PHYSICS].end(); iter != endIter; ++iter) @@ -2619,18 +2621,16 @@ void LLModelPreview::updateStatusMessages()              fmp->childEnable("simplify_cancel");              fmp->childEnable("decompose_cancel");          } -    } - -    LLCtrlSelectionInterface* iface = fmp->childGetSelectionInterface("physics_lod_combo"); -    S32 which_mode = 0; -    S32 file_mode = 1; -    if (iface) -    { -        which_mode = iface->getFirstSelectedIndex(); -        file_mode = iface->getItemCount() - 1; +        LLCtrlSelectionInterface* iface = fmp->childGetSelectionInterface("physics_lod_combo"); +        if (iface) +        { +            which_mode = iface->getFirstSelectedIndex(); +            file_mode = iface->getItemCount() - 1; +        }      } +      if (which_mode == file_mode)      {          mFMP->childEnable("physics_file"); diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index b1d5cd9e16..b84b0b3a8c 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -793,6 +793,17 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)      LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);      if (!cat) return; +    if (!isOutfitFolder(cat)) +    { +        // Assume a subfolder that contains or will contain outfits, track it +        const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +        mOutfitsObserver->addCategory(cat_id, [this, outfits]() +        { +            observerCallback(outfits); +        }); +        return; +    } +      std::string name = cat->getName();      LLOutfitGalleryItem* item = buildGalleryItem(name, cat_id);      mOutfitMap.insert(LLOutfitGallery::outfit_map_value_t(cat_id, item)); diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 9d8493549d..df53c66ec1 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -142,6 +142,17 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id)      LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);      if (!cat) return; +    if (!isOutfitFolder(cat)) +    { +        // Assume a subfolder that contains or will contain outfits, track it +        const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +        mCategoriesObserver->addCategory(cat_id, [this, outfits]() +        { +            observerCallback(outfits); +        }); +        return; +    } +      std::string name = cat->getName();      outfit_accordion_tab_params tab_params(get_accordion_tab_params()); @@ -819,49 +830,38 @@ void LLOutfitListBase::observerCallback(const LLUUID& category_id)      refreshList(category_id);  } -class LLIsOutfitListFolder : public LLInventoryCollectFunctor +bool LLOutfitListBase::isOutfitFolder(LLViewerInventoryCategory* cat) const  { -public: -    LLIsOutfitListFolder() +    if (!cat)      { -        mOutfitsId = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +        return false;      } -    virtual ~LLIsOutfitListFolder() {} - -    bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) override +    if (cat->getPreferredType() == LLFolderType::FT_OUTFIT)      { -        if (cat) +        return true; +    } +    // assumes that folder is somewhere inside MyOutfits +    if (cat->getPreferredType() == LLFolderType::FT_NONE) +    { +        LLViewerInventoryCategory* inv_cat = dynamic_cast<LLViewerInventoryCategory*>(cat); +        if (inv_cat && inv_cat->getDescendentCount() > 3)          { -            if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) +            LLInventoryModel::cat_array_t* cats; +            LLInventoryModel::item_array_t* items; +            gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items); +            if (cats->empty() // protection against outfits inside +                && items->size() > 3) // arbitrary, if doesn't have at least base parts, not an outfit              { +                // For now assume this to be an old style outfit, not a subfolder +                // but ideally no such 'outfits' should be left in My Outfits +                // Todo: stop counting FT_NONE as outfits, +                // convert obvious outfits into FT_OUTFIT                  return true;              } -            if (cat->getPreferredType() == LLFolderType::FT_NONE -                && cat->getParentUUID() == mOutfitsId) -            { -                LLViewerInventoryCategory* inv_cat = dynamic_cast<LLViewerInventoryCategory*>(cat); -                if (inv_cat && inv_cat->getDescendentCount() > 3) -                { -                    LLInventoryModel::cat_array_t* cats; -                    LLInventoryModel::item_array_t* items; -                    gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items); -                    if (cats->empty() // protection against outfits inside -                        && items->size() > 3) // eyes, skin, hair and shape are required -                    { -                        // For now assume this to be an old style outfit, not a subfolder -                        // but ideally no such 'outfits' should be left in My Outfits -                        // Todo: stop counting FT_NONE as outfits, -                        // convert obvious outfits into FT_OUTFIT -                        return true; -                    } -                } -            }          } -        return false;      } -protected: -    LLUUID mOutfitsId; -}; +    return false; +}  void LLOutfitListBase::refreshList(const LLUUID& category_id)  { @@ -872,13 +872,13 @@ void LLOutfitListBase::refreshList(const LLUUID& category_id)      LLInventoryModel::item_array_t item_array;      // Collect all sub-categories of a given category. -    LLIsOutfitListFolder is_outfit; +    LLIsType is_category(LLAssetType::AT_CATEGORY);      gInventory.collectDescendentsIf(          category_id,          cat_array,          item_array,          LLInventoryModel::EXCLUDE_TRASH, -        is_outfit); +        is_category);      // Memorize item names for each UUID      std::map<LLUUID, std::string> names; @@ -1396,7 +1396,12 @@ bool LLOutfitAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask)      {          LLSD params;          params["inv_type"] = LLInventoryType::IT_CATEGORY; -        params["thumbnail_id"] = gInventory.getCategory(mFolderID)->getThumbnailUUID(); +        LLViewerInventoryCategory* cat = gInventory.getCategory(mFolderID); +        if (cat) +        { +            params["thumbnail_id"] = cat->getThumbnailUUID(); +        } +        // else consider returning          params["item_id"] = mFolderID;          LLToolTipMgr::instance().show(LLToolTip::Params() diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index f581b419d9..fad0e638fb 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -118,6 +118,8 @@ protected:      void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response);      virtual void onChangeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id) = 0; +    bool isOutfitFolder(LLViewerInventoryCategory* cat) const; +      static void onIdle(void* userdata);      void onIdleRefreshList(); diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index f938c07efe..5b059516cd 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -1099,7 +1099,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)          }          mRadioPbrType->setEnabled(editable);          const bool pbr_selected = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR; -        const bool media_selected = mComboMatMedia->getCurrentIndex() == MATMEDIA_MEDIA;          const bool texture_info_selected = pbr_selected && mRadioPbrType->getSelectedIndex() != PBRTYPE_RENDER_MATERIAL_ID;          mCheckSyncSettings->setEnabled(editable); @@ -1403,7 +1402,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)              mShinyScaleU->setValue(spec_scale_s);              mBumpyScaleU->setValue(norm_scale_s); -            mTexScaleU->setEnabled(editable && (has_material || media_selected)); +            mTexScaleU->setEnabled(editable && has_material);              mShinyScaleU->setEnabled(editable && has_material && specmap_id.notNull());              mBumpyScaleU->setEnabled(editable && has_material && normmap_id.notNull()); @@ -1442,7 +1441,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)              bool norm_scale_tentative = !identical_norm_scale_t;              bool spec_scale_tentative = !identical_spec_scale_t; -            mTexScaleV->setEnabled(editable && (has_material || media_selected)); +            mTexScaleV->setEnabled(editable && has_material);              mShinyScaleV->setEnabled(editable && has_material && specmap_id.notNull());              mBumpyScaleV->setEnabled(editable && has_material && normmap_id.notNull()); @@ -1488,7 +1487,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)              mShinyOffsetU->setTentative(LLSD(spec_offset_u_tentative));              mBumpyOffsetU->setTentative(LLSD(norm_offset_u_tentative)); -            mTexOffsetU->setEnabled(editable && (has_material || media_selected)); +            mTexOffsetU->setEnabled(editable && has_material);              mShinyOffsetU->setEnabled(editable && has_material && specmap_id.notNull());              mBumpyOffsetU->setEnabled(editable && has_material && normmap_id.notNull());          } @@ -1518,7 +1517,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)              mBumpyOffsetV->setTentative(LLSD(norm_offset_v_tentative));              mShinyOffsetV->setTentative(LLSD(spec_offset_v_tentative)); -            mTexOffsetV->setEnabled(editable && (has_material || media_selected)); +            mTexOffsetV->setEnabled(editable && has_material);              mShinyOffsetV->setEnabled(editable && has_material && specmap_id.notNull());              mBumpyOffsetV->setEnabled(editable && has_material && normmap_id.notNull());          } @@ -1545,7 +1544,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)              F32 norm_rot_deg = norm_rotation * RAD_TO_DEG;              F32 spec_rot_deg = spec_rotation * RAD_TO_DEG; -            mTexRotate->setEnabled(editable && (has_material || media_selected)); +            mTexRotate->setEnabled(editable && has_material);              mShinyRotate->setEnabled(editable && has_material && specmap_id.notNull());              mBumpyRotate->setEnabled(editable && has_material && normmap_id.notNull()); @@ -1662,7 +1661,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)                      mTexRepeat->setValue(editable ? repeats : 1.0f);                  }                  mTexRepeat->setTentative(LLSD(repeats_tentative)); -                mTexRepeat->setEnabled(!identical_planar_texgen && enabled && (has_material || media_selected)); +                mTexRepeat->setEnabled(has_material && !identical_planar_texgen && enabled);              }          } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index feb7ed9774..858c7b6656 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3922,25 +3922,7 @@ bool process_login_success_response()          LLViewerMedia::getInstance()->openIDSetup(openid_url, openid_token);      } - -    // Only save mfa_hash for future logins if the user wants their info remembered. -    if(response.has("mfa_hash") -       && gSavedSettings.getBOOL("RememberUser") -       && LLLoginInstance::getInstance()->saveMFA()) -    { -        std::string grid(LLGridManager::getInstance()->getGridId()); -        std::string user_id(gUserCredential->userID()); -        gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]); -        // TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically -        gSecAPIHandler->syncProtectedMap(); -    } -    else if (!LLLoginInstance::getInstance()->saveMFA()) -    { -        std::string grid(LLGridManager::getInstance()->getGridId()); -        std::string user_id(gUserCredential->userID()); -        gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); -        gSecAPIHandler->syncProtectedMap(); -    } +    LLLoginInstance::getInstance()->saveMFAHash(response);      bool success = false;      // JC: gesture loading done below, when we have an asset system diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index 6cf99b68b2..9949bae8ac 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -73,12 +73,14 @@ LLViewerCamera::LLViewerCamera() : LLCamera()      mAverageSpeed = 0.f;      mAverageAngularSpeed = 0.f; -    mCameraAngleChangedSignal = gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2)); -} - -LLViewerCamera::~LLViewerCamera() -{ -    mCameraAngleChangedSignal.disconnect(); +    LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl("CameraAngle"); +    if (cntrl_ptr.notNull()) +    { +        cntrl_ptr->getCommitSignal()->connect([](LLControlVariable* control, const LLSD& value, const LLSD& previous) +        { +            LLViewerCamera::getInstance()->setDefaultFOV((F32)value.asReal()); +        }); +    }  }  void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVector3 &up_direction, const LLVector3 &point_of_interest) @@ -816,8 +818,3 @@ bool LLViewerCamera::isDefaultFOVChanged()      return false;  } -void LLViewerCamera::updateCameraAngle(const LLSD& value) -{ -    setDefaultFOV((F32)value.asReal()); -} - diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h index a204b85d88..91d26f09f2 100644 --- a/indra/newview/llviewercamera.h +++ b/indra/newview/llviewercamera.h @@ -43,7 +43,6 @@ class alignas(16) LLViewerCamera : public LLCamera, public LLSimpleton<LLViewerC      LL_ALIGN_NEW  public:      LLViewerCamera(); -    ~LLViewerCamera();      typedef enum      { @@ -66,7 +65,6 @@ public:                                  const LLVector3 &point_of_interest);      static void updateFrustumPlanes(LLCamera& camera, bool ortho = false, bool zflip = false, bool no_hacks = false); -    void updateCameraAngle(const LLSD& value);      void setPerspective(bool for_selection, S32 x, S32 y_from_bot, S32 width, S32 height, bool limit_select_distance, F32 z_near = 0, F32 z_far = 0);      const LLMatrix4 &getProjection() const; @@ -126,8 +124,6 @@ protected:      F32                 mZoomFactor;      S16                 mZoomSubregion; -    boost::signals2::connection mCameraAngleChangedSignal; -  public:  }; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 697433148b..b9f52e11aa 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -3720,12 +3720,6 @@ bool LLViewerRegion::bakesOnMeshEnabled() const          mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean());  } -bool LLViewerRegion::meshRezEnabled() const -{ -    return (mSimulatorFeatures.has("MeshRezEnabled") && -                mSimulatorFeatures["MeshRezEnabled"].asBoolean()); -} -  bool LLViewerRegion::dynamicPathfindingEnabled() const  {      return ( mSimulatorFeatures.has("DynamicPathfindingEnabled") && diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index d0ec1fe877..244e2b7835 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -333,7 +333,6 @@ public:      void getInfo(LLSD& info); -    bool meshRezEnabled() const;      bool meshUploadEnabled() const;      bool bakesOnMeshEnabled() const; diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 668f878629..00ca6e3bb0 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -1012,7 +1012,7 @@      value="0.82 0.91 0.98 0.15" />    <color      name="ChatSelfMentionHighlight" -    value="1 1 0 1" /> +    value="1 1 0 0.35" />    <color      name="MentionFlashBgColor"      value="1 1 0 0.5" /> diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index bff2289a7c..29ca903256 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -66,6 +66,7 @@ static LLEventStream gTestPump("test_pump");  #include "../llstartup.h"  LLSLURL LLStartUp::sStartSLURL;  LLSLURL& LLStartUp::getStartSLURL() { return sStartSLURL; } +std::string LLStartUp::getUserId() { return ""; };  #include "lllogin.h" | 
