aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xxorg-server/hw/xwin/winmultiwindowwindow.c56
1 files changed, 55 insertions, 1 deletions
diff --git a/xorg-server/hw/xwin/winmultiwindowwindow.c b/xorg-server/hw/xwin/winmultiwindowwindow.c
index 850edc149..457830bcc 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;
}
@@ -913,11 +916,18 @@ winAdjustXWindow(WindowPtr pWin, HWND hwnd)
LONG dX, dY, dW, dH, x, y;
DWORD dwStyle, dwExStyle;
+ int ret;
+ 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 +951,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 +990,49 @@ 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;
+ }
+
+
+ if((rcWin.left <= monitorInfo.rcMonitor.left) && (rcWin.top <= monitorInfo.rcMonitor.top) &&
+ (rcWin.right - rcWin.left > monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left) &&
+ (rcWin.bottom - rcWin.top > monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top))
+ {
+ 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, monitorInfo.rcMonitor.left,
+ monitorInfo.rcMonitor.top,
+ monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left,
+ monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top,
+ SWP_DRAWFRAME | SWP_SHOWWINDOW);
+ }
+
+ return ret;
+
#undef WIDTH
#undef HEIGHT
}