From 9700d6b44920181af1b2f0310426cac089194467 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Thu, 8 Aug 2024 22:47:47 -0400 Subject: [PATCH] read all EWMH window types and attempt to set appropriate flags --- anvil.h | 1 + atoms | 7 +++++++ atoms.c | 14 ++++++++++++++ atoms.h | 7 +++++++ client.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 5 files changed, 79 insertions(+), 8 deletions(-) diff --git a/anvil.h b/anvil.h index e086b8f..3a2f432 100644 --- a/anvil.h +++ b/anvil.h @@ -70,6 +70,7 @@ enum { F_DIALOG = (1 << 2), F_FLOATING = (1 << 3), F_SHADED = (1 << 4), + F_NO_FRAME = (1 << 5), }; typedef struct Node { diff --git a/atoms b/atoms index 8bdfbf3..7e3f912 100644 --- a/atoms +++ b/atoms @@ -11,4 +11,11 @@ WM_CLIENT_MACHINE WM_DELETE_WINDOW _NET_ACTIVE_WINDOW _NET_WM_WINDOW_TYPE +_NET_WM_WINDOW_TYPE_DESKTOP +_NET_WM_WINDOW_TYPE_DOCK +_NET_WM_WINDOW_TYPE_TOOLBAR +_NET_WM_WINDOW_TYPE_MENU +_NET_WM_WINDOW_TYPE_UTILITY +_NET_WM_WINDOW_TYPE_SPLASH _NET_WM_WINDOW_TYPE_DIALOG +_NET_WM_WINDOW_TYPE_NORMAL diff --git a/atoms.c b/atoms.c index 39bfb3d..699a9e9 100644 --- a/atoms.c +++ b/atoms.c @@ -12,7 +12,14 @@ Atom WM_CLIENT_MACHINE; Atom WM_DELETE_WINDOW; Atom _NET_ACTIVE_WINDOW; Atom _NET_WM_WINDOW_TYPE; +Atom _NET_WM_WINDOW_TYPE_DESKTOP; +Atom _NET_WM_WINDOW_TYPE_DOCK; +Atom _NET_WM_WINDOW_TYPE_TOOLBAR; +Atom _NET_WM_WINDOW_TYPE_MENU; +Atom _NET_WM_WINDOW_TYPE_UTILITY; +Atom _NET_WM_WINDOW_TYPE_SPLASH; Atom _NET_WM_WINDOW_TYPE_DIALOG; +Atom _NET_WM_WINDOW_TYPE_NORMAL; void Atoms_Init(void) { WM_STATE = XInternAtom(X.disp, "WM_STATE", False); @@ -28,5 +35,12 @@ void Atoms_Init(void) { WM_DELETE_WINDOW = XInternAtom(X.disp, "WM_DELETE_WINDOW", False); _NET_ACTIVE_WINDOW = XInternAtom(X.disp, "_NET_ACTIVE_WINDOW", False); _NET_WM_WINDOW_TYPE = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE", False); + _NET_WM_WINDOW_TYPE_DESKTOP = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_DESKTOP", False); + _NET_WM_WINDOW_TYPE_DOCK = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_DOCK", False); + _NET_WM_WINDOW_TYPE_TOOLBAR = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_TOOLBAR", False); + _NET_WM_WINDOW_TYPE_MENU = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_MENU", False); + _NET_WM_WINDOW_TYPE_UTILITY = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_UTILITY", False); + _NET_WM_WINDOW_TYPE_SPLASH = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_SPLASH", False); _NET_WM_WINDOW_TYPE_DIALOG = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_DIALOG", False); + _NET_WM_WINDOW_TYPE_NORMAL = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_NORMAL", False); } diff --git a/atoms.h b/atoms.h index 7306d7c..61af1ed 100644 --- a/atoms.h +++ b/atoms.h @@ -12,6 +12,13 @@ extern Atom WM_CLIENT_MACHINE; extern Atom WM_DELETE_WINDOW; extern Atom _NET_ACTIVE_WINDOW; extern Atom _NET_WM_WINDOW_TYPE; +extern Atom _NET_WM_WINDOW_TYPE_DESKTOP; +extern Atom _NET_WM_WINDOW_TYPE_DOCK; +extern Atom _NET_WM_WINDOW_TYPE_TOOLBAR; +extern Atom _NET_WM_WINDOW_TYPE_MENU; +extern Atom _NET_WM_WINDOW_TYPE_UTILITY; +extern Atom _NET_WM_WINDOW_TYPE_SPLASH; extern Atom _NET_WM_WINDOW_TYPE_DIALOG; +extern Atom _NET_WM_WINDOW_TYPE_NORMAL; void Atoms_Init(void); diff --git a/client.c b/client.c index 4139f7b..e47ccaa 100644 --- a/client.c +++ b/client.c @@ -5,6 +5,7 @@ #define LIST_FOR_EACH(val,list) \ for (val = list; (val != NULL); val = val->next) +static void ReadWindowTypes(Client* c); static void ReadProps(Client* c); static void Redraw(Client* c); static void LayerWindows(void); @@ -293,7 +294,7 @@ void Client_UpdateAll(void) static void ReadProps(Client* c) { - Atom *protos = NULL, actual_type, *wintype; + Atom actual_type, *protos = NULL; int format, nprotos = 0; unsigned long n, extra; @@ -340,19 +341,60 @@ static void ReadProps(Client* c) // TODO: read client machine property /* check if the window is a dialog */ - XGetWindowProperty( - X.disp, c->win, _NET_WM_WINDOW_TYPE, 0L, -1, False, XA_ATOM, &actual_type, &format, &n, &extra, (unsigned char **)&wintype); - if ((wintype && *wintype == _NET_WM_WINDOW_TYPE_DIALOG) || (c->transient_for != None)) - { - c->flags |= F_DIALOG|F_FLOATING; - } - xfree(wintype); + ReadWindowTypes(c); /* The following properties are unused currently */ /* WM_ICON_NAME - window title when iconified */ /* WM_COLORMAP_WINDOWS - */ } +static void ReadWindowTypes(Client* c) +{ + Atom actual_type, *types; + int format; + unsigned long ntypes, extra; + + XGetWindowProperty( + X.disp, c->win, _NET_WM_WINDOW_TYPE, 0L, -1, False, XA_ATOM, &actual_type, &format, &ntypes, &extra, (unsigned char **)&types); + + for (unsigned long i = 0; i < ntypes; i++) + { + if (types[i] == _NET_WM_WINDOW_TYPE_DIALOG) + { + c->flags |= F_DIALOG|F_FLOATING; + } + if (types[i] == _NET_WM_WINDOW_TYPE_DESKTOP) + { + c->flags |= F_FLOATING|F_NO_FRAME; + } + if (types[i] == _NET_WM_WINDOW_TYPE_DOCK) + { + c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME; + } + if (types[i] == _NET_WM_WINDOW_TYPE_TOOLBAR) + { + c->flags |= F_DIALOG|F_FLOATING; + } + if (types[i] == _NET_WM_WINDOW_TYPE_MENU) + { + c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME; + } + if (types[i] == _NET_WM_WINDOW_TYPE_UTILITY) + { + c->flags |= F_DIALOG|F_FLOATING; + } + if (types[i] == _NET_WM_WINDOW_TYPE_SPLASH) + { + c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME; + } + if (types[i] == _NET_WM_WINDOW_TYPE_NORMAL) + { + c->flags |= 0; + } + } + xfree(types); +} + static void Redraw(Client* c) { if (c->frame) -- 2.51.0