diff
patches/ewmh.patch | 170 +++++++++++++++++++++++++++--------------------------
1 file changed, 86 insertions(+), 84 deletions(-)
diff --git a/patches/ewmh.patch b/patches/ewmh.patch
index d940c21..df861a6 100644
--- a/patches/ewmh.patch
+++ b/patches/ewmh.patch
@@ -1,64 +1,62 @@
--- a/wm.c
+++ b/wm.c
-@@ -1,13 +1,21 @@
+@@ -1,13 +1,19 @@
#include <X11/Xlib.h>
+#include <X11/Xatom.h>
-+#include <string.h>
-+
- #define MAX(a, b) ((a) > (b) ? (a) : (b))
- #define MODKEY Mod1Mask
- #define MAXWINS 4096
- #define CMD_WS 1
- #define CMD_MOVE 2
-+#define NUM_WS 9
+ #define max_val(a, b) ((a) > (b) ? (a) : (b))
+ #define mod_key Mod1Mask
+ #define max_windows 4096
+ #define cmd_workspace 1
+ #define cmd_move 2
++#define num_workspaces 9
- static Window wins[MAXWINS];
- static int ws[MAXWINS], nwin, curws;
+ static Window windows[max_windows];
+ static int window_workspace[max_windows], window_count, current_workspace;
+static Atom net_supported, net_number_of_desktops, net_current_desktop;
+static Atom net_active_window, net_client_list, net_wm_desktop;
+static Atom net_supporting_wm_check, net_wm_name, utf8_string;
-+static Window wmcheck;
++static Window wm_check_window;
static int
- getidx(Window w)
-@@ -25,6 +33,72 @@
+ get_window_index(Window window)
+@@ -54,6 +60,72 @@
}
static void
-+setcardinal(Display *dpy, Window w, Atom a, unsigned long v)
++set_cardinal(Display *display, Window window, Atom atom, unsigned long value)
+{
-+ XChangeProperty(dpy, w, a, XA_CARDINAL, 32, PropModeReplace,
-+ (unsigned char *)&v, 1);
++ XChangeProperty(display, window, atom, XA_CARDINAL, 32, PropModeReplace,
++ (unsigned char *)&value, 1);
+}
+
+static void
-+setwindow(Display *dpy, Window w, Atom a, Window v)
++set_window(Display *display, Window window, Atom atom, Window value)
+{
-+ XChangeProperty(dpy, w, a, XA_WINDOW, 32, PropModeReplace,
-+ (unsigned char *)&v, 1);
++ XChangeProperty(display, window, atom, XA_WINDOW, 32, PropModeReplace,
++ (unsigned char *)&value, 1);
+}
+
+static void
-+ewmhinit(Display *dpy, Window root)
++ewmh_init(Display *display, Window root_window)
+{
+ Atom supported[7];
-+ char name[] = "wm";
++ char wm_name[] = "wm";
+
-+ net_supported = XInternAtom(dpy, "_NET_SUPPORTED", False);
-+ net_number_of_desktops = XInternAtom(dpy, "_NET_NUMBER_OF_DESKTOPS", False);
-+ net_current_desktop = XInternAtom(dpy, "_NET_CURRENT_DESKTOP", False);
-+ net_active_window = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False);
-+ net_client_list = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
-+ net_wm_desktop = XInternAtom(dpy, "_NET_WM_DESKTOP", False);
-+ net_supporting_wm_check = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
-+ net_wm_name = XInternAtom(dpy, "_NET_WM_NAME", False);
-+ utf8_string = XInternAtom(dpy, "UTF8_STRING", False);
-+ wmcheck = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0);
-+ setwindow(dpy, root, net_supporting_wm_check, wmcheck);
-+ setwindow(dpy, wmcheck, net_supporting_wm_check, wmcheck);
-+ XChangeProperty(dpy, wmcheck, net_wm_name, utf8_string, 8, PropModeReplace,
-+ (unsigned char *)name, (int)(sizeof(name) - 1));
++ net_supported = XInternAtom(display, "_NET_SUPPORTED", False);
++ net_number_of_desktops = XInternAtom(display, "_NET_NUMBER_OF_DESKTOPS", False);
++ net_current_desktop = XInternAtom(display, "_NET_CURRENT_DESKTOP", False);
++ net_active_window = XInternAtom(display, "_NET_ACTIVE_WINDOW", False);
++ net_client_list = XInternAtom(display, "_NET_CLIENT_LIST", False);
++ net_wm_desktop = XInternAtom(display, "_NET_WM_DESKTOP", False);
++ net_supporting_wm_check = XInternAtom(display, "_NET_SUPPORTING_WM_CHECK", False);
++ net_wm_name = XInternAtom(display, "_NET_WM_NAME", False);
++ utf8_string = XInternAtom(display, "UTF8_STRING", False);
++ wm_check_window = XCreateSimpleWindow(display, root_window, 0, 0, 1, 1, 0, 0, 0);
++ set_window(display, root_window, net_supporting_wm_check, wm_check_window);
++ set_window(display, wm_check_window, net_supporting_wm_check, wm_check_window);
++ XChangeProperty(display, wm_check_window, net_wm_name, utf8_string, 8,
++ PropModeReplace, (unsigned char *)wm_name, (int)(sizeof(wm_name) - 1));
+ supported[0] = net_number_of_desktops;
+ supported[1] = net_current_desktop;
+ supported[2] = net_active_window;
@@ -66,75 +64,79 @@
+ supported[4] = net_wm_desktop;
+ supported[5] = net_supporting_wm_check;
+ supported[6] = net_wm_name;
-+ XChangeProperty(dpy, root, net_supported, XA_ATOM, 32, PropModeReplace,
-+ (unsigned char *)supported, 7);
-+ setcardinal(dpy, root, net_number_of_desktops, NUM_WS);
-+ setcardinal(dpy, root, net_current_desktop, 0);
-+ setwindow(dpy, root, net_active_window, None);
++ XChangeProperty(display, root_window, net_supported, XA_ATOM, 32,
++ PropModeReplace, (unsigned char *)supported, 7);
++ set_cardinal(display, root_window, net_number_of_desktops, num_workspaces);
++ set_cardinal(display, root_window, net_current_desktop, 0);
++ set_window(display, root_window, net_active_window, None);
+}
+
+static void
-+ewmhsync(Display *dpy, Window root)
++ewmh_sync(Display *display, Window root_window)
+{
+ unsigned long desktop;
+ int i;
+
-+ if (nwin > 0)
-+ XChangeProperty(dpy, root, net_client_list, XA_WINDOW, 32, PropModeReplace,
-+ (unsigned char *)wins, nwin);
++ if (window_count > 0)
++ XChangeProperty(display, root_window, net_client_list, XA_WINDOW, 32,
++ PropModeReplace, (unsigned char *)windows, window_count);
+ else
-+ XDeleteProperty(dpy, root, net_client_list);
-+ for (i = 0; i < nwin; i++) {
-+ desktop = (unsigned long)ws[i];
-+ XChangeProperty(dpy, wins[i], net_wm_desktop, XA_CARDINAL, 32,
++ XDeleteProperty(display, root_window, net_client_list);
++ for (i = 0; i < window_count; i++) {
++ desktop = (unsigned long)window_workspace[i];
++ XChangeProperty(display, windows[i], net_wm_desktop, XA_CARDINAL, 32,
+ PropModeReplace, (unsigned char *)&desktop, 1);
+ }
+}
+
+static void
- showws(Display *dpy, Window root)
+ show_workspace(Display *display, Window root_window)
{
- Window rootret, parent, *children;
-@@ -66,6 +140,8 @@
-
- root = DefaultRootWindow(dpy);
- ctl = XInternAtom(dpy, "_WM_CTL", False);
-+ ewmhinit(dpy, root);
-+ ewmhsync(dpy, root);
+ Window root_return, parent, *children;
+@@ -97,6 +169,8 @@
+ control_atom = XInternAtom(display, "_WM_CTL", False);
+ XSelectInput(display, root_window, SubstructureNotifyMask);
+ track_windows(display, root_window);
++ ewmh_init(display, root_window);
++ ewmh_sync(display, root_window);
- XGrabButton(dpy, 1, MODKEY, root, True, ButtonPressMask, GrabModeAsync,
+ XGrabButton(display, 1, mod_key, root_window, True, ButtonPressMask, GrabModeAsync,
GrabModeAsync, None, None);
-@@ -76,25 +152,32 @@
- XNextEvent(dpy, &ev);
- if (ev.type == ClientMessage && ev.xclient.message_type == ctl) {
- i = (int)ev.xclient.data.l[1];
+@@ -107,29 +181,36 @@
+ XNextEvent(display, &event);
+ if (event.type == ClientMessage && event.xclient.message_type == control_atom) {
+ i = (int)event.xclient.data.l[1];
- if (i >= 0 && i < 9) {
-+ if (i >= 0 && i < NUM_WS) {
- if (ev.xclient.data.l[0] == CMD_WS && i != curws) {
- curws = i;
- showws(dpy, root);
-+ setcardinal(dpy, root, net_current_desktop,
-+ (unsigned long)curws);
-+ ewmhsync(dpy, root);
- } else if (ev.xclient.data.l[0] == CMD_MOVE) {
- XGetInputFocus(dpy, &focus, &j);
-+ setwindow(dpy, root, net_active_window, focus);
- j = getidx(focus);
++ if (i >= 0 && i < num_workspaces) {
+ if (event.xclient.data.l[0] == cmd_workspace && i != current_workspace) {
+ track_windows(display, root_window);
+ current_workspace = i;
+ show_workspace(display, root_window);
++ set_cardinal(display, root_window, net_current_desktop,
++ (unsigned long)current_workspace);
++ ewmh_sync(display, root_window);
+ } else if (event.xclient.data.l[0] == cmd_move) {
+ XGetInputFocus(display, &focused_window, &j);
+ if (!is_root_child(display, root_window, focused_window))
+ continue;
++ set_window(display, root_window, net_active_window, focused_window);
+ j = get_window_index(focused_window);
if (j >= 0) {
- ws[j] = i;
- if (i != curws)
- XUnmapWindow(dpy, focus);
-+ ewmhsync(dpy, root);
+ window_workspace[j] = i;
+ if (i != current_workspace)
+ XUnmapWindow(display, focused_window);
++ ewmh_sync(display, root_window);
}
}
}
- } else if (ev.type == ButtonPress && ev.xbutton.subwindow != None) {
- dragwin = ev.xbutton.subwindow;
-+ setwindow(dpy, root, net_active_window, dragwin);
- j = getidx(dragwin);
+ } else if (event.type == ButtonPress && event.xbutton.subwindow != None) {
+ drag_window = event.xbutton.subwindow;
++ set_window(display, root_window, net_active_window, drag_window);
+ XSetInputFocus(display, drag_window, RevertToPointerRoot, CurrentTime);
+ j = get_window_index(drag_window);
if (j >= 0)
- ws[j] = curws;
-+ ewmhsync(dpy, root);
- XGrabPointer(dpy, dragwin, True,
+ window_workspace[j] = current_workspace;
++ ewmh_sync(display, root_window);
+ XGrabPointer(display, drag_window, True,
PointerMotionMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None, CurrentTime);