dwm-dwmfifo-6.1.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-dwmfifo-6.1.diff (6832B) | |
--- | |
1 diff --git a/config.def.h b/config.def.h | |
2 index 7054c06..9f4ef79 100644 | |
3 --- a/config.def.h | |
4 +++ b/config.def.h | |
5 @@ -111,3 +111,66 @@ static Button buttons[] = { | |
6 { ClkTagBar, MODKEY, Button3, togglet… | |
7 }; | |
8 | |
9 +static const char *dwmfifo = "/tmp/dwm.fifo"; | |
10 +static Command commands[] = { | |
11 + { "dmenu", spawn, {.v = dmenucmd} }, | |
12 + { "term", spawn, {.v = termcmd} }, | |
13 + { "quit", quit, {0} }, | |
14 + { "togglebar", togglebar, {0} }, | |
15 + { "focusstack+", focusstack, {.i = +1} }, | |
16 + { "focusstack-", focusstack, {.i = -1} }, | |
17 + { "incnmaster+", incnmaster, {.i = +1} }, | |
18 + { "incnmaster-", incnmaster, {.i = -1} }, | |
19 + { "setmfact+", setmfact, {.f = +0.05} }, | |
20 + { "setmfact-", setmfact, {.f = -0.05} }, | |
21 + { "zoom", zoom, {0} }, | |
22 + { "view", view, {0} }, | |
23 + { "killclient", killclient, {0} }, | |
24 + { "setlayout-tiled", setlayout, {.v = &layouts[0]} }, | |
25 + { "setlayout-float", setlayout, {.v = &layouts[1]} }, | |
26 + { "setlayout-mono", setlayout, {.v = &layouts[2]} }, | |
27 + { "togglelayout", setlayout, {0} }, | |
28 + { "togglefloating", togglefloating, {0} }, | |
29 + { "viewall", view, {.ui = ~0} }, | |
30 + { "tag", tag, {.ui = ~0} }, | |
31 + { "focusmon+", focusmon, {.i = +1} }, | |
32 + { "focusmon-", focusmon, {.i = -1} }, | |
33 + { "tagmon+", tagmon, {.i = +1} }, | |
34 + { "tagmon-", tagmon, {.i = -1} }, | |
35 + { "view1", view, {.ui = 1 << 0} }, | |
36 + { "view2", view, {.ui = 1 << 1} }, | |
37 + { "view3", view, {.ui = 1 << 2} }, | |
38 + { "view4", view, {.ui = 1 << 3} }, | |
39 + { "view5", view, {.ui = 1 << 4} }, | |
40 + { "view6", view, {.ui = 1 << 5} }, | |
41 + { "view7", view, {.ui = 1 << 6} }, | |
42 + { "view8", view, {.ui = 1 << 7} }, | |
43 + { "view9", view, {.ui = 1 << 8} }, | |
44 + { "toggleview1", toggleview, {.ui = 1 << 0} }, | |
45 + { "toggleview2", toggleview, {.ui = 1 << 1} }, | |
46 + { "toggleview3", toggleview, {.ui = 1 << 2} }, | |
47 + { "toggleview4", toggleview, {.ui = 1 << 3} }, | |
48 + { "toggleview5", toggleview, {.ui = 1 << 4} }, | |
49 + { "toggleview6", toggleview, {.ui = 1 << 5} }, | |
50 + { "toggleview7", toggleview, {.ui = 1 << 6} }, | |
51 + { "toggleview8", toggleview, {.ui = 1 << 7} }, | |
52 + { "toggleview9", toggleview, {.ui = 1 << 8} }, | |
53 + { "tag1", tag, {.ui = 1 << 0} }, | |
54 + { "tag2", tag, {.ui = 1 << 1} }, | |
55 + { "tag3", tag, {.ui = 1 << 2} }, | |
56 + { "tag4", tag, {.ui = 1 << 3} }, | |
57 + { "tag5", tag, {.ui = 1 << 4} }, | |
58 + { "tag6", tag, {.ui = 1 << 5} }, | |
59 + { "tag7", tag, {.ui = 1 << 6} }, | |
60 + { "tag8", tag, {.ui = 1 << 7} }, | |
61 + { "tag9", tag, {.ui = 1 << 8} }, | |
62 + { "toggletag1", toggletag, {.ui = 1 << 0} }, | |
63 + { "toggletag2", toggletag, {.ui = 1 << 1} }, | |
64 + { "toggletag3", toggletag, {.ui = 1 << 2} }, | |
65 + { "toggletag4", toggletag, {.ui = 1 << 3} }, | |
66 + { "toggletag5", toggletag, {.ui = 1 << 4} }, | |
67 + { "toggletag6", toggletag, {.ui = 1 << 5} }, | |
68 + { "toggletag7", toggletag, {.ui = 1 << 6} }, | |
69 + { "toggletag8", toggletag, {.ui = 1 << 7} }, | |
70 + { "toggletag9", toggletag, {.ui = 1 << 8} }, | |
71 +}; | |
72 diff --git a/dwm.c b/dwm.c | |
73 index 0362114..5c45d2a 100644 | |
74 --- a/dwm.c | |
75 +++ b/dwm.c | |
76 @@ -21,6 +21,7 @@ | |
77 * To understand everything else, start reading main(). | |
78 */ | |
79 #include <errno.h> | |
80 +#include <fcntl.h> | |
81 #include <locale.h> | |
82 #include <signal.h> | |
83 #include <stdarg.h> | |
84 @@ -28,6 +29,7 @@ | |
85 #include <stdlib.h> | |
86 #include <string.h> | |
87 #include <unistd.h> | |
88 +#include <sys/select.h> | |
89 #include <sys/types.h> | |
90 #include <sys/wait.h> | |
91 #include <X11/cursorfont.h> | |
92 @@ -141,6 +144,12 @@ typedef struct { | |
93 int monitor; | |
94 } Rule; | |
95 | |
96 +typedef struct { | |
97 + const char *name; | |
98 + void (*func)(const Arg *arg); | |
99 + const Arg arg; | |
100 +} Command; | |
101 + | |
102 /* function declarations */ | |
103 static void applyrules(Client *c); | |
104 static int applysizehints(Client *c, int *x, int *y, int *w, int *h, in… | |
105 @@ -162,9 +171,11 @@ static void destroynotify(XEvent *e); | |
106 static void detach(Client *c); | |
107 static void detachstack(Client *c); | |
108 static Monitor *dirtomon(int dir); | |
109 +static void dispatchcmd(void); | |
110 static void drawbar(Monitor *m); | |
111 static void drawbars(void); | |
112 static void enternotify(XEvent *e); | |
113 +static Bool evpredicate(); | |
114 static void expose(XEvent *e); | |
115 static void focus(Client *c); | |
116 static void focusin(XEvent *e); | |
117 @@ -266,6 +277,7 @@ static Display *dpy; | |
118 static Drw *drw; | |
119 static Monitor *mons, *selmon; | |
120 static Window root; | |
121 +static int fifofd; | |
122 | |
123 /* configuration, allows nested code to access above variables */ | |
124 #include "config.h" | |
125 @@ -490,6 +502,7 @@ cleanup(void) | |
126 XSync(dpy, False); | |
127 XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTi… | |
128 XDeleteProperty(dpy, root, netatom[NetActiveWindow]); | |
129 + close(fifofd); | |
130 } | |
131 | |
132 void | |
133 @@ -701,6 +714,26 @@ dirtomon(int dir) | |
134 return m; | |
135 } | |
136 | |
137 +void | |
138 +dispatchcmd(void) | |
139 +{ | |
140 + int i; | |
141 + char buf[BUFSIZ]; | |
142 + ssize_t n; | |
143 + | |
144 + n = read(fifofd, buf, sizeof(buf) - 1); | |
145 + if (n == -1) | |
146 + die("Failed to read() from DWM fifo %s:", dwmfifo); | |
147 + buf[n] = '\0'; | |
148 + buf[strcspn(buf, "\n")] = '\0'; | |
149 + for (i = 0; i < LENGTH(commands); i++) { | |
150 + if (strcmp(commands[i].name, buf) == 0) { | |
151 + commands[i].func(&commands[i].arg); | |
152 + break; | |
153 + } | |
154 + } | |
155 +} | |
156 + | |
157 void | |
158 drawbar(Monitor *m) | |
159 { | |
160 @@ -781,6 +813,12 @@ enternotify(XEvent *e) | |
161 focus(c); | |
162 } | |
163 | |
164 +Bool | |
165 +evpredicate() | |
166 +{ | |
167 + return True; | |
168 +} | |
169 + | |
170 void | |
171 expose(XEvent *e) | |
172 { | |
173 @@ -1390,11 +1428,30 @@ void | |
174 run(void) | |
175 { | |
176 XEvent ev; | |
177 + fd_set rfds; | |
178 + int n; | |
179 + int dpyfd, maxfd; | |
180 /* main event loop */ | |
181 XSync(dpy, False); | |
182 - while (running && !XNextEvent(dpy, &ev)) | |
183 - if (handler[ev.type]) | |
184 - handler[ev.type](&ev); /* call handler */ | |
185 + dpyfd = ConnectionNumber(dpy); | |
186 + maxfd = fifofd; | |
187 + if (dpyfd > maxfd) | |
188 + maxfd = dpyfd; | |
189 + maxfd++; | |
190 + while (running) { | |
191 + FD_ZERO(&rfds); | |
192 + FD_SET(fifofd, &rfds); | |
193 + FD_SET(dpyfd, &rfds); | |
194 + n = select(maxfd, &rfds, NULL, NULL, NULL); | |
195 + if (n > 0) { | |
196 + if (FD_ISSET(fifofd, &rfds)) | |
197 + dispatchcmd(); | |
198 + if (FD_ISSET(dpyfd, &rfds)) | |
199 + while (XCheckIfEvent(dpy, &ev, evpredic… | |
200 + if (handler[ev.type]) | |
201 + handler[ev.type](&ev); … | |
202 + } | |
203 + } | |
204 } | |
205 | |
206 void | |
207 @@ -1601,6 +1658,9 @@ setup(void) | |
208 XSelectInput(dpy, root, wa.event_mask); | |
209 grabkeys(); | |
210 focus(NULL); | |
211 + fifofd = open(dwmfifo, O_RDWR | O_NONBLOCK); | |
212 + if (fifofd < 0) | |
213 + die("Failed to open() DWM fifo %s:", dwmfifo); | |
214 } | |
215 | |
216 void |