dwm-statuscmd-nosignal-status2d-20210402-60bb3df.diff - sites - public wiki con… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-statuscmd-nosignal-status2d-20210402-60bb3df.diff (5550B) | |
--- | |
1 From df16de3b4457fd6537e6efaa1785183770056ed6 Mon Sep 17 00:00:00 2001 | |
2 From: Daniel Bylinka <[email protected]> | |
3 Date: Fri, 2 Apr 2021 19:33:35 +0200 | |
4 Subject: [PATCH] [statuscmd] status2d compatibility for statuscmd-nosign… | |
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 dmenuc… | |
16 static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", d… | |
17 static const char *termcmd[] = { "st", NULL }; | |
18 | |
19 +/* commands spawned when clicking statusbar, the mouse button pressed i… | |
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 argu… | |
27 { MODKEY, XK_p, spawn, {.v … | |
28 @@ -103,7 +109,9 @@ static Button buttons[] = { | |
29 { ClkLtSymbol, 0, Button1, setlayo… | |
30 { ClkLtSymbol, 0, Button3, setlayo… | |
31 { ClkWinTitle, 0, Button2, zoom, … | |
32 - { ClkStatusText, 0, Button2, spawn, … | |
33 + { ClkStatusText, 0, Button1, spawn, … | |
34 + { ClkStatusText, 0, Button2, spawn, … | |
35 + { ClkStatusText, 0, Button3, spawn, … | |
36 { ClkClientWin, MODKEY, Button1, movemou… | |
37 { ClkClientWin, MODKEY, Button2, togglef… | |
38 { ClkClientWin, MODKEY, Button3, resizem… | |
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, in… | |
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].cm… | |
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 |