Module: wine Branch: master Commit: 03f8f85ddae0cb7d7ff85d0478f1d9a77c88b26b URL: http://source.winehq.org/git/wine.git/?a=commit;h=03f8f85ddae0cb7d7ff85d0478...
Author: Ken Thomases ken@codeweavers.com Date: Thu Dec 12 16:49:48 2013 -0600
user32: Respect monitor work area when sizing or moving a top-level window.
This prevents dragging a window's title bar behind a menu bar across the top of a screen, for example.
---
dlls/user32/winpos.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index 22ee290..7cae0ad 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -2625,6 +2625,7 @@ void WINPOS_SysCommandSizeMove( HWND hwnd, WPARAM wParam ) BOOL moved = FALSE; DWORD dwPoint = GetMessagePos (); BOOL DragFullWindows = TRUE; + HMONITOR mon = 0;
if (IsZoomed(hwnd) || !IsWindowVisible(hwnd)) return;
@@ -2673,6 +2674,7 @@ void WINPOS_SysCommandSizeMove( HWND hwnd, WPARAM wParam ) { parent = 0; mouseRect = get_virtual_screen_rect(); + mon = MonitorFromPoint( pt, MONITOR_DEFAULTTONEAREST ); }
if (ON_LEFT_BORDER(hittest)) @@ -2749,6 +2751,24 @@ void WINPOS_SysCommandSizeMove( HWND hwnd, WPARAM wParam ) pt.y = max( pt.y, mouseRect.top ); pt.y = min( pt.y, mouseRect.bottom );
+ if (!parent) + { + HMONITOR newmon; + MONITORINFO info; + + if ((newmon = MonitorFromPoint( pt, MONITOR_DEFAULTTONULL ))) + mon = newmon; + + info.cbSize = sizeof(info); + if (mon && GetMonitorInfoW( mon, &info )) + { + pt.x = max( pt.x, info.rcWork.left ); + pt.x = min( pt.x, info.rcWork.right ); + pt.y = max( pt.y, info.rcWork.top ); + pt.y = min( pt.y, info.rcWork.bottom ); + } + } + dx = pt.x - capturePoint.x; dy = pt.y - capturePoint.y;