diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index fef7dc80b3..3a855bc480 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -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: diff --git a/indra/llcommon/llwatchdog.cpp b/indra/llcommon/llwatchdog.cpp index c28b7fb081..aebeb477a0 100644 --- a/indra/llcommon/llwatchdog.cpp +++ b/indra/llcommon/llwatchdog.cpp @@ -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); } } } diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index 8f51e755fd..da497d533d 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -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)); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 7d0d29eece..069f190e9f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -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. + Persist + 1 + Type + S32 + Value + 90 + + ScriptToastButtonWidth + + Comment + Default width of buttons in the Script dialog toast. Persist 1 Type diff --git a/indra/newview/fonts/fonts.xml b/indra/newview/fonts/fonts.xml index 3604a1144d..f8db63bf37 100644 --- a/indra/newview/fonts/fonts.xml +++ b/indra/newview/fonts/fonts.xml @@ -41,7 +41,7 @@ - InterVariableFont.ttf + InterVariableFont.ttf DejaVuSans-Bold.ttf arialbd.ttf @@ -68,7 +68,7 @@ name="SansSerif" comment="Name of bold sans-serif font" font_style="BOLD"> - InterVariableFont.ttf + InterVariableFont.ttf DejaVuSans-Bold.ttf @@ -84,7 +84,7 @@ name="SansSerif" comment="Name of bold italic sans-serif font" font_style="BOLD|ITALIC"> - InterItalicVariableFont.ttf + InterItalicVariableFont.ttf DejaVuSans-BoldOblique.ttf @@ -164,7 +164,7 @@ name="Helvetica" comment="Name of Helvetica font (bold)" font_style="BOLD"> - InterVariableFont.ttf + InterVariableFont.ttf DejaVuSans-Bold.ttf arialbd.ttf diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 57b8ae3bc3..fe5ee62888 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -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 { diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 9a604f9f47..6490989d49 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -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. diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 8f9e52e709..06a87ff326 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -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(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("info_panel"); mControlPanel = getChild("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 btn_width(gSavedSettings, "ToastButtonWidth", 90); + static LLCachedControl 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. diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h index d694513aba..71b9eaf8f5 100644 --- a/indra/newview/lltoastnotifypanel.h +++ b/indra/newview/lltoastnotifypanel.h @@ -134,6 +134,8 @@ protected: S32 mNumOptions { 0 }; S32 mNumButtons { 0 }; + S32 mButtonWidth; + static const std::string sFontDefault; static const std::string sFontScript; }; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index d688afb71d..60ef4575d7 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -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"); - // 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"); + // 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"); + } + // + LLFloaterReg::getInstance("marketplace"); } - else + // OpenSim support + //else if (gSavedSettings.getBOOL("FirstLoginThisInstall")) + else if (LLGridManager::instance().isInSecondLife() && gSavedSettings.getBOOL("FirstLoginThisInstall")) + // { - LLFloaterReg::getInstance("legacy_search"); + // Preload the welcome pack for first-time login even on low end hardware + LLFloaterReg::getInstance("avatar_welcome_pack"); } - // - LLFloaterReg::getInstance("marketplace"); } // Autohide main chat bar if applicable diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp index 31005fb734..38e49d0750 100644 --- a/indra/newview/llwindowlistener.cpp +++ b/indra/newview/llwindowlistener.cpp @@ -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); + } } } diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 3c6e100541..1ad01ee120 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -37,7 +37,7 @@ - InterVariableFont.ttf + InterVariableFont.ttf DejaVuSans-Bold.ttf arialbd.ttf @@ -64,7 +64,7 @@ name="SansSerif" comment="Name of bold sans-serif font" font_style="BOLD"> - InterVariableFont.ttf + InterVariableFont.ttf DejaVuSans-Bold.ttf @@ -80,7 +80,7 @@ name="SansSerif" comment="Name of bold italic sans-serif font" font_style="BOLD|ITALIC"> - InterItalicVariableFont.ttf + InterItalicVariableFont.ttf DejaVuSans-BoldOblique.ttf @@ -135,7 +135,7 @@ name="Helvetica" comment="Name of Helvetica font (bold)" font_style="BOLD"> - InterVariableFont.ttf + InterVariableFont.ttf DejaVuSans-Bold.ttf arialbd.ttf diff --git a/indra/newview/skins/default/xui/ja/fonts.xml b/indra/newview/skins/default/xui/ja/fonts.xml index 06922d2b02..7abb3593b6 100644 --- a/indra/newview/skins/default/xui/ja/fonts.xml +++ b/indra/newview/skins/default/xui/ja/fonts.xml @@ -80,7 +80,7 @@ NotoSansCJKjp-Bold.otf - InterVariableFont.ttf + InterVariableFont.ttf YuGothB.ttc @@ -115,13 +115,13 @@ - InterVariableFont.ttf + InterVariableFont.ttf InterItalicVariableFont.ttf - InterItalicVariableFont.ttf + InterItalicVariableFont.ttf @@ -163,7 +163,7 @@ - InterVariableFont.ttf + InterVariableFont.ttf arialbd.ttf @@ -189,7 +189,7 @@ - InterItalicVariableFont.ttf + InterItalicVariableFont.ttf arialbi.ttf