diff options
author | Mike DePaulo <mikedep333@gmail.com> | 2015-06-23 20:33:38 -0400 |
---|---|---|
committer | Mike DePaulo <mikedep333@gmail.com> | 2015-06-23 20:33:38 -0400 |
commit | 2d37036a02168de8537e17b47d8004a53a4a5e62 (patch) | |
tree | a865017322fca8c960af80405e14e4d468bf6c00 | |
parent | b37dc46d44680dd60643c6cbae8c3543437b1c10 (diff) | |
download | vcxsrv-2d37036a02168de8537e17b47d8004a53a4a5e62.tar.gz vcxsrv-2d37036a02168de8537e17b47d8004a53a4a5e62.tar.bz2 vcxsrv-2d37036a02168de8537e17b47d8004a53a4a5e62.zip |
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.
-rwxr-xr-x | xorg-server/hw/xwin/winmultiwindowwindow.c | 90 |
1 files changed, 89 insertions, 1 deletions
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 } |