git.strcat.st

/strcat/wm.git/ - summarytreelogarchivereleases

subject
fix EWMH patch
commit
854967866c0cc121c16355b66f60f1d94a6157b1
date
2026-04-21T16:11:33Z
message
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);