1919#include " ../DWMBlurGlass.h"
2020#include " ../Backdrops/ButtonGlowBackdrop.hpp"
2121#include < shellscalingapi.h>
22+ #include < mutex>
2223#pragma comment(lib, "shcore.lib")
2324
2425namespace MDWMBlurGlassExt ::CustomButton
@@ -34,12 +35,13 @@ namespace MDWMBlurGlassExt::CustomButton
3435 };
3536 thread_local std::unordered_map<CTopLevelWindow*, buttonData> g_cbuttonList;
3637 std::unordered_map<CTopLevelWindow*, com_ptr<CButtonGlowBackdrop>> g_glowbackdropMap{};
38+ std::mutex g_dslock;
3739
3840 inline auto FindWindowFromButton (CButton* btn)
3941 {
40- for (auto wnditer = g_cbuttonList.begin (); wnditer != g_cbuttonList.end (); ++wnditer)
42+ for (auto wnditer = g_cbuttonList.begin (); wnditer != g_cbuttonList.end (); ++wnditer)
4143 {
42- if (auto iter = wnditer->second .buttonList .find (btn); iter != wnditer->second .buttonList .end ())
44+ if (auto iter = wnditer->second .buttonList .find (btn); iter != wnditer->second .buttonList .end ())
4345 return wnditer;
4446 }
4547 return g_cbuttonList.end ();
@@ -123,7 +125,7 @@ namespace MDWMBlurGlassExt::CustomButton
123125 && (
124126 (g_configData.blurmethod != blurMethod::DWMAPIBlur && g_configData.oldBtnHeight )
125127 || (g_configData.blurmethod == blurMethod::CustomBlur && g_configData.titlebtnGlow )
126- ))
128+ ))
127129 Attach ();
128130 else if (g_startup
129131 && ((!g_configData.oldBtnHeight && !g_configData.titlebtnGlow ) || g_configData.blurmethod == blurMethod::DWMAPIBlur)
@@ -200,7 +202,7 @@ namespace MDWMBlurGlassExt::CustomButton
200202 if (scale != 1 .f )
201203 borderW -= (int )ceil (1 .1f * scale);
202204
203- if (os::buildNumber < 22000 && borderW <= 0 )
205+ if (os::buildNumber < 22000 && borderW <= 0 )
204206 {
205207 borderW = 6 ;
206208 if (IsZoomed (g_window))
@@ -279,8 +281,11 @@ namespace MDWMBlurGlassExt::CustomButton
279281 {
280282 RemoveGlow (This);
281283 }
284+ std::lock_guard lock{ g_dslock };
282285 if (auto iter = g_cbuttonList.find (This); iter != g_cbuttonList.end ())
286+ {
283287 g_cbuttonList.erase (iter);
288+ }
284289 }
285290
286291 void CButton_Destructor (CButton* This)
@@ -322,18 +327,21 @@ namespace MDWMBlurGlassExt::CustomButton
322327 auto hr = g_funCButton_RedrawVisual.call_org (This);
323328 if (!g_configData.titlebtnGlow ) return hr;
324329
330+ std::lock_guard lock{ g_dslock };
325331 auto iter = FindWindowFromButton (This);
326332 if (iter == g_cbuttonList.end ())
327333 return hr;
328334
335+ auto cwnd = iter->first ;
336+
329337 RECT rect;
330- iter-> first ->GetActualWindowRect (&rect, 0 , 0 , false );
338+ cwnd ->GetActualWindowRect (&rect, 0 , 0 , false );
331339 auto monitor = MonitorFromPoint ({ max (0 , rect.left ), max (0 , rect.top ) }, 0 );
332340 UINT dpi = 96 ;
333341 GetDpiForMonitor (monitor, MDT_EFFECTIVE_DPI, &dpi, &dpi);
334342 const float scale = (float )dpi / 96 .f ;
335343
336- if (auto backdrop = GetOrCreateGlow (iter-> first , false ))
344+ if (auto backdrop = GetOrCreateGlow (cwnd , false ))
337345 {
338346 auto & data = iter->second .buttonList [This];
339347
0 commit comments