Merge branch 'release/2026.02' of https://github.com/secondlife/viewer

# Conflicts:
#	indra/newview/llappviewerwin32.cpp
#	indra/newview/llviewerwindow.cpp
This commit is contained in:
Ansariel
2026-05-07 11:23:50 +02:00
13 changed files with 136 additions and 58 deletions
+1 -1
View File
@@ -285,7 +285,7 @@ public:
#ifdef LL_WINDOWS
virtual bool reportCrashToBugsplat(void* pExcepInfo /*EXCEPTION_POINTERS*/) { return false; }
virtual bool reportCustomToBugsplat(const std::string& desription) { return false; }
virtual bool reportCustomToBugsplat(const std::string& description) { return false; }
#endif
public:
+6 -3
View File
@@ -192,6 +192,7 @@ void LLWatchdog::remove(LLWatchdogEntry* e)
{
lockThread();
mSuspects.erase(e);
mFrozeList.erase(e);
unlockThread();
}
@@ -285,8 +286,9 @@ void LLWatchdog::run()
// Sets watchdog marker file
mCreateMarkerFnc(false);
// If it's mainloop and it somehow recovers, it will re-add itself
mSuspects.erase(*result);
mFrozeList.insert(*result);
LLWatchdogEntry* froze_entry = *result;
mSuspects.erase(result);
mFrozeList.insert(froze_entry);
LL_WARNS() << description << LL_ENDL;
}
else
@@ -308,8 +310,9 @@ void LLWatchdog::run()
mCreateMarkerFnc(false);
// Already reported, don't report again.
// If it's mainloop and it somehow recovers, it will re-add itself
LLWatchdogEntry* froze_entry = *result;
mSuspects.erase(result);
mFrozeList.insert(*result);
mFrozeList.insert(froze_entry);
}
}
}
+11
View File
@@ -70,6 +70,10 @@ LLConsole::LLConsole(const LLConsole::Params& p)
{
setFontSize(p.font_size_index);
}
if (mFont == nullptr)
{
setFontSize(0); // sans-serif
}
mFadeTime = mLinePersistTime - FADE_DURATION;
setMaxLines(LLUI::getInstance()->mSettingGroups["config"]->getS32("ConsoleMaxLines"));
@@ -85,6 +89,13 @@ void LLConsole::setLinePersistTime(F32 seconds)
void LLConsole::reshape(S32 width, S32 height, bool called_from_parent)
{
if (mFont == nullptr)
{
// not initialized yet
LL_WARNS() << "LLConsole::reshape called before font is set" << LL_ENDL;
return;
}
S32 new_width = llmax(50, llmin(getRect().getWidth(), width));
S32 new_height = llmax(mFont->getLineHeight() + 15, llmin(getRect().getHeight(), height));
+11
View File
@@ -9259,6 +9259,17 @@
Notes:
If required width will be less than this one, a button will be reshaped to default size , otherwise to required.
Change of this parameter will affect the layout of buttons in notification toast.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>90</integer>
</map>
<key>ScriptToastButtonWidth</key>
<map>
<key>Comment</key>
<string>Default width of buttons in the Script dialog toast.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
+4 -4
View File
@@ -41,7 +41,7 @@
<font
name="SansSerifBold"
comment="Name of bold sans-serif font">
<file load_collection="true" flags="bold" font_weight="600">InterVariableFont.ttf</file>
<file load_collection="true" flags="bold" font_weight="700">InterVariableFont.ttf</file>
<file size_delta="-0.5">DejaVuSans-Bold.ttf</file>
<os name="Windows">
<file>arialbd.ttf</file>
@@ -68,7 +68,7 @@
name="SansSerif"
comment="Name of bold sans-serif font"
font_style="BOLD">
<file load_collection="true" flags="bold" font_weight="600">InterVariableFont.ttf</file>
<file load_collection="true" flags="bold" font_weight="700">InterVariableFont.ttf</file>
<file size_delta="-0.5">DejaVuSans-Bold.ttf</file>
</font>
@@ -84,7 +84,7 @@
name="SansSerif"
comment="Name of bold italic sans-serif font"
font_style="BOLD|ITALIC">
<file load_collection="true" font_weight="800">InterItalicVariableFont.ttf</file>
<file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file>
<file size_delta="-0.5">DejaVuSans-BoldOblique.ttf</file>
</font>
@@ -164,7 +164,7 @@
name="Helvetica"
comment="Name of Helvetica font (bold)"
font_style="BOLD">
<file flags="bold" font_weight="800">InterVariableFont.ttf</file>
<file flags="bold" font_weight="700">InterVariableFont.ttf</file>
<file size_delta="-0.5">DejaVuSans-Bold.ttf</file>
<os name="Windows">
<file>arialbd.ttf</file>
+3 -3
View File
@@ -129,7 +129,7 @@ namespace
// MiniDmpSender pointer. As things stand, though, we must define an
// actual function and store the pointer statically.
static MiniDmpSender *sBugSplatSender = nullptr;
static std::string sBugsplatDesriptionField;
static std::string sBugsplatDescriptionField;
bool bugsplatSendLog(UINT nCode, LPVOID lpVal1, LPVOID lpVal2)
{
@@ -208,7 +208,7 @@ namespace
// // Can be set by watchdog or other code that detects a problem
// // and wants to add some context to the crash report.
// // Will be visible in the BugSplat web UI.
// sBugSplatSender->setDefaultUserDescription(WCSTR(LLError::getFatalMessage()));
// sBugSplatSender->setDefaultUserDescription(WCSTR(sBugsplatDescriptionField));
// // This type of crash is not nessesarily a crash, or final.
// // Prepare for the next one.
// sBugsplatDesriptionField.clear();
@@ -1111,7 +1111,7 @@ bool LLAppViewerWin32::reportCustomToBugsplat(const std::string &description)
#if defined(LL_BUGSPLAT)
if (sBugSplatSender)
{
sBugsplatDesriptionField = description;
sBugsplatDescriptionField = description;
__try
{
+1 -1
View File
@@ -44,7 +44,7 @@ public:
bool cleanup() override;
bool reportCrashToBugsplat(void* pExcepInfo) override;
bool reportCustomToBugsplat(const std::string& desription) override;
bool reportCustomToBugsplat(const std::string& description) override;
protected:
bool initWindow() override; // Override to initialize the viewer's window.
+27 -19
View File
@@ -50,7 +50,7 @@
const S32 BOTTOM_PAD = VPAD * 3;
const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
S32 BUTTON_WIDTH = 110;
const S32 BUTTON_WIDTH = 90;
//static
@@ -62,7 +62,8 @@ LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal
LLToastNotifyPanel::LLToastNotifyPanel(const LLNotificationPtr& notification, const LLRect& rect, bool show_images)
: LLCheckBoxToastPanel(notification)
, LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerReplaceOnCollision>(notification->getID())
, mTextBox(NULL)
, mTextBox(NULL),
mButtonWidth(BUTTON_WIDTH)
{
init(rect, show_images);
}
@@ -73,9 +74,9 @@ void LLToastNotifyPanel::addDefaultButton()
LLButton* ok_btn = createButton(form_element, false);
LLRect new_btn_rect(ok_btn->getRect());
new_btn_rect.setOriginAndSize(llabs(getRect().getWidth() - BUTTON_WIDTH)/ 2, BOTTOM_PAD,
new_btn_rect.setOriginAndSize(llabs(getRect().getWidth() - mButtonWidth) / 2, BOTTOM_PAD,
//auto_size for ok button makes it very small, so let's make it wider
BUTTON_WIDTH, new_btn_rect.getHeight());
mButtonWidth, new_btn_rect.getHeight());
ok_btn->setRect(new_btn_rect);
addChild(ok_btn, -1);
mNumButtons = 1;
@@ -102,7 +103,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, bool is_opt
p.font = font;
p.rect.height = BTN_HEIGHT;
p.click_callback.function(boost::bind(&LLToastNotifyPanel::onClickButton, userdata));
p.rect.width = BUTTON_WIDTH;
p.rect.width = mButtonWidth;
p.auto_resize = false;
p.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
p.enabled = !form_element.has("enabled") || form_element["enabled"].asBoolean();
@@ -112,7 +113,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, bool is_opt
p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
}
// for the scriptdialog buttons we use fixed button size. This is a limit!
if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > (BUTTON_WIDTH-2*HPAD))
if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > (mButtonWidth - 2 * HPAD))
{
p.rect.width = 1;
p.auto_resize = true;
@@ -280,7 +281,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
mInfoPanel = getChild<LLPanel>("info_panel");
mControlPanel = getChild<LLPanel>("control_panel");
BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth");
// customize panel's attributes
// is it intended for displaying a tip?
mIsTip = mNotification->getType() == "notifytip";
@@ -289,6 +290,10 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
// is it a script dialog?
mIsScriptDialog = (notif_name == "ScriptDialog" || notif_name == "ScriptDialogGroup");
static LLCachedControl<S32> btn_width(gSavedSettings, "ToastButtonWidth", 90);
static LLCachedControl<S32> script_button_width(gSavedSettings, "ScriptToastButtonWidth", 110);
mButtonWidth = mIsScriptDialog ? script_button_width : btn_width;
bool is_content_trusted = (notif_name != "LoadWebPage");
// is it a caution?
//
@@ -390,17 +395,20 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
S32 button_panel_width = mControlPanel->getRect().getWidth();// get initial width from XML
S32 button_panel_height = mControlPanel->getRect().getHeight();
// width for 3 columns: 3 buttons + 2 gaps
S32 min_width_required = 3 * BUTTON_WIDTH + 2 * (2 * HPAD);
if (min_width_required > button_panel_width)
// Script dialog has wider buttons so it requires wider layout to ensure proper spacing
if (mIsScriptDialog)
{
button_panel_width = min_width_required;
S32 width_increase = button_panel_width - mControlPanel->getRect().getWidth();
reshape(getRect().getWidth() + width_increase, getRect().getHeight());
mInfoPanel->reshape(mInfoPanel->getRect().getWidth() + width_increase, mInfoPanel->getRect().getHeight());
mTextBox->reshape(mTextBox->getRect().getWidth() + width_increase, mTextBox->getRect().getHeight());
// width for 3 columns: 3 buttons + 2 gaps
S32 min_width_required = 3 * mButtonWidth + 2 * (2 * HPAD);
if (min_width_required > button_panel_width)
{
button_panel_width = min_width_required;
S32 width_increase = button_panel_width - mControlPanel->getRect().getWidth();
reshape(getRect().getWidth() + width_increase, getRect().getHeight());
mInfoPanel->reshape(mInfoPanel->getRect().getWidth() + width_increase, mInfoPanel->getRect().getHeight());
mTextBox->reshape(mTextBox->getRect().getWidth() + width_increase, mTextBox->getRect().getHeight());
}
}
//try get an average h_pad to spread out buttons
S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size()));
if(h_pad < 2*HPAD)
@@ -410,8 +418,8 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
* for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons.
* In last case set default h_pad to avoid heaping of buttons
*/
S32 button_per_row = button_panel_width / BUTTON_WIDTH;
h_pad = (button_panel_width % BUTTON_WIDTH) / (button_per_row - 1);// -1 because we do not need space after last button in a row
S32 button_per_row = button_panel_width / mButtonWidth;
h_pad = (button_panel_width % mButtonWidth) / (button_per_row - 1);// -1 because we do not need space after last button in a row
if(h_pad < 2*HPAD) // still not enough space between buttons ?
{
h_pad = 2*HPAD;
@@ -422,7 +430,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
// we are using default width for script buttons so we can determinate button_rows
// to get a number of rows we divide the required width of the buttons to button_panel_width
// buttons.size() is reduced by -2 due to presence of ignore button which is calculated independently a bit lower
S32 button_rows = llceil(F32(buttons.size() - 2) * (BUTTON_WIDTH + h_pad) / (button_panel_width + h_pad));
S32 button_rows = llceil(F32(buttons.size() - 2) * (mButtonWidth + h_pad) / (button_panel_width + h_pad));
//reserve one row for the ignore_btn
button_rows++;
//calculate required panel height for scripdialog notification.
+2
View File
@@ -134,6 +134,8 @@ protected:
S32 mNumOptions { 0 };
S32 mNumButtons { 0 };
S32 mButtonWidth;
static const std::string sFontDefault;
static const std::string sFontScript;
};
+24 -13
View File
@@ -2538,24 +2538,35 @@ void LLViewerWindow::initWorldUI()
physical_mem = LLMemory::getMaxMemKB();
}
if (!gNonInteractive && physical_mem > MIN_PHYSICAL_MEMORY)
if (!gNonInteractive)
{
LL_INFOS() << "Preloading cef instances" << LL_ENDL;
if (physical_mem > MIN_PHYSICAL_MEMORY)
{
LL_INFOS() << "Preloading cef instances" << LL_ENDL;
LLFloaterReg::getInstance("destinations");
LLFloaterReg::getInstance("avatar_welcome_pack");
// <FS:TJ> Preload the CEF instance of the currently used legacy search floater
//LLFloaterReg::getInstance("search");
if (gSavedSettings.getBOOL("FSUseFSLegacySearch"))
{
LLFloaterReg::getInstance("search");
LLFloaterReg::getInstance("destinations");
LLFloaterReg::getInstance("avatar_welcome_pack");
// <FS:TJ> Preload the CEF instance of the currently used legacy search floater
//LLFloaterReg::getInstance("search");
if (gSavedSettings.getBOOL("FSUseFSLegacySearch"))
{
LLFloaterReg::getInstance("search");
}
else
{
LLFloaterReg::getInstance("legacy_search");
}
// </FS:TJ>
LLFloaterReg::getInstance("marketplace");
}
else
// <FS:Ansariel> OpenSim support
//else if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
else if (LLGridManager::instance().isInSecondLife() && gSavedSettings.getBOOL("FirstLoginThisInstall"))
// </FS:Ansariel>
{
LLFloaterReg::getInstance("legacy_search");
// Preload the welcome pack for first-time login even on low end hardware
LLFloaterReg::getInstance("avatar_welcome_pack");
}
// </FS:TJ>
LLFloaterReg::getInstance("marketplace");
}
// <FS:Zi> Autohide main chat bar if applicable
+37 -5
View File
@@ -91,7 +91,8 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter&
&LLWindowListener::getPaths,
LLSDMap("reply", LLSD()));
add("keyDown",
keySomething + "keypress event.\n" + keyExplain + mask,
keySomething + "keypress event.\n" + keyExplain +
"The [\"char\"] parameter detects and handles non-ASCII characters seperately\n" + mask,
&LLWindowListener::keyDown);
add("keyUp",
keySomething + "key release event.\n" + keyExplain + mask,
@@ -270,6 +271,20 @@ void LLWindowListener::keyDown(LLSD const & evt)
KEY key = getKEY(evt);
MASK mask = getMask(evt);
bool is_non_ascii = false;
llwchar uni_char = 0;
if (evt.has("char"))
{
LLWString wstr = utf8str_to_wstring(evt["char"].asString());
if (!wstr.empty())
{
uni_char = wstr[0];
// If the Unicode code point is outside ASCII range, use Unicode-only handling
is_non_ascii = (uni_char >= 0x80);
}
}
if (evt.has("path"))
{
std::string path(evt["path"]);
@@ -284,8 +299,17 @@ void LLWindowListener::keyDown(LLSD const & evt)
response.setResponse(target_view->getInfo());
gFocusMgr.setKeyboardFocus(target_view);
gViewerInput.handleKey(key, mask, false);
if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
if (is_non_ascii)
{
// For non-ASCII characters, only send the Unicode event
mWindow->handleUnicodeChar(uni_char, mask);
}
else
{
gViewerInput.handleKey(key, mask, false);
if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
}
}
else
{
@@ -296,8 +320,16 @@ void LLWindowListener::keyDown(LLSD const & evt)
}
else
{
gViewerInput.handleKey(key, mask, false);
if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
if (is_non_ascii)
{
// For non-ASCII characters, only send the Unicode event
mWindow->handleUnicodeChar(uni_char, mask);
}
else
{
gViewerInput.handleKey(key, mask, false);
if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
}
}
}
+4 -4
View File
@@ -37,7 +37,7 @@
<font
name="SansSerifBold"
comment="Name of bold sans-serif font">
<file load_collection="true" flags="bold" font_weight="600">InterVariableFont.ttf</file>
<file load_collection="true" flags="bold" font_weight="700">InterVariableFont.ttf</file>
<file size_delta="-0.5">DejaVuSans-Bold.ttf</file>
<os name="Windows">
<file>arialbd.ttf</file>
@@ -64,7 +64,7 @@
name="SansSerif"
comment="Name of bold sans-serif font"
font_style="BOLD">
<file load_collection="true" flags="bold" font_weight="600">InterVariableFont.ttf</file>
<file load_collection="true" flags="bold" font_weight="700">InterVariableFont.ttf</file>
<file size_delta="-0.5">DejaVuSans-Bold.ttf</file>
</font>
@@ -80,7 +80,7 @@
name="SansSerif"
comment="Name of bold italic sans-serif font"
font_style="BOLD|ITALIC">
<file load_collection="true" font_weight="800">InterItalicVariableFont.ttf</file>
<file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file>
<file size_delta="-0.5">DejaVuSans-BoldOblique.ttf</file>
</font>
@@ -135,7 +135,7 @@
name="Helvetica"
comment="Name of Helvetica font (bold)"
font_style="BOLD">
<file flags="bold" font_weight="800">InterVariableFont.ttf</file>
<file flags="bold" font_weight="700">InterVariableFont.ttf</file>
<file size_delta="-0.5">DejaVuSans-Bold.ttf</file>
<os name="Windows">
<file>arialbd.ttf</file>
+5 -5
View File
@@ -80,7 +80,7 @@
<file>
NotoSansCJKjp-Bold.otf
</file>
<file load_collection="true" font_weight="800" flags="bold">InterVariableFont.ttf</file>
<file load_collection="true" font_weight="700" flags="bold">InterVariableFont.ttf</file>
<os name="Windows">
<file load_collection="true">
YuGothB.ttc
@@ -115,13 +115,13 @@
</os>
</font>
<font name="SansSerif" comment="Name of bold sans-serif font" font_style="BOLD">
<file load_collection="true" font_weight="800" flags="bold">InterVariableFont.ttf</file>
<file load_collection="true" font_weight="700" flags="bold">InterVariableFont.ttf</file>
</font>
<font name="SansSerif" comment="Name of italic sans-serif font" font_style="ITALIC">
<file load_collection="true" font_weight="400">InterItalicVariableFont.ttf</file>
</font>
<font name="SansSerif" comment="Name of bold italic sans-serif font" font_style="BOLD|ITALIC">
<file load_collection="true" flags="bold" font_weight="800">InterItalicVariableFont.ttf</file>
<file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file>
</font>
<font name="Monospace" comment="Name of monospace font">
<file>
@@ -163,7 +163,7 @@
</os>
</font>
<font name="Helvetica" comment="Name of Helvetica font (bold)" font_style="BOLD">
<file load_collection="true" font_weight="800" flags="bold">InterVariableFont.ttf</file>
<file load_collection="true" font_weight="700" flags="bold">InterVariableFont.ttf</file>
<os name="Windows">
<file>
arialbd.ttf
@@ -189,7 +189,7 @@
</os>
</font>
<font name="Helvetica" comment="Name of Helvetica font (bold italic)" font_style="BOLD|ITALIC">
<file load_collection="true" flags="bold" font_weight="800">InterItalicVariableFont.ttf</file>
<file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file>
<os name="Windows">
<file>
arialbi.ttf