diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index 7abc9fd..773606f 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -118,6 +118,8 @@ typedef struct _win { Bool isHidden; Bool isSysTrayIcon; Bool sizeHintsSpecified; + Bool skipTaskbar; + Bool skipPager; unsigned int requestedWidth; unsigned int requestedHeight; @@ -213,6 +215,8 @@ static Atom netWMStateAtom; static Atom WMTransientForAtom; static Atom netWMStateHiddenAtom; static Atom netWMStateFocusedAtom; +static Atom netWMStateSkipTaskbarAtom; +static Atom netWMStateSkipPagerAtom; static Atom WLSurfaceIDAtom; static Atom WMStateAtom; static Atom steamUnfocusAtom; @@ -554,22 +558,31 @@ set_win_hidden (Display *dpy, win *w, Bool hidden) return; } + int netWMStateLen = 0; + Atom netWMState[5] = {0}; + if (hidden == True) { - XChangeProperty(dpy, w->id, netWMStateAtom, XA_ATOM, 32, - PropModeReplace, (unsigned char *)&netWMStateHiddenAtom, 1); + netWMState[netWMStateLen++] = netWMStateHiddenAtom; } else { - Atom netWMState[] = { - netWMStateFullscreenAtom, - netWMStateFocusedAtom, - }; - XChangeProperty(dpy, w->id, netWMStateAtom, XA_ATOM, 32, - PropModeReplace, (unsigned char *)netWMState, - sizeof(netWMState) / sizeof(netWMState[0])); + netWMState[netWMStateLen++] = netWMStateFullscreenAtom; + netWMState[netWMStateLen++] = netWMStateFocusedAtom; } + if (w->skipTaskbar) + { + netWMState[netWMStateLen++] = netWMStateSkipTaskbarAtom; + } + if (w->skipPager) + { + netWMState[netWMStateLen++] = netWMStateSkipPagerAtom; + } + + XChangeProperty(dpy, w->id, netWMStateAtom, XA_ATOM, 32, PropModeReplace, + (unsigned char *)&netWMState, netWMStateLen); + uint32_t wmState[] = { (uint32_t)(hidden ? ICCCM_ICONIC_STATE : ICCCM_NORMAL_STATE), None, @@ -1675,6 +1688,10 @@ get_net_wm_state(Display *dpy, win *w) for (size_t i = 0; i < nitems; i++) { if (props[i] == netWMStateFullscreenAtom) { w->isFullscreen = True; + } else if (props[i] == netWMStateSkipTaskbarAtom) { + w->skipTaskbar = True; + } else if (props[i] == netWMStateSkipPagerAtom) { + w->skipPager = True; } else { fprintf(stderr, "Unhandled initial NET_WM_STATE property: %s\n", XGetAtomName(dpy, props[i])); } @@ -1863,6 +1880,8 @@ add_win (Display *dpy, Window id, Window prev, unsigned long sequence) new_win->isHidden = False; new_win->isSysTrayIcon = False; new_win->sizeHintsSpecified = False; + new_win->skipTaskbar = False; + new_win->skipPager = False; new_win->requestedWidth = 0; new_win->requestedHeight = 0; new_win->nudged = False; @@ -2133,6 +2152,12 @@ handle_net_wm_state(Display *dpy, win *w, XClientMessageEvent *ev) if (props[i] == netWMStateFullscreenAtom) { update_net_wm_state(action, &w->isFullscreen); focusDirty = True; + } else if (props[i] == netWMStateSkipTaskbarAtom) { + update_net_wm_state(action, &w->skipTaskbar); + focusDirty = True; + } else if (props[i] == netWMStateSkipPagerAtom) { + update_net_wm_state(action, &w->skipPager); + focusDirty = True; } else if (props[i] != None) { fprintf(stderr, "Unhandled NET_WM_STATE property change: %s\n", XGetAtomName(dpy, props[i])); } @@ -2484,6 +2509,8 @@ register_cm (Display *dpy) Atom supportedAtoms[] = { XInternAtom(dpy, "_NET_WM_STATE", False), XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False), + XInternAtom(dpy, "_NET_WM_STATE_SKIP_TASKBAR", False), + XInternAtom(dpy, "_NET_WM_STATE_SKIP_PAGER", False), XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False), }; @@ -2791,6 +2818,8 @@ steamcompmgr_main (int argc, char **argv) WMTransientForAtom = XInternAtom (dpy, "WM_TRANSIENT_FOR", False); netWMStateHiddenAtom = XInternAtom (dpy, "_NET_WM_STATE_HIDDEN", False); netWMStateFocusedAtom = XInternAtom (dpy, "_NET_WM_STATE_FOCUSED", False); + netWMStateSkipTaskbarAtom = XInternAtom (dpy, "_NET_WM_STATE_SKIP_TASKBAR", False); + netWMStateSkipPagerAtom = XInternAtom (dpy, "_NET_WM_STATE_SKIP_PAGER", False); WLSurfaceIDAtom = XInternAtom (dpy, "WL_SURFACE_ID", False); WMStateAtom = XInternAtom (dpy, "WM_STATE", False); utf8StringAtom = XInternAtom (dpy, "UTF8_STRING", False);