summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
Diffstat (limited to 'hw')
-rw-r--r--hw/xwin/glx/indirect.c15
-rw-r--r--hw/xwin/man/XWinrc.man12
-rw-r--r--hw/xwin/winmultiwindowwindow.c10
-rw-r--r--hw/xwin/winmultiwindowwm.c159
-rw-r--r--hw/xwin/winmultiwindowwndproc.c140
-rw-r--r--hw/xwin/winprefs.h1
-rw-r--r--hw/xwin/winprefslex.l1
-rw-r--r--hw/xwin/winprefsyacc.y16
-rw-r--r--hw/xwin/winvalargs.c17
-rw-r--r--hw/xwin/winwindow.h4
10 files changed, 211 insertions, 164 deletions
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index ad35c834c..b9881426c 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -87,6 +87,7 @@
#include <wgl_ext_api.h>
#include <winglobals.h>
#include <indirect.h>
+#include <setjmp.h>
#define NUM_ELEMENTS(x) (sizeof(x)/ sizeof(x[1]))
@@ -479,6 +480,7 @@ glxLogExtensions(const char *prefix, const char *extensions)
free(str);
}
+static jmp_buf jmp_sig;
static struct sigaction old_act;
extern Bool install_os_signal_handler;
@@ -490,7 +492,7 @@ glxWinScreenProbeSigHandler(int signo, siginfo_t * sip, void *context)
// show a messagebox
MessageBox(NULL,
- "A crash occurred while initializing Windows OpenGL.\n"
+ "Windows OpenGL has been disabled as a crash occurred during initialization.\n"
"\n"
"Please try updating the display driver.\n"
"\n"
@@ -498,8 +500,8 @@ glxWinScreenProbeSigHandler(int signo, siginfo_t * sip, void *context)
XVENDORNAMESHORT,
MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND);
- // and pass on to previous sighandler
- (*old_act.sa_sigaction)(signo, sip, context);
+ // continue via longjmp()
+ longjmp(jmp_sig, 1);
}
/* This is called by GlxExtensionInit() asking the GLX provider if it can handle the screen... */
@@ -566,7 +568,7 @@ glxWinScreenProbe(ScreenPtr pScreen)
// The following tests seem particularly prone to crashing somewhere in the
// display driver's OpenGL implementation. So temporarily install a special
- // SIGSEGV handler so we can offer some remedial advice...
+ // SIGSEGV handler so can catch that and offer some remedial advice...
if (install_os_signal_handler)
{
struct sigaction act;
@@ -574,6 +576,11 @@ glxWinScreenProbe(ScreenPtr pScreen)
act.sa_sigaction = glxWinScreenProbeSigHandler;
act.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &act, &old_act);
+
+ if (setjmp(jmp_sig)) {
+ LogMessage(X_ERROR, "AIGLX: Not using WGL due to SEGV\n");
+ goto error;
+ }
}
// create an invisible window for a scratch DC
diff --git a/hw/xwin/man/XWinrc.man b/hw/xwin/man/XWinrc.man
index 0f641e92f..60b8ce1ec 100644
--- a/hw/xwin/man/XWinrc.man
+++ b/hw/xwin/man/XWinrc.man
@@ -200,7 +200,7 @@ will be used.
.SH Style Instructions
.TP 8
.B STYLES {
-\fIclass-or-name-of-window\fP \fIstyle-keyword-1\fP \fIstyle-keyword-2\fP
+\fIclass-or-name-of-window\fP \fIstyle-keyword-1\fP \fIstyle-keyword-2\fP \fIstyle-keyword-3\fP
.br
\fI...\fP
.br
@@ -245,8 +245,14 @@ No Windows title bar and just a thin-line border, for the class or name.
.br
No Windows title bar or border, for the class or name.
-One keyword in \fIstyle-keyword-1\fP can be used with one keyword in \fIstyle-keyword-2\fP,
-or any keyword can be used singly.
+\fIstyle-keyword-3\fP
+
+\fBSKIPTASKBAR\fP
+.br
+Omit the class or name from being listed in the Windows taskbar.
+
+Up to one keyword from each of these three groups can be used. Not all
+groups need be used, and the keywords can be given in any order.
.SH EXAMPLE
diff --git a/hw/xwin/winmultiwindowwindow.c b/hw/xwin/winmultiwindowwindow.c
index 0fe300227..512d1a967 100644
--- a/hw/xwin/winmultiwindowwindow.c
+++ b/hw/xwin/winmultiwindowwindow.c
@@ -588,9 +588,13 @@ winCreateWindowsTopLevelWindow(WindowPtr pWin)
if (winMultiWindowGetTransientFor(pWin, &daddyId)) {
if (daddyId) {
- hFore = GetForegroundWindow();
- if (hFore && (daddyId != (Window) (INT_PTR) GetProp(hFore, WIN_WID_PROP)))
- hFore = NULL;
+ WindowPtr pParent;
+ int res = dixLookupWindow(&pParent, daddyId, serverClient, DixReadAccess);
+ if (res == Success)
+ {
+ winPrivWinPtr pParentPriv = winGetWindowPriv(pParent);
+ hFore = pParentPriv->hWnd;
+ }
}
}
else {
diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c
index 754bf7926..66b6d979f 100644
--- a/hw/xwin/winmultiwindowwm.c
+++ b/hw/xwin/winmultiwindowwm.c
@@ -221,7 +221,7 @@ static void
winApplyUrgency(Display * pDisplay, Window iWindow, HWND hWnd);
static void
- winApplyHints(WMInfoPtr pWMInfo, Window iWindow, HWND hWnd, HWND * zstyle);
+ winApplyHints(WMInfoPtr pWMInfo, Window iWindow, HWND hWnd, HWND * zstyle, Bool onCreate);
/*
* Local globals
@@ -238,6 +238,64 @@ static Bool redirectError = FALSE;
static Bool g_fAnotherWMRunning = FALSE;
/*
+ * Translate msg id to text, for debug purposes
+ */
+
+static const char *
+MessageName(winWMMessagePtr msg)
+{
+ switch (msg->msg)
+ {
+ case WM_WM_MOVE:
+ return "WM_WM_MOVE";
+ break;
+ case WM_WM_SIZE:
+ return "WM_WM_SIZE";
+ break;
+ case WM_WM_RAISE:
+ return "WM_WM_RAISE";
+ break;
+ case WM_WM_LOWER:
+ return "WM_WM_LOWER";
+ break;
+ case WM_WM_UNMAP:
+ return "WM_WM_UNMAP";
+ break;
+ case WM_WM_KILL:
+ return "WM_WM_KILL";
+ break;
+ case WM_WM_ACTIVATE:
+ return "WM_WM_ACTIVATE";
+ break;
+ case WM_WM_NAME_EVENT:
+ return "WM_WM_NAME_EVENT";
+ break;
+ case WM_WM_ICON_EVENT:
+ return "WM_WM_ICON_EVENT";
+ break;
+ case WM_WM_CHANGE_STATE:
+ return "WM_WM_CHANGE_STATE";
+ break;
+ case WM_WM_MAP:
+ return "WM_WM_MAP";
+ break;
+ case WM_WM_MAP_UNMANAGED:
+ return "WM_WM_MAP_UNMANAGED";
+ break;
+ case WM_WM_MAP_MANAGED:
+ return "WM_WM_MAP_MANAGED";
+ break;
+ case WM_WM_HINTS_EVENT:
+ return "WM_WM_HINTS_EVENT";
+ break;
+ default:
+ return "Unknown Message";
+ break;
+ }
+}
+
+
+/*
* PushMessage - Push a message onto the queue
*/
@@ -259,44 +317,6 @@ PushMessage(WMMsgQueuePtr pQueue, WMMsgNodePtr pNode)
pQueue->pHead = pNode;
}
-#if 0
- switch (pNode->msg.msg) {
- case WM_WM_MOVE:
- ErrorF("\tWM_WM_MOVE\n");
- break;
- case WM_WM_SIZE:
- ErrorF("\tWM_WM_SIZE\n");
- break;
- case WM_WM_RAISE:
- ErrorF("\tWM_WM_RAISE\n");
- break;
- case WM_WM_LOWER:
- ErrorF("\tWM_WM_LOWER\n");
- break;
- case WM_WM_MAP:
- ErrorF("\tWM_WM_MAP\n");
- break;
- case WM_WM_MAP2:
- ErrorF("\tWM_WM_MAP2\n");
- break;
- case WM_WM_MAP3:
- ErrorF("\tWM_WM_MAP3\n");
- break;
- case WM_WM_UNMAP:
- ErrorF("\tWM_WM_UNMAP\n");
- break;
- case WM_WM_KILL:
- ErrorF("\tWM_WM_KILL\n");
- break;
- case WM_WM_ACTIVATE:
- ErrorF("\tWM_WM_ACTIVATE\n");
- break;
- default:
- ErrorF("\tUnknown Message.\n");
- break;
- }
-#endif
-
/* Increase the count of elements in the queue by one */
++(pQueue->nQueueSize);
@@ -723,7 +743,7 @@ UpdateIcon(WMInfoPtr pWMInfo, Window iWindow)
*/
static void
-UpdateStyle(WMInfoPtr pWMInfo, Window iWindow)
+UpdateStyle(WMInfoPtr pWMInfo, Window iWindow, Bool onCreate)
{
HWND hWnd;
HWND zstyle = HWND_NOTOPMOST;
@@ -734,7 +754,7 @@ UpdateStyle(WMInfoPtr pWMInfo, Window iWindow)
return;
/* Determine the Window style, which determines borders and clipping region... */
- winApplyHints(pWMInfo, iWindow, hWnd, &zstyle);
+ winApplyHints(pWMInfo, iWindow, hWnd, &zstyle, onCreate);
winUpdateWindowPosition(hWnd, &zstyle);
/* Apply the updated window style, without changing it's show or activation state */
@@ -981,26 +1001,21 @@ winMultiWindowWMProc(void *pArg)
}
#if CYGMULTIWINDOW_DEBUG
- ErrorF("winMultiWindowWMProc - %d ms MSG: %d ID: %d\n",
- GetTickCount(), (int) pNode->msg.msg, (int) pNode->msg.dwID);
+ ErrorF("winMultiWindowWMProc - MSG: %s (%d) ID: %d\n",
+ MessageName(&(pNode->msg)), (int)pNode->msg.msg, (int)pNode->msg.dwID);
#endif
/* Branch on the message type */
switch (pNode->msg.msg) {
#if 0
case WM_WM_MOVE:
- ErrorF("\tWM_WM_MOVE\n");
break;
case WM_WM_SIZE:
- ErrorF("\tWM_WM_SIZE\n");
break;
#endif
case WM_WM_RAISE:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF("\tWM_WM_RAISE\n");
-#endif
/* Raise the window */
XRaiseWindow(pWMInfo->pDisplay, pNode->msg.iWindow);
#if 0
@@ -1009,18 +1024,12 @@ winMultiWindowWMProc(void *pArg)
break;
case WM_WM_LOWER:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF("\tWM_WM_LOWER\n");
-#endif
/* Lower the window */
XLowerWindow(pWMInfo->pDisplay, pNode->msg.iWindow);
break;
case WM_WM_MAP:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF("\tWM_WM_MAP\n");
-#endif
/* Put a note as to the HWND associated with this Window */
XChangeProperty(pWMInfo->pDisplay, pNode->msg.iWindow, pWMInfo->atmPrivMap, XA_INTEGER,
32,
@@ -1030,27 +1039,21 @@ winMultiWindowWMProc(void *pArg)
UpdateIcon(pWMInfo, pNode->msg.iWindow);
break;
- case WM_WM_MAP2:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF("\tWM_WM_MAP2\n");
-#endif
+ case WM_WM_MAP_UNMANAGED:
XChangeProperty(pWMInfo->pDisplay, pNode->msg.iWindow, pWMInfo->atmPrivMap, XA_INTEGER,
32,
PropModeReplace,
(unsigned char *) &(pNode->msg.hwndWindow), sizeof(HWND)/4);
break;
- case WM_WM_MAP3:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF("\tWM_WM_MAP3\n");
-#endif
+ case WM_WM_MAP_MANAGED:
/* Put a note as to the HWND associated with this Window */
XChangeProperty(pWMInfo->pDisplay, pNode->msg.iWindow, pWMInfo->atmPrivMap, XA_INTEGER,
32,
PropModeReplace,
(unsigned char *) &(pNode->msg.hwndWindow), sizeof(HWND)/4);
UpdateName(pWMInfo, pNode->msg.iWindow);
- UpdateStyle(pWMInfo, pNode->msg.iWindow);
+ UpdateStyle(pWMInfo, pNode->msg.iWindow, TRUE);
UpdateIcon(pWMInfo, pNode->msg.iWindow);
@@ -1067,18 +1070,12 @@ winMultiWindowWMProc(void *pArg)
break;
case WM_WM_UNMAP:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF("\tWM_WM_UNMAP\n");
-#endif
/* Unmap the window */
XUnmapWindow(pWMInfo->pDisplay, pNode->msg.iWindow);
break;
case WM_WM_KILL:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF("\tWM_WM_KILL\n");
-#endif
{
/* --- */
if (IsWmProtocolAvailable(pWMInfo->pDisplay,
@@ -1093,9 +1090,6 @@ winMultiWindowWMProc(void *pArg)
break;
case WM_WM_ACTIVATE:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF("\tWM_WM_ACTIVATE\n");
-#endif
/* Set the input focus */
/*
@@ -1148,7 +1142,7 @@ winMultiWindowWMProc(void *pArg)
if (attr.override_redirect)
break;
- UpdateStyle(pWMInfo, pNode->msg.iWindow);
+ UpdateStyle(pWMInfo, pNode->msg.iWindow, FALSE);
}
break;
@@ -1747,7 +1741,7 @@ winSendMessageToWM(void *pWMInfo, winWMMessagePtr pMsg)
WMMsgNodePtr pNode;
#if CYGMULTIWINDOW_DEBUG
- ErrorF("winSendMessageToWM ()\n");
+ ErrorF("winSendMessageToWM %s\n", MessageName(pMsg));
#endif
pNode = malloc(sizeof(WMMsgNodeRec));
@@ -1951,7 +1945,7 @@ winApplyUrgency(Display * pDisplay, Window iWindow, HWND hWnd)
#define HINT_MIN (1L<<1)
static void
-winApplyHints(WMInfoPtr pWMInfo, Window iWindow, HWND hWnd, HWND * zstyle)
+winApplyHints(WMInfoPtr pWMInfo, Window iWindow, HWND hWnd, HWND * zstyle, Bool onCreate)
{
static Atom motif_wm_hints, windowType;
static Atom fullscreenState, belowState, aboveState, skiptaskbarState;
@@ -2135,6 +2129,13 @@ winApplyHints(WMInfoPtr pWMInfo, Window iWindow, HWND hWnd, HWND * zstyle)
free(application_id);
if (window_name)
XFree(window_name);
+
+ /*
+ It only makes sense to apply minimize/maximize override when the
+ window is mapped, as otherwise the state can't be changed.
+ */
+ if (!onCreate)
+ style &= ~(STYLE_MAXIMIZE | STYLE_MINIMIZE);
}
else {
style = STYLE_NONE;
@@ -2168,6 +2169,9 @@ winApplyHints(WMInfoPtr pWMInfo, Window iWindow, HWND hWnd, HWND * zstyle)
(hint & ~HINT_BORDER & ~HINT_CAPTION & ~HINT_SIZEBOX) |
HINT_NOFRAME;
+ if (style & STYLE_SKIPTASKBAR)
+ hint |= HINT_SKIPTASKBAR;
+
/* Now apply styles to window */
style = GetWindowLongPtr(hWnd, GWL_STYLE);
if (!style)
@@ -2175,6 +2179,11 @@ winApplyHints(WMInfoPtr pWMInfo, Window iWindow, HWND hWnd, HWND * zstyle)
style &= ~WS_CAPTION & ~WS_SIZEBOX; /* Just in case */
+ if (GetParent(hWnd))
+ style |= WS_SYSMENU;
+ else
+ style |= WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX;
+
if (!(hint & ~HINT_SKIPTASKBAR)) /* No hints, default */
style = style | WS_CAPTION | WS_SIZEBOX;
else if (hint & HINT_NOFRAME) /* No frame, no decorations */
diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c
index 85b8669ae..4123a80f6 100644
--- a/hw/xwin/winmultiwindowwndproc.c
+++ b/hw/xwin/winmultiwindowwndproc.c
@@ -905,77 +905,6 @@ winTopLevelWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
/* else: Wait for WM_EXITSIZEMOVE */
return 0;
- case WM_SHOWWINDOW:
- /* Bail out if the window is being hidden */
- if (!wParam)
- return 0;
-
- /* */
- if (!pWin->overrideRedirect) {
- HWND zstyle = HWND_NOTOPMOST;
-
- /* Flag that this window needs to be made active when clicked */
- SetProp(hwnd, WIN_NEEDMANAGE_PROP, (HANDLE) 1);
-
- /* Set the transient style flags */
- if (GetParent(hwnd))
- SetWindowLongPtr(hwnd, GWL_STYLE,
- WS_POPUP | WS_OVERLAPPED | WS_SYSMENU |
- WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
- /* Set the window standard style flags */
- else
- SetWindowLongPtr(hwnd, GWL_STYLE,
- (WS_POPUP | WS_OVERLAPPEDWINDOW |
- WS_CLIPCHILDREN | WS_CLIPSIBLINGS)
- & ~WS_CAPTION & ~WS_SIZEBOX);
-
- winUpdateWindowPosition(hwnd, &zstyle);
-
- {
- WinXWMHints hints;
-
- if (winMultiWindowGetWMHints(pWin, &hints)) {
- /*
- Give the window focus, unless it has an InputHint
- which is FALSE (this is used by e.g. glean to
- avoid every test window grabbing the focus)
- */
- if (!((hints.flags & InputHint) && (!hints.input))) {
- SetForegroundWindow(hwnd);
- }
- }
- }
- wmMsg.msg = WM_WM_MAP3;
- }
- else { /* It is an overridden window so make it top of Z stack */
-
- HWND forHwnd = GetForegroundWindow();
-
-#if CYGWINDOWING_DEBUG
- ErrorF("overridden window is shown\n");
-#endif
- if (forHwnd != NULL) {
- if (GetWindowLongPtr(forHwnd, GWLP_USERDATA) & (LONG_PTR)
- XMING_SIGNATURE) {
- if (GetWindowLongPtr(forHwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)
- SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0,
- SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
- else
- SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0,
- SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
- }
- }
- wmMsg.msg = WM_WM_MAP2;
- }
-
- /* Tell our Window Manager thread to map the window */
- if (fWMMsgInitialized)
- winSendMessageToWM(s_pScreenPriv->pWMInfo, &wmMsg);
-
- winStartMousePolling(s_pScreenPriv);
-
- return 0;
-
case WM_SIZING:
/* Need to legalize the size according to WM_NORMAL_HINTS */
/* for applications like xterm */
@@ -1028,12 +957,71 @@ winTopLevelWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
}
}
}
+
+ /* Window is being shown */
+ if (pWinPos->flags & SWP_SHOWWINDOW) {
+ if (!pWin->overrideRedirect) {
+ HWND zstyle = HWND_NOTOPMOST;
+
+ /* Flag that this window needs to be made active when clicked */
+ SetProp(hwnd, WIN_NEEDMANAGE_PROP, (HANDLE) 1);
+
+ winUpdateWindowPosition(hwnd, &zstyle);
+
+ {
+ WinXWMHints hints;
+
+ if (winMultiWindowGetWMHints(pWin, &hints)) {
+ /*
+ Give the window focus, unless it has an InputHint
+ which is FALSE (this is used by e.g. glean to
+ avoid every test window grabbing the focus)
+ */
+ if (!((hints.flags & InputHint) && (!hints.input))) {
+ SetForegroundWindow(hwnd);
+ }
+ }
+ }
+ wmMsg.msg = WM_WM_MAP_MANAGED;
+ }
+ else { /* It is an overridden window so make it top of Z stack */
+ HWND forHwnd = GetForegroundWindow();
+
+ if (forHwnd != NULL) {
+ if (GetWindowLongPtr(forHwnd, GWLP_USERDATA) & (LONG_PTR)
+ XMING_SIGNATURE) {
+ if (GetWindowLongPtr(forHwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)
+ SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ else
+ SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ }
+ }
+ wmMsg.msg = WM_WM_MAP_UNMANAGED;
+ }
+
+ /* Tell our Window Manager thread to map the window */
+ if (fWMMsgInitialized)
+ winSendMessageToWM(s_pScreenPriv->pWMInfo, &wmMsg);
+
+ winStartMousePolling(s_pScreenPriv);
+ }
+
+ /* Window is being hidden */
+ if (pWinPos->flags & SWP_HIDEWINDOW) {
+ /* Tell our Window Manager thread to unmap the window */
+ wmMsg.msg = WM_WM_UNMAP;
+
+ if (fWMMsgInitialized)
+ winSendMessageToWM(s_pScreenPriv->pWMInfo, &wmMsg);
+ }
}
- /*
- * Pass the message to DefWindowProc to let the function
- * break down WM_WINDOWPOSCHANGED to WM_MOVE and WM_SIZE.
- */
- break;
+ /*
+ * Pass the message to DefWindowProc to let the function
+ * break down WM_WINDOWPOSCHANGED to WM_MOVE and WM_SIZE.
+ */
+ break;
case WM_ENTERSIZEMOVE:
hasEnteredSizeMove = TRUE;
diff --git a/hw/xwin/winprefs.h b/hw/xwin/winprefs.h
index 702e5897d..c41710419 100644
--- a/hw/xwin/winprefs.h
+++ b/hw/xwin/winprefs.h
@@ -62,6 +62,7 @@ typedef enum MENUCOMMANDTYPE {
#define STYLE_MAXIMIZE (1L<<4) /* Open a window maximized */
#define STYLE_MINIMIZE (1L<<5) /* Open a window minimized */
#define STYLE_BOTTOM (1L<<6) /* Open a window at the bottom of the Z order */
+#define STYLE_SKIPTASKBAR (1L<<7) /* Omit from taskbar */
/* Where to place a system menu */
typedef enum MENUPOSITION {
diff --git a/hw/xwin/winprefslex.l b/hw/xwin/winprefslex.l
index 472c85658..e7547729c 100644
--- a/hw/xwin/winprefslex.l
+++ b/hw/xwin/winprefslex.l
@@ -77,6 +77,7 @@ BOTTOM { return BOTTOM; }
NOTITLE { return NOTITLE; }
OUTLINE { return OUTLINE; }
NOFRAME { return NOFRAME; }
+SKIPTASKBAR { return SKIPTASKBAR; }
ROOTMENU { return ROOTMENU; }
DEFAULTSYSMENU { return DEFAULTSYSMENU; }
SYSMENU { return SYSMENU; }
diff --git a/hw/xwin/winprefsyacc.y b/hw/xwin/winprefsyacc.y
index 361e05de0..e4e305a0f 100644
--- a/hw/xwin/winprefsyacc.y
+++ b/hw/xwin/winprefsyacc.y
@@ -117,6 +117,7 @@ extern int yylex(void);
%token NOTITLE
%token OUTLINE
%token NOFRAME
+%token SKIPTASKBAR
%token DEFAULTSYSMENU
%token SYSMENU
%token ROOTMENU
@@ -140,6 +141,7 @@ extern int yylex(void);
%token <sVal> STRING
%type <uVal> group1
%type <uVal> group2
+%type <uVal> group3
%type <uVal> stylecombo
%type <iVal> atspot
@@ -246,10 +248,24 @@ group2: NOTITLE { $$=STYLE_NOTITLE; }
| NOFRAME { $$=STYLE_NOFRAME; }
;
+group3: SKIPTASKBAR { $$=STYLE_SKIPTASKBAR; }
+ ;
+
stylecombo: group1 { $$=$1; }
| group2 { $$=$1; }
+ | group3 { $$=$1; }
| group1 group2 { $$=$1|$2; }
+ | group1 group3 { $$=$1|$2; }
| group2 group1 { $$=$1|$2; }
+ | group2 group3 { $$=$1|$2; }
+ | group3 group1 { $$=$1|$2; }
+ | group3 group2 { $$=$1|$2; }
+ | group1 group2 group3 { $$=$1|$2|$3; }
+ | group1 group3 group2 { $$=$1|$2|$3; }
+ | group2 group1 group3 { $$=$1|$2|$3; }
+ | group2 group3 group1 { $$=$1|$2|$3; }
+ | group3 group1 group2 { $$=$1|$2|$3; }
+ | group3 group2 group1 { $$=$1|$2|$3; }
;
styleline: STRING stylecombo NEWLINE newline_or_nada { AddStyleLine($1, $2); free($1); }
diff --git a/hw/xwin/winvalargs.c b/hw/xwin/winvalargs.c
index d0e0b7519..f93872419 100644
--- a/hw/xwin/winvalargs.c
+++ b/hw/xwin/winvalargs.c
@@ -127,7 +127,7 @@ winValidateArgs(void)
return FALSE;
}
- /* Check for -multiwindow, -mwextwm, or -rootless and fullscreen */
+ /* Check for -multiwindow, -mwextwm, or -rootless and -fullscreen */
if (g_ScreenInfo[i].fFullScreen && (FALSE
#ifdef XWIN_MULTIWINDOW
|| g_ScreenInfo[i].fMultiWindow
@@ -142,6 +142,21 @@ winValidateArgs(void)
return FALSE;
}
+ /* Check for -multiwindow, -mwextwm, or -rootless and -nodecoration */
+ if (!g_ScreenInfo[i].fDecoration && (FALSE
+#ifdef XWIN_MULTIWINDOW
+ || g_ScreenInfo[i].fMultiWindow
+#endif
+#ifdef XWIN_MULTIWINDOWEXTWM
+ || g_ScreenInfo[i].fMWExtWM
+#endif
+ || g_ScreenInfo[i].fRootless)
+ ) {
+ ErrorF("winValidateArgs - -nodecoration is invalid with "
+ "-multiwindow, -mwextwm, or -rootless.\n");
+ return FALSE;
+ }
+
/* Check for !fullscreen and any fullscreen-only parameters */
if (!g_ScreenInfo[i].fFullScreen
&& (g_ScreenInfo[i].dwRefreshRate != WIN_DEFAULT_REFRESH
diff --git a/hw/xwin/winwindow.h b/hw/xwin/winwindow.h
index d21274f4f..f27094f4d 100644
--- a/hw/xwin/winwindow.h
+++ b/hw/xwin/winwindow.h
@@ -111,8 +111,8 @@ typedef struct _winWMMessageRec {
#define WM_WM_NAME_EVENT (WM_USER + 9)
#define WM_WM_ICON_EVENT (WM_USER + 10)
#define WM_WM_CHANGE_STATE (WM_USER + 11)
-#define WM_WM_MAP2 (WM_USER + 12)
-#define WM_WM_MAP3 (WM_USER + 13)
+#define WM_WM_MAP_UNMANAGED (WM_USER + 12)
+#define WM_WM_MAP_MANAGED (WM_USER + 13)
#define WM_WM_HINTS_EVENT (WM_USER + 14)
#define WM_MANAGE (WM_USER + 100)
#define WM_UNMANAGE (WM_USER + 102)