From 71a98e55d323b3e20bfc94604ed00054cbed701a Mon Sep 17 00:00:00 2001 From: Beq Date: Fri, 8 Dec 2023 02:14:18 +0000 Subject: [PATCH 1/8] FIRE-33841 - FS Hangs on login This is triggered by having the stats window open from a previous session. The drawTicks call then manages to get a value_scale = INF call when drawing packet_loss. This causes the main thread to block forever in the loop. the visible symptoms (apart from the hung viewer login) are the event queue filling (reported in the log) because the main thread is no longer consuming. --- indra/llui/llstatbar.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/indra/llui/llstatbar.cpp b/indra/llui/llstatbar.cpp index 402dea7771..d8f0bda543 100644 --- a/indra/llui/llstatbar.cpp +++ b/indra/llui/llstatbar.cpp @@ -726,6 +726,13 @@ void LLStatBar::drawLabelAndValue( F32 value, std::string &label, LLRect &bar_re void LLStatBar::drawTicks( F32 min, F32 max, F32 value_scale, LLRect &bar_rect ) { + // FIRE-33481 - FS hangs on login, progress bar full + LL_DEBUGS("STATBAR") << "name: " << this->getName() << "min: " << min << ", max: " << max << ", value_scale: " << value_scale << LL_ENDL; + if ( value_scale == INFINITY ) + { + return; + } + // if (!llisnan(min) && (mAutoScaleMax || mAutoScaleMin)) { F32 u = LLSmoothInterpolation::getInterpolant(10.f); From 35bf40259bffd77a0d8fcfb16a31b9ee70bf6299 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Fri, 8 Dec 2023 14:50:01 +0100 Subject: [PATCH 2/8] Fix the inventory thumbnail tooltip appearing randomly different and ugly --- indra/newview/llinspecttexture.cpp | 33 ++++++++++++++++++------------ 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/indra/newview/llinspecttexture.cpp b/indra/newview/llinspecttexture.cpp index da4e3c0949..3efbbd1003 100644 --- a/indra/newview/llinspecttexture.cpp +++ b/indra/newview/llinspecttexture.cpp @@ -191,8 +191,10 @@ LLTextureToolTip::LLTextureToolTip(const LLToolTip::Params& p) mMaxWidth = llmax(mMaxWidth, mPreviewSize); // Currently has to share params with LLToolTip, override values - setBackgroundColor(LLColor4::black); - setTransparentColor(LLColor4::black); + // Make the texture tooltip not look ugly + //setBackgroundColor(LLColor4::black); + //setTransparentColor(LLColor4::black); + // setBorderVisible(true); } @@ -226,22 +228,27 @@ void LLTextureToolTip::initFromParams(const LLToolTip::Params& p) // Currently has to share params with LLToolTip, override values manually // Todo: provide from own params instead, may be like object inspector does it - LLViewBorder::Params border_params; - border_params.border_thickness(LLPANEL_BORDER_WIDTH); - border_params.highlight_light_color(LLColor4::white); - border_params.highlight_dark_color(LLColor4::white); - border_params.shadow_light_color(LLColor4::white); - border_params.shadow_dark_color(LLColor4::white); - addBorder(border_params); - setBorderVisible(true); + // Make the texture tooltip not look ugly + //LLViewBorder::Params border_params; + //border_params.border_thickness(LLPANEL_BORDER_WIDTH); + //border_params.highlight_light_color(LLColor4::white); + //border_params.highlight_dark_color(LLColor4::white); + //border_params.shadow_light_color(LLColor4::white); + //border_params.shadow_dark_color(LLColor4::white); + //addBorder(border_params); + //setBorderVisible(true); + // - setBackgroundColor(LLColor4::black); + // Make the texture tooltip not look ugly + // setBackgroundColor(LLColor4::black); setBackgroundVisible(true); setBackgroundOpaque(true); - setBackgroundImage(nullptr); + // Make the texture tooltip not look ugly + //setBackgroundImage(nullptr); setTransparentImage(nullptr); - mTextBox->setColor(LLColor4::white); + // Make the texture tooltip not look ugly + //mTextBox->setColor(LLColor4::white); snapToChildren(); } From 4ffe20628507cc5d53122ae9f637bdfd4d638988 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Fri, 8 Dec 2023 22:13:30 +0100 Subject: [PATCH 3/8] Replace some boost elements with C++ standard counterparts --- indra/newview/fsdiscordconnect.cpp | 37 +++++++++++++++--------------- indra/newview/fsdiscordconnect.h | 11 ++++----- indra/newview/llflickrconnect.cpp | 25 ++++++++++---------- indra/newview/llflickrconnect.h | 9 ++++---- 4 files changed, 40 insertions(+), 42 deletions(-) diff --git a/indra/newview/fsdiscordconnect.cpp b/indra/newview/fsdiscordconnect.cpp index 7705d56a31..fd8a433b99 100644 --- a/indra/newview/fsdiscordconnect.cpp +++ b/indra/newview/fsdiscordconnect.cpp @@ -44,21 +44,20 @@ #include "llfloaterreg.h" -#include "discord-rpc/discord_rpc.h" - -#include "boost/algorithm/string/case_conv.hpp" +#include +#include #include "fsdiscordkey.h" #include "llviewernetwork.h" -boost::scoped_ptr FSDiscordConnect::sStateWatcher(new LLEventStream("DiscordConnectState")); -boost::scoped_ptr FSDiscordConnect::sInfoWatcher(new LLEventStream("DiscordConnectInfo")); +std::unique_ptr FSDiscordConnect::sStateWatcher = std::make_unique("DiscordConnectState"); +std::unique_ptr FSDiscordConnect::sInfoWatcher = std::make_unique("DiscordConnectInfo"); // Returns false when the file exists and has not our UUID // Or, put simply, returns true if someone else is using it -bool FSDiscordConnect::checkMarkerFile() +bool FSDiscordConnect::checkMarkerFile() const { if (!LLFile::isfile(mMarkerFilename)) { @@ -94,7 +93,7 @@ void FSDiscordConnect::clearMarkerFile() LLFile::remove(mMarkerFilename); } -void handleDiscordReady(const DiscordUser *request) +static void handleDiscordReady(const DiscordUser *request) { LLSD info; info["name"] = request->username; @@ -102,12 +101,12 @@ void handleDiscordReady(const DiscordUser *request) FSDiscordConnect::getInstance()->setConnectionState(FSDiscordConnect::DISCORD_CONNECTED); } -void handleDiscordError(int errorCode, const char* message) +static void handleDiscordError(int errorCode, const char* message) { LL_WARNS("DiscordConnect") << "Discord error, errorCode: \"" << errorCode << "\", message: \"" << message << "\"" << LL_ENDL; } -void handleDiscordDisconnected(int errorCode, const char* message) +static void handleDiscordDisconnected(int errorCode, const char* message) { LL_INFOS("DiscordConnect") << "Discord disconnected, errorCode: \"" << errorCode << "\", message: \"" << message << "\"" << LL_ENDL; FSDiscordConnect::getInstance()->setConnectionState(FSDiscordConnect::DISCORD_NOT_CONNECTED); @@ -157,7 +156,7 @@ void FSDiscordConnect::discordConnectedCoro(bool autoConnect) } -bool isRegionVisible(LLViewerRegion* region) +static bool isRegionVisible(LLViewerRegion* region) { U8 rating = region->getSimAccess(); bool visible = true; @@ -183,9 +182,9 @@ bool isRegionVisible(LLViewerRegion* region) return visible; } -void FSDiscordConnect::updateRichPresence() +void FSDiscordConnect::updateRichPresence() const { - LLViewerRegion * region = gAgent.getRegion(); + LLViewerRegion* region = gAgent.getRegion(); if (!isConnected() || !region) { return; @@ -238,7 +237,8 @@ void FSDiscordConnect::updateRichPresence() discordPresence.largeImageKey = "secondlife_512"; #endif - discordPresence.largeImageText = LLGridManager::getInstance()->getGridLabel().c_str(); + auto gridLabel = LLGridManager::getInstance()->getGridLabel(); + discordPresence.largeImageText = gridLabel.c_str(); discordPresence.smallImageKey = "firestorm_512"; std::string appName = std::string("via " + APP_NAME); discordPresence.smallImageText = appName.c_str(); @@ -256,10 +256,11 @@ FSDiscordConnect::FSDiscordConnect() : mConnectionState(DISCORD_NOT_CONNECTED), mConnected(false), mInfo(), - mRefreshInfo(false) + mRefreshInfo(false), + mConnectTime(0) { mMarkerFilename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "discord_in_use_marker"); - LLEventPumps::instance().obtain("mainloop").listen("FSDiscordConnect", boost::bind(&FSDiscordConnect::Tick, this, _1)); + LLEventPumps::instance().obtain("mainloop").listen("FSDiscordConnect", std::bind(&FSDiscordConnect::Tick, this, std::placeholders::_1)); } FSDiscordConnect::~FSDiscordConnect() @@ -270,7 +271,7 @@ FSDiscordConnect::~FSDiscordConnect() void FSDiscordConnect::connectToDiscord() { LLCoros::instance().launch("FSDiscordConnect::discordConnectCoro", - boost::bind(&FSDiscordConnect::discordConnectCoro, this)); + std::bind(&FSDiscordConnect::discordConnectCoro, this)); } void FSDiscordConnect::disconnectFromDiscord() @@ -278,13 +279,13 @@ void FSDiscordConnect::disconnectFromDiscord() setConnectionState(FSDiscordConnect::DISCORD_DISCONNECTING); LLCoros::instance().launch("FSDiscordConnect::discordDisconnectCoro", - boost::bind(&FSDiscordConnect::discordDisconnectCoro, this)); + std::bind(&FSDiscordConnect::discordDisconnectCoro, this)); } void FSDiscordConnect::checkConnectionToDiscord(bool auto_connect) { LLCoros::instance().launch("FSDiscordConnect::discordConnectedCoro", - boost::bind(&FSDiscordConnect::discordConnectedCoro, this, auto_connect)); + std::bind(&FSDiscordConnect::discordConnectedCoro, this, auto_connect)); } bool FSDiscordConnect::Tick(const LLSD&) diff --git a/indra/newview/fsdiscordconnect.h b/indra/newview/fsdiscordconnect.h index 037672c9ca..e06d3b37ac 100644 --- a/indra/newview/fsdiscordconnect.h +++ b/indra/newview/fsdiscordconnect.h @@ -60,10 +60,10 @@ public: void setConnectionState(EConnectionState connection_state); void setConnected(bool connected); - bool isConnected() { return mConnected; } + bool isConnected() const { return mConnected; } EConnectionState getConnectionState() { return mConnectionState; } - void updateRichPresence(); + void updateRichPresence() const; bool Tick(const LLSD&); @@ -74,15 +74,14 @@ private: LLSD mInfo; bool mRefreshInfo; - static boost::scoped_ptr sStateWatcher; - static boost::scoped_ptr sInfoWatcher; - static boost::scoped_ptr sContentWatcher; + static std::unique_ptr sStateWatcher; + static std::unique_ptr sInfoWatcher; void discordConnectCoro(); void discordDisconnectCoro(); void discordConnectedCoro(bool autoConnect); - bool checkMarkerFile(); + bool checkMarkerFile() const; void setMarkerFile(); void clearMarkerFile(); diff --git a/indra/newview/llflickrconnect.cpp b/indra/newview/llflickrconnect.cpp index 80fe26ddbd..9e947a99b5 100644 --- a/indra/newview/llflickrconnect.cpp +++ b/indra/newview/llflickrconnect.cpp @@ -44,23 +44,22 @@ #include "llfloaterreg.h" #include "llcorehttputil.h" -boost::scoped_ptr LLFlickrConnect::sStateWatcher(new LLEventStream("FlickrConnectState")); -boost::scoped_ptr LLFlickrConnect::sInfoWatcher(new LLEventStream("FlickrConnectInfo")); -boost::scoped_ptr LLFlickrConnect::sContentWatcher(new LLEventStream("FlickrConnectContent")); +std::unique_ptr LLFlickrConnect::sStateWatcher = std::make_unique("FlickrConnectState"); +std::unique_ptr LLFlickrConnect::sInfoWatcher = std::make_unique("FlickrConnectInfo"); // Local functions -void log_flickr_connect_error(const std::string& request, U32 status, const std::string& reason, const std::string& code, const std::string& description) +static void log_flickr_connect_error(const std::string& request, U32 status, const std::string& reason, const std::string& code, const std::string& description) { // Note: 302 (redirect) is *not* an error that warrants logging if (status != 302) { - LL_WARNS("FlickrConnect") << request << " request failed with a " << status << " " << reason << ". Reason: " << code << " (" << description << ")" << LL_ENDL; + LL_WARNS("FlickrConnect") << request << " request failed with a " << status << " " << reason << ". Reason: " << code << " (" << description << ")" << LL_ENDL; } } -void toast_user_for_flickr_success() +static void toast_user_for_flickr_success() { - LLSD args; + LLSD args; args["MESSAGE"] = LLTrans::getString("flickr_post_success"); LLNotificationsUtil::add("FlickrConnect", args); } @@ -437,19 +436,19 @@ std::string LLFlickrConnect::getFlickrConnectURL(const std::string& route, bool void LLFlickrConnect::connectToFlickr(const std::string& request_token, const std::string& oauth_verifier) { LLCoros::instance().launch("LLFlickrConnect::flickrConnectCoro", - boost::bind(&LLFlickrConnect::flickrConnectCoro, this, request_token, oauth_verifier)); + std::bind(&LLFlickrConnect::flickrConnectCoro, this, request_token, oauth_verifier)); } void LLFlickrConnect::disconnectFromFlickr() { LLCoros::instance().launch("LLFlickrConnect::flickrDisconnectCoro", - boost::bind(&LLFlickrConnect::flickrDisconnectCoro, this)); + std::bind(&LLFlickrConnect::flickrDisconnectCoro, this)); } void LLFlickrConnect::checkConnectionToFlickr(bool auto_connect) { LLCoros::instance().launch("LLFlickrConnect::flickrConnectedCoro", - boost::bind(&LLFlickrConnect::flickrConnectedCoro, this, auto_connect)); + std::bind(&LLFlickrConnect::flickrConnectedCoro, this, auto_connect)); } void LLFlickrConnect::loadFlickrInfo() @@ -457,7 +456,7 @@ void LLFlickrConnect::loadFlickrInfo() if(mRefreshInfo) { LLCoros::instance().launch("LLFlickrConnect::flickrInfoCoro", - boost::bind(&LLFlickrConnect::flickrInfoCoro, this)); + std::bind(&LLFlickrConnect::flickrInfoCoro, this)); } } @@ -473,7 +472,7 @@ void LLFlickrConnect::uploadPhoto(const std::string& image_url, const std::strin setConnectionState(LLFlickrConnect::FLICKR_POSTING); LLCoros::instance().launch("LLFlickrConnect::flickrShareCoro", - boost::bind(&LLFlickrConnect::flickrShareCoro, this, body)); + std::bind(&LLFlickrConnect::flickrShareCoro, this, body)); } void LLFlickrConnect::uploadPhoto(LLPointer image, const std::string& title, const std::string& description, const std::string& tags, int safety_level) @@ -481,7 +480,7 @@ void LLFlickrConnect::uploadPhoto(LLPointer image, const std:: setConnectionState(LLFlickrConnect::FLICKR_POSTING); LLCoros::instance().launch("LLFlickrConnect::flickrShareImageCoro", - boost::bind(&LLFlickrConnect::flickrShareImageCoro, this, image, + std::bind(&LLFlickrConnect::flickrShareImageCoro, this, image, title, description, tags, safety_level)); } diff --git a/indra/newview/llflickrconnect.h b/indra/newview/llflickrconnect.h index 5374cb7fa9..d2f862c8ba 100644 --- a/indra/newview/llflickrconnect.h +++ b/indra/newview/llflickrconnect.h @@ -78,8 +78,8 @@ public: void setConnectionState(EConnectionState connection_state); void setConnected(bool connected); - bool isConnected() { return mConnected; } - bool isTransactionOngoing() { return ((mConnectionState == FLICKR_CONNECTION_IN_PROGRESS) || (mConnectionState == FLICKR_POSTING) || (mConnectionState == FLICKR_DISCONNECTING)); } + bool isConnected() const { return mConnected; } + bool isTransactionOngoing() const { return ((mConnectionState == FLICKR_CONNECTION_IN_PROGRESS) || (mConnectionState == FLICKR_POSTING) || (mConnectionState == FLICKR_DISCONNECTING)); } EConnectionState getConnectionState() { return mConnectionState; } void openFlickrWeb(std::string url); @@ -94,9 +94,8 @@ private: bool mRefreshInfo; bool mReadFromMaster; - static boost::scoped_ptr sStateWatcher; - static boost::scoped_ptr sInfoWatcher; - static boost::scoped_ptr sContentWatcher; + static std::unique_ptr sStateWatcher; + static std::unique_ptr sInfoWatcher; bool testShareStatus(LLSD &result); void flickrConnectCoro(std::string requestToken, std::string oauthVerifier); From d7eaff4a3283ed373d9065c036884202f5d9eeca Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sat, 9 Dec 2023 02:04:41 +0100 Subject: [PATCH 4/8] Make inventory thumbnail tooltips work with inventory lists --- indra/newview/llinventorylistitem.cpp | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index 74452fc32b..8e0ae7b4f1 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -41,6 +41,10 @@ #include "llinventorymodel.h" #include "llviewerinventory.h" +#include "llinspecttexture.h" +#include "lltooltip.h" +#include "llviewercontrol.h" + static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelInventoryListItemBaseParams(&typeid(LLPanelInventoryListItemBase::Params), "inventory_list_item"); static const S32 WIDGET_SPACING = 3; @@ -419,6 +423,34 @@ void LLPanelInventoryListItemBase::setTitle(const std::string& title, BOOL LLPanelInventoryListItemBase::handleToolTip( S32 x, S32 y, MASK mask) { LLRect text_box_rect = mTitleCtrl->getRect(); + + // Make inventory thumbnail tooltips work with inventory lists + static LLCachedControl showInventoryThumbnailTooltips(gSavedSettings, "FSShowInventoryThumbnailTooltips"); + if (showInventoryThumbnailTooltips && text_box_rect.pointInRect(x, y)) + { + if (auto inventoryItem = gInventory.getItem(mInventoryItemUUID); inventoryItem) + { + static LLCachedControl inventoryThumbnailTooltipsDelay(gSavedSettings, "FSInventoryThumbnailTooltipsDelay"); + static LLCachedControl tooltip_fast_delay(gSavedSettings, "ToolTipFastDelay"); + F32 tooltipDelay = LLToolTipMgr::instance().toolTipVisible() ? tooltip_fast_delay() : inventoryThumbnailTooltipsDelay(); + + if (const LLUUID& thumbnailUUID = inventoryItem->getThumbnailUUID(); !thumbnailUUID.isNull()) + { + LLSD params; + params["thumbnail_id"] = thumbnailUUID; + + LLToolTipMgr::instance().show(LLToolTip::Params() + .message(inventoryItem->getName()) + .sticky_rect(calcScreenRect()) + .delay_time(tooltipDelay) + .create_callback(boost::bind(&LLInspectTextureUtil::createInventoryToolTip, _1)) + .create_params(params)); + return TRUE; + } + } + } + // + if (text_box_rect.pointInRect(x, y) && mTitleCtrl->getTextPixelWidth() <= text_box_rect.getWidth()) { From 6f2a821c8d4151e495a0e74db6aab4a640adb980 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sat, 9 Dec 2023 02:06:36 +0100 Subject: [PATCH 5/8] Wait! This should be here! --- indra/newview/llinventorylistitem.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index 8e0ae7b4f1..6c3842ce54 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -430,12 +430,12 @@ BOOL LLPanelInventoryListItemBase::handleToolTip( S32 x, S32 y, MASK mask) { if (auto inventoryItem = gInventory.getItem(mInventoryItemUUID); inventoryItem) { - static LLCachedControl inventoryThumbnailTooltipsDelay(gSavedSettings, "FSInventoryThumbnailTooltipsDelay"); - static LLCachedControl tooltip_fast_delay(gSavedSettings, "ToolTipFastDelay"); - F32 tooltipDelay = LLToolTipMgr::instance().toolTipVisible() ? tooltip_fast_delay() : inventoryThumbnailTooltipsDelay(); - if (const LLUUID& thumbnailUUID = inventoryItem->getThumbnailUUID(); !thumbnailUUID.isNull()) { + static LLCachedControl inventoryThumbnailTooltipsDelay(gSavedSettings, "FSInventoryThumbnailTooltipsDelay"); + static LLCachedControl tooltip_fast_delay(gSavedSettings, "ToolTipFastDelay"); + F32 tooltipDelay = LLToolTipMgr::instance().toolTipVisible() ? tooltip_fast_delay() : inventoryThumbnailTooltipsDelay(); + LLSD params; params["thumbnail_id"] = thumbnailUUID; From 73dd23d1a87f579f38f9f99a80674d1faebcd1db Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sat, 9 Dec 2023 02:09:42 +0100 Subject: [PATCH 6/8] Prevent unnecessary copy --- indra/newview/llinventorylistitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index 6c3842ce54..1620257d33 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -422,7 +422,7 @@ void LLPanelInventoryListItemBase::setTitle(const std::string& title, BOOL LLPanelInventoryListItemBase::handleToolTip( S32 x, S32 y, MASK mask) { - LLRect text_box_rect = mTitleCtrl->getRect(); + const LLRect& text_box_rect = mTitleCtrl->getRect(); // Make inventory thumbnail tooltips work with inventory lists static LLCachedControl showInventoryThumbnailTooltips(gSavedSettings, "FSShowInventoryThumbnailTooltips"); From 99b79bd38c0a8645567a06c3015503c671606eea Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sat, 9 Dec 2023 02:16:56 +0100 Subject: [PATCH 7/8] Fix broken toybox floater layout --- indra/newview/skins/default/xui/en/floater_toybox.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml index a899c5a229..fe874c897e 100644 --- a/indra/newview/skins/default/xui/en/floater_toybox.xml +++ b/indra/newview/skins/default/xui/en/floater_toybox.xml @@ -81,11 +81,11 @@ + top="485" /> @@ -108,7 +108,7 @@ layout="topleft" left="335" name="btn_restore_defaults" - top="462" + top="495" width="130"> From 64ff4305430a450286ddccbb8fc1107a944fd8fb Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Sat, 9 Dec 2023 14:03:08 +0100 Subject: [PATCH 8/8] FIRE-33484 French translation update, by Laurent Bechir --- indra/newview/skins/default/xui/fr/panel_preferences_UI.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_UI.xml b/indra/newview/skins/default/xui/fr/panel_preferences_UI.xml index cedd1ef97f..f4f16a6a5c 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_UI.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_UI.xml @@ -57,6 +57,11 @@ + + + + sec + sec