aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike DePaulo <mikedep333@gmail.com>2015-06-23 20:33:38 -0400
committerMike DePaulo <mikedep333@gmail.com>2015-06-23 20:33:38 -0400
commit2d37036a02168de8537e17b47d8004a53a4a5e62 (patch)
treea865017322fca8c960af80405e14e4d468bf6c00
parentb37dc46d44680dd60643c6cbae8c3543437b1c10 (diff)
downloadvcxsrv-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-xxorg-server/hw/xwin/winmultiwindowwindow.c90
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
}