]> git.mdlowis.com Git - proto/anvil.git/commitdiff
added reading of window types and states
authorMike Lowis <mike.lowis@gentex.com>
Fri, 9 Aug 2024 16:18:33 +0000 (12:18 -0400)
committerMike Lowis <mike.lowis@gentex.com>
Fri, 9 Aug 2024 16:18:33 +0000 (12:18 -0400)
atoms
atoms.c
atoms.h
client.c

diff --git a/atoms b/atoms
index 0e97d85d4768a20b1e2286e72897b025a5b17a2c..bddebae706bf0f0596f1c0b45b4acdb59bc1b36d 100644 (file)
--- a/atoms
+++ b/atoms
@@ -19,6 +19,7 @@ _NET_WM_WINDOW_TYPE_UTILITY
 _NET_WM_WINDOW_TYPE_SPLASH
 _NET_WM_WINDOW_TYPE_DIALOG
 _NET_WM_WINDOW_TYPE_NORMAL
+_NET_WM_STATE
 _NET_WM_STATE_MODAL
 _NET_WM_STATE_STICKY
 _NET_WM_STATE_MAXIMIZED_VERT
diff --git a/atoms.c b/atoms.c
index 7621517a8f124996dbe307913da89e9a1895f0e1..7f9a684636a85c3fbf19dd99bae0b6e2a27bd7cb 100644 (file)
--- a/atoms.c
+++ b/atoms.c
@@ -20,6 +20,7 @@ Atom _NET_WM_WINDOW_TYPE_UTILITY;
 Atom _NET_WM_WINDOW_TYPE_SPLASH;
 Atom _NET_WM_WINDOW_TYPE_DIALOG;
 Atom _NET_WM_WINDOW_TYPE_NORMAL;
+Atom _NET_WM_STATE;
 Atom _NET_WM_STATE_MODAL;
 Atom _NET_WM_STATE_STICKY;
 Atom _NET_WM_STATE_MAXIMIZED_VERT;
@@ -55,6 +56,7 @@ void Atoms_Init(void) {
     _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);
+    _NET_WM_STATE = XInternAtom(X.disp, "_NET_WM_STATE", False);
     _NET_WM_STATE_MODAL = XInternAtom(X.disp, "_NET_WM_STATE_MODAL", False);
     _NET_WM_STATE_STICKY = XInternAtom(X.disp, "_NET_WM_STATE_STICKY", False);
     _NET_WM_STATE_MAXIMIZED_VERT = XInternAtom(X.disp, "_NET_WM_STATE_MAXIMIZED_VERT", False);
diff --git a/atoms.h b/atoms.h
index bd2d3f6e23cd6a54d2b146d085d9ededccbf5cc2..e71cdf52de7f36eabb59606d004498a02647c652 100644 (file)
--- a/atoms.h
+++ b/atoms.h
@@ -20,6 +20,7 @@ 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;
+extern Atom _NET_WM_STATE;
 extern Atom _NET_WM_STATE_MODAL;
 extern Atom _NET_WM_STATE_STICKY;
 extern Atom _NET_WM_STATE_MAXIMIZED_VERT;
index e47ccaa36185353375cef374452e458d3cc2216c..539ceb71607a22633bb3d4d48eddd4c28e8f3ad6 100644 (file)
--- a/client.c
+++ b/client.c
@@ -6,6 +6,7 @@
     for (val = list; (val != NULL); val = val->next)
 
 static void ReadWindowTypes(Client* c);
+static void ReadWindowState(Client* c);
 static void ReadProps(Client* c);
 static void Redraw(Client* c);
 static void LayerWindows(void);
@@ -16,6 +17,38 @@ static void SendMessage(Window win, Atom proto, Atom type);
 static void SetWMState(Client *c, int state);
 static void* ListDelete(void* list, void* node);
 
+typedef struct {
+    Atom* atom;
+    int flags;
+} AtomMap;
+
+static AtomMap WindowTypes[] = {
+    { .atom = &_NET_WM_WINDOW_TYPE,         .flags = 0 },
+    { .atom = &_NET_WM_WINDOW_TYPE_DESKTOP, .flags = 0 },
+    { .atom = &_NET_WM_WINDOW_TYPE_DOCK,    .flags = 0 },
+    { .atom = &_NET_WM_WINDOW_TYPE_TOOLBAR, .flags = 0 },
+    { .atom = &_NET_WM_WINDOW_TYPE_MENU,    .flags = 0 },
+    { .atom = &_NET_WM_WINDOW_TYPE_UTILITY, .flags = 0 },
+    { .atom = &_NET_WM_WINDOW_TYPE_SPLASH,  .flags = 0 },
+    { .atom = &_NET_WM_WINDOW_TYPE_DIALOG,  .flags = 0 },
+    { .atom = &_NET_WM_WINDOW_TYPE_NORMAL,  .flags = 0 },
+};
+
+static AtomMap WindowStates[] = {
+    { .atom = &_NET_WM_STATE_MODAL,             .flags = 0 },
+    { .atom = &_NET_WM_STATE_STICKY,            .flags = 0 },
+    { .atom = &_NET_WM_STATE_MAXIMIZED_VERT,    .flags = 0 },
+    { .atom = &_NET_WM_STATE_MAXIMIZED_HORZ,    .flags = 0 },
+    { .atom = &_NET_WM_STATE_SHADED,            .flags = 0 },
+    { .atom = &_NET_WM_STATE_SKIP_TASKBAR,      .flags = 0 },
+    { .atom = &_NET_WM_STATE_SKIP_PAGER,        .flags = 0 },
+    { .atom = &_NET_WM_STATE_HIDDEN,            .flags = 0 },
+    { .atom = &_NET_WM_STATE_FULLSCREEN,        .flags = 0 },
+    { .atom = &_NET_WM_STATE_ABOVE,             .flags = 0 },
+    { .atom = &_NET_WM_STATE_BELOW,             .flags = 0 },
+    { .atom = &_NET_WM_STATE_DEMANDS_ATTENTION, .flags = 0 },
+};
+
 Client* Client_Find(Window win)
 {
     Client* curr = AllClients;
@@ -343,58 +376,84 @@ static void ReadProps(Client* c)
     /* check if the window is a dialog */
     ReadWindowTypes(c);
 
+    ReadWindowState(c);
+
     /* The following properties are unused currently */
     /* WM_ICON_NAME - window title when iconified */
     /* WM_COLORMAP_WINDOWS - */
 }
 
-static void ReadWindowTypes(Client* c)
+static void ReadFlagHint(Client* c, Atom hint, AtomMap* known, unsigned long nknown, int* flags)
 {
-    Atom actual_type, *types;
+    Atom actual_type, *atoms;
     int format;
-    unsigned long ntypes, extra;
+    unsigned long natoms, extra;
 
     XGetWindowProperty(
-        X.disp, c->win, _NET_WM_WINDOW_TYPE, 0L, -1, False, XA_ATOM, &actual_type, &format, &ntypes, &extra, (unsigned char **)&types);
+        X.disp, c->win, hint, 0L, -1, False, XA_ATOM, &actual_type, &format, &natoms, &extra, (unsigned char **)&atoms);
 
-    for (unsigned long i = 0; i < ntypes; i++)
+    for (unsigned long i = 0; i < natoms; 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)
+        for (unsigned long x = 0; x < nknown; x++)
         {
-            c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME;
-        }
-        if (types[i] == _NET_WM_WINDOW_TYPE_NORMAL)
-        {
-            c->flags |= 0;
+            if (*known[x].atom == atoms[i])
+            {
+                *flags |= known[x].flags;
+            }
         }
     }
-    xfree(types);
+    xfree(atoms);
 }
 
+static void ReadWindowTypes(Client* c)
+{
+    ReadFlagHint(c, _NET_WM_WINDOW_TYPE, WindowTypes, sizeof(WindowTypes)/sizeof(WindowTypes[0]), &(c->flags));
+
+//    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(atoms);
+}
+
+static void ReadWindowState(Client* c)
+{
+    ReadFlagHint(c, _NET_WM_STATE, WindowStates, sizeof(WindowStates)/sizeof(WindowStates[0]), &(c->flags));
+
+}
+
+
 static void Redraw(Client* c)
 {
     if (c->frame)