]> git.mdlowis.com Git - proto/anvil.git/commitdiff
switched to ruby for genatoms script to allow for fancier logic. Know generate flag...
authorMike Lowis <mike.lowis@gentex.com>
Mon, 12 Aug 2024 20:22:10 +0000 (16:22 -0400)
committerMike Lowis <mike.lowis@gentex.com>
Mon, 12 Aug 2024 20:22:10 +0000 (16:22 -0400)
atoms
atoms.c
atoms.h
ewmh.c
genatoms [deleted file]
genatoms.rb [new file with mode: 0755]

diff --git a/atoms b/atoms
index 3db2a50df88d39270b3a77456dd305a6c7545e5b..f7799e53bd82ea602d0161466e34e3e007903f16 100644 (file)
--- a/atoms
+++ b/atoms
@@ -12,24 +12,24 @@ WM_DELETE_WINDOW
 _NET_WM_NAME
 _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
+_NET_WM_WINDOW_TYPE_DESKTOP     WindowType
+_NET_WM_WINDOW_TYPE_DOCK        WindowType
+_NET_WM_WINDOW_TYPE_TOOLBAR     WindowType
+_NET_WM_WINDOW_TYPE_MENU        WindowType
+_NET_WM_WINDOW_TYPE_UTILITY     WindowType
+_NET_WM_WINDOW_TYPE_SPLASH      WindowType
+_NET_WM_WINDOW_TYPE_DIALOG      WindowType
+_NET_WM_WINDOW_TYPE_NORMAL      WindowType
 _NET_WM_STATE
-_NET_WM_STATE_MODAL
-_NET_WM_STATE_STICKY
-_NET_WM_STATE_MAXIMIZED_VERT
-_NET_WM_STATE_MAXIMIZED_HORZ
-_NET_WM_STATE_SHADED
-_NET_WM_STATE_SKIP_TASKBAR
-_NET_WM_STATE_SKIP_PAGER
-_NET_WM_STATE_HIDDEN
-_NET_WM_STATE_FULLSCREEN
-_NET_WM_STATE_ABOVE
-_NET_WM_STATE_BELOW
-_NET_WM_STATE_DEMANDS_ATTENTION
+_NET_WM_STATE_MODAL             WindowState
+_NET_WM_STATE_STICKY            WindowState
+_NET_WM_STATE_MAXIMIZED_VERT    WindowState
+_NET_WM_STATE_MAXIMIZED_HORZ    WindowState
+_NET_WM_STATE_SHADED            WindowState
+_NET_WM_STATE_SKIP_TASKBAR      WindowState
+_NET_WM_STATE_SKIP_PAGER        WindowState
+_NET_WM_STATE_HIDDEN            WindowState
+_NET_WM_STATE_FULLSCREEN        WindowState
+_NET_WM_STATE_ABOVE             WindowState
+_NET_WM_STATE_BELOW             WindowState
+_NET_WM_STATE_DEMANDS_ATTENTION WindowState
diff --git a/atoms.c b/atoms.c
index 2e9e98f3fd6e75e0b4e16be91d6bc2cbed1a3780..4f5229075a8185c1af70fe44982fab8dcab56940 100644 (file)
--- a/atoms.c
+++ b/atoms.c
@@ -1,4 +1,5 @@
 #include "anvil.h"
+
 Atom WM_STATE;
 Atom WM_NAME;
 Atom WM_ICON_NAME;
@@ -34,8 +35,11 @@ Atom _NET_WM_STATE_FULLSCREEN;
 Atom _NET_WM_STATE_ABOVE;
 Atom _NET_WM_STATE_BELOW;
 Atom _NET_WM_STATE_DEMANDS_ATTENTION;
+Atom WindowType[8];
+Atom WindowState[12];
 
-void Atoms_Init(void) {
+void Atoms_Init(void)
+{
     WM_STATE = XInternAtom(X.disp, "WM_STATE", False);
     WM_NAME = XInternAtom(X.disp, "WM_NAME", False);
     WM_ICON_NAME = XInternAtom(X.disp, "WM_ICON_NAME", False);
@@ -51,24 +55,44 @@ void Atoms_Init(void) {
     _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);
+    WindowType[0] = _NET_WM_WINDOW_TYPE_DESKTOP;
     _NET_WM_WINDOW_TYPE_DOCK = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_DOCK", False);
+    WindowType[1] = _NET_WM_WINDOW_TYPE_DOCK;
     _NET_WM_WINDOW_TYPE_TOOLBAR = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_TOOLBAR", False);
+    WindowType[2] = _NET_WM_WINDOW_TYPE_TOOLBAR;
     _NET_WM_WINDOW_TYPE_MENU = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_MENU", False);
+    WindowType[3] = _NET_WM_WINDOW_TYPE_MENU;
     _NET_WM_WINDOW_TYPE_UTILITY = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_UTILITY", False);
+    WindowType[4] = _NET_WM_WINDOW_TYPE_UTILITY;
     _NET_WM_WINDOW_TYPE_SPLASH = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_SPLASH", False);
+    WindowType[5] = _NET_WM_WINDOW_TYPE_SPLASH;
     _NET_WM_WINDOW_TYPE_DIALOG = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_DIALOG", False);
+    WindowType[6] = _NET_WM_WINDOW_TYPE_DIALOG;
     _NET_WM_WINDOW_TYPE_NORMAL = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_NORMAL", False);
+    WindowType[7] = _NET_WM_WINDOW_TYPE_NORMAL;
     _NET_WM_STATE = XInternAtom(X.disp, "_NET_WM_STATE", False);
     _NET_WM_STATE_MODAL = XInternAtom(X.disp, "_NET_WM_STATE_MODAL", False);
+    WindowState[0] = _NET_WM_STATE_MODAL;
     _NET_WM_STATE_STICKY = XInternAtom(X.disp, "_NET_WM_STATE_STICKY", False);
+    WindowState[1] = _NET_WM_STATE_STICKY;
     _NET_WM_STATE_MAXIMIZED_VERT = XInternAtom(X.disp, "_NET_WM_STATE_MAXIMIZED_VERT", False);
+    WindowState[2] = _NET_WM_STATE_MAXIMIZED_VERT;
     _NET_WM_STATE_MAXIMIZED_HORZ = XInternAtom(X.disp, "_NET_WM_STATE_MAXIMIZED_HORZ", False);
+    WindowState[3] = _NET_WM_STATE_MAXIMIZED_HORZ;
     _NET_WM_STATE_SHADED = XInternAtom(X.disp, "_NET_WM_STATE_SHADED", False);
+    WindowState[4] = _NET_WM_STATE_SHADED;
     _NET_WM_STATE_SKIP_TASKBAR = XInternAtom(X.disp, "_NET_WM_STATE_SKIP_TASKBAR", False);
+    WindowState[5] = _NET_WM_STATE_SKIP_TASKBAR;
     _NET_WM_STATE_SKIP_PAGER = XInternAtom(X.disp, "_NET_WM_STATE_SKIP_PAGER", False);
+    WindowState[6] = _NET_WM_STATE_SKIP_PAGER;
     _NET_WM_STATE_HIDDEN = XInternAtom(X.disp, "_NET_WM_STATE_HIDDEN", False);
+    WindowState[7] = _NET_WM_STATE_HIDDEN;
     _NET_WM_STATE_FULLSCREEN = XInternAtom(X.disp, "_NET_WM_STATE_FULLSCREEN", False);
+    WindowState[8] = _NET_WM_STATE_FULLSCREEN;
     _NET_WM_STATE_ABOVE = XInternAtom(X.disp, "_NET_WM_STATE_ABOVE", False);
+    WindowState[9] = _NET_WM_STATE_ABOVE;
     _NET_WM_STATE_BELOW = XInternAtom(X.disp, "_NET_WM_STATE_BELOW", False);
+    WindowState[10] = _NET_WM_STATE_BELOW;
     _NET_WM_STATE_DEMANDS_ATTENTION = XInternAtom(X.disp, "_NET_WM_STATE_DEMANDS_ATTENTION", False);
+    WindowState[11] = _NET_WM_STATE_DEMANDS_ATTENTION;
 }
diff --git a/atoms.h b/atoms.h
index bf83d0b69de1f47521c211856896ec217d1a9838..93b1eba9b2f4143ba84e03fafa4e7197e8968570 100644 (file)
--- a/atoms.h
+++ b/atoms.h
@@ -1,4 +1,3 @@
-
 extern Atom WM_STATE;
 extern Atom WM_NAME;
 extern Atom WM_ICON_NAME;
@@ -35,4 +34,7 @@ extern Atom _NET_WM_STATE_ABOVE;
 extern Atom _NET_WM_STATE_BELOW;
 extern Atom _NET_WM_STATE_DEMANDS_ATTENTION;
 
+extern Atom WindowType[8];
+extern Atom WindowState[12];
+
 void Atoms_Init(void);
diff --git a/ewmh.c b/ewmh.c
index aa9a1a9ab3673188c189772ef7e7e7308040a5a2..3e0b9aed955c2d65483d337588baefa5e7cd7ace 100644 (file)
--- a/ewmh.c
+++ b/ewmh.c
 //    NetWMWindowTypeDialog,
 //    NetClientList,
 
-static Atom* WindowTypes[] = {
-    &_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,
-};
-
-static Atom* WindowStates[] = {
-    &_NET_WM_STATE_MODAL,
-    &_NET_WM_STATE_STICKY,
-    &_NET_WM_STATE_MAXIMIZED_VERT,
-    &_NET_WM_STATE_MAXIMIZED_HORZ,
-    &_NET_WM_STATE_SHADED,
-    &_NET_WM_STATE_SKIP_TASKBAR,
-    &_NET_WM_STATE_SKIP_PAGER,
-    &_NET_WM_STATE_HIDDEN,
-    &_NET_WM_STATE_FULLSCREEN,
-    &_NET_WM_STATE_ABOVE,
-    &_NET_WM_STATE_BELOW,
-    &_NET_WM_STATE_DEMANDS_ATTENTION,
-};
+//static Atom* WindowTypes[] = {
+//    &_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,
+//};
+
+//static Atom* WindowStates[] = {
+//    &_NET_WM_STATE_MODAL,
+//    &_NET_WM_STATE_STICKY,
+//    &_NET_WM_STATE_MAXIMIZED_VERT,
+//    &_NET_WM_STATE_MAXIMIZED_HORZ,
+//    &_NET_WM_STATE_SHADED,
+//    &_NET_WM_STATE_SKIP_TASKBAR,
+//    &_NET_WM_STATE_SKIP_PAGER,
+//    &_NET_WM_STATE_HIDDEN,
+//    &_NET_WM_STATE_FULLSCREEN,
+//    &_NET_WM_STATE_ABOVE,
+//    &_NET_WM_STATE_BELOW,
+//    &_NET_WM_STATE_DEMANDS_ATTENTION,
+//};
 
 static void ReplaceProp(Window w, Atom prop, Atom type, void* elems, int nelems, int format)
 {
@@ -51,7 +51,7 @@ static void ReplaceProp(Window w, Atom prop, Atom type, void* elems, int nelems,
         nelems);
 }
 
-static int ReadFlagHint(Window w, Atom hint, Atom** known, unsigned long nknown)
+static int ReadFlagHint(Window w, Atom hint, Atom* known, unsigned long nknown)
 {
     Atom actual_type, *atoms;
     int format, flags = 0;
@@ -64,7 +64,7 @@ static int ReadFlagHint(Window w, Atom hint, Atom** known, unsigned long nknown)
     {
         for (unsigned long x = 0; x < nknown; x++)
         {
-            if (*known[x] == atoms[i])
+            if (known[x] == atoms[i])
             {
                 flags |= (1 << x);
             }
@@ -78,7 +78,7 @@ static int ReadFlagHint(Window w, Atom hint, Atom** known, unsigned long nknown)
 }
 
 
-static void WriteFlagHint(Window w, Atom hint, Atom** known, unsigned long nknown, int flags)
+static void WriteFlagHint(Window w, Atom hint, Atom* known, unsigned long nknown, int flags)
 {
     Atom* to_write = calloc(sizeof(Atom), nknown);
     int n_to_write = 0;
@@ -88,7 +88,7 @@ static void WriteFlagHint(Window w, Atom hint, Atom** known, unsigned long nknow
         {
             if (flags & (1 << i))
             {
-                to_write[n_to_write++] = *known[i];
+                to_write[n_to_write++] = known[i];
             }
         }
         ReplaceProp(w, hint, XA_ATOM, to_write, n_to_write, 32);
@@ -166,26 +166,60 @@ char* EWMH_GetName(Window w)
 int EWMH_GetWindowTypeFlags(Window w)
 {
     // Read _NET_WM_WINDOW_TYPE
-    return ReadFlagHint(w, _NET_WM_WINDOW_TYPE, WindowTypes, nelem(WindowTypes));
+    return ReadFlagHint(w, _NET_WM_WINDOW_TYPE, WindowType, nelem(WindowType));
 }
 
 int EWMH_GetWindowStateFlags(Window w)
 {
     // Read _NET_WM_STATE
-    return ReadFlagHint(w, _NET_WM_STATE, WindowStates, nelem(WindowStates));
+    return ReadFlagHint(w, _NET_WM_STATE, WindowState, nelem(WindowState));
 }
 
 void EWMH_SetWindowStateFlags(Window w, int flags)
 {
     // Write _NET_WM_STATE
-    WriteFlagHint(w, _NET_WM_STATE, WindowStates, nelem(WindowStates), flags);
+    WriteFlagHint(w, _NET_WM_STATE, WindowState, nelem(WindowState), flags);
 }
 
-void EWMH_UpdateWindowStateFlags(Window w, int op, Atom prop)
+static int GetFlagId(Atom* atoms, size_t natoms, Atom prop)
 {
-    (void)w, (void)op, (void)prop;
+    int id = -1;
+    for (size_t i = 0; i < natoms; i++)
+    {
+        if (atoms[i] == prop)
+        {
+            id = (int)i;
+            break;
+        }
+    }
+    return id;
 }
 
+void EWMH_UpdateWindowStateFlags(Window w, int op, Atom prop)
+{
+    Client* c = Client_Find(w);
+    if (c)
+    {
+        int id = GetFlagId(WindowState, nelem(WindowState), prop);
+        if (id >= 0)
+        {
+            int clearing = 0;
+            if (op == 2)
+            {
+                clearing = ((c->wm_state & (1 << id)) != 0);
+            }
+
+            if (clearing)
+            {
+                c->wm_state &= ~(1 << id);
+            }
+            else
+            {
+                c->wm_state |= (1 << id);
+            }
+        }
+    }
+}
 
 //void EWMH_GetWindowStrut(Strut* strut)
 //{
diff --git a/genatoms b/genatoms
deleted file mode 100755 (executable)
index 0055ade..0000000
--- a/genatoms
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-
-hdr="atoms.h"
-src="atoms.c"
-
-echo "" > $hdr
-echo -e "#include \"anvil.h\"" > $src
-
-while IFS= read -r line; do
-    echo "extern Atom $line;" >> "$hdr"
-    echo "Atom $line;" >> "$src"
-done < atoms
-echo "" >> "$hdr"
-echo "void Atoms_Init(void);" >> "$hdr"
-
-echo "" >> "$src"
-echo "void Atoms_Init(void) {" >> "$src"
-while IFS= read -r atom; do
-    echo "    $atom = XInternAtom(X.disp, \"$atom\", False);" >> "$src"
-done < atoms
-echo "}"  >> "$src"
\ No newline at end of file
diff --git a/genatoms.rb b/genatoms.rb
new file mode 100755 (executable)
index 0000000..d5783a8
--- /dev/null
@@ -0,0 +1,55 @@
+#!/bin/env ruby
+
+HDR=File.open("atoms.h", "wb")
+SRC=File.open("atoms.c", "wb")
+
+$atoms = {}
+$cats = {}
+
+# Read in the atoms file and get the data
+File.readlines("atoms").each do |line|
+  atom, cat = line.split
+  $atoms[atom] = cat
+  if cat then
+    $cats[cat] ||= []
+    $cats[cat] << atom
+  end
+end
+
+# Now output the header and source
+SRC.puts "#include \"anvil.h\"\n\n"
+$atoms.each do |atom,val|
+  HDR.puts "extern Atom #{atom};"
+  SRC.puts "Atom #{atom};"
+end
+HDR.puts ""
+$cats.each do |cat, vals|
+  HDR.puts "extern Atom #{cat}[#{vals.length}];"
+  SRC.puts "Atom #{cat}[#{vals.length}];"
+end
+SRC.puts ""
+HDR.puts ""
+HDR.puts "void Atoms_Init(void);"
+SRC.puts "void Atoms_Init(void)"
+SRC.puts "{"
+$atoms.each do |atom,val|
+  catname = $atoms[atom]
+  cat = $cats[catname]
+  SRC.puts "    #{atom} = XInternAtom(X.disp, \"#{atom}\", False);"
+  if $cats[$atoms[atom]]
+    SRC.puts "    #{catname}[#{cat.index(atom)}] = #{atom};"
+  end
+
+
+#  HDR.puts "extern Atom #{atom};"
+#  SRC.puts "Atom #{atom};"
+end
+
+SRC.puts "}"
+
+
+SRC
+
+
+pp $atoms
+pp $cats