From: Mike Lowis Date: Mon, 12 Aug 2024 20:22:10 +0000 (-0400) Subject: switched to ruby for genatoms script to allow for fancier logic. Know generate flag... X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=61b816fc9c674f10cb189c8db329789084e329f6;p=proto%2Fanvil.git switched to ruby for genatoms script to allow for fancier logic. Know generate flag sets --- diff --git a/atoms b/atoms index 3db2a50..f7799e5 100644 --- 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 2e9e98f..4f52290 100644 --- 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 bf83d0b..93b1eba 100644 --- 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 aa9a1a9..3e0b9ae 100644 --- a/ewmh.c +++ b/ewmh.c @@ -11,32 +11,32 @@ // 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 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 index 0000000..d5783a8 --- /dev/null +++ b/genatoms.rb @@ -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