Added patch to fix handling of WM_WINDOWPOS{CHANGING,CHANGED} for deactivated topmost window.

This commit is contained in:
Sebastian Lackner
2017-01-08 17:43:27 +01:00
parent b51fe90caa
commit 5530538a2b
3 changed files with 95 additions and 18 deletions

View File

@@ -0,0 +1,46 @@
From 59692b046e936dc25ecab6adaf258533a7404635 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Tue, 27 Dec 2016 17:45:05 +0800
Subject: winex11.drv: Send WM_WINDOWPOSCHANGING/WM_WINDOWPOSCHANGED messages
to a being deactivated topmost window.
---
dlls/winex11.drv/event.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index bf2cbb07429..e38b76a7274 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -593,16 +593,27 @@ static void set_input_focus( struct x11drv_win_data *data )
*/
static void set_focus( Display *display, HWND hwnd, Time time )
{
- HWND focus;
+ HWND focus, old_active;
Window win;
GUITHREADINFO threadinfo;
+ old_active = GetForegroundWindow();
+
/* prevent recursion */
x11drv_thread_data()->active_window = hwnd;
TRACE( "setting foreground window to %p\n", hwnd );
SetForegroundWindow( hwnd );
+ /* Some applications expect that a being deactivated topmost window
+ * receives the WM_WINDOWPOSCHANGING/WM_WINDOWPOSCHANGED messages,
+ * and perform some specific actions. Chessmaster is one of such apps.
+ * Window Manager keeps a topmost window on top in z-oder, so there is
+ * no need to actually do anything, just send the messages.
+ */
+ if (old_active && (GetWindowLongW( old_active, GWL_EXSTYLE ) & WS_EX_TOPMOST))
+ SetWindowPos( old_active, hwnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER );
+
threadinfo.cbSize = sizeof(threadinfo);
GetGUIThreadInfo(0, &threadinfo);
focus = threadinfo.hwndFocus;
--
2.11.0

View File

@@ -0,0 +1,2 @@
Fixes: [34594] Fix handling of WM_WINDOWPOS{CHANGING,CHANGED} for deactivated topmost window
Depends: winex11-_NET_ACTIVE_WINDOW