Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e063828

Browse files
Synchronize changes from 1.6 branch [ci skip]
2daba7b Update DX SDK requirement 8058af5 Addendum #1 to ca5ca19 e0933ad Rewrite Crash handler (to more reliably catch, dialog, dump and process all types of exceptions, even stack buffer overruns) Aims to reduce "MTA closed without anything", the handler was on ancient code and badly needed modernization away from deprecated API's as well. bc6e7c0 Fix GUI related crashes and regressions/bad code b596e87 Crashfix (uninitialized ptr) (#4508) 251b8ac Addendum #2 to 86ad47c & dc0fb96 2425c4c Addendum to last 37784c8 Replace ReadRegistryStringValue b162368 Addendum to 86ad47c & dc0fb96 a2d20ba GUI related safety tweaks bfd1306 Fix memory leak in main menu (News browser) ea949b2 Further improve settings window scaling on low res
2 parents 4620779 + 2daba7b commit e063828

40 files changed

+3290
-645
lines changed

‎Client/core/CCrashDumpWriter.cpp‎

Lines changed: 1074 additions & 258 deletions
Large diffs are not rendered by default.

‎Client/core/CGUI.cpp‎

Lines changed: 94 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ CLocalGUI::CLocalGUI()
4444

4545
m_LastSettingsRevision = -1;
4646
m_LocaleChangeCounter = 0;
47+
m_bHasQueuedLocaleChange = false;
4748
}
4849

4950
CLocalGUI::~CLocalGUI()
@@ -123,8 +124,15 @@ void CLocalGUI::ChangeLocale(const char* szName)
123124
CClientVariables* cvars = CCore::GetSingleton().GetCVars();
124125
m_LastSettingsRevision = cvars->GetRevision();
125126

126-
g_pLocalization->SetCurrentLanguage();
127-
m_LastLocaleName = szName;
127+
g_pLocalization->SetCurrentLanguage(szName ? szName : "");
128+
129+
SString strCanonicalLocale = g_pLocalization->GetLanguageCode();
130+
if (strCanonicalLocale.empty())
131+
strCanonicalLocale = CVARS_GET_VALUE<SString>("locale");
132+
if (strCanonicalLocale.empty() && szName)
133+
strCanonicalLocale = szName;
134+
135+
m_LastLocaleName = strCanonicalLocale;
128136

129137
if (guiWasLoaded)
130138
{
@@ -211,6 +219,78 @@ void CLocalGUI::DestroyObjects()
211219
SAFE_DELETE(m_pLabelVersionTag);
212220
}
213221

222+
void CLocalGUI::RequestLocaleChange(const SString& strLocale)
223+
{
224+
if (strLocale.empty())
225+
return;
226+
227+
if (m_bHasQueuedLocaleChange && strLocale == m_QueuedLocaleChange)
228+
return;
229+
230+
const SString strCurrentLocale = CVARS_GET_VALUE<SString>("locale");
231+
if (!m_bHasQueuedLocaleChange && strLocale == strCurrentLocale && strLocale == m_LastLocaleName)
232+
return;
233+
234+
if (m_LocaleChangeCounter > 0)
235+
CCore::GetSingleton().RemoveMessageBox();
236+
237+
m_QueuedLocaleChange = strLocale;
238+
m_bHasQueuedLocaleChange = true;
239+
m_LocaleChangeCounter = 0;
240+
241+
// Keep the cvar at the last applied locale so dependent systems remain stable while we rebuild UI
242+
if (!m_LastLocaleName.empty() && strCurrentLocale != m_LastLocaleName)
243+
CVARS_SET("locale", m_LastLocaleName);
244+
}
245+
246+
void CLocalGUI::ApplyQueuedLocale()
247+
{
248+
if (!m_bHasQueuedLocaleChange)
249+
return;
250+
251+
CClientVariables* cvars = CCore::GetSingleton().GetCVars();
252+
253+
if (m_QueuedLocaleChange.empty())
254+
{
255+
m_bHasQueuedLocaleChange = false;
256+
m_LocaleChangeCounter = 0;
257+
CCore::GetSingleton().RemoveMessageBox();
258+
return;
259+
}
260+
261+
if (CCore::GetSingleton().GetModManager()->IsLoaded())
262+
{
263+
CCore::GetSingleton().GetConsole()->Printf("Please disconnect before changing language");
264+
if (cvars)
265+
cvars->Set("locale", m_LastLocaleName);
266+
267+
m_bHasQueuedLocaleChange = false;
268+
m_QueuedLocaleChange.clear();
269+
m_LocaleChangeCounter = 0;
270+
CCore::GetSingleton().RemoveMessageBox();
271+
return;
272+
}
273+
274+
ChangeLocale(m_QueuedLocaleChange);
275+
276+
m_bHasQueuedLocaleChange = false;
277+
SString strAppliedLocale = m_LastLocaleName;
278+
m_QueuedLocaleChange.clear();
279+
m_LocaleChangeCounter = 0;
280+
281+
if (!strAppliedLocale.empty())
282+
{
283+
SString strCurrentLocale = CVARS_GET_VALUE<SString>("locale");
284+
if (strCurrentLocale != strAppliedLocale)
285+
CVARS_SET("locale", strAppliedLocale);
286+
}
287+
288+
if (cvars)
289+
m_LastSettingsRevision = cvars->GetRevision();
290+
291+
CCore::GetSingleton().RemoveMessageBox();
292+
}
293+
214294
void CLocalGUI::DoPulse()
215295
{
216296
m_pVersionUpdater->DoPulse();
@@ -247,33 +327,21 @@ void CLocalGUI::DoPulse()
247327
{
248328
m_LastLocaleName = currentLocaleName;
249329
}
250-
if (currentLocaleName != m_LastLocaleName)
330+
elseif (!m_bHasQueuedLocaleChange && currentLocaleName != m_LastLocaleName)
251331
{
252-
m_LocaleChangeCounter++;
253-
if (m_LocaleChangeCounter < 5)
254-
{
255-
// Do GUI stuff for first 5 frames
256-
// Force pulse next time
257-
m_LastSettingsRevision = cvars->GetRevision() - 1;
332+
RequestLocaleChange(currentLocaleName);
333+
}
334+
}
258335

259-
if (m_LocaleChangeCounter == 2)
260-
CCore::GetSingleton().ShowMessageBox(_E("CC99"), ("Changing language, please wait..."), MB_ICON_INFO);
261-
}
262-
else
263-
{
264-
// Do actual locale change
265-
m_LocaleChangeCounter = 0;
266-
CCore::GetSingleton().RemoveMessageBox();
336+
if (m_bHasQueuedLocaleChange)
337+
{
338+
m_LocaleChangeCounter++;
267339

268-
if (!CCore::GetSingleton().GetModManager()->IsLoaded())
269-
ChangeLocale(currentLocaleName);
270-
else
271-
{
272-
CCore::GetSingleton().GetConsole()->Printf("Please disconnect before changing language");
273-
cvars->Set("locale", m_LastLocaleName);
274-
}
275-
}
276-
}
340+
if (m_LocaleChangeCounter == 2)
341+
CCore::GetSingleton().ShowMessageBox(_E("CC99"), ("Changing language, please wait..."), MB_ICON_INFO);
342+
343+
if (m_LocaleChangeCounter >= 5)
344+
ApplyQueuedLocale();
277345
}
278346
}
279347

‎Client/core/CGUI.h‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,11 @@ class CLocalGUI : public CSingleton<CLocalGUI>
9292
bool IsOptionalUpdateInfoRequired(const char* szHost) { return m_pVersionUpdater->IsOptionalUpdateInfoRequired(szHost); }
9393
void InitiateDataFilesFix() { m_pVersionUpdater->InitiateDataFilesFix(); }
9494

95+
void RequestLocaleChange(const SString& strLocale);
96+
9597
private:
9698
void UpdateCursor();
99+
void ApplyQueuedLocale();
97100

98101
DWORD TranslateScanCodeToGUIKey(DWORD dwCharacter);
99102

@@ -118,4 +121,6 @@ class CLocalGUI : public CSingleton<CLocalGUI>
118121
SString m_LastSkinName;
119122
SString m_LastLocaleName;
120123
uint m_LocaleChangeCounter;
124+
SString m_QueuedLocaleChange;
125+
bool m_bHasQueuedLocaleChange;
121126
};

‎Client/core/CLanguageSelector.cpp‎

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,24 @@ CLanguageSelector::CLanguageSelector(CGUIElement* pMainMenuCanvas)
5555
///////////////////////////////////////////////////////////////
5656
CLanguageSelector::~CLanguageSelector()
5757
{
58-
SAFE_DELETE(m_pButtonWindow);
59-
SAFE_DELETE(m_pListWindow);
60-
SAFE_DELETE(m_ButtonItem.pContainerPane);
61-
SAFE_DELETE(m_ButtonItem.pIcon);
62-
SAFE_DELETE(m_ButtonItem.pLabel);
63-
for (CLangListItem& item : m_ListItems)
64-
{
65-
SAFE_DELETE(item.pContainerPane);
66-
SAFE_DELETE(item.pIcon);
67-
SAFE_DELETE(item.pLabel);
68-
}
58+
CGUI* pGUI = g_pCore ? g_pCore->GetGUI() : nullptr;
59+
60+
auto destroyElement = [pGUI](auto*& element) {
61+
if (!element)
62+
return;
63+
64+
auto* elementToDestroy = element;
65+
element = nullptr;
66+
if (pGUI)
67+
pGUI->DestroyElementRecursive(elementToDestroy);
68+
};
69+
70+
// Ensure callbacks see a safe state even if destruction triggers them re-entrantly
71+
m_ButtonItem = CLangListItem();
72+
m_ListItems.clear();
73+
74+
destroyElement(m_pListWindow);
75+
destroyElement(m_pButtonWindow);
6976
}
7077

7178
///////////////////////////////////////////////////////////////
@@ -118,18 +125,17 @@ void CLanguageSelector::CreateGUI(CGUIElement* pMainMenuCanvas)
118125
pLabel->SetZOrderingEnabled(false);
119126
pLabel->SetText(g_pLocalization->GetLanguageNativeName());
120127

121-
CLangListItem m_ButtonItem;
122-
m_ButtonItem.strLocale = "";
123-
m_ButtonItem.pContainerPane = pContainerPane;
124-
m_ButtonItem.pIcon = pIcon;
125-
m_ButtonItem.vecIconInitialPos = pIcon->GetPosition();
126-
m_ButtonItem.vecIconInitialSize = pIcon->GetSize();
127-
m_ButtonItem.pLabel = pLabel;
128-
m_ButtonItem.vecLabelInitialPos = pLabel->GetPosition();
129-
m_ButtonItem.vecLabelInitialSize = pLabel->GetSize();
130-
m_ButtonItem.pContainerPane->SetMouseButtonDownHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonClick, this));
131-
m_ButtonItem.pContainerPane->SetMouseEnterHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonEnter, this));
132-
m_ButtonItem.pContainerPane->SetMouseLeaveHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonLeave, this));
128+
m_ButtonItem.strLocale = "";
129+
m_ButtonItem.pContainerPane = pContainerPane;
130+
m_ButtonItem.pIcon = pIcon;
131+
m_ButtonItem.vecIconInitialPos = pIcon->GetPosition();
132+
m_ButtonItem.vecIconInitialSize = pIcon->GetSize();
133+
m_ButtonItem.pLabel = pLabel;
134+
m_ButtonItem.vecLabelInitialPos = pLabel->GetPosition();
135+
m_ButtonItem.vecLabelInitialSize = pLabel->GetSize();
136+
m_ButtonItem.pContainerPane->SetMouseButtonDownHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonClick, this));
137+
m_ButtonItem.pContainerPane->SetMouseEnterHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonEnter, this));
138+
m_ButtonItem.pContainerPane->SetMouseLeaveHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonLeave, this));
133139
}
134140

135141
//
@@ -226,6 +232,9 @@ CLangListItem CLanguageSelector::CreateGUILangItem(CGUIElement* pGUIParent, cons
226232
///////////////////////////////////////////////////////////////
227233
void CLanguageSelector::DoPulse()
228234
{
235+
if (!m_pButtonWindow)
236+
return;
237+
229238
if (CLocalGUI::GetSingleton().GetMainMenu()->GetIsIngame())
230239
{
231240
// Can't change locale when connected, so hide
@@ -241,12 +250,12 @@ void CLanguageSelector::DoPulse()
241250
fDeltaSeconds = Clamp(0.01f, fDeltaSeconds, 0.10f);
242251

243252
// Update current language button mouseover effect
244-
m_bListWasVisible = m_pListWindow->IsVisible();
253+
m_bListWasVisible = m_pListWindow && m_pListWindow->IsVisible();
245254
m_pButtonWindow->SetAlpha((m_bMouseOverButton || m_bListWasVisible) ? 1.f : 0.5f);
246255
m_pButtonWindow->SetVisible(true);
247256

248257
// Animate list items if list is visible
249-
if (m_bListWasVisible)
258+
if (m_bListWasVisible && m_pListWindow)
250259
{
251260
for (CLangListItem& item : m_ListItems)
252261
{
@@ -272,6 +281,9 @@ void CLanguageSelector::DoPulse()
272281
///////////////////////////////////////////////////////////////
273282
void CLanguageSelector::SetLanguageListVisible(bool bVisible)
274283
{
284+
if (!m_pListWindow)
285+
return;
286+
275287
if (bVisible)
276288
{
277289
m_pListWindow->BringToFront();
@@ -280,7 +292,6 @@ void CLanguageSelector::SetLanguageListVisible(bool bVisible)
280292
}
281293
m_pListWindow->SetVisible(bVisible);
282294
}
283-
284295
///////////////////////////////////////////////////////////////
285296
//
286297
// CLanguageSelector::GetListItemByIndex
@@ -379,13 +390,16 @@ bool CLanguageSelector::OnListItemClick(CGUIElement* pElement)
379390
if (pItem)
380391
{
381392
SetLanguageListVisible(false);
382-
SString strPrevLocale = CVARS_GET_VALUE<SString>("locale");
383-
SString strNewLocale = pItem->strLocale;
393+
constSString strPrevLocale = CVARS_GET_VALUE<SString>("locale");
394+
constSString strNewLocale = pItem->strLocale;
384395
if (strNewLocale != strPrevLocale)
385396
{
386-
// Locale change
387-
CVARS_SET("locale", strNewLocale);
388-
SetApplicationSetting("locale", strNewLocale);
397+
CLocalGUI::GetSingleton().RequestLocaleChange(strNewLocale);
398+
399+
// Update button label immediately so user sees their selection
400+
m_ButtonItem.strLocale = strNewLocale;
401+
if (m_ButtonItem.pLabel)
402+
m_ButtonItem.pLabel->SetText(g_pLocalization->GetLanguageNativeName(strNewLocale));
389403
}
390404
}
391405
return true;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /