commit 550f8a99501b5c3da55db695f0c1e9cf9886c42e from: Brett Fisher date: Thu May 14 22:33:04 2026 UTC bxwm.c: Decouple key handling logic from the window manager. - Remove X11/keysym.h header - Remove Keycode caching in main() - Remove KeyPress event handling in main() - Remove XGrabKey calls in setup() commit - 3b54925cbf35d15232908b7ff996ef354d5b4fab commit + 550f8a99501b5c3da55db695f0c1e9cf9886c42e blob - 0812932392a17514093d9fe4d36951657c2a5705 blob + 0feff2eab7eeed776d0b24f30c480b36896208fd --- bxwm.c +++ bxwm.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include "config.h" @@ -109,32 +108,9 @@ main(int argc, char *argv[]) fds[1].fd = server_fd; fds[1].events = POLLIN; - // 3. User configuration/setup (key grabs, etc) + // 3. User configuration/setup setup(); - /* Cache keycodes */ - KeyCode kcodes[11]; - KeyCode ws_codes[10]; - int i, w; - - for (i = 0; i < 11; i++) - kcodes[i] = XKeysymToKeycode(dpy, XStringToKeysym( - i == 0 ? "Return" : - i == 1 ? "Q" : - i == 2 ? "C" : - i == 3 ? "H" : - i == 4 ? "L" : - i == 5 ? "S" : - i == 6 ? "M" : - i == 7 ? "J" : - i == 8 ? "K" : - i == 9 ? "X" : "P")); - - for (w = 0; w < 10; w++) { - KeySym ks = (w == 9) ? XK_0 : (XK_1 + w); - ws_codes[w] = XKeysymToKeycode(dpy, ks); - } - running = 1; // 4. Main Loop @@ -148,79 +124,7 @@ main(int argc, char *argv[]) if (fds[0].revents & POLLIN) { while (XPending(dpy)) { XNextEvent(dpy, &ev); - if (ev.type == KeyPress) { - /* Workspace view keys */ - for (w = 0; w < 10; w++) { - if (ev.xkey.keycode == ws_codes[w] && - (ev.xkey.state & Mod4Mask) && - !(ev.xkey.state & ShiftMask)) { - view(w); - goto processed; - } - } - /* Workspace move keys */ - for (w = 0; w < 10; w++) { - if (ev.xkey.keycode == ws_codes[w] && - (ev.xkey.state & (Mod4Mask | ShiftMask)) == - (Mod4Mask | ShiftMask)) { - movetows(w); - goto processed; - } - } - /* Action keys */ - for (i = 0; i < 11; i++) { - if (ev.xkey.keycode == kcodes[i]) { - switch (i) { - case 0: - if ((ev.xkey.state & (ShiftMask | Mod1Mask)) == (ShiftMask | Mod1Mask)) - spawn(TERMINAL); - break; - case 1: - if ((ev.xkey.state & (ControlMask | ShiftMask)) == (ControlMask | ShiftMask)) - cleanup(0); - break; - case 2: - if ((ev.xkey.state & (ControlMask | Mod1Mask)) == (ControlMask | Mod1Mask)) - center_window(focused_client); - break; - case 3: - if ((ev.xkey.state & (ControlMask | Mod1Mask)) == (ControlMask | Mod1Mask)) - left_half_window(focused_client); - break; - case 4: - if ((ev.xkey.state & (ControlMask | Mod1Mask)) == (ControlMask | Mod1Mask)) - right_half_window(focused_client); - break; - case 5: - if ((ev.xkey.state & (ControlMask | Mod1Mask)) == (ControlMask | Mod1Mask)) - small_window(focused_client); - break; - case 6: - if ((ev.xkey.state & (ControlMask | Mod1Mask)) == (ControlMask | Mod1Mask)) - maximize_window(focused_client); - break; - case 7: - if ((ev.xkey.state & (ControlMask | Mod1Mask)) == (ControlMask | Mod1Mask)) - focus_next(); - break; - case 8: - if ((ev.xkey.state & (ControlMask | Mod1Mask)) == (ControlMask | Mod1Mask)) - focus_prev(); - break; - case 9: - if ((ev.xkey.state & (ControlMask | Mod1Mask)) == (ControlMask | Mod1Mask)) - close_window(focused_client); - break; - case 10: - if ((ev.xkey.state & (ShiftMask | Mod1Mask)) == (ShiftMask | Mod1Mask)) - spawn(LAUNCHPROGRAM); - break; - } - goto processed; - } - } - processed:; - } else if (ev.type == MapRequest) { + if (ev.type == MapRequest) { manage(ev.xmaprequest.window); } else if (ev.type == DestroyNotify) { unmanage(ev.xdestroywindow.window); @@ -312,28 +216,7 @@ setup(void) { XSetWindowAttributes wa; Colormap cmap = DefaultColormap(dpy, DefaultScreen(dpy)); XColor color; - KeyCode keycodes[] = { - XKeysymToKeycode(dpy, XStringToKeysym("Return")), - XKeysymToKeycode(dpy, XStringToKeysym("Q")), - XKeysymToKeycode(dpy, XStringToKeysym("C")), - XKeysymToKeycode(dpy, XStringToKeysym("H")), - XKeysymToKeycode(dpy, XStringToKeysym("L")), - XKeysymToKeycode(dpy, XStringToKeysym("S")), - XKeysymToKeycode(dpy, XStringToKeysym("M")), - XKeysymToKeycode(dpy, XStringToKeysym("J")), - XKeysymToKeycode(dpy, XStringToKeysym("K")), - XKeysymToKeycode(dpy, XStringToKeysym("X")), - XKeysymToKeycode(dpy, XStringToKeysym("P")) - }; - KeyCode ws_codes[10]; - int w; - - for (w = 0; w < 10; w++) { - KeySym ks = (w == 9) ? XK_0 : (XK_1 + w); - ws_codes[w] = XKeysymToKeycode(dpy, ks); - } - screen = DefaultScreen(dpy); screen_w = DisplayWidth(dpy, screen); screen_h = DisplayHeight(dpy, screen); @@ -377,26 +260,6 @@ setup(void) { XDefineCursor(dpy, root, cursor); XFreeCursor(dpy, cursor); - /* Key grabs */ - XGrabKey(dpy, keycodes[0], ShiftMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Shift+Alt+Enter: terminal */ - XGrabKey(dpy, keycodes[1], ControlMask | ShiftMask, root, True, GrabModeAsync, GrabModeAsync); /* Ctrl+Shift+Q: quit */ - XGrabKey(dpy, keycodes[2], ControlMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Ctrl+Alt+C: center */ - XGrabKey(dpy, keycodes[3], ControlMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Ctrl+Alt+H: left */ - XGrabKey(dpy, keycodes[4], ControlMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Ctrl+Alt+L: right */ - XGrabKey(dpy, keycodes[5], ControlMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Ctrl+Alt+S: small */ - XGrabKey(dpy, keycodes[6], ControlMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Ctrl+Alt+M: maximize */ - XGrabKey(dpy, keycodes[7], ControlMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Ctrl+Alt+J: next */ - XGrabKey(dpy, keycodes[8], ControlMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Ctrl+Alt+K: prev */ - XGrabKey(dpy, keycodes[9], ControlMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Ctrl+Alt+X: close */ - XGrabKey(dpy, keycodes[10], ShiftMask | Mod1Mask, root, True, GrabModeAsync, GrabModeAsync); /* Shift+Alt+P: launchprograms script */ - - for (w = 0; w < 10; w++) { - XGrabKey(dpy, ws_codes[w], Mod4Mask, root, True, - GrabModeAsync, GrabModeAsync); /* Super+N: view */ - XGrabKey(dpy, ws_codes[w], Mod4Mask | ShiftMask, - root, True, GrabModeAsync, GrabModeAsync); /* Super+Shift+N: move */ - } - /* Intern EWMH/ICCCM atoms */ net_supported = XInternAtom(dpy, "_NET_SUPPORTED", False); net_number_of_desktops = XInternAtom(dpy, "_NET_NUMBER_OF_DESKTOPS", False);