dwm-keybindings-6.5.diff (4787B)
1 diff --git a/config.def.h b/config.def.h 2 index 9efa774..5ca4a0d 100644 3 --- a/config.def.h 4 +++ b/config.def.h 5 @@ -51,6 +51,8 @@ static const Layout layouts[] = { 6 { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ 7 { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ 8 { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, 9 +#define KEYEVENT(SRC_MOD,SRC_KEY,DST_MOD,DST_KEY) \ 10 + { SRC_MOD, SRC_KEY, sendkeyevent, { .v = &(const KeyBinding){ DST_MOD, DST_KEY } } }, 11 12 /* helper for spawning shell commands in the pre dwm-5.0 fashion */ 13 #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } 14 @@ -85,6 +87,43 @@ static const Key keys[] = { 15 { MODKEY, XK_period, focusmon, {.i = +1 } }, 16 { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, 17 { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, 18 + // Navigation(two-handed) 19 + KEYEVENT(Mod1Mask, XK_h, 0, XK_Left) 20 + KEYEVENT(Mod1Mask, XK_l, 0, XK_Right) 21 + KEYEVENT(Mod1Mask, XK_k, 0, XK_Up) 22 + KEYEVENT(Mod1Mask, XK_j, 0, XK_Down) 23 + KEYEVENT(Mod1Mask, XK_p, 0, XK_Up) 24 + KEYEVENT(Mod1Mask, XK_n, 0, XK_Down) 25 + KEYEVENT(Mod1Mask, XK_i, ControlMask, XK_Left) 26 + KEYEVENT(Mod1Mask, XK_o, ControlMask, XK_Right) 27 + KEYEVENT(Mod1Mask, XK_equal, ControlMask, XK_Home) 28 + KEYEVENT(Mod1Mask, XK_minus, ControlMask, XK_End) 29 + // Navigation(one-handed) 30 + KEYEVENT(Mod1Mask, XK_s, 0, XK_Up) 31 + KEYEVENT(Mod1Mask, XK_x, 0, XK_Down) 32 + KEYEVENT(Mod1Mask, XK_z, 0, XK_Left) 33 + KEYEVENT(Mod1Mask, XK_c, 0, XK_Right) 34 + KEYEVENT(Mod1Mask, XK_d, 0, XK_Return) 35 + KEYEVENT(Mod1Mask, XK_a, 0, XK_Home) 36 + KEYEVENT(Mod1Mask, XK_e, 0, XK_End) 37 + // Selection(two-handed) 38 + KEYEVENT(Mod1Mask|ShiftMask, XK_h, ShiftMask, XK_Left) 39 + KEYEVENT(Mod1Mask|ShiftMask, XK_l, ShiftMask, XK_Right) 40 + KEYEVENT(Mod1Mask|ShiftMask, XK_k, ShiftMask, XK_Up) 41 + KEYEVENT(Mod1Mask|ShiftMask, XK_j, ShiftMask, XK_Down) 42 + KEYEVENT(Mod1Mask|ShiftMask, XK_p, ShiftMask, XK_Up) 43 + KEYEVENT(Mod1Mask|ShiftMask, XK_n, ShiftMask, XK_Down) 44 + KEYEVENT(Mod1Mask|ShiftMask, XK_i, ControlMask|ShiftMask, XK_Left) 45 + KEYEVENT(Mod1Mask|ShiftMask, XK_o, ControlMask|ShiftMask, XK_Right) 46 + KEYEVENT(Mod1Mask|ShiftMask, XK_equal, ControlMask|ShiftMask, XK_Home) 47 + KEYEVENT(Mod1Mask|ShiftMask, XK_minus, ControlMask|ShiftMask, XK_End) 48 + // Selection(one-handed) 49 + KEYEVENT(Mod1Mask|ShiftMask, XK_s, ShiftMask, XK_Up) 50 + KEYEVENT(Mod1Mask|ShiftMask, XK_x, ShiftMask, XK_Down) 51 + KEYEVENT(Mod1Mask|ShiftMask, XK_z, ShiftMask, XK_Left) 52 + KEYEVENT(Mod1Mask|ShiftMask, XK_c, ShiftMask, XK_Right) 53 + KEYEVENT(Mod1Mask|ShiftMask, XK_a, ShiftMask, XK_Home) 54 + KEYEVENT(Mod1Mask|ShiftMask, XK_e, ShiftMask, XK_End) 55 TAGKEYS( XK_1, 0) 56 TAGKEYS( XK_2, 1) 57 TAGKEYS( XK_3, 2) 58 diff --git a/dwm.c b/dwm.c 59 index 67c6b2b..b7c911d 100644 60 --- a/dwm.c 61 +++ b/dwm.c 62 @@ -106,6 +106,11 @@ typedef struct { 63 const Arg arg; 64 } Key; 65 66 +typedef struct { 67 + unsigned int mod; 68 + KeySym keysym; 69 +} KeyBinding; 70 + 71 typedef struct { 72 const char *symbol; 73 void (*arrange)(Monitor *); 74 @@ -196,6 +201,7 @@ static void restack(Monitor *m); 75 static void run(void); 76 static void scan(void); 77 static int sendevent(Client *c, Atom proto); 78 +static void sendkeyevent(const Arg *arg); 79 static void sendmon(Client *c, Monitor *m); 80 static void setclientstate(Client *c, long state); 81 static void setfocus(Client *c); 82 @@ -1467,6 +1473,47 @@ sendevent(Client *c, Atom proto) 83 return exists; 84 } 85 86 +XKeyEvent 87 +createkeyevent(Display *display, Window win, Window rootWindow, int type, KeyBinding *keyBinding) 88 +{ 89 + int keysym = keyBinding->keysym; 90 + unsigned int modifier = keyBinding->mod; 91 + 92 + XKeyEvent event; 93 + event.type = type; 94 + event.display = display; 95 + event.window = win; 96 + event.root = rootWindow; 97 + event.subwindow = None; 98 + event.time = CurrentTime; 99 + event.x = 1; 100 + event.y = 1; 101 + event.x_root = 1; 102 + event.y_root = 1; 103 + event.same_screen = True; 104 + event.keycode = XKeysymToKeycode(display, keysym); 105 + event.state = modifier; 106 + 107 + return event; 108 +} 109 + 110 +void sendkeyevent(const Arg *arg) 111 +{ 112 + Window rootWindow = XDefaultRootWindow(dpy); 113 + 114 + Window focusedWindow; 115 + int revert; 116 + XGetInputFocus(dpy, &focusedWindow, &revert); 117 + 118 + KeyBinding *keyBinding = (KeyBinding *)arg->v; 119 + 120 + XKeyEvent event = createkeyevent(dpy, focusedWindow, rootWindow, KeyPress, keyBinding); 121 + XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); 122 + 123 + event = createkeyevent(dpy, focusedWindow, rootWindow, KeyRelease, keyBinding); 124 + XSendEvent(event.display, event.window, True, KeyReleaseMask, (XEvent *)&event); 125 +} 126 + 127 void 128 setfocus(Client *c) 129 {