| dwm-dwmc-6.2.diff - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| dwm-dwmc-6.2.diff (5837B) | |
| --- | |
| 1 From d94cb6f1a553d19127f44dbdc96e8bb5041956c2 Mon Sep 17 00:00:00 2001 | |
| 2 From: Nihal Jere <[email protected]> | |
| 3 Date: Sat, 21 Mar 2020 15:16:49 -0500 | |
| 4 Subject: [PATCH] dwm-client | |
| 5 | |
| 6 --- | |
| 7 Makefile | 2 +- | |
| 8 config.def.h | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
| 9 dwm.c | 55 +++++++++++++++++++++++++++++++++++++++-- | |
| 10 dwmc | 40 ++++++++++++++++++++++++++++++ | |
| 11 4 files changed, 164 insertions(+), 3 deletions(-) | |
| 12 create mode 100755 dwmc | |
| 13 | |
| 14 diff --git a/Makefile b/Makefile | |
| 15 index 77bcbc0..f837f5c 100644 | |
| 16 --- a/Makefile | |
| 17 +++ b/Makefile | |
| 18 @@ -38,7 +38,7 @@ dist: clean | |
| 19 | |
| 20 install: all | |
| 21 mkdir -p ${DESTDIR}${PREFIX}/bin | |
| 22 - cp -f dwm ${DESTDIR}${PREFIX}/bin | |
| 23 + cp -f dwm dwmc ${DESTDIR}${PREFIX}/bin | |
| 24 chmod 755 ${DESTDIR}${PREFIX}/bin/dwm | |
| 25 mkdir -p ${DESTDIR}${MANPREFIX}/man1 | |
| 26 sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/m… | |
| 27 diff --git a/config.def.h b/config.def.h | |
| 28 index 1c0b587..efbae79 100644 | |
| 29 --- a/config.def.h | |
| 30 +++ b/config.def.h | |
| 31 @@ -113,3 +113,73 @@ static Button buttons[] = { | |
| 32 { ClkTagBar, MODKEY, Button3, togglet… | |
| 33 }; | |
| 34 | |
| 35 +void | |
| 36 +setlayoutex(const Arg *arg) | |
| 37 +{ | |
| 38 + setlayout(&((Arg) { .v = &layouts[arg->i] })); | |
| 39 +} | |
| 40 + | |
| 41 +void | |
| 42 +viewex(const Arg *arg) | |
| 43 +{ | |
| 44 + view(&((Arg) { .ui = 1 << arg->ui })); | |
| 45 +} | |
| 46 + | |
| 47 +void | |
| 48 +viewall(const Arg *arg) | |
| 49 +{ | |
| 50 + view(&((Arg){.ui = ~0})); | |
| 51 +} | |
| 52 + | |
| 53 +void | |
| 54 +toggleviewex(const Arg *arg) | |
| 55 +{ | |
| 56 + toggleview(&((Arg) { .ui = 1 << arg->ui })); | |
| 57 +} | |
| 58 + | |
| 59 +void | |
| 60 +tagex(const Arg *arg) | |
| 61 +{ | |
| 62 + tag(&((Arg) { .ui = 1 << arg->ui })); | |
| 63 +} | |
| 64 + | |
| 65 +void | |
| 66 +toggletagex(const Arg *arg) | |
| 67 +{ | |
| 68 + toggletag(&((Arg) { .ui = 1 << arg->ui })); | |
| 69 +} | |
| 70 + | |
| 71 +void | |
| 72 +tagall(const Arg *arg) | |
| 73 +{ | |
| 74 + tag(&((Arg){.ui = ~0})); | |
| 75 +} | |
| 76 + | |
| 77 +/* signal definitions */ | |
| 78 +/* signum must be greater than 0 */ | |
| 79 +/* trigger signals using `xsetroot -name "fsignal:<signame> [<type> <va… | |
| 80 +static Signal signals[] = { | |
| 81 + /* signum function */ | |
| 82 + { "focusstack", focusstack }, | |
| 83 + { "setmfact", setmfact }, | |
| 84 + { "togglebar", togglebar }, | |
| 85 + { "incnmaster", incnmaster }, | |
| 86 + { "togglefloating", togglefloating }, | |
| 87 + { "focusmon", focusmon }, | |
| 88 + { "tagmon", tagmon }, | |
| 89 + { "zoom", zoom }, | |
| 90 + { "view", view }, | |
| 91 + { "viewall", viewall }, | |
| 92 + { "viewex", viewex }, | |
| 93 + { "toggleview", view }, | |
| 94 + { "toggleviewex", toggleviewex }, | |
| 95 + { "tag", tag }, | |
| 96 + { "tagall", tagall }, | |
| 97 + { "tagex", tagex }, | |
| 98 + { "toggletag", tag }, | |
| 99 + { "toggletagex", toggletagex }, | |
| 100 + { "killclient", killclient }, | |
| 101 + { "quit", quit }, | |
| 102 + { "setlayout", setlayout }, | |
| 103 + { "setlayoutex", setlayoutex }, | |
| 104 +}; | |
| 105 diff --git a/dwm.c b/dwm.c | |
| 106 index 4465af1..aa53706 100644 | |
| 107 --- a/dwm.c | |
| 108 +++ b/dwm.c | |
| 109 @@ -106,6 +106,11 @@ typedef struct { | |
| 110 const Arg arg; | |
| 111 } Key; | |
| 112 | |
| 113 +typedef struct { | |
| 114 + const char * sig; | |
| 115 + void (*func)(const Arg *); | |
| 116 +} Signal; | |
| 117 + | |
| 118 typedef struct { | |
| 119 const char *symbol; | |
| 120 void (*arrange)(Monitor *); | |
| 121 @@ -148,6 +153,7 @@ static void arrange(Monitor *m); | |
| 122 static void arrangemon(Monitor *m); | |
| 123 static void attach(Client *c); | |
| 124 static void attachstack(Client *c); | |
| 125 +static int fake_signal(void); | |
| 126 static void buttonpress(XEvent *e); | |
| 127 static void checkotherwm(void); | |
| 128 static void cleanup(void); | |
| 129 @@ -998,6 +1004,49 @@ keypress(XEvent *e) | |
| 130 keys[i].func(&(keys[i].arg)); | |
| 131 } | |
| 132 | |
| 133 +int | |
| 134 +fake_signal(void) | |
| 135 +{ | |
| 136 + char fsignal[256]; | |
| 137 + char indicator[9] = "fsignal:"; | |
| 138 + char str_sig[50]; | |
| 139 + char param[16]; | |
| 140 + int i, len_str_sig, n, paramn; | |
| 141 + size_t len_fsignal, len_indicator = strlen(indicator); | |
| 142 + Arg arg; | |
| 143 + | |
| 144 + // Get root name property | |
| 145 + if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) { | |
| 146 + len_fsignal = strlen(fsignal); | |
| 147 + | |
| 148 + // Check if this is indeed a fake signal | |
| 149 + if (len_indicator > len_fsignal ? 0 : strncmp(indicator… | |
| 150 + paramn = sscanf(fsignal+len_indicator, "%s%n%s%… | |
| 151 + | |
| 152 + if (paramn == 1) arg = (Arg) {0}; | |
| 153 + else if (paramn > 2) return 1; | |
| 154 + else if (strncmp(param, "i", n - len_str_sig) =… | |
| 155 + sscanf(fsignal + len_indicator + n, "%i… | |
| 156 + else if (strncmp(param, "ui", n - len_str_sig) … | |
| 157 + sscanf(fsignal + len_indicator + n, "%u… | |
| 158 + else if (strncmp(param, "f", n - len_str_sig) =… | |
| 159 + sscanf(fsignal + len_indicator + n, "%f… | |
| 160 + else return 1; | |
| 161 + | |
| 162 + // Check if a signal was found, and if so handl… | |
| 163 + for (i = 0; i < LENGTH(signals); i++) | |
| 164 + if (strncmp(str_sig, signals[i].sig, le… | |
| 165 + signals[i].func(&(arg)); | |
| 166 + | |
| 167 + // A fake signal was sent | |
| 168 + return 1; | |
| 169 + } | |
| 170 + } | |
| 171 + | |
| 172 + // No fake signal was sent, so proceed with update | |
| 173 + return 0; | |
| 174 +} | |
| 175 + | |
| 176 void | |
| 177 killclient(const Arg *arg) | |
| 178 { | |
| 179 @@ -1215,8 +1264,10 @@ propertynotify(XEvent *e) | |
| 180 Window trans; | |
| 181 XPropertyEvent *ev = &e->xproperty; | |
| 182 | |
| 183 - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) | |
| 184 - updatestatus(); | |
| 185 + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) { | |
| 186 + if (!fake_signal()) | |
| 187 + updatestatus(); | |
| 188 + } | |
| 189 else if (ev->state == PropertyDelete) | |
| 190 return; /* ignore */ | |
| 191 else if ((c = wintoclient(ev->window))) { | |
| 192 diff --git a/dwmc b/dwmc | |
| 193 new file mode 100755 | |
| 194 index 0000000..5ff8dbc | |
| 195 --- /dev/null | |
| 196 +++ b/dwmc | |
| 197 @@ -0,0 +1,40 @@ | |
| 198 +#!/usr/bin/env sh | |
| 199 + | |
| 200 +signal() { | |
| 201 + xsetroot -name "fsignal:$*" | |
| 202 +} | |
| 203 + | |
| 204 +case $# in | |
| 205 +1) | |
| 206 + case $1 in | |
| 207 + setlayout | view | viewall | togglebar | togglefloating | zoom … | |
| 208 + signal $1 | |
| 209 + ;; | |
| 210 + *) | |
| 211 + echo "Unknown command or missing one argument." | |
| 212 + exit 1 | |
| 213 + ;; | |
| 214 + esac | |
| 215 + ;; | |
| 216 +2) | |
| 217 + case $1 in | |
| 218 + view) | |
| 219 + signal $1 ui $2 | |
| 220 + ;; | |
| 221 + viewex | toggleviewex | tagex | toggletagex | setlayoutex | foc… | |
| 222 + signal $1 i $2 | |
| 223 + ;; | |
| 224 + setmfact) | |
| 225 + signal $1 f $2 | |
| 226 + ;; | |
| 227 + *) | |
| 228 + echo "Unknown command or one too many arguments." | |
| 229 + exit 1 | |
| 230 + ;; | |
| 231 + esac | |
| 232 + ;; | |
| 233 +*) | |
| 234 + echo "Too many arguments." | |
| 235 + exit 1 | |
| 236 + ;; | |
| 237 +esac | |
| 238 -- | |
| 239 2.25.1 | |
| 240 |