aboutsummaryrefslogtreecommitdiff
path: root/xorg-server
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server')
-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
}