_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
#include "anvil.h"
+
Atom WM_STATE;
Atom WM_NAME;
Atom WM_ICON_NAME;
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);
_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;
}
-
extern Atom WM_STATE;
extern Atom WM_NAME;
extern Atom WM_ICON_NAME;
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);
// 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)
{
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;
{
for (unsigned long x = 0; x < nknown; x++)
{
- if (*known[x] == atoms[i])
+ if (known[x] == atoms[i])
{
flags |= (1 << x);
}
}
-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;
{
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);
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)
//{
+++ /dev/null
-#!/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
--- /dev/null
+#!/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