dwm-holdbar-modkey-6.2.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-holdbar-modkey-6.2.diff (4866B) | |
--- | |
1 From 1004b9406e4b89448cf9d3b18955dbd0d55a571d Mon Sep 17 00:00:00 2001 | |
2 From: bakkeby <[email protected]> | |
3 Date: Wed, 1 Jul 2020 08:05:35 +0200 | |
4 Subject: [PATCH] holdbar: variant of the patch where holdbar is only act… | |
5 when the bar is toggled off | |
6 | |
7 Additionally this allows the use of the primary MOD key to be used as th… | |
8 still allowing the bar to be toggled on and off using MOD+b. This gives … | |
9 flexible feel when using this functionality. | |
10 | |
11 Use xev to find the keysym for the key that you want to use and add/upda… | |
12 definition in config.h. | |
13 | |
14 E.g. using Alt_L as the HOLDKEY | |
15 --- | |
16 config.def.h | 2 ++ | |
17 dwm.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- | |
18 2 files changed, 52 insertions(+), 1 deletion(-) | |
19 | |
20 diff --git a/config.def.h b/config.def.h | |
21 index 1c0b587..8611189 100644 | |
22 --- a/config.def.h | |
23 +++ b/config.def.h | |
24 @@ -50,6 +50,7 @@ static const Layout layouts[] = { | |
25 { MODKEY|ControlMask, KEY, toggleview, {.ui … | |
26 { MODKEY|ShiftMask, KEY, tag, {.ui … | |
27 { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui … | |
28 +#define HOLDKEY 0 // replace 0 with the keysym to activate holdbar | |
29 | |
30 /* helper for spawning shell commands in the pre dwm-5.0 fashion */ | |
31 #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL }… | |
32 @@ -94,6 +95,7 @@ static Key keys[] = { | |
33 TAGKEYS( XK_8, 7) | |
34 TAGKEYS( XK_9, 8) | |
35 { MODKEY|ShiftMask, XK_q, quit, {0} … | |
36 + { 0, HOLDKEY, holdbar, {0} … | |
37 }; | |
38 | |
39 /* button definitions */ | |
40 diff --git a/dwm.c b/dwm.c | |
41 index 4465af1..def5f66 100644 | |
42 --- a/dwm.c | |
43 +++ b/dwm.c | |
44 @@ -176,6 +176,7 @@ static void grabbuttons(Client *c, int focused); | |
45 static void grabkeys(void); | |
46 static void incnmaster(const Arg *arg); | |
47 static void keypress(XEvent *e); | |
48 +static void keyrelease(XEvent *e); | |
49 static void killclient(const Arg *arg); | |
50 static void manage(Window w, XWindowAttributes *wa); | |
51 static void mappingnotify(XEvent *e); | |
52 @@ -210,6 +211,7 @@ static void tag(const Arg *arg); | |
53 static void tagmon(const Arg *arg); | |
54 static void tile(Monitor *); | |
55 static void togglebar(const Arg *arg); | |
56 +static void holdbar(const Arg *arg); | |
57 static void togglefloating(const Arg *arg); | |
58 static void toggletag(const Arg *arg); | |
59 static void toggleview(const Arg *arg); | |
60 @@ -217,6 +219,7 @@ static void unfocus(Client *c, int setfocus); | |
61 static void unmanage(Client *c, int destroyed); | |
62 static void unmapnotify(XEvent *e); | |
63 static void updatebarpos(Monitor *m); | |
64 +static void updateholdbarpos(Monitor *m); | |
65 static void updatebars(void); | |
66 static void updateclientlist(void); | |
67 static int updategeom(void); | |
68 @@ -245,6 +248,7 @@ static int (*xerrorxlib)(Display *, XErrorEvent *); | |
69 static unsigned int numlockmask = 0; | |
70 static void (*handler[LASTEvent]) (XEvent *) = { | |
71 [ButtonPress] = buttonpress, | |
72 + [ButtonRelease] = keyrelease, | |
73 [ClientMessage] = clientmessage, | |
74 [ConfigureRequest] = configurerequest, | |
75 [ConfigureNotify] = configurenotify, | |
76 @@ -252,6 +256,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { | |
77 [EnterNotify] = enternotify, | |
78 [Expose] = expose, | |
79 [FocusIn] = focusin, | |
80 + [KeyRelease] = keyrelease, | |
81 [KeyPress] = keypress, | |
82 [MappingNotify] = mappingnotify, | |
83 [MapRequest] = maprequest, | |
84 @@ -275,6 +280,50 @@ static Window root, wmcheckwin; | |
85 struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; | |
86 | |
87 /* function implementations */ | |
88 +void | |
89 +holdbar(const Arg *arg) | |
90 +{ | |
91 + if (selmon->showbar) | |
92 + return; | |
93 + selmon->showbar = 2; | |
94 + updateholdbarpos(selmon); | |
95 + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, … | |
96 +} | |
97 + | |
98 +void | |
99 +keyrelease(XEvent *e) | |
100 +{ | |
101 + if (XEventsQueued(dpy, QueuedAfterReading)) { | |
102 + XEvent ne; | |
103 + XPeekEvent(dpy, &ne); | |
104 + | |
105 + if (ne.type == KeyPress && ne.xkey.time == e->xkey.time… | |
106 + ne.xkey.keycode == e->xkey.keycode) { | |
107 + XNextEvent(dpy, &ne); | |
108 + return; | |
109 + } | |
110 + } | |
111 + if (e->xkey.keycode == XKeysymToKeycode(dpy, HOLDKEY) && selmon… | |
112 + selmon->showbar = 0; | |
113 + updateholdbarpos(selmon); | |
114 + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selm… | |
115 + arrange(selmon); | |
116 + } | |
117 +} | |
118 + | |
119 +void | |
120 +updateholdbarpos(Monitor *m) | |
121 +{ | |
122 + m->wy = m->my; | |
123 + m->wh = m->mh; | |
124 + if (m->showbar) { | |
125 + m->by = m->topbar ? m->wy : m->wy + m->wh - bh; | |
126 + m->wy = m->topbar ? m->wy - bh + bh : m->wy; | |
127 + } else { | |
128 + m->by = -bh; | |
129 + } | |
130 +} | |
131 + | |
132 void | |
133 applyrules(Client *c) | |
134 { | |
135 @@ -1699,7 +1748,7 @@ tile(Monitor *m) | |
136 void | |
137 togglebar(const Arg *arg) | |
138 { | |
139 - selmon->showbar = !selmon->showbar; | |
140 + selmon->showbar = (selmon->showbar == 2 ? 1 : !selmon->showbar); | |
141 updatebarpos(selmon); | |
142 XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, … | |
143 arrange(selmon); | |
144 -- | |
145 2.19.1 | |
146 |