From 4d4dd065696890a0c023423db0aae91446169968 Mon Sep 17 00:00:00 2001 From: Mike DePaulo Date: Tue, 23 Jun 2015 19:19:50 -0400 Subject: A new version of winmultiwindow.patch from Ionic. It seems to fix the missing window decorations, but there is still the issue of the window overlapping much of the taskbar. Sometimes the window is below the taskbar, other times it is on top of the taskbar. --- xorg-server/hw/xwin/winmultiwindowwindow.c | 56 +++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) 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 } -- cgit v1.2.3