Skip to content

Commit 13656d1

Browse files
committed
Remove current dialog
1 parent 0da8eb3 commit 13656d1

File tree

1 file changed

+26
-64
lines changed

1 file changed

+26
-64
lines changed

Flow.Launcher.Infrastructure/QuickSwitch/QuickSwitch.cs

Lines changed: 26 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,6 @@ public static class QuickSwitch
5656
private static IQuickSwitchDialogWindow _dialogWindow = null;
5757
private static readonly object _dialogWindowLock = new();
5858

59-
private static IQuickSwitchDialogWindow _currentDialogWindow = null;
60-
private static readonly object _currentDialogWindowLock = new();
61-
6259
private static HWINEVENTHOOK _foregroundChangeHook = HWINEVENTHOOK.Null;
6360
private static HWINEVENTHOOK _locationChangeHook = HWINEVENTHOOK.Null;
6461
private static HWINEVENTHOOK _destroyChangeHook = HWINEVENTHOOK.Null;
@@ -197,15 +194,6 @@ public static void SetupQuickSwitch(bool enabled)
197194
dialogWindowExists = true;
198195
}
199196
}
200-
lock (_currentDialogWindowLock)
201-
{
202-
if (_currentDialogWindow != null)
203-
{
204-
_currentDialogWindow.Dispose();
205-
_currentDialogWindow = null;
206-
dialogWindowExists = true;
207-
}
208-
}
209197

210198
// Remove auto switched dialogs
211199
lock (_autoSwitchedDialogsLock)
@@ -249,26 +237,15 @@ public static void SetupQuickSwitch(bool enabled)
249237

250238
#region Invoke Property Events
251239

252-
private static unsafe void InvokeShowQuickSwitchWindow()
240+
private static unsafe void InvokeShowQuickSwitchWindow(bool dialogWindowChanged)
253241
{
254242
// Show quick switch window
255243
if (_settings.ShowQuickSwitchWindow)
256244
{
257-
lock (_currentDialogWindowLock)
245+
if (dialogWindowChanged)
258246
{
259-
lock (_dialogWindowLock)
260-
{
261-
var currentDialogWindowChanged = _currentDialogWindow == null ||
262-
_currentDialogWindow != _dialogWindow;
263-
264-
if (currentDialogWindowChanged)
265-
{
266-
// Save quick switch window position for one file dialog
267-
QuickSwitchWindowPosition = _settings.QuickSwitchWindowPosition;
268-
}
269-
270-
_currentDialogWindow = _dialogWindow;
271-
}
247+
// Save quick switch window position for one file dialog
248+
QuickSwitchWindowPosition = _settings.QuickSwitchWindowPosition;
272249
}
273250

274251
ShowQuickSwitchWindow?.Invoke(_dialogWindow.Handle);
@@ -278,34 +255,25 @@ private static unsafe void InvokeShowQuickSwitchWindow()
278255
// Note: Here we do not start & stop the timer beacause when there are many dialog windows
279256
// Unhooking and hooking will take too much time which can make window position weird
280257
// So we start & stop the timer when we find a file dialog window
281-
/*lock (_currentDialogWindowLock)
258+
/*if (dialogWindowChanged)
282259
{
283-
lock (_dialogWindowLock)
260+
if (!_moveSizeHook.IsNull)
284261
{
285-
var currentDialogWindowChanged = _currentDialogWindow == null ||
286-
_currentDialogWindow != _dialogWindow;
287-
288-
if (currentDialogWindowChanged)
289-
{
290-
if (!_moveSizeHook.IsNull)
291-
{
292-
PInvoke.UnhookWinEvent(_moveSizeHook);
293-
_moveSizeHook = HWINEVENTHOOK.Null;
294-
}
295-
296-
// Call MoveSizeCallBack when the window is moved or resized
297-
uint processId;
298-
var threadId = PInvoke.GetWindowThreadProcessId(_dialogWindow.Handle, &processId);
299-
_moveSizeHook = PInvoke.SetWinEventHook(
300-
PInvoke.EVENT_SYSTEM_MOVESIZESTART,
301-
PInvoke.EVENT_SYSTEM_MOVESIZEEND,
302-
PInvoke.GetModuleHandle((PCWSTR)null),
303-
MoveSizeCallBack,
304-
processId,
305-
threadId,
306-
PInvoke.WINEVENT_OUTOFCONTEXT);
307-
}
262+
PInvoke.UnhookWinEvent(_moveSizeHook);
263+
_moveSizeHook = HWINEVENTHOOK.Null;
308264
}
265+
266+
// Call MoveSizeCallBack when the window is moved or resized
267+
uint processId;
268+
var threadId = PInvoke.GetWindowThreadProcessId(_dialogWindow.Handle, &processId);
269+
_moveSizeHook = PInvoke.SetWinEventHook(
270+
PInvoke.EVENT_SYSTEM_MOVESIZESTART,
271+
PInvoke.EVENT_SYSTEM_MOVESIZEEND,
272+
PInvoke.GetModuleHandle((PCWSTR)null),
273+
MoveSizeCallBack,
274+
processId,
275+
threadId,
276+
PInvoke.WINEVENT_OUTOFCONTEXT);
309277
}*/
310278
}
311279
}
@@ -335,10 +303,6 @@ private static void InvokeResetQuickSwitchWindow()
335303
{
336304
_dialogWindow = null;
337305
}
338-
lock (_currentDialogWindowLock)
339-
{
340-
_currentDialogWindow = null;
341-
}
342306
}
343307

344308
private static void InvokeHideQuickSwitchWindow()
@@ -374,12 +338,14 @@ uint dwmsEventTime
374338
{
375339
// File dialog window
376340
var findDialogWindow = false;
341+
var dialogWindowChanged = false;
377342
foreach (var dialog in _quickSwitchDialogs)
378343
{
379344
if (dialog.CheckDialogWindow(hwnd))
380345
{
381346
lock (_dialogWindowLock)
382347
{
348+
dialogWindowChanged = _dialogWindow == null || _dialogWindow.Handle != hwnd;
383349
_dialogWindow = dialog.DialogWindow;
384350
}
385351

@@ -403,17 +369,17 @@ uint dwmsEventTime
403369
// Just show quick switch window
404370
if (alreadySwitched)
405371
{
406-
InvokeShowQuickSwitchWindow();
372+
InvokeShowQuickSwitchWindow(dialogWindowChanged);
407373
}
408374
// Show quick switch window after navigating the path
409375
else
410376
{
411-
NavigateDialogPath(hwnd, InvokeShowQuickSwitchWindow);
377+
NavigateDialogPath(hwnd, () => InvokeShowQuickSwitchWindow(dialogWindowChanged));
412378
}
413379
}
414380
else
415381
{
416-
InvokeShowQuickSwitchWindow();
382+
InvokeShowQuickSwitchWindow(dialogWindowChanged);
417383
}
418384
}
419385
// Quick switch window
@@ -668,7 +634,7 @@ private static void NavigateDialogPath(HWND hwnd, Action action = null)
668634

669635
// Get explorer path
670636
string path;
671-
lock (_dialogWindowLock)
637+
lock (_lastExplorerLock)
672638
{
673639
path = _lastExplorer?.GetExplorerPath();
674640
}
@@ -843,10 +809,6 @@ public static void Dispose()
843809
{
844810
_dialogWindow = null;
845811
}
846-
lock (_currentDialogWindowLock)
847-
{
848-
_currentDialogWindow = null;
849-
}
850812

851813
// Stop drag move timer
852814
if (_dragMoveTimer != null)

0 commit comments

Comments
 (0)