Make EWMH windows float

Move updatewindowtype() functionality into applyrules(), and also make
following EWMH windows float: DIALOG, UTILITY, TOOLBAR, SPLASH.

This is taking the proposed patch to add window type to the rule matching
options for dwm, allowing dialog, utility, toolbar and splash windows
to be configured to float by default.

This patch is intended to be merged into the main dwm build.

In effect the intermediate EWMH_WINDOWS_FLOAT_PATCH has also been removed.
This commit is contained in:
bakkeby
2020-06-15 13:24:23 +02:00
parent f315188728
commit a7b226de41
3 changed files with 19 additions and 58 deletions

59
dwm.c
View File

@@ -79,6 +79,7 @@
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
#define WIDTH(X) ((X)->w + 2 * (X)->bw)
#define HEIGHT(X) ((X)->h + 2 * (X)->bw)
#define WTYPE "_NET_WM_WINDOW_TYPE_"
#if SCRATCHPADS_PATCH
#define NUMTAGS (LENGTH(tags) + LENGTH(scratchpads))
#define TAGMASK ((1 << NUMTAGS) - 1)
@@ -130,10 +131,7 @@ enum {
#if EWMHTAGS_PATCH
NetDesktopNames, NetDesktopViewport, NetNumberOfDesktops, NetCurrentDesktop,
#endif // EWMHTAGS_PATCH
#if EWMH_WINDOWS_FLOAT_PATCH
NetWMModal, NetWMWindowTypeUtility, NetWMWindowTypeToolbar, NetWMWindowTypeSplash,
#endif // EWMH_WINDOWS_FLOAT_PATCH
NetWMWindowTypeDialog, NetClientList, NetLast
NetClientList, NetLast
}; /* EWMH atoms */
#if WINDOWROLERULE_PATCH
@@ -305,6 +303,7 @@ typedef struct {
#endif // WINDOWROLERULE_PATCH
const char *instance;
const char *title;
const char *wintype;
unsigned int tags;
#if SWITCHTAG_PATCH
int switchtag;
@@ -346,9 +345,9 @@ typedef struct {
#define R_SWALLOW_(enabled) R_SWALLOW_##enabled
#define R_SWALLOW(enabled) R_SWALLOW_(enabled)
#define R_SWALLOW_0
#define R_SWALLOW_1 .isterminal = 0, .noswallow = 1,
#define R_SWALLOW_1 .isterminal = 0, .noswallow = 0,
#define RULE(...) { .class = NULL, R_WINDOWROLERULE(WINDOWROLERULE_PATCH) .instance = NULL, .title = NULL, .tags = 0, R_SWITCHTAG(SWITCHTAG_PATCH) R_CENTER(CENTER_PATCH) .isfloating = 0, R_ISPERMANENT(ISPERMANENT_PATCH) R_SWALLOW(SWALLOW_PATCH) .monitor = -1 },
#define RULE(...) { .class = NULL, R_WINDOWROLERULE(WINDOWROLERULE_PATCH) .instance = NULL, .title = NULL, .wintype = NULL, .tags = 0, R_SWITCHTAG(SWITCHTAG_PATCH) R_CENTER(CENTER_PATCH) .isfloating = 0, R_ISPERMANENT(ISPERMANENT_PATCH) R_SWALLOW(SWALLOW_PATCH) .monitor = -1 },
#if MONITOR_RULES_PATCH
typedef struct {
@@ -466,7 +465,6 @@ static void updatenumlockmask(void);
static void updatesizehints(Client *c);
static void updatestatus(void);
static void updatetitle(Client *c);
static void updatewindowtype(Client *c);
static void updatewmhints(Client *c);
static void view(const Arg *arg);
static Client *wintoclient(Window w);
@@ -564,6 +562,7 @@ void
applyrules(Client *c)
{
const char *class, *instance;
Atom wintype;
#if WINDOWROLERULE_PATCH
char role[64];
#endif // WINDOWROLERULE_PATCH
@@ -578,6 +577,7 @@ applyrules(Client *c)
XGetClassHint(dpy, c->win, &ch);
class = ch.res_class ? ch.res_class : broken;
instance = ch.res_name ? ch.res_name : broken;
wintype = getatomprop(c, netatom[NetWMWindowType]);
#if WINDOWROLERULE_PATCH
gettextprop(c->win, wmatom[WMWindowRole], role, sizeof(role));
#endif // WINDOWROLERULE_PATCH
@@ -589,7 +589,8 @@ applyrules(Client *c)
#if WINDOWROLERULE_PATCH
&& (!r->role || strstr(role, r->role))
#endif // WINDOWROLERULE_PATCH
&& (!r->instance || strstr(instance, r->instance)))
&& (!r->instance || strstr(instance, r->instance))
&& (!r->wintype || wintype == XInternAtom(dpy, r->wintype, False)))
{
#if CENTER_PATCH
c->iscentered = r->iscentered;
@@ -2260,8 +2261,8 @@ manage(Window w, XWindowAttributes *wa)
XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
#endif // FLOAT_BORDER_COLOR_PATCH
configure(c); /* propagates border_width, if size doesn't change */
updatewindowtype(c);
updatesizehints(c);
if (getatomprop(c, netatom[NetWMState]) == netatom[NetWMFullscreen])
setfullscreen(c, 1);
updatewmhints(c);
#if CENTER_PATCH
if (c->iscentered) {
@@ -2533,8 +2534,6 @@ propertynotify(XEvent *e)
if (c == c->mon->sel)
drawbar(c->mon);
}
if (ev->atom == netatom[NetWMWindowType])
updatewindowtype(c);
}
}
@@ -3126,16 +3125,7 @@ setup(void)
netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
#if EWMH_WINDOWS_FLOAT_PATCH
netatom[NetWMModal] = XInternAtom(dpy, "_NET_WM_STATE_MODAL", False);
#endif // EWMH_WINDOWS_FLOAT_PATCH
netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
#if EWMH_WINDOWS_FLOAT_PATCH
netatom[NetWMWindowTypeUtility] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_UTILITY", False);
netatom[NetWMWindowTypeToolbar] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_TOOLBAR", False);
netatom[NetWMWindowTypeSplash] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_SPLASH", False);
#endif // EWMH_WINDOWS_FLOAT_PATCH
netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
/* init cursors */
cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
@@ -4056,33 +4046,6 @@ updatetitle(Client *c)
strcpy(c->name, broken);
}
void
updatewindowtype(Client *c)
{
Atom state = getatomprop(c, netatom[NetWMState]);
Atom wtype = getatomprop(c, netatom[NetWMWindowType]);
if (state == netatom[NetWMFullscreen])
setfullscreen(c, 1);
#if EWMH_WINDOWS_FLOAT_PATCH
if (wtype == netatom[NetWMWindowTypeDialog] ||
wtype == netatom[NetWMWindowTypeUtility] ||
wtype == netatom[NetWMWindowTypeToolbar] ||
wtype == netatom[NetWMWindowTypeSplash] ||
state == netatom[NetWMModal])
#else
if (wtype == netatom[NetWMWindowTypeDialog])
#endif //EWMH_WINDOWS_FLOAT_PATCH
{
#if CENTER_PATCH
if (c->x <= c->mon->mx && c->y <= c->mon->my)
c->iscentered = 1;
#endif // CENTER_PATCH
c->isfloating = 1;
}
}
void
updatewmhints(Client *c)
{