dwm-holdbar-6.2.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-holdbar-6.2.diff (4087B) | |
--- | |
1 From 58507fca3c3c334f540700c5ed81815d9335138e Mon Sep 17 00:00:00 2001 | |
2 From: Nihal Jere <[email protected]> | |
3 Date: Thu, 12 Mar 2020 10:16:48 -0500 | |
4 Subject: [PATCH] holdbar: fixed bar flickering caused by repeated key ev… | |
5 | |
6 --- | |
7 config.def.h | 2 ++ | |
8 dwm.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ | |
9 2 files changed, 52 insertions(+) | |
10 | |
11 diff --git a/config.def.h b/config.def.h | |
12 index 1c0b587..0e19b5d 100644 | |
13 --- a/config.def.h | |
14 +++ b/config.def.h | |
15 @@ -50,6 +50,7 @@ static const Layout layouts[] = { | |
16 { MODKEY|ControlMask, KEY, toggleview, {.ui … | |
17 { MODKEY|ShiftMask, KEY, tag, {.ui … | |
18 { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui … | |
19 +#define HOLDKEY 0 // replace 0 with the keysym to activate holdbar | |
20 | |
21 /* helper for spawning shell commands in the pre dwm-5.0 fashion */ | |
22 #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL }… | |
23 @@ -94,6 +95,7 @@ static Key keys[] = { | |
24 TAGKEYS( XK_8, 7) | |
25 TAGKEYS( XK_9, 8) | |
26 { MODKEY|ShiftMask, XK_q, quit, {0} … | |
27 + { 0, HOLDKEY, holdbar, {0} }, | |
28 }; | |
29 | |
30 /* button definitions */ | |
31 diff --git a/dwm.c b/dwm.c | |
32 index 4465af1..9437707 100644 | |
33 --- a/dwm.c | |
34 +++ b/dwm.c | |
35 @@ -176,6 +176,7 @@ static void grabbuttons(Client *c, int focused); | |
36 static void grabkeys(void); | |
37 static void incnmaster(const Arg *arg); | |
38 static void keypress(XEvent *e); | |
39 +static void keyrelease(XEvent *e); | |
40 static void killclient(const Arg *arg); | |
41 static void manage(Window w, XWindowAttributes *wa); | |
42 static void mappingnotify(XEvent *e); | |
43 @@ -210,6 +211,7 @@ static void tag(const Arg *arg); | |
44 static void tagmon(const Arg *arg); | |
45 static void tile(Monitor *); | |
46 static void togglebar(const Arg *arg); | |
47 +static void holdbar(const Arg *arg); | |
48 static void togglefloating(const Arg *arg); | |
49 static void toggletag(const Arg *arg); | |
50 static void toggleview(const Arg *arg); | |
51 @@ -217,6 +219,7 @@ static void unfocus(Client *c, int setfocus); | |
52 static void unmanage(Client *c, int destroyed); | |
53 static void unmapnotify(XEvent *e); | |
54 static void updatebarpos(Monitor *m); | |
55 +static void updateholdbarpos(Monitor *m); | |
56 static void updatebars(void); | |
57 static void updateclientlist(void); | |
58 static int updategeom(void); | |
59 @@ -245,6 +248,7 @@ static int (*xerrorxlib)(Display *, XErrorEvent *); | |
60 static unsigned int numlockmask = 0; | |
61 static void (*handler[LASTEvent]) (XEvent *) = { | |
62 [ButtonPress] = buttonpress, | |
63 + [ButtonRelease] = keyrelease, | |
64 [ClientMessage] = clientmessage, | |
65 [ConfigureRequest] = configurerequest, | |
66 [ConfigureNotify] = configurenotify, | |
67 @@ -252,6 +256,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { | |
68 [EnterNotify] = enternotify, | |
69 [Expose] = expose, | |
70 [FocusIn] = focusin, | |
71 + [KeyRelease] = keyrelease, | |
72 [KeyPress] = keypress, | |
73 [MappingNotify] = mappingnotify, | |
74 [MapRequest] = maprequest, | |
75 @@ -275,6 +280,51 @@ static Window root, wmcheckwin; | |
76 struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; | |
77 | |
78 /* function implementations */ | |
79 + | |
80 + | |
81 +void | |
82 +holdbar(const Arg *arg) | |
83 +{ | |
84 + selmon->showbar = 1; | |
85 + updateholdbarpos(selmon); | |
86 + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, … | |
87 +} | |
88 + | |
89 + | |
90 +void | |
91 +keyrelease(XEvent *e) | |
92 +{ | |
93 + if (XEventsQueued(dpy, QueuedAfterReading)) { | |
94 + XEvent ne; | |
95 + XPeekEvent(dpy, &ne); | |
96 + | |
97 + if (ne.type == KeyPress && ne.xkey.time == e->xkey.time… | |
98 + ne.xkey.keycode == e->xkey.keycode) { | |
99 + XNextEvent(dpy, &ne); | |
100 + return; | |
101 + } | |
102 + } | |
103 + if (e->xkey.keycode == XKeysymToKeycode(dpy, HOLDKEY)) { | |
104 + selmon->showbar = 0; | |
105 + updateholdbarpos(selmon); | |
106 + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selm… | |
107 + arrange(selmon); | |
108 + } | |
109 +} | |
110 + | |
111 +void | |
112 +updateholdbarpos(Monitor *m) | |
113 +{ | |
114 + m->wy = m->my; | |
115 + m->wh = m->mh; | |
116 + if (m->showbar) { | |
117 + m->by = m->topbar ? m->wy : m->wy + m->wh - bh; | |
118 + m->wy = m->topbar ? m->wy - bh + bh : m->wy; | |
119 + } else { | |
120 + m->by = -bh; | |
121 + } | |
122 +} | |
123 + | |
124 void | |
125 applyrules(Client *c) | |
126 { | |
127 -- | |
128 2.25.1 | |
129 |