From 0b1808975a62559e6dbaf92b5935856bb4f820a8 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 5 Aug 2019 09:49:33 +0200 Subject: ui: raise window more aggressively Since we might now be shell-exec'ing from elsewhere, we probably want to do a bit of input attachment shuffling. --- ui/raise.go | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'ui') diff --git a/ui/raise.go b/ui/raise.go index b74b5ed6..42509994 100644 --- a/ui/raise.go +++ b/ui/raise.go @@ -20,19 +20,33 @@ func raise(hwnd win.HWND) { } win.SetActiveWindow(hwnd) - win.SetWindowPos(hwnd, win.HWND_TOPMOST, 0, 0, 0, 0, win.SWP_NOMOVE|win.SWP_NOSIZE|win.SWP_SHOWWINDOW) win.SetForegroundWindow(hwnd) win.SetWindowPos(hwnd, win.HWND_NOTOPMOST, 0, 0, 0, 0, win.SWP_NOMOVE|win.SWP_NOSIZE|win.SWP_SHOWWINDOW) } +func raiseRemote(hwnd win.HWND) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + win.SendMessage(hwnd, raiseMsg, 0, 0) + currentForegroundHwnd := win.GetForegroundWindow() + currentForegroundThreadId := win.GetWindowThreadProcessId(currentForegroundHwnd, nil) + currentThreadId := win.GetCurrentThreadId() + win.AttachThreadInput(int32(currentForegroundThreadId), int32(currentThreadId), true) + win.SetWindowPos(hwnd, win.HWND_TOPMOST, 0, 0, 0, 0, win.SWP_NOMOVE|win.SWP_NOSIZE|win.SWP_SHOWWINDOW) + win.SetWindowPos(hwnd, win.HWND_NOTOPMOST, 0, 0, 0, 0, win.SWP_NOMOVE|win.SWP_NOSIZE|win.SWP_SHOWWINDOW) + win.SetForegroundWindow(hwnd) + win.AttachThreadInput(int32(currentForegroundThreadId), int32(currentThreadId), false) + win.SetFocus(hwnd) + win.SetActiveWindow(hwnd) +} + func RaiseUI() bool { hwnd := win.FindWindow(windows.StringToUTF16Ptr(manageWindowWindowClass), nil) if hwnd == 0 { return false } - win.SendMessage(hwnd, raiseMsg, 0, 0) - win.SetForegroundWindow(hwnd) + raiseRemote(hwnd) return true } @@ -47,8 +61,7 @@ func WaitForRaiseUIThenQuit() { return 0 } win.UnhookWinEvent(handle) - win.SendMessage(hwnd, raiseMsg, 0, 0) - win.SetForegroundWindow(hwnd) + raiseRemote(hwnd) os.Exit(0) return 0 }, 0, 0, win.WINEVENT_SKIPOWNPROCESS|win.WINEVENT_OUTOFCONTEXT) -- cgit v1.2.3-59-g8ed1b