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