dwm-keybindings-6.5.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
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 {