diff --git a/src/GNUstep.h b/src/GNUstep.h index 88b3c056..9083f13b 100644 --- a/src/GNUstep.h +++ b/src/GNUstep.h @@ -46,6 +46,12 @@ #define GNUSTEP_WM_ATTR_NAME "_GNUSTEP_WM_ATTR" +#define GNUSTEP_TITLEBAR_STATE "_GNUSTEP_TITLEBAR_STATE" +enum { + WMTitleBarKey = 0, + WMTitleBarNormal = 1, + WMTitleBarMain = 2 +}; #ifndef _WINGS_H_ /* window stacking level */ diff --git a/src/event.c b/src/event.c index c790c911..c4fbee71 100644 --- a/src/event.c +++ b/src/event.c @@ -85,7 +85,9 @@ extern Atom _XA_WM_COLORMAP_NOTIFY; extern Atom _XA_WM_CHANGE_STATE; extern Atom _XA_WM_DELETE_WINDOW; +extern Atom _XA_GNUSTEP_WM_ATTR; extern Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW; +extern Atom _XA_GNUSTEP_TITLEBAR_STATE; extern Atom _XA_WINDOWMAKER_WM_FUNCTION; extern Atom _XA_WINDOWMAKER_COMMAND; @@ -888,6 +890,33 @@ handleClientMessage(XEvent *event) } } } + } else if (event->xclient.message_type == _XA_GNUSTEP_WM_ATTR) { + wwin = wWindowFor(event->xclient.window); + if (!wwin) return; + switch (event->xclient.data.l[0]) { + case GSWindowLevelAttr: + { + int level = (int)event->xclient.data.l[0]; + if (WINDOW_LEVEL(wwin) != level) { + ChangeStackingLevel(wwin->frame->core, level); + } + } + break; + } + } else if (event->xclient.message_type == _XA_GNUSTEP_TITLEBAR_STATE) { + wwin = wWindowFor(event->xclient.window); + if (!wwin) return; + switch (event->xclient.data.l[0]) { + case WMTitleBarNormal: + wFrameWindowChangeState(wwin->frame, WS_UNFOCUSED); + break; + case WMTitleBarMain: + wFrameWindowChangeState(wwin->frame, WS_PFOCUSED); + break; + case WMTitleBarKey: + wFrameWindowChangeState(wwin->frame, WS_FOCUSED); + break; + } #ifdef GNOME_STUFF } else if (wGNOMEProcessClientMessage(&event->xclient)) { /* do nothing */ diff --git a/src/main.c b/src/main.c index b35ae560..392fdf4c 100644 --- a/src/main.c +++ b/src/main.c @@ -101,6 +101,7 @@ Atom _XA_WM_COLORMAP_NOTIFY; Atom _XA_GNUSTEP_WM_ATTR; Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW; Atom _XA_GNUSTEP_WM_RESIZEBAR; +Atom _XA_GNUSTEP_TITLEBAR_STATE; Atom _XA_WINDOWMAKER_MENU; Atom _XA_WINDOWMAKER_WM_PROTOCOLS; diff --git a/src/startup.c b/src/startup.c index 672a3535..57e49de6 100644 --- a/src/startup.c +++ b/src/startup.c @@ -130,6 +130,7 @@ extern Atom _XA_WINDOWMAKER_ICON_SIZE; extern Atom _XA_WINDOWMAKER_ICON_TILE; extern Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW; +extern Atom _XA_GNUSTEP_TITLEBAR_STATE; #ifdef OFFIX_DND extern Atom _XA_DND_PROTOCOL; @@ -648,6 +649,7 @@ static char *atomNames[] = { "_WINDOWMAKER_COMMAND", "_WINDOWMAKER_ICON_SIZE", "_WINDOWMAKER_ICON_TILE" + GNUSTEP_TITLEBAR_STATE, }; @@ -720,6 +722,8 @@ StartUp(Bool defaultScreenOnly) _XA_WINDOWMAKER_ICON_SIZE = atom[17]; _XA_WINDOWMAKER_ICON_TILE = atom[18]; + _XA_GNUSTEP_TITLEBAR_STATE = atom[99]; + #ifdef OFFIX_DND _XA_DND_SELECTION = XInternAtom(dpy, "DndSelection", False); _XA_DND_PROTOCOL = XInternAtom(dpy, "DndProtocol", False);