improve re-entrance protection using lock

This commit is contained in:
Kang Yu 2025-04-18 14:29:29 -07:00
parent 3b5813bb35
commit fb5f538b88

View file

@ -107,7 +107,7 @@ namespace PersistentWindows.Common
public bool restoringFromDB = false; // manual restore from DB public bool restoringFromDB = false; // manual restore from DB
public bool autoInitialRestoreFromDB = false; public bool autoInitialRestoreFromDB = false;
public bool restoringSnapshot = false; // implies restoringFromMem public bool restoringSnapshot = false; // implies restoringFromMem
private bool restoringFullScreenWindow = false; private Object restoringFullScreenWindow = new object();
public bool showDesktop = false; // show desktop when display changes public bool showDesktop = false; // show desktop when display changes
public int fixZorder = 1; // 1 means restore z-order only for snapshot; 2 means restore z-order for all; 0 means no z-order restore at all public int fixZorder = 1; // 1 means restore z-order only for snapshot; 2 means restore z-order for all; 0 means no z-order restore at all
public int fixZorderMethod = 5; // bit i represent restore method for pass i public int fixZorderMethod = 5; // bit i represent restore method for pass i
@ -1690,6 +1690,7 @@ namespace PersistentWindows.Common
//restore fullscreen window only applies if screen resolution has changed since minimize/normalize //restore fullscreen window only applies if screen resolution has changed since minimize/normalize
if (prevDisplayMetrics.CaptureTime < lastDisplayChangeTime) if (prevDisplayMetrics.CaptureTime < lastDisplayChangeTime)
lock(restoringFullScreenWindow)
RestoreFullScreenWindow(hwnd, target_rect); RestoreFullScreenWindow(hwnd, target_rect);
return; return;
} }
@ -3565,11 +3566,6 @@ namespace PersistentWindows.Common
*/ */
} }
if (restoringFullScreenWindow)
return;
restoringFullScreenWindow = true;
bool wrong_screen = false; bool wrong_screen = false;
RECT cur_rect = new RECT(); RECT cur_rect = new RECT();
User32.GetWindowRect(hwnd, ref cur_rect); User32.GetWindowRect(hwnd, ref cur_rect);
@ -3604,8 +3600,6 @@ namespace PersistentWindows.Common
Thread.Sleep(3 * double_clck_interval); Thread.Sleep(3 * double_clck_interval);
restoringFullScreenWindow = false;
style = User32.GetWindowLong(hwnd, User32.GWL_STYLE); style = User32.GetWindowLong(hwnd, User32.GWL_STYLE);
if ((style & (long)WindowStyleFlags.CAPTION) == 0L) if ((style & (long)WindowStyleFlags.CAPTION) == 0L)
{ {
@ -4376,6 +4370,7 @@ namespace PersistentWindows.Common
if (restore_fullscreen) if (restore_fullscreen)
{ {
if (restoreTimes > 0 && sWindow == null) //#246, let other windows restore first if (restoreTimes > 0 && sWindow == null) //#246, let other windows restore first
lock(restoringFullScreenWindow)
RestoreFullScreenWindow(hWnd, rect); RestoreFullScreenWindow(hWnd, rect);
} }
else if (restoreTimes >= MinRestoreTimes - 1) else if (restoreTimes >= MinRestoreTimes - 1)