dwm-r1533-stdin.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-r1533-stdin.diff (3803B)
---
1 This backports pre-dwm-5.3 behaviour where the status bar content was read from
2 stdin instead of the root window title. I did this, because I had several
3 problems with the "new" method, on different machines, with different
4 configurations, including vanilla, where the statusbar froze.
5 It adds some LOC, but is not broken for me.
6
7 diff -r ba7d976f74d3 config.def.h
8 --- a/config.def.h Fri Mar 25 14:06:46 2011 +0000
9 +++ b/config.def.h Sun Apr 10 19:07:26 2011 +0200
10 @@ -12,6 +12,7 @@
11 static const unsigned int snap = 32; /* snap pixel */
12 static const Bool showbar = True; /* False means no bar */
13 static const Bool topbar = True; /* False means bottom bar */
14 +static Bool readin = True; /* False means do not read stdin */
15
16 /* tagging */
17 static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
18 diff -r ba7d976f74d3 dwm.c
19 --- a/dwm.c Fri Mar 25 14:06:46 2011 +0000
20 +++ b/dwm.c Sun Apr 10 19:07:26 2011 +0200
21 @@ -28,6 +28,7 @@
22 #include <stdlib.h>
23 #include <string.h>
24 #include <unistd.h>
25 +#include <sys/select.h>
26 #include <sys/types.h>
27 #include <sys/wait.h>
28 #include <X11/cursorfont.h>
29 @@ -232,7 +233,6 @@
30 static void updatebars(void);
31 static void updatenumlockmask(void);
32 static void updatesizehints(Client *c);
33 -static void updatestatus(void);
34 static void updatetitle(Client *c);
35 static void updatewmhints(Client *c);
36 static void view(const Arg *arg);
37 @@ -1251,9 +1251,7 @@
38 Window trans;
39 XPropertyEvent *ev = &e->xproperty;
40
41 - if((ev->window == root) && (ev->atom == XA_WM_NAME))
42 - updatestatus();
43 - else if(ev->state == PropertyDelete)
44 + if(ev->state == PropertyDelete)
45 return; /* ignore */
46 else if((c = wintoclient(ev->window))) {
47 switch (ev->atom) {
48 @@ -1413,12 +1411,60 @@
49
50 void
51 run(void) {
52 + char *p;
53 + char sbuf[sizeof stext];
54 + fd_set rd;
55 + int r, xfd;
56 + unsigned int len, offset;
57 XEvent ev;
58 - /* main event loop */
59 +
60 + /* main event loop, also reads status text from stdin */
61 XSync(dpy, False);
62 - while(running && !XNextEvent(dpy, &ev)) {
63 - if(handler[ev.type])
64 - handler[ev.type](&ev); /* call handler */
65 + xfd = ConnectionNumber(dpy);
66 + offset = 0;
67 + len = sizeof stext - 1;
68 + sbuf[len] = stext[len] = '\0'; /* 0-terminator is never touched */
69 + while(running) {
70 + FD_ZERO(&rd);
71 + if(readin)
72 + FD_SET(STDIN_FILENO, &rd);
73 + FD_SET(xfd, &rd);
74 + if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) {
75 + if(errno == EINTR)
76 + continue;
77 + die("select failed\n");
78 + }
79 + if(FD_ISSET(STDIN_FILENO, &rd)) {
80 + switch((r = read(STDIN_FILENO, sbuf + offset, len - offset))) {
81 + case -1:
82 + strncpy(stext, strerror(errno), len);
83 + readin = False;
84 + break;
85 + case 0:
86 + strncpy(stext, "EOF", 4);
87 + readin = False;
88 + break;
89 + default:
90 + for(p = sbuf + offset; r > 0; p++, r--, offset++)
91 + if(*p == '\n' || *p == '\0') {
92 + *p = '\0';
93 + strncpy(stext, sbuf, len);
94 + p += r - 1; /* p is sbuf + offset + r - 1 */
95 + for(r = 0; *(p - r) && *(p - r) != '\n'; r++);
96 + offset = r;
97 + if(r)
98 + memmove(sbuf, p - r + 1, r);
99 + break;
100 + }
101 + break;
102 + }
103 + drawbars();
104 + }
105 + while(XPending(dpy)) {
106 + XNextEvent(dpy, &ev);
107 + if(handler[ev.type])
108 + (handler[ev.type])(&ev); /* call handler */
109 + }
110 }
111 }
112
113 @@ -1539,7 +1585,6 @@
114 XSetFont(dpy, dc.gc, dc.font.xfont->fid);
115 /* init bars */
116 updatebars();
117 - updatestatus();
118 /* EWMH support per view */
119 XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
120 PropModeReplace, (unsigned char *) netatom, NetLast);
121 @@ -1916,13 +1961,6 @@
122 }
123
124 void
125 -updatestatus(void) {
126 - if(!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
127 - strcpy(stext, "dwm-"VERSION);
128 - drawbar(selmon);
129 -}
130 -
131 -void
132 updatewmhints(Client *c) {
133 XWMHints *wmh;
134