]> git.mdlowis.com Git - proto/anvil.git/commitdiff
read all EWMH window types and attempt to set appropriate flags
authorMichael D. Lowis <mike@mdlowis.com>
Fri, 9 Aug 2024 02:47:47 +0000 (22:47 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Fri, 9 Aug 2024 02:47:47 +0000 (22:47 -0400)
anvil.h
atoms
atoms.c
atoms.h
client.c

diff --git a/anvil.h b/anvil.h
index e086b8f59577887ea1984ce09d50d41e290b6dc0..3a2f432da5545c830d1625c5bede9da71bda7f19 100644 (file)
--- 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 8bdfbf3369df8f6c55613670b5b5c865cd2d67ea..7e3f912a617d125298fa8130c1c5def6a211a2ad 100644 (file)
--- 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 39bfb3df3cc274b7c83ba07f757af70ba100b4df..699a9e96f9a9f8cef87a9109ff6acf5555cdbb4b 100644 (file)
--- 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 7306d7cee8324ae8324580ac999e1a5e50269d73..61af1ede814a111f3ed5854a0da716d90cfeac04 100644 (file)
--- 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);
index 4139f7b2b6d161437981489a50cee089319d59a6..e47ccaa36185353375cef374452e458d3cc2216c 100644 (file)
--- 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)