diff options
-rwxr-xr-x | xorg-server/hw/xwin/winmultiwindowwindow.c | 56 |
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 } |