From 8b2c41af886b758126c7738fbd302fc1dfcc3172 Mon Sep 17 00:00:00 2001 From: Daniel Guihot Date: Wed, 16 Sep 2026 05:09:22 +1000 Subject: [PATCH] fullscreenhook: publish the fullscreen window on the root window Set _DWM_FULLSCREEN on the root window to the window id of the client that is fullscreen and clear it when the client exits, so a compositor, notification daemon or GameMode helper can react without scanning every window. Assumes one fullscreen client at a time. --- dwm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dwm.c b/dwm.c index 53b393e..1868c5c 100644 --- a/dwm.c +++ b/dwm.c @@ -258,7 +258,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { [PropertyNotify] = propertynotify, [UnmapNotify] = unmapnotify }; -static Atom wmatom[WMLast], netatom[NetLast]; +static Atom wmatom[WMLast], netatom[NetLast], dwmfullscreen; static int running = 1; static Cur *cursor[CurLast]; static Clr **scheme; @@ -1492,9 +1492,12 @@ setfullscreen(Client *c, int fullscreen) c->isfloating = 1; resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); XRaiseWindow(dpy, c->win); + XChangeProperty(dpy, root, dwmfullscreen, XA_WINDOW, 32, + PropModeReplace, (unsigned char *)&c->win, 1); } else if (!fullscreen && c->isfullscreen){ XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, PropModeReplace, (unsigned char*)0, 0); + XDeleteProperty(dpy, root, dwmfullscreen); c->isfullscreen = 0; c->isfloating = c->oldstate; c->bw = c->oldbw; @@ -1579,6 +1582,7 @@ setup(void) netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); + dwmfullscreen = XInternAtom(dpy, "_DWM_FULLSCREEN", False); /* init cursors */ cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); cursor[CurResize] = drw_cur_create(drw, XC_sizing); @@ -1783,6 +1787,8 @@ unmanage(Client *c, int destroyed) detach(c); detachstack(c); + if (c->isfullscreen) + XDeleteProperty(dpy, root, dwmfullscreen); if (!destroyed) { wc.border_width = c->oldbw; XGrabServer(dpy); /* avoid race conditions */ -- 2.55.0