Alexandre Julliard : winex11.drv: If a window is not resizable through the window manager fall back to non-managed resizing .

Alexandre Julliard julliard at winehq.org
Thu Sep 20 10:30:04 CDT 2007


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Sep 19 17:54:33 2007 +0200

winex11.drv: If a window is not resizable through the window manager fall back to non-managed resizing.

---

 dlls/winex11.drv/winpos.c |   58 +++++++++++++++++++++++---------------------
 1 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c
index 085396c..ac7a651 100644
--- a/dlls/winex11.drv/winpos.c
+++ b/dlls/winex11.drv/winpos.c
@@ -1164,11 +1164,38 @@ static void set_movesize_capture( HWND hwnd )
  *  http://freedesktop.org/Standards/wm-spec/1.3/ar01s04.html
  *  or search for "_NET_WM_MOVERESIZE"
  */
-static void X11DRV_WMMoveResizeWindow( HWND hwnd, int x, int y, int dir )
+static BOOL X11DRV_WMMoveResizeWindow( HWND hwnd, int x, int y, WPARAM wparam )
 {
+    WPARAM syscommand = wparam & 0xfff0;
+    WPARAM hittest = wparam & 0x0f;
+    int dir;
     XEvent xev;
     Display *display = thread_display();
 
+    if (syscommand == SC_MOVE)
+    {
+        if (!hittest) dir = _NET_WM_MOVERESIZE_MOVE_KEYBOARD;
+        else dir = _NET_WM_MOVERESIZE_MOVE;
+    }
+    else
+    {
+        /* windows without WS_THICKFRAME are not resizable through the window manager */
+        if (!(GetWindowLongW( hwnd, GWL_STYLE ) & WS_THICKFRAME)) return FALSE;
+
+        switch (hittest)
+        {
+        case WMSZ_LEFT:        dir = _NET_WM_MOVERESIZE_SIZE_LEFT; break;
+        case WMSZ_RIGHT:       dir = _NET_WM_MOVERESIZE_SIZE_RIGHT; break;
+        case WMSZ_TOP:         dir = _NET_WM_MOVERESIZE_SIZE_TOP; break;
+        case WMSZ_TOPLEFT:     dir = _NET_WM_MOVERESIZE_SIZE_TOPLEFT; break;
+        case WMSZ_TOPRIGHT:    dir = _NET_WM_MOVERESIZE_SIZE_TOPRIGHT; break;
+        case WMSZ_BOTTOM:      dir = _NET_WM_MOVERESIZE_SIZE_BOTTOM; break;
+        case WMSZ_BOTTOMLEFT:  dir = _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT; break;
+        case WMSZ_BOTTOMRIGHT: dir = _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT; break;
+        default:               dir = _NET_WM_MOVERESIZE_SIZE_KEYBOARD; break;
+        }
+    }
+
     TRACE("hwnd %p, x %d, y %d, dir %d\n", hwnd, x, y, dir);
 
     xev.xclient.type = ClientMessage;
@@ -1190,6 +1217,7 @@ static void X11DRV_WMMoveResizeWindow( HWND hwnd, int x, int y, int dir )
     XUngrabPointer( display, CurrentTime );
     XSendEvent(display, root_window, False, SubstructureNotifyMask, &xev);
     wine_tsx11_unlock();
+    return TRUE;
 }
 
 /***********************************************************************
@@ -1232,33 +1260,7 @@ void X11DRV_SysCommandSizeMove( HWND hwnd, WPARAM wParam )
           hwnd, data->managed ? "" : "NOT ", syscommand, hittest, pt.x, pt.y);
 
     /* if we are managed then we let the WM do all the work */
-    if (data->managed)
-    {
-        int dir;
-        if (syscommand == SC_MOVE)
-        {
-            if (!hittest) dir = _NET_WM_MOVERESIZE_MOVE_KEYBOARD;
-            else dir = _NET_WM_MOVERESIZE_MOVE;
-        }
-        else if (!hittest) dir = _NET_WM_MOVERESIZE_SIZE_KEYBOARD;
-        else
-            switch (hittest)
-            {
-            case WMSZ_LEFT:        dir = _NET_WM_MOVERESIZE_SIZE_LEFT; break;
-            case WMSZ_RIGHT:       dir = _NET_WM_MOVERESIZE_SIZE_RIGHT; break;
-            case WMSZ_TOP:         dir = _NET_WM_MOVERESIZE_SIZE_TOP; break;
-            case WMSZ_TOPLEFT:     dir = _NET_WM_MOVERESIZE_SIZE_TOPLEFT; break;
-            case WMSZ_TOPRIGHT:    dir = _NET_WM_MOVERESIZE_SIZE_TOPRIGHT; break;
-            case WMSZ_BOTTOM:      dir = _NET_WM_MOVERESIZE_SIZE_BOTTOM; break;
-            case WMSZ_BOTTOMLEFT:  dir = _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT; break;
-            case WMSZ_BOTTOMRIGHT: dir = _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT; break;
-            default:
-                ERR("Invalid hittest value: %d\n", hittest);
-                dir = _NET_WM_MOVERESIZE_SIZE_KEYBOARD;
-            }
-        X11DRV_WMMoveResizeWindow( hwnd, pt.x, pt.y, dir );
-        return;
-    }
+    if (data->managed && X11DRV_WMMoveResizeWindow( hwnd, pt.x, pt.y, wParam )) return;
 
     SystemParametersInfoA(SPI_GETDRAGFULLWINDOWS, 0, &DragFullWindows, 0);
 




More information about the wine-cvs mailing list