From 48176963e1dc6312fa28d9b14e2a02833a657b08 Mon Sep 17 00:00:00 2001 From: Solomon Laing Date: Fri, 18 Apr 2025 21:39:15 +0930 Subject: [PATCH] patched keychord, bye bye keychain :( --- dwm.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/dwm.c b/dwm.c index 6e5ba4f..95fbbfe 100644 --- a/dwm.c +++ b/dwm.c @@ -117,9 +117,14 @@ struct Client { typedef struct { unsigned int mod; KeySym keysym; +} Key; + +typedef struct { + unsigned int n; + const Key keys[5]; void (*func)(const Arg *); const Arg arg; -} Key; +} Keychord; typedef struct { const char *symbol; @@ -312,6 +317,7 @@ static Display *dpy; static Drw *drw; static Monitor *mons, *selmon; static Window root, wmcheckwin; +unsigned int currentkey = 0; /* configuration, allows nested code to access above variables */ #include "config.h" @@ -1180,7 +1186,8 @@ grabkeys(void) { updatenumlockmask(); { - unsigned int i, j, k; + /* unsigned int i, j, k; */ + unsigned int i, c, k; unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; int start, end, skip; KeySym *syms; @@ -1190,15 +1197,18 @@ grabkeys(void) syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip); if (!syms) return; + for (k = start; k <= end; k++) - for (i = 0; i < LENGTH(keys); i++) + for (i = 0; i < LENGTH(keychords); i++) /* skip modifier codes, we do that ourselves */ - if (keys[i].keysym == syms[(k - start) * skip]) - for (j = 0; j < LENGTH(modifiers); j++) + if (keychords[i]->keys[currentkey].keysym == syms[(k - start) * skip]) + for (c = 0; c < LENGTH(modifiers); c++) XGrabKey(dpy, k, - keys[i].mod | modifiers[j], + keychords[i]->keys[currentkey].mod | modifiers[c], root, True, GrabModeAsync, GrabModeAsync); + if(currentkey > 0) + XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Escape), AnyModifier, root, True, GrabModeAsync, GrabModeAsync); XFree(syms); } } @@ -1225,17 +1235,51 @@ isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) void keypress(XEvent *e) { - unsigned int i; + /* unsigned int i; */ + XEvent event = *e; + unsigned int ran = 0; KeySym keysym; XKeyEvent *ev; - ev = &e->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for (i = 0; i < LENGTH(keys); i++) - if (keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) - keys[i].func(&(keys[i].arg)); + Keychord *arr1[sizeof(keychords) / sizeof(Keychord*)]; + Keychord *arr2[sizeof(keychords) / sizeof(Keychord*)]; + memcpy(arr1, keychords, sizeof(keychords)); + Keychord **rpointer = arr1; + Keychord **wpointer = arr2; + + size_t r = sizeof(keychords)/ sizeof(Keychord*); + + while(1){ + ev = &event.xkey; + keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); + size_t w = 0; + for (int i = 0; i < r; i++){ + if(keysym == (*(rpointer + i))->keys[currentkey].keysym + && CLEANMASK((*(rpointer + i))->keys[currentkey].mod) == CLEANMASK(ev->state) + && (*(rpointer + i))->func){ + if((*(rpointer + i))->n == currentkey +1){ + (*(rpointer + i))->func(&((*(rpointer + i))->arg)); + ran = 1; + }else{ + *(wpointer + w) = *(rpointer + i); + w++; + } + } + } + currentkey++; + if(w == 0 || ran == 1) + break; + grabkeys(); + while (running && !XNextEvent(dpy, &event) && !ran) + if(event.type == KeyPress) + break; + r = w; + Keychord **holder = rpointer; + rpointer = wpointer; + wpointer = holder; + } + currentkey = 0; + grabkeys(); } void