dwm-statuscmd-nosignal-status2d-20210402-60bb3df.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-statuscmd-nosignal-status2d-20210402-60bb3df.diff (5550B)
---
1 From df16de3b4457fd6537e6efaa1785183770056ed6 Mon Sep 17 00:00:00 2001
2 From: Daniel Bylinka <daniel.bylinka@gmail.com>
3 Date: Fri, 2 Apr 2021 19:33:35 +0200
4 Subject: [PATCH] [statuscmd] status2d compatibility for statuscmd-nosignal
5
6 ---
7 config.def.h | 10 +++++++-
8 dwm.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++----
9 2 files changed, 72 insertions(+), 6 deletions(-)
10
11 diff --git a/config.def.h b/config.def.h
12 index 1c0b587..8f88366 100644
13 --- a/config.def.h
14 +++ b/config.def.h
15 @@ -59,6 +59,12 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn()
16 static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
17 static const char *termcmd[] = { "st", NULL };
18
19 +/* commands spawned when clicking statusbar, the mouse button pressed is exported as BUTTON */
20 +static const StatusCmd statuscmds[] = {
21 + { "notify-send Mouse$BUTTON", 1 },
22 +};
23 +static const char *statuscmd[] = { "/bin/sh", "-c", NULL, NULL };
24 +
25 static Key keys[] = {
26 /* modifier key function argument */
27 { MODKEY, XK_p, spawn, {.v = dmenucmd } },
28 @@ -103,7 +109,9 @@ static Button buttons[] = {
29 { ClkLtSymbol, 0, Button1, setlayout, {0} },
30 { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
31 { ClkWinTitle, 0, Button2, zoom, {0} },
32 - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
33 + { ClkStatusText, 0, Button1, spawn, {.v = statuscmd } },
34 + { ClkStatusText, 0, Button2, spawn, {.v = statuscmd } },
35 + { ClkStatusText, 0, Button3, spawn, {.v = statuscmd } },
36 { ClkClientWin, MODKEY, Button1, movemouse, {0} },
37 { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
38 { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
39 diff --git a/dwm.c b/dwm.c
40 index acbe6c9..851b0ed 100644
41 --- a/dwm.c
42 +++ b/dwm.c
43 @@ -141,6 +141,11 @@ typedef struct {
44 int monitor;
45 } Rule;
46
47 +typedef struct {
48 + const char *cmd;
49 + int id;
50 +} StatusCmd;
51 +
52 /* function declarations */
53 static void applyrules(Client *c);
54 static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
55 @@ -239,6 +244,9 @@ static void zoom(const Arg *arg);
56 /* variables */
57 static const char broken[] = "broken";
58 static char stext[1024];
59 +static int statusw;
60 +static int statuscmdn;
61 +static char lastbutton[] = "-";
62 static int screen;
63 static int sw, sh; /* X display screen geometry width, height */
64 static int bh, blw = 0; /* bar geometry */
65 @@ -441,8 +449,27 @@ buttonpress(XEvent *e)
66 arg.ui = 1 << i;
67 } else if (ev->x < x + blw)
68 click = ClkLtSymbol;
69 - else if (ev->x > selmon->ww - (int)TEXTW(stext))
70 + else if (ev->x > selmon->ww - statusw) {
71 + char *text, *s, ch;
72 + *lastbutton = '0' + ev->button;
73 +
74 + x = selmon->ww - statusw;
75 click = ClkStatusText;
76 +
77 + statuscmdn = 0;
78 + for (text = s = stext; *s && x <= ev->x; s++) {
79 + if ((unsigned char)(*s) < ' ') {
80 + ch = *s;
81 + *s = '\0';
82 + x += TEXTW(text) - lrpad;
83 + *s = ch;
84 + text = s + 1;
85 + if (x >= ev->x)
86 + break;
87 + statuscmdn = ch;
88 + }
89 + }
90 + }
91 else
92 click = ClkWinTitle;
93 } else if ((c = wintoclient(ev->window))) {
94 @@ -696,7 +723,7 @@ dirtomon(int dir)
95
96 int
97 drawstatusbar(Monitor *m, int bh, char* stext) {
98 - int ret, i, w, x, len;
99 + int ret, i, j, w, x, len;
100 short isCode = 0;
101 char *text;
102 char *p;
103 @@ -705,7 +732,12 @@ drawstatusbar(Monitor *m, int bh, char* stext) {
104 if (!(text = (char*) malloc(sizeof(char)*len)))
105 die("malloc");
106 p = text;
107 - memcpy(text, stext, len);
108 +
109 + i = -1, j = 0;
110 + while (stext[++i])
111 + if ((unsigned char)stext[i] >= ' ')
112 + text[j++] = stext[i];
113 + text[j] = '\0';
114
115 /* compute width of the status text */
116 w = 0;
117 @@ -813,7 +845,7 @@ drawbar(Monitor *m)
118
119 /* draw status first so it can be overdrawn by tags later */
120 if (m == selmon) { /* status is only drawn on selected monitor */
121 - tw = m->ww - drawstatusbar(m, bh, stext);
122 + tw = statusw = m->ww - drawstatusbar(m, bh, stext);
123 }
124
125 for (c = m->clients; c; c = c->next) {
126 @@ -1753,6 +1785,17 @@ spawn(const Arg *arg)
127 if (fork() == 0) {
128 if (dpy)
129 close(ConnectionNumber(dpy));
130 + if (arg->v == statuscmd) {
131 + for (int i = 0; i < LENGTH(statuscmds); i++) {
132 + if (statuscmdn == statuscmds[i].id) {
133 + statuscmd[2] = statuscmds[i].cmd;
134 + setenv("BUTTON", lastbutton, 1);
135 + break;
136 + }
137 + }
138 + if (!statuscmd[2])
139 + exit(EXIT_SUCCESS);
140 + }
141 setsid();
142 execvp(((char **)arg->v)[0], (char **)arg->v);
143 fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
144 @@ -2098,8 +2141,23 @@ updatesizehints(Client *c)
145 void
146 updatestatus(void)
147 {
148 - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
149 + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) {
150 strcpy(stext, "dwm-"VERSION);
151 + statusw = TEXTW(stext) - lrpad + 2;
152 + } else {
153 + char *text, *s, ch;
154 + statusw = 0;
155 + for (text = s = stext; *s; s++) {
156 + if ((unsigned char)(*s) < ' ') {
157 + ch = *s;
158 + *s = '\0';
159 + statusw += TEXTW(text) - lrpad;
160 + *s = ch;
161 + text = s + 1;
162 + }
163 + }
164 + statusw += TEXTW(text) - lrpad + 2;
165 + }
166 drawbar(selmon);
167 }
168
169 --
170 2.31.0
171