sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

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))) {