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 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);