dwm-fsignal-6.1.diff (2904B)
1 diff -up dwm-6.1/config.def.h dwm-6.1_FSIGNAL/config.def.h 2 --- dwm-6.1/config.def.h 2015-11-08 23:11:48.000000000 +0100 3 +++ dwm-6.1_FSIGNAL/config.def.h 2018-03-29 21:34:43.218114924 +0200 4 @@ -111,3 +111,10 @@ static Button buttons[] = { 5 { ClkTagBar, MODKEY, Button3, toggletag, {0} }, 6 }; 7 8 +/* signal definitions */ 9 +/* signum must be greater than 0 */ 10 +/* trigger signals using `xsetroot -name "fsignal:<signum>"` */ 11 +static Signal signals[] = { 12 + /* signum function argument */ 13 + { 1, setlayout, {.v = 0} }, 14 +}; 15 Only in dwm-6.1_FSIGNAL/: config.h 16 diff -up dwm-6.1/dwm.c dwm-6.1_FSIGNAL/dwm.c 17 --- dwm-6.1/dwm.c 2015-11-08 23:11:48.000000000 +0100 18 +++ dwm-6.1_FSIGNAL/dwm.c 2018-03-29 21:22:07.697560231 +0200 19 @@ -107,6 +107,12 @@ typedef struct { 20 } Key; 21 22 typedef struct { 23 + unsigned int signum; 24 + void (*func)(const Arg *); 25 + const Arg arg; 26 +} Signal; 27 + 28 +typedef struct { 29 const char *symbol; 30 void (*arrange)(Monitor *); 31 } Layout; 32 @@ -177,6 +183,7 @@ static void grabbuttons(Client *c, int f 33 static void grabkeys(void); 34 static void incnmaster(const Arg *arg); 35 static void keypress(XEvent *e); 36 +static int fake_signal(void); 37 static void killclient(const Arg *arg); 38 static void manage(Window w, XWindowAttributes *wa); 39 static void mappingnotify(XEvent *e); 40 @@ -1013,6 +1020,47 @@ keypress(XEvent *e) 41 keys[i].func(&(keys[i].arg)); 42 } 43 44 +int 45 +fake_signal(void) 46 +{ 47 + char fsignal[256]; 48 + char indicator[9] = "fsignal:"; 49 + char str_signum[16]; 50 + int i, v, signum; 51 + size_t len_fsignal, len_indicator = strlen(indicator); 52 + 53 + // Get root name property 54 + if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) { 55 + len_fsignal = strlen(fsignal); 56 + 57 + // Check if this is indeed a fake signal 58 + if (len_indicator > len_fsignal ? 0 : strncmp(indicator, fsignal, len_indicator) == 0) { 59 + memcpy(str_signum, &fsignal[len_indicator], len_fsignal - len_indicator); 60 + str_signum[len_fsignal - len_indicator] = '\0'; 61 + 62 + // Convert string value into managable integer 63 + for (i = signum = 0; i < strlen(str_signum); i++) { 64 + v = str_signum[i] - '0'; 65 + if (v >= 0 && v <= 9) { 66 + signum = signum * 10 + v; 67 + } 68 + } 69 + 70 + // Check if a signal was found, and if so handle it 71 + if (signum) 72 + for (i = 0; i < LENGTH(signals); i++) 73 + if (signum == signals[i].signum && signals[i].func) 74 + signals[i].func(&(signals[i].arg)); 75 + 76 + // A fake signal was sent 77 + return 1; 78 + } 79 + } 80 + 81 + // No fake signal was sent, so proceed with update 82 + return 0; 83 +} 84 + 85 void 86 killclient(const Arg *arg) 87 { 88 @@ -1233,7 +1281,8 @@ propertynotify(XEvent *e) 89 XPropertyEvent *ev = &e->xproperty; 90 91 if ((ev->window == root) && (ev->atom == XA_WM_NAME)) 92 - updatestatus(); 93 + if (!fake_signal()) 94 + updatestatus(); 95 else if (ev->state == PropertyDelete) 96 return; /* ignore */ 97 else if ((c = wintoclient(ev->window))) {