Module: wine
Branch: master
Commit: 7d21e6b37517d77cfc051005ebb3efaf479f9bc3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d21e6b37517d77cfc051005e…
Author: Alexandre Julliard <julliard(a)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);