Alexandre Julliard : winex11: Poll the mouse button to detect the end of a window manager move/resize.

Alexandre Julliard julliard at winehq.org
Wed Feb 1 11:23:26 CST 2012


Module: wine
Branch: master
Commit: 852687f1d112c3a945698cc551b2b7d122a1dff9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=852687f1d112c3a945698cc551b2b7d122a1dff9

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Feb  1 15:49:19 2012 +0100

winex11: Poll the mouse button to detect the end of a window manager move/resize.

---

 dlls/winex11.drv/mouse.c |   46 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 45 insertions(+), 1 deletions(-)

diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 060b4c8..332b71d 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -1332,8 +1332,10 @@ BOOL CDECL X11DRV_ClipCursor( LPCRECT clip )
 void move_resize_window( Display *display, struct x11drv_win_data *data, int dir )
 {
     DWORD pt;
-    int x, y, button = 0;
+    int x, y, rootX, rootY, ret, button = 0;
     XEvent xev;
+    Window root, child;
+    unsigned int xstate;
 
     pt = GetMessagePos();
     x = (short)LOWORD( pt );
@@ -1365,6 +1367,48 @@ void move_resize_window( Display *display, struct x11drv_win_data *data, int dir
     XUngrabPointer( display, CurrentTime );
     XSendEvent(display, root_window, False, SubstructureNotifyMask | SubstructureRedirectMask, &xev);
     wine_tsx11_unlock();
+
+    /* try to detect the end of the size/move by polling for the mouse button to be released */
+    /* (some apps don't like it if we return before the size/move is done) */
+
+    if (!button) return;
+    for (;;)
+    {
+        MSG msg;
+        INPUT input;
+
+        wine_tsx11_lock();
+        ret = XQueryPointer( display, root_window, &root, &child, &rootX, &rootY, &x, &y, &xstate );
+        wine_tsx11_unlock();
+        if (!ret) break;
+
+        if (!(xstate & (Button1Mask << (button - 1))))
+        {
+            /* fake a button release event */
+            input.type = INPUT_MOUSE;
+            input.u.mi.dx          = x + virtual_screen_rect.left;
+            input.u.mi.dy          = y + virtual_screen_rect.top;
+            input.u.mi.mouseData   = button_up_data[button - 1];
+            input.u.mi.dwFlags     = button_up_flags[button - 1] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
+            input.u.mi.time        = GetTickCount();
+            input.u.mi.dwExtraInfo = 0;
+            __wine_send_input( data->hwnd, &input );
+        }
+
+        while (PeekMessageW( &msg, 0, 0, 0, PM_REMOVE ))
+        {
+            if (!CallMsgFilterW( &msg, MSGF_SIZE ))
+            {
+                TranslateMessage( &msg );
+                DispatchMessageW( &msg );
+            }
+        }
+
+        if (!(xstate & (Button1Mask << (button - 1)))) break;
+        MsgWaitForMultipleObjects( 0, NULL, FALSE, 100, QS_ALLINPUT );
+    }
+
+    TRACE( "hwnd %p/%lx done\n", data->hwnd, data->whole_window );
 }
 
 




More information about the wine-cvs mailing list