Skip to content

Commit 2332436

Browse files
committed
Fix possible null exception & Improve dialog window lock
1 parent 56a645c commit 2332436

File tree

2 files changed

+58
-14
lines changed

2 files changed

+58
-14
lines changed

Flow.Launcher.Infrastructure/QuickSwitch/Models/WindowsDialog.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ static unsafe string GetClassName(HWND handle)
5858

5959
internal class WindowsDialogWindow : IQuickSwitchDialogWindow
6060
{
61-
public HWND Handle { get; private set; }
61+
public HWND Handle { get; private set; } = HWND.Null;
6262

6363
// After jumping folder, file editor handle of Save / SaveAs file dialogs cannot be found anymore
6464
// So we need to cache the current tab and use the original handle
@@ -84,7 +84,7 @@ internal class WindowsDialogTab : IQuickSwitchDialogWindowTab
8484
{
8585
#region Public Properties
8686

87-
public HWND Handle { get; private set; }
87+
public HWND Handle { get; private set; } = HWND.Null;
8888

8989
#endregion
9090

Flow.Launcher.Infrastructure/QuickSwitch/QuickSwitch.cs

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,19 @@ private static unsafe void InvokeShowQuickSwitchWindow(bool dialogWindowChanged)
258258
QuickSwitchWindowPosition = _settings.QuickSwitchWindowPosition;
259259
}
260260

261-
ShowQuickSwitchWindow?.Invoke(_dialogWindow.Handle);
261+
IQuickSwitchDialogWindow dialogWindow = null;
262+
lock (_dialogWindowLock)
263+
{
264+
if (_dialogWindow != null)
265+
{
266+
dialogWindow = _dialogWindow;
267+
}
268+
}
269+
if (dialogWindow != null)
270+
{
271+
ShowQuickSwitchWindow?.Invoke(dialogWindow.Handle);
272+
}
273+
262274
if (QuickSwitchWindowPosition == QuickSwitchWindowPositions.UnderDialog)
263275
{
264276
_dragMoveTimer?.Start();
@@ -267,6 +279,17 @@ private static unsafe void InvokeShowQuickSwitchWindow(bool dialogWindowChanged)
267279
// So we start & stop the timer when we find a file dialog window
268280
/*if (dialogWindowChanged)
269281
{
282+
HWND dialogWindowHandle = HWND.Null;
283+
lock (_dialogWindowLock)
284+
{
285+
if (_dialogWindow != null)
286+
{
287+
dialogWindowHandle = _dialogWindow.Handle;
288+
}
289+
}
290+
291+
if (dialogWindowHandle == HWND.Null) return;
292+
270293
if (!_moveSizeHook.IsNull)
271294
{
272295
PInvoke.UnhookWinEvent(_moveSizeHook);
@@ -275,7 +298,7 @@ private static unsafe void InvokeShowQuickSwitchWindow(bool dialogWindowChanged)
275298
276299
// Call _moveProc when the window is moved or resized
277300
uint processId;
278-
var threadId = PInvoke.GetWindowThreadProcessId(_dialogWindow.Handle, &processId);
301+
var threadId = PInvoke.GetWindowThreadProcessId(dialogWindowHandle, &processId);
279302
_moveSizeHook = PInvoke.SetWinEventHook(
280303
PInvoke.EVENT_SYSTEM_MOVESIZESTART,
281304
PInvoke.EVENT_SYSTEM_MOVESIZEEND,
@@ -297,6 +320,11 @@ private static void InvokeUpdateQuickSwitchWindow()
297320

298321
private static void InvokeResetQuickSwitchWindow()
299322
{
323+
lock (_dialogWindowLock)
324+
{
325+
_dialogWindow = null;
326+
}
327+
300328
// Reset quick switch window
301329
ResetQuickSwitchWindow?.Invoke();
302330
_dragMoveTimer?.Stop();
@@ -308,11 +336,6 @@ private static void InvokeResetQuickSwitchWindow()
308336
PInvoke.UnhookWinEvent(_moveSizeHook);
309337
_moveSizeHook = HWINEVENTHOOK.Null;
310338
}*/
311-
312-
lock (_dialogWindowLock)
313-
{
314-
_dialogWindow = null;
315-
}
316339
}
317340

318341
private static void InvokeHideQuickSwitchWindow()
@@ -402,7 +425,15 @@ uint dwmsEventTime
402425
}
403426
else
404427
{
405-
if (_dialogWindow != null)
428+
var dialogWindowExist = false;
429+
lock (_dialogWindowLock)
430+
{
431+
if (_dialogWindow != null)
432+
{
433+
dialogWindowExist = true;
434+
}
435+
}
436+
if (dialogWindowExist)
406437
{
407438
InvokeHideQuickSwitchWindow();
408439
}
@@ -441,7 +472,15 @@ uint dwmsEventTime
441472
)
442473
{
443474
// If the dialog window is moved, update the quick switch window position
444-
if (_dialogWindow != null && _dialogWindow.Handle == hwnd)
475+
var dialogWindowExist = false;
476+
lock (_dialogWindowLock)
477+
{
478+
if (_dialogWindow != null && _dialogWindow.Handle == hwnd)
479+
{
480+
dialogWindowExist = true;
481+
}
482+
}
483+
if (dialogWindowExist)
445484
{
446485
InvokeUpdateQuickSwitchWindow();
447486
}
@@ -486,13 +525,18 @@ uint dwmsEventTime
486525
)
487526
{
488527
// If the dialog window is destroyed, set _dialogWindowHandle to null
489-
if (_dialogWindow != null && _dialogWindow.Handle == hwnd)
528+
var dialogWindowExist = false;
529+
lock (_dialogWindowLock)
490530
{
491-
Log.Debug(ClassName, $"Destory dialog: {hwnd}");
492-
lock (_dialogWindowLock)
531+
if (_dialogWindow != null && _dialogWindow.Handle == hwnd)
493532
{
533+
Log.Debug(ClassName, $"Destory dialog: {hwnd}");
494534
_dialogWindow = null;
535+
dialogWindowExist = true;
495536
}
537+
}
538+
if (dialogWindowExist)
539+
{
496540
lock (_autoSwitchedDialogsLock)
497541
{
498542
_autoSwitchedDialogs.Remove(hwnd);

0 commit comments

Comments
 (0)