aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/hw/xwin/wincreatewnd.c
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/hw/xwin/wincreatewnd.c')
-rw-r--r--xorg-server/hw/xwin/wincreatewnd.c124
1 files changed, 70 insertions, 54 deletions
diff --git a/xorg-server/hw/xwin/wincreatewnd.c b/xorg-server/hw/xwin/wincreatewnd.c
index 0a18a6a29..0580421ae 100644
--- a/xorg-server/hw/xwin/wincreatewnd.c
+++ b/xorg-server/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);
/*
* Create a full screen window
@@ -64,10 +60,10 @@ winCreateBoundingWindowFullScreen(ScreenPtr pScreen)
HWND *phwnd = &pScreenPriv->hwndScreen;
WNDCLASSEX wc;
char szTitle[256];
+ char HostName[256];
+ gethostname(HostName,256);
-#if CYGDEBUG
winDebug("winCreateBoundingWindowFullScreen\n");
-#endif
/* Setup our window class */
wc.cbSize = sizeof(WNDCLASSEX);
@@ -95,12 +91,13 @@ winCreateBoundingWindowFullScreen(ScreenPtr pScreen)
snprintf(szTitle,
sizeof(szTitle),
WINDOW_TITLE_XDMCP,
- g_pszQueryHost, display, (int) pScreenInfo->dwScreen);
+ g_pszQueryHost, HostName, display, (int) pScreenInfo->dwScreen);
else
+ {
snprintf(szTitle,
sizeof(szTitle),
- WINDOW_TITLE, display, (int) pScreenInfo->dwScreen);
-
+ WINDOW_TITLE, HostName, display, (int) pScreenInfo->dwScreen);
+ }
/* Create the window */
*phwnd = CreateWindowExA(0, /* Extended styles */
WINDOW_CLASS, /* Class name */
@@ -157,6 +154,9 @@ winCreateBoundingWindowWindowed(ScreenPtr pScreen)
DWORD dwWindowStyle;
BOOL fForceShowWindow = FALSE;
char szTitle[256];
+ char HostName[256];
+
+ gethostname(HostName,256);
winDebug("winCreateBoundingWindowWindowed - User w: %d h: %d\n",
(int) pScreenInfo->dwUserWidth, (int) pScreenInfo->dwUserHeight);
@@ -218,7 +218,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) {
@@ -248,10 +248,8 @@ winCreateBoundingWindowWindowed(ScreenPtr pScreen)
/* Did the user specify a height and width? */
if (pScreenInfo->fUserGaveHeightAndWidth) {
/* User gave a desired height and width, try to accomodate */
-#if CYGDEBUG
winDebug("winCreateBoundingWindowWindowed - User gave height "
"and width\n");
-#endif
/* Adjust the window width and height for borders and title bar */
if (pScreenInfo->fDecoration
@@ -263,27 +261,21 @@ winCreateBoundingWindowWindowed(ScreenPtr pScreen)
&& !pScreenInfo->fMultiWindow
#endif
) {
-#if CYGDEBUG
winDebug
("winCreateBoundingWindowWindowed - Window has decoration\n");
-#endif
/* Are we resizable */
if (pScreenInfo->iResizeMode != notAllowed) {
-#if CYGDEBUG
winDebug
("winCreateBoundingWindowWindowed - Window is resizable\n");
-#endif
iWidth += 2 * GetSystemMetrics(SM_CXSIZEFRAME);
iHeight += 2 * GetSystemMetrics(SM_CYSIZEFRAME)
+ GetSystemMetrics(SM_CYCAPTION);
}
else {
-#if CYGDEBUG
winDebug
("winCreateBoundingWindowWindowed - Window is not resizable\n");
-#endif
iWidth += 2 * GetSystemMetrics(SM_CXFIXEDFRAME);
iHeight += 2 * GetSystemMetrics(SM_CYFIXEDFRAME)
@@ -293,10 +285,8 @@ winCreateBoundingWindowWindowed(ScreenPtr pScreen)
}
else {
/* By default, we are creating a window that is as large as possible */
-#if CYGDEBUG
winDebug("winCreateBoundingWindowWindowed - User did not give "
"height and width\n");
-#endif
/* Defaults are wrong if we have multiple monitors */
if (pScreenInfo->fMultipleMonitors) {
iWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
@@ -321,10 +311,8 @@ winCreateBoundingWindowWindowed(ScreenPtr pScreen)
if (iHeight >= (rcWorkArea.bottom - rcWorkArea.top))
iHeight = rcWorkArea.bottom - rcWorkArea.top;
-#if CYGDEBUG
winDebug("winCreateBoundingWindowWindowed - Adjusted width: %d "
"height: %d\n", iWidth, iHeight);
-#endif
}
/* Set display and screen-specific tooltip text */
@@ -332,11 +320,13 @@ winCreateBoundingWindowWindowed(ScreenPtr pScreen)
snprintf(szTitle,
sizeof(szTitle),
WINDOW_TITLE_XDMCP,
- g_pszQueryHost, display, (int) pScreenInfo->dwScreen);
+ g_pszQueryHost, HostName, display, (int) pScreenInfo->dwScreen);
else
+ {
snprintf(szTitle,
sizeof(szTitle),
- WINDOW_TITLE, display, (int) pScreenInfo->dwScreen);
+ WINDOW_TITLE, HostName, display, (int) pScreenInfo->dwScreen);
+ }
/* Create the window */
*phwnd = CreateWindowExA(0, /* Extended styles */
@@ -355,9 +345,7 @@ winCreateBoundingWindowWindowed(ScreenPtr pScreen)
return FALSE;
}
-#if CYGDEBUG
winDebug("winCreateBoundingWindowWindowed - CreateWindowEx () returned\n");
-#endif
if (fForceShowWindow) {
ErrorF
@@ -501,14 +489,33 @@ winGetWorkArea(RECT * prcWorkArea, winScreenInfo * pScreenInfo)
int iLeft, iTop;
int iPrimaryNonWorkAreaWidth, iPrimaryNonWorkAreaHeight;
- /* SPI_GETWORKAREA only gets the work area of the primary screen. */
- SystemParametersInfo(SPI_GETWORKAREA, 0, prcWorkArea, 0);
+ /* 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 */
- if (!pScreenInfo->fMultipleMonitors)
return TRUE;
+ }
- winDebug("winGetWorkArea - Original WorkArea: %d %d %d %d\n",
+ /* SPI_GETWORKAREA only gets the work area of the primary screen. */
+ SystemParametersInfo (SPI_GETWORKAREA, 0, prcWorkArea, 0);
+
+ winDebug ("winGetWorkArea - Primary Monitor WorkArea: %d %d %d %d\n",
(int) prcWorkArea->top, (int) prcWorkArea->left,
(int) prcWorkArea->bottom, (int) prcWorkArea->right);
@@ -556,16 +563,37 @@ 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
* will work correctly.
*/
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,
@@ -577,34 +605,31 @@ 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;
}
@@ -613,14 +638,5 @@ winAdjustForAutoHide(RECT * prcWorkArea)
(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;
}