steamcompmgr: store SKIP_TASKBAR and SKIP_PAGER hints

This commit is contained in:
Simon Ser 2020-11-10 09:21:47 +01:00
parent bce006fd70
commit c26d86a794

View file

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