From 2d37036a02168de8537e17b47d8004a53a4a5e62 Mon Sep 17 00:00:00 2001 From: Mike DePaulo Date: Tue, 23 Jun 2015 20:33:38 -0400 Subject: A new version of winmultiwindow.patch from Ionic. The window decoration no longer disappears, and resuming an X2Go session after maximizing the single app (Firefox) seems to work fine. However, if the window was large, but not maximized, there is still some issues with window sizing and location after resume. --- xorg-server/hw/xwin/winmultiwindowwindow.c | 90 +++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/xorg-server/hw/xwin/winmultiwindowwindow.c b/xorg-server/hw/xwin/winmultiwindowwindow.c index 850edc149..2908fff17 100755 --- a/xorg-server/hw/xwin/winmultiwindowwindow.c +++ b/xorg-server/hw/xwin/winmultiwindowwindow.c @@ -107,6 +107,7 @@ winCreateWindowMultiWindow(WindowPtr pWin) winDebug ("winCreateWindowMultiWindow - pWin: %p\n", pWin); #endif + WIN_UNWRAP(CreateWindow); fResult = (*pScreen->CreateWindow) (pWin); WIN_WRAP(CreateWindow, winCreateWindowMultiWindow); @@ -319,6 +320,7 @@ winUnmapWindowMultiWindow(WindowPtr pWin) winDebug ("winUnmapWindowMultiWindow - pWin: %p\n", pWin); #endif + WIN_UNWRAP(UnrealizeWindow); fResult = (*pScreen->UnrealizeWindow) (pWin); WIN_WRAP(UnrealizeWindow, winUnmapWindowMultiWindow); @@ -364,6 +366,7 @@ winMapWindowMultiWindow(WindowPtr pWin) winReshapeMultiWindow(pWin); winUpdateRgnMultiWindow(pWin); + return fResult; } @@ -908,16 +911,27 @@ winAdjustXWindow(WindowPtr pWin, HWND hwnd) { RECT rcDraw; /* Rect made from pWin->drawable to be adjusted */ RECT rcWin; /* The source: WindowRect from hwnd */ + RECT new_size; /* Structure holding a new window size, in case + * the window exceeds visible limits. + * Caveat: right and bottom values are really + * width and height! */ DrawablePtr pDraw; XID vlist[4]; LONG dX, dY, dW, dH, x, y; DWORD dwStyle, dwExStyle; + int ret, need_resize; + HMONITOR currentMonitor; + MONITORINFO monitorInfo; + LONG_PTR old_style, old_ex_style; + #define WIDTH(rc) (rc.right - rc.left) #define HEIGHT(rc) (rc.bottom - rc.top) winDebug("winAdjustXWindow\n"); + + if (IsIconic(hwnd)) { winDebug("\timmediately return because the window is iconized\n"); /* @@ -941,13 +955,17 @@ winAdjustXWindow(WindowPtr pWin, HWND hwnd) dwExStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE); dwStyle = GetWindowLongPtr(hwnd, GWL_STYLE); winDebug("\tWindowStyle: %08x %08x\n", dwStyle, dwExStyle); + AdjustWindowRectEx(&rcDraw, dwStyle, FALSE, dwExStyle); /* The source of adjust */ GetWindowRect(hwnd, &rcWin); + winDebug("\tWindow extend {%d, %d, %d, %d}, {%d, %d}\n", rcWin.left, rcWin.top, rcWin.right, rcWin.bottom, rcWin.right - rcWin.left, rcWin.bottom - rcWin.top); + + winDebug("\tDraw extend {%d, %d, %d, %d}, {%d, %d}\n", rcDraw.left, rcDraw.top, rcDraw.right, rcDraw.bottom, rcDraw.right - rcDraw.left, rcDraw.bottom - rcDraw.top); @@ -976,9 +994,79 @@ winAdjustXWindow(WindowPtr pWin, HWND hwnd) vlist[3] = pDraw->height + dH; winDebug("\tConfigureWindow to (%ld, %ld) - %ldx%ld\n", vlist[0], vlist[1], vlist[2], vlist[3]); - return ConfigureWindow(pWin, CWX | CWY | CWWidth | CWHeight, + + ret=ConfigureWindow(pWin, CWX | CWY | CWWidth | CWHeight, vlist, wClient(pWin)); + + currentMonitor=MonitorFromWindow(hwnd,MONITOR_DEFAULTTONULL); + if(!currentMonitor) + { + return ret; + } + monitorInfo.cbSize=sizeof ( MONITORINFO ); + if(!GetMonitorInfo(currentMonitor, &monitorInfo)) + { + return ret; + } + + need_resize = 0; + if (rcWin.left <= monitorInfo.rcWork.left) { + new_size.left = monitorInfo.rcWork.left; + need_resize = 1; + } + else { + new_size.left = rcWin.left; + } + + if (rcWin.top <= monitorInfo.rcWork.top) { + new_size.top = monitorInfo.rcWork.top; + need_resize = 1; + } + else { + new_size.top = rcWin.top; + } + + if ((rcWin.right - rcWin.left) > (monitorInfo.rcWork.right - monitorInfo.rcWork.left)) { + new_size.right = (monitorInfo.rcWork.right - monitorInfo.rcWork.left); + need_resize = 1; + } + else { + new_size.right = (rcWin.right - rcWin.left); + } + + if ((rcWin.bottom - rcWin.top) > (monitorInfo.rcWork.bottom - monitorInfo.rcWork.top)) { + new_size.bottom = (monitorInfo.rcWork.bottom - monitorInfo.rcWork.top); + need_resize = 1; + } + else { + new_size.bottom = (rcWin.bottom - rcWin.top); + } + + if (need_resize) + { + old_style = GetWindowLongPtr (hwnd, GWL_STYLE); + old_ex_style = GetWindowLongPtr (hwnd, GWL_EXSTYLE); + + if (!old_style || !old_ex_style) { + return ret; + } + + SetWindowLongPtr(hwnd, GWL_STYLE, + WS_VISIBLE | old_style); + + SetWindowLongPtr(hwnd, GWL_EXSTYLE, + old_ex_style); + + SetWindowPos ( hwnd, HWND_TOPMOST, new_size.left, + new_size.top, + new_size.right, + new_size.bottom, + SWP_DRAWFRAME | SWP_SHOWWINDOW); + } + + return ret; + #undef WIDTH #undef HEIGHT } -- cgit v1.2.3