diff options
-rw-r--r-- | hw/xwin/win.h | 2 | ||||
-rw-r--r-- | hw/xwin/wincreatewnd.c | 92 | ||||
-rw-r--r-- | hw/xwin/winmonitors.c | 1 | ||||
-rw-r--r-- | hw/xwin/winmonitors.h | 29 | ||||
-rw-r--r-- | hw/xwin/winprocarg.c | 4 |
5 files changed, 94 insertions, 34 deletions
diff --git a/hw/xwin/win.h b/hw/xwin/win.h index a43b94ac2..aa2fb0f08 100644 --- a/hw/xwin/win.h +++ b/hw/xwin/win.h @@ -398,6 +398,8 @@ typedef struct DWORD dwScreen; int iMonitor; + HMONITOR hMonitor; + DWORD dwUserWidth; DWORD dwUserHeight; DWORD dwWidth; diff --git a/hw/xwin/wincreatewnd.c b/hw/xwin/wincreatewnd.c index 755373965..882725f54 100644 --- a/hw/xwin/wincreatewnd.c +++ b/hw/xwin/wincreatewnd.c @@ -34,10 +34,6 @@ #include "win.h" #include "shellapi.h" -#ifndef ABS_AUTOHIDE -#define ABS_AUTOHIDE 1 -#endif - /* * Local function prototypes */ @@ -46,7 +42,7 @@ static Bool winGetWorkArea (RECT *prcWorkArea, winScreenInfo *pScreenInfo); static Bool -winAdjustForAutoHide (RECT *prcWorkArea); +winAdjustForAutoHide (RECT *prcWorkArea, winScreenInfo *pScreenInfo); /* @@ -219,7 +215,7 @@ winCreateBoundingWindowWindowed (ScreenPtr pScreen) winGetWorkArea (&rcWorkArea, pScreenInfo); /* Adjust for auto-hide taskbars */ - winAdjustForAutoHide (&rcWorkArea); + winAdjustForAutoHide (&rcWorkArea, pScreenInfo); /* Did the user specify a position? */ if (pScreenInfo->fUserGavePosition) @@ -523,14 +519,33 @@ winGetWorkArea (RECT *prcWorkArea, winScreenInfo *pScreenInfo) int iLeft, iTop; int iPrimaryNonWorkAreaWidth, iPrimaryNonWorkAreaHeight; + /* Use GetMonitorInfo to get work area for monitor */ + if (!pScreenInfo->fMultipleMonitors) + { + MONITORINFO mi; + mi.cbSize = sizeof(MONITORINFO); + if (GetMonitorInfo(pScreenInfo->hMonitor, &mi)) + { + *prcWorkArea = mi.rcWork; + + winDebug ("winGetWorkArea - Monitor %d WorkArea: %d %d %d %d\n", + pScreenInfo->iMonitor, + (int) prcWorkArea->top, (int) prcWorkArea->left, + (int) prcWorkArea->bottom, (int) prcWorkArea->right); + } + else + { + ErrorF ("winGetWorkArea - GetMonitorInfo() failed for monitor %d\n", pScreenInfo->iMonitor); + } + + /* Bail out here if we aren't using multiple monitors */ + return TRUE; + } + /* SPI_GETWORKAREA only gets the work area of the primary screen. */ SystemParametersInfo (SPI_GETWORKAREA, 0, prcWorkArea, 0); - /* Bail out here if we aren't using multiple monitors */ - if (!pScreenInfo->fMultipleMonitors) - return TRUE; - - winDebug ("winGetWorkArea - Original WorkArea: %d %d %d %d\n", + winDebug ("winGetWorkArea - Primary Monitor WorkArea: %d %d %d %d\n", (int) prcWorkArea->top, (int) prcWorkArea->left, (int) prcWorkArea->bottom, (int) prcWorkArea->right); @@ -581,6 +596,28 @@ winGetWorkArea (RECT *prcWorkArea, winScreenInfo *pScreenInfo) return TRUE; } +static Bool +winTaskbarOnScreenEdge(unsigned int uEdge, winScreenInfo *pScreenInfo) +{ + APPBARDATA abd; + HWND hwndAutoHide; + + ZeroMemory (&abd, sizeof (abd)); + abd.cbSize = sizeof (abd); + abd.uEdge = uEdge; + + hwndAutoHide = (HWND) SHAppBarMessage (ABM_GETAUTOHIDEBAR, &abd); + if (hwndAutoHide != NULL) + { + /* + Found an autohide taskbar on that edge, but is it on the + same monitor as the screen window? + */ + if (pScreenInfo->fMultipleMonitors || (MonitorFromWindow(hwndAutoHide, MONITOR_DEFAULTTONULL) == pScreenInfo->hMonitor)) + return TRUE; + } + return FALSE; +} /* * Adjust the client area so that any auto-hide toolbars @@ -588,10 +625,9 @@ winGetWorkArea (RECT *prcWorkArea, winScreenInfo *pScreenInfo) */ static Bool -winAdjustForAutoHide (RECT *prcWorkArea) +winAdjustForAutoHide (RECT *prcWorkArea, winScreenInfo *pScreenInfo) { APPBARDATA abd; - HWND hwndAutoHide; winDebug ("winAdjustForAutoHide - Original WorkArea: %d %d %d %d\n", (int) prcWorkArea->top, (int) prcWorkArea->left, @@ -603,37 +639,34 @@ winAdjustForAutoHide (RECT *prcWorkArea) if (SHAppBarMessage (ABM_GETSTATE, &abd) & ABS_AUTOHIDE) winDebug ("winAdjustForAutoHide - Taskbar is auto hide\n"); + /* + Despite the forgoing, we are checking for any AppBar + hiding along a monitor edge, not just the Windows TaskBar. + */ + /* Look for a TOP auto-hide taskbar */ - abd.uEdge = ABE_TOP; - hwndAutoHide = (HWND) SHAppBarMessage (ABM_GETAUTOHIDEBAR, &abd); - if (hwndAutoHide != NULL) + if (winTaskbarOnScreenEdge(ABE_TOP, pScreenInfo)) { winDebug ("winAdjustForAutoHide - Found TOP auto-hide taskbar\n"); prcWorkArea->top += 1; } /* Look for a LEFT auto-hide taskbar */ - abd.uEdge = ABE_LEFT; - hwndAutoHide = (HWND) SHAppBarMessage (ABM_GETAUTOHIDEBAR, &abd); - if (hwndAutoHide != NULL) + if (winTaskbarOnScreenEdge(ABE_LEFT, pScreenInfo)) { winDebug ("winAdjustForAutoHide - Found LEFT auto-hide taskbar\n"); prcWorkArea->left += 1; } /* Look for a BOTTOM auto-hide taskbar */ - abd.uEdge = ABE_BOTTOM; - hwndAutoHide = (HWND) SHAppBarMessage (ABM_GETAUTOHIDEBAR, &abd); - if (hwndAutoHide != NULL) + if (winTaskbarOnScreenEdge(ABE_BOTTOM, pScreenInfo)) { winDebug ("winAdjustForAutoHide - Found BOTTOM auto-hide taskbar\n"); prcWorkArea->bottom -= 1; } /* Look for a RIGHT auto-hide taskbar */ - abd.uEdge = ABE_RIGHT; - hwndAutoHide = (HWND) SHAppBarMessage (ABM_GETAUTOHIDEBAR, &abd); - if (hwndAutoHide != NULL) + if (winTaskbarOnScreenEdge(ABE_RIGHT, pScreenInfo)) { winDebug ("winAdjustForAutoHide - Found RIGHT auto-hide taskbar\n"); prcWorkArea->right -= 1; @@ -642,15 +675,6 @@ winAdjustForAutoHide (RECT *prcWorkArea) winDebug ("winAdjustForAutoHide - Adjusted WorkArea: %d %d %d %d\n", (int) prcWorkArea->top, (int) prcWorkArea->left, (int) prcWorkArea->bottom, (int) prcWorkArea->right); - -#if 0 - /* Obtain the task bar window dimensions */ - abd.hWnd = hwndAutoHide; - hwndAutoHide = (HWND) SHAppBarMessage (ABM_GETTASKBARPOS, &abd); - winDebug ("hwndAutoHide %08x abd.hWnd %08x %d %d %d %d\n", - hwndAutoHide, abd.hWnd, - abd.rc.top, abd.rc.left, abd.rc.bottom, abd.rc.right); -#endif return TRUE; } diff --git a/hw/xwin/winmonitors.c b/hw/xwin/winmonitors.c index a9d46f90e..7856bdf49 100644 --- a/hw/xwin/winmonitors.c +++ b/hw/xwin/winmonitors.c @@ -48,6 +48,7 @@ wBOOL CALLBACK getMonitorInfo(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM _d data->monitorOffsetY = rect->top; data->monitorHeight = rect->bottom - rect->top; data->monitorWidth = rect->right - rect->left; + data->monitorHandle = hMonitor; return FALSE; } return TRUE; diff --git a/hw/xwin/winmonitors.h b/hw/xwin/winmonitors.h index 180566b00..9445e90b2 100644 --- a/hw/xwin/winmonitors.h +++ b/hw/xwin/winmonitors.h @@ -1,3 +1,31 @@ +/* + +Copyright 1993, 1998 The Open Group +Copyright (C) Colin Harrison 2005-2008 + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ /* data returned for monitor information */ struct GetMonitorInfoData { @@ -9,6 +37,7 @@ struct GetMonitorInfoData { int monitorOffsetY; int monitorHeight; int monitorWidth; + HMONITOR monitorHandle; }; Bool QueryMonitor(int index, struct GetMonitorInfoData *data); diff --git a/hw/xwin/winprocarg.c b/hw/xwin/winprocarg.c index 96792cb58..43e8aeeac 100644 --- a/hw/xwin/winprocarg.c +++ b/hw/xwin/winprocarg.c @@ -111,6 +111,7 @@ winInitializeScreenDefaults(void) } defaultScreenInfo.iMonitor = 1; + defaultScreenInfo.hMonitor = MonitorFromWindow(NULL, MONITOR_DEFAULTTOPRIMARY); defaultScreenInfo.dwWidth = dwWidth; defaultScreenInfo.dwHeight = dwHeight; defaultScreenInfo.dwUserWidth = dwWidth; @@ -335,6 +336,7 @@ ddxProcessArgument (int argc, char *argv[], int i) g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = FALSE; g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; g_ScreenInfo[nScreenNum].iMonitor = iMonitor; + g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle; g_ScreenInfo[nScreenNum].dwWidth = data.monitorWidth; g_ScreenInfo[nScreenNum].dwHeight = data.monitorHeight; g_ScreenInfo[nScreenNum].dwUserWidth = data.monitorWidth; @@ -388,6 +390,7 @@ ddxProcessArgument (int argc, char *argv[], int i) } else if (data.bMonitorSpecifiedExists == TRUE) { g_ScreenInfo[nScreenNum].iMonitor = iMonitor; + g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle; g_ScreenInfo[nScreenNum].dwInitialX += data.monitorOffsetX; g_ScreenInfo[nScreenNum].dwInitialY += data.monitorOffsetY; } @@ -418,6 +421,7 @@ ddxProcessArgument (int argc, char *argv[], int i) winErrorFVerb (2, "ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", iMonitor); g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; g_ScreenInfo[nScreenNum].iMonitor = iMonitor; + g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle; g_ScreenInfo[nScreenNum].dwInitialX = data.monitorOffsetX; g_ScreenInfo[nScreenNum].dwInitialY = data.monitorOffsetY; } |