dwm and dwmblocks patch for clickable bar - https://dwm.suckless.org/patches/statuscmd/

April 26, 2020 ยท View on GitHub

diff --git a/config.def.h b/config.def.h index 1c0b587..b67825e 100644 --- a/config.def.h +++ b/config.def.h @@ -103,7 +103,9 @@ static Button buttons[] = { { ClkLtSymbol, 0, Button1, setlayout, {0} }, { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, { ClkWinTitle, 0, Button2, zoom, {0} },

  • { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
  • { ClkStatusText, 0, Button1, sigdwmblocks, {.i = 1} },
  • { ClkStatusText, 0, Button2, sigdwmblocks, {.i = 2} },
  • { ClkStatusText, 0, Button3, sigdwmblocks, {.i = 3} }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, diff --git a/dwm.c b/dwm.c index 4465af1..c600131 100644 --- a/dwm.c +++ b/dwm.c @@ -156,6 +156,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); @@ -169,6 +170,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); @@ -205,6 +207,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 spawn(const Arg *arg); static void tag(const Arg *arg); static void tagmon(const Arg *arg); @@ -237,6 +240,9 @@ static void zoom(const Arg arg); / 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 */ @@ -439,9 +445,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); @@ -627,6 +650,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) { @@ -871,6 +907,18 @@ getatomprop(Client *c, Atom prop) return atom; }

+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) { @@ -1636,6 +1684,23 @@ sigchld(int unused) while (0 < waitpid(-1, NULL, WNOHANG)); }

+void +sigdwmblocks(const Arg *arg) +{

  • union sigval sv;
  • sv.sival_int = (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) { @@ -1987,8 +2052,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); }