dotfiles

personal configuration files and scripts
git clone https://tongong.net/git/dotfiles.git
Log | Files | Refs | README

dwm-custom-fsignal-titlebar.diff (2499B)


      1 diff --git a/dwm/dwm.c b/dwm/dwm.c
      2 --- a/dwm/dwm.c
      3 +++ b/dwm/dwm.c
      4 @@ -193,6 +193,7 @@ static void grabbuttons(Client *c, int focused);
      5  static void grabkeys(void);
      6  static void incnmaster(const Arg *arg);
      7  static void keypress(XEvent *e);
      8 +static int fakesignal(void);
      9  static void killclient(const Arg *arg);
     10  static void manage(Window w, XWindowAttributes *wa);
     11  static void mappingnotify(XEvent *e);
     12 @@ -308,6 +309,7 @@ static Display *dpy;
     13  static Drw *drw;
     14  static Monitor *mons, *selmon;
     15  static Window root, wmcheckwin;
     16 +static char globaltitle[256] = "";
     17 
     18  /* configuration, allows nested code to access above variables */
     19  #include "config.h"
     20 @@ -823,6 +825,7 @@ drawbar(Monitor *m)
     21  	drw_setscheme(drw, scheme[SchemeNorm]);
     22  	x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
     23 
     24 +	/*
     25  	if ((w = m->ww - wstext - x) > bh) {
     26  		if (m->sel) {
     27  			drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
     28 @@ -834,6 +837,11 @@ drawbar(Monitor *m)
     29  			drw_rect(drw, x, 0, w, bh, 1, 1);
     30  		}
     31  	}
     32 +	*/
     33 +	if ((w = m->ww - wstext - x) > bh) {
     34 +		drw_setscheme(drw, scheme[globaltitle[0] != '\0' ? SchemeSel : SchemeNorm]);
     35 +		drw_text(drw, x, 0, w, bh, lrpad / 2, globaltitle, 0);
     36 +	}
     37  	drw_map(drw, m->barwin, 0, 0, m->ww, bh);
     38  }
     39 
     40 @@ -1116,6 +1124,36 @@ keypress(XEvent *e)
     41  			keys[i].func(&(keys[i].arg));
     42  }
     43 
     44 +int
     45 +fakesignal(void)
     46 +{
     47 +	char fsignal[256];
     48 +	char indicator[7] = "title:";
     49 +	char str_signum[256];
     50 +	size_t len_fsignal, len_indicator = strlen(indicator);
     51 +
     52 +	// Get root name property
     53 +	if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) {
     54 +		len_fsignal = strlen(fsignal);
     55 +
     56 +		// Check if this is indeed a fake signal
     57 +		if (len_indicator > len_fsignal ? 0 : strncmp(indicator, fsignal, len_indicator) == 0) {
     58 +
     59 +			memcpy(str_signum, &fsignal[len_indicator], len_fsignal - len_indicator);
     60 +			str_signum[len_fsignal - len_indicator] = '\0';
     61 +
     62 +			strcpy(globaltitle,str_signum);
     63 +			drawbars();
     64 +
     65 +			// A fake signal was sent
     66 +			return 1;
     67 +		}
     68 +	}
     69 +
     70 +	// No fake signal was sent, so proceed with update
     71 +	return 0;
     72 +}
     73 +
     74  void
     75  killclient(const Arg *arg)
     76  {
     77 @@ -1345,8 +1383,10 @@ propertynotify(XEvent *e)
     78  	Window trans;
     79  	XPropertyEvent *ev = &e->xproperty;
     80 
     81 -	if ((ev->window == root) && (ev->atom == XA_WM_NAME))
     82 -		updatestatus();
     83 +	if ((ev->window == root) && (ev->atom == XA_WM_NAME)) {
     84 +		if (!fakesignal())
     85 +			updatestatus();
     86 +	}
     87  	else if (ev->state == PropertyDelete)
     88  		return; /* ignore */
     89  	else if ((c = wintoclient(ev->window))) {