On 230924-093006, Hiltjo Posthuma 'hil...@codemadness.org' wrote: > > >On Sun, Sep 24, 2023 at 05:34:48AM +0000, suiso67@macadamia.rocks wrote: >> From: suiso67 <suiso67@macadamia.rocks> >> >> --- >> config.def.h | 43 +++++++++++++++++++++++++++++++++++++++++++ >> dwm.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 90 insertions(+) >> >> diff --git a/config.def.h b/config.def.h >> index 061ad66..98ff36f 100644 >> --- a/config.def.h >> +++ b/config.def.h >> @@ -51,6 +51,8 @@ static const Layout layouts[] = { >> { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << >> TAG} }, \ >> { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << >> TAG} }, \ >> { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << >> TAG} }, >> +#define KEYEVENT(SRC_MOD,SRC_KEY,DST_MOD,DST_KEY) \ >> + { SRC_MOD, SRC_KEY, sendkeyevent, { .v = &(const KeyShortcut){ DST_MOD, >> DST_KEY } } }, >> >> /* helper for spawning shell commands in the pre dwm-5.0 fashion */ >> #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } >> @@ -84,6 +86,47 @@ static const Key keys[] = { >> { MODKEY, XK_period, focusmon, {.i = +1 } }, >> { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, >> { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, >> + // Navigation(two-handed) >> + KEYEVENT(Mod1Mask, XK_h, 0, XK_Left) >> + KEYEVENT(Mod1Mask, XK_l, 0, XK_Right) >> + KEYEVENT(Mod1Mask, XK_k, 0, XK_Up) >> + KEYEVENT(Mod1Mask, XK_j, 0, XK_Down) >> + KEYEVENT(Mod1Mask, XK_p, 0, XK_Up) >> + KEYEVENT(Mod1Mask, XK_n, 0, XK_Down) >> + KEYEVENT(Mod1Mask, XK_i, ControlMask, XK_Left) >> + KEYEVENT(Mod1Mask, XK_o, ControlMask, XK_Right) >> + KEYEVENT(Mod1Mask, XK_q, ControlMask, XK_Left) >> + KEYEVENT(Mod1Mask, XK_w, ControlMask, XK_Right) >> + KEYEVENT(Mod1Mask, XK_equal, ControlMask, XK_Home) >> + KEYEVENT(Mod1Mask, XK_minus, ControlMask, XK_End) >> + // Navigation(one-handed) >> + KEYEVENT(Mod1Mask, XK_s, 0, XK_Up) >> + KEYEVENT(Mod1Mask, XK_x, 0, XK_Down) >> + KEYEVENT(Mod1Mask, XK_z, 0, XK_Left) >> + KEYEVENT(Mod1Mask, XK_c, 0, XK_Right) >> + KEYEVENT(Mod1Mask, XK_d, 0, XK_Return) >> + KEYEVENT(Mod1Mask, XK_a, 0, XK_Home) >> + KEYEVENT(Mod1Mask, XK_e, 0, XK_End) >> + // Selection(two-handed) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_h, ShiftMask, XK_Left) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_l, ShiftMask, XK_Right) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_k, ShiftMask, XK_Up) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_j, ShiftMask, XK_Down) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_p, ShiftMask, XK_Up) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_n, ShiftMask, XK_Down) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_i, ControlMask|ShiftMask, XK_Left) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_o, ControlMask|ShiftMask, XK_Right) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_equal, ControlMask|ShiftMask, XK_Home) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_minus, ControlMask|ShiftMask, XK_End) >> + // Selection(one-handed) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_s, ShiftMask, XK_Up) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_x, ShiftMask, XK_Down) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_z, ShiftMask, XK_Left) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_c, ShiftMask, XK_Right) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_q, ControlMask|ShiftMask, XK_Left) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_w, ControlMask|ShiftMask, XK_Right) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_a, ShiftMask, XK_Home) >> + KEYEVENT(Mod1Mask|ShiftMask, XK_e, ShiftMask, XK_End) >> TAGKEYS( XK_1, 0) >> TAGKEYS( XK_2, 1) >> TAGKEYS( XK_3, 2) >> diff --git a/dwm.c b/dwm.c >> index e5efb6a..6988c77 100644 >> --- a/dwm.c >> +++ b/dwm.c >> @@ -106,6 +106,11 @@ typedef struct { >> const Arg arg; >> } Key; >> >> +typedef struct { >> + unsigned int mod; >> + KeySym keysym; >> +} KeyShortcut; >> + >> typedef struct { >> const char *symbol; >> void (*arrange)(Monitor *); >> @@ -196,6 +201,7 @@ static void restack(Monitor *m); >> static void run(void); >> static void scan(void); >> static int sendevent(Client *c, Atom proto); >> +static void sendkeyevent(const Arg *arg); >> static void sendmon(Client *c, Monitor *m); >> static void setclientstate(Client *c, long state); >> static void setfocus(Client *c); >> @@ -1458,6 +1464,47 @@ sendevent(Client *c, Atom proto) >> return exists; >> } >> >> +XKeyEvent >> +createkeyevent(Display *display, Window win, Window rootWindow, int type, >> KeyShortcut *keyShortcut) >> +{ >> + int keysym = keyShortcut->keysym; >> + unsigned int modifier = keyShortcut->mod; >> + >> + XKeyEvent event; >> + event.type = type; >> + event.display = display; >> + event.window = win; >> + event.root = rootWindow; >> + event.subwindow = None; >> + event.time = CurrentTime; >> + event.x = 1; >> + event.y = 1; >> + event.x_root = 1; >> + event.y_root = 1; >> + event.same_screen = True; >> + event.keycode = XKeysymToKeycode(display, keysym); >> + event.state = modifier; >> + >> + return event; >> +} >> + >> +void sendkeyevent(const Arg *arg) >> +{ >> + Window rootWindow = XDefaultRootWindow(dpy); >> + >> + Window focusedWindow; >> + int revert; >> + XGetInputFocus(dpy, &focusedWindow, &revert); >> + >> + KeyShortcut *keyShortcut = (KeyShortcut *)arg->v; >> + >> + XKeyEvent event = createkeyevent(dpy, focusedWindow, rootWindow, >> KeyPress, keyShortcut); >> + XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent >> *)&event); >> + >> + event = createkeyevent(dpy, focusedWindow, rootWindow, KeyRelease, >> keyShortcut); >> + XSendEvent(event.display, event.window, True, KeyReleaseMask, (XEvent >> *)&event); >> +} >> + >> void >> setfocus(Client *c) >> { >> -- >> 2.42.0 >> >> >> > >Hi, > >You can upload it to the wiki if you want, > >-- >Kind regards, >Hiltjo > > >
Sorry for interrupting, I mistook the word "patch" and thought I should send this to here. Thank you for letting me know.