diff options
| -rw-r--r-- | config.h | 6 | ||||
| -rw-r--r-- | dwm.c | 73 | 
2 files changed, 75 insertions, 4 deletions
| @@ -279,7 +279,11 @@ static Button buttons[] = {  	{ ClkLtSymbol,          0,              Button1,        setlayout,      {0} },  	{ ClkLtSymbol,          0,              Button3,        setlayout,      {.v = &layouts[2]} },  	{ ClkWinTitle,          0,              Button2,        zoom,           {0} }, -	{ ClkStatusText,        0,              Button2,        spawn,          SHCMD("st -e statusbarinfo") }, +	{ ClkStatusText,        0,              Button1,        sigdwmblocks,   {.i = 1} }, +	{ ClkStatusText,        0,              Button2,        sigdwmblocks,   {.i = 2} }, +	{ ClkStatusText,        0,              Button3,        sigdwmblocks,   {.i = 3} }, +	{ ClkStatusText,        0,              Button4,        sigdwmblocks,   {.i = 4} }, +	{ ClkStatusText,        0,              Button5,        sigdwmblocks,   {.i = 5} },  	{ ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },  	{ ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },  	{ ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} }, @@ -188,6 +188,7 @@ static void clientmessage(XEvent *e);  static void configure(Client *c);  static void configurenotify(XEvent *e);  static void configurerequest(XEvent *e); +static void copyvalidchars(char *text, char *rawtext);  static Monitor *createmon(void);  static void destroynotify(XEvent *e);  static void detach(Client *c); @@ -201,6 +202,7 @@ static void focus(Client *c);  static void focusin(XEvent *e);  static void focusmon(const Arg *arg);  static void focusstack(const Arg *arg); +static int getdwmblockspid();  static int getrootptr(int *x, int *y);  static long getstate(Window w);  static int gettextprop(Window w, Atom atom, char *text, unsigned int size); @@ -249,6 +251,7 @@ static void setup(void);  static void seturgent(Client *c, int urg);  static void showhide(Client *c);  static void sigchld(int unused); +static void sigdwmblocks(const Arg *arg);  static void sighup(int unused);  static void sigterm(int unused);  static void spawn(const Arg *arg); @@ -290,6 +293,9 @@ static void centeredfloatingmaster(Monitor *m);  /* variables */  static const char broken[] = "broken";  static char stext[256]; +static char rawstext[256]; +static int dwmblockssig; +pid_t dwmblockspid = 0;  static int screen;  static int sw, sh;           /* X display screen geometry width, height */  static int bh, blw = 0;      /* bar geometry */ @@ -503,9 +509,26 @@ buttonpress(XEvent *e)  			arg.ui = 1 << i;  		} else if (ev->x < x + blw)  			click = ClkLtSymbol; -		else if (ev->x > selmon->ww - TEXTW(stext)) +		else if (ev->x > (x = selmon->ww - TEXTW(stext) + lrpad)) {  			click = ClkStatusText; -		else + +			char *text = rawstext; +			int i = -1; +			char ch; +			dwmblockssig = 0; +			while (text[++i]) { +				if ((unsigned char)text[i] < ' ') { +					ch = text[i]; +					text[i] = '\0'; +					x += TEXTW(text) - lrpad; +					text[i] = ch; +					text += i+1; +					i = -1; +					if (x >= ev->x) break; +					dwmblockssig = ch; +				} +			} +		} else  			click = ClkWinTitle;  	} else if ((c = wintoclient(ev->window))) {  		focus(c); @@ -691,6 +714,19 @@ configurerequest(XEvent *e)  	XSync(dpy, False);  } +void +copyvalidchars(char *text, char *rawtext) +{ +	int i = -1, j = 0; + +	while(rawtext[++i]) { +		if ((unsigned char)rawtext[i] >= ' ') { +			text[j++] = rawtext[i]; +		} +	} +	text[j] = '\0'; +} +  Monitor *  createmon(void)  { @@ -929,6 +965,18 @@ getatomprop(Client *c, Atom prop)  }  int +getdwmblockspid() +{ +	char buf[16]; +	FILE *fp = popen("pidof -s dwmblocks", "r"); +	fgets(buf, sizeof(buf), fp); +	pid_t pid = strtoul(buf, NULL, 10); +	pclose(fp); +	dwmblockspid = pid; +	return pid != 0 ? 0 : -1; +} + +int  getrootptr(int *x, int *y)  {  	int di; @@ -1947,6 +1995,23 @@ sigterm(int unused)  }  void +sigdwmblocks(const Arg *arg) +{ +	union sigval sv; +	sv.sival_int = 0 | (dwmblockssig << 8) | arg->i; +	if (!dwmblockspid) +		if (getdwmblockspid() == -1) +			return; + +	if (sigqueue(dwmblockspid, SIGUSR1, sv) == -1) { +		if (errno == ESRCH) { +			if (!getdwmblockspid()) +				sigqueue(dwmblockspid, SIGUSR1, sv); +		} +	} +} + +void  spawn(const Arg *arg)  {  	if (arg->v == dmenucmd) @@ -2342,8 +2407,10 @@ updatesizehints(Client *c)  void  updatestatus(void)  { -	if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) +	if (!gettextprop(root, XA_WM_NAME, rawstext, sizeof(rawstext)))  		strcpy(stext, "dwm-"VERSION); +	else +		copyvalidchars(stext, rawstext);  	drawbar(selmon);  } | 
