sites

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

dwm-status2d-6.2.diff (4267B)


      1 diff --git a/dwm.c b/dwm.c
      2 index d27cb67..464c9d6 100644
      3 --- a/dwm.c
      4 +++ b/dwm.c
      5 @@ -163,6 +163,7 @@ static void detach(Client *c);
      6  static Monitor *dirtomon(int dir);
      7  static void drawbar(Monitor *m);
      8  static void drawbars(void);
      9 +static int drawstatusbar(Monitor *m, int bh, char* text);
     10  static void enternotify(XEvent *e);
     11  static void expose(XEvent *e);
     12  static void focus(Client *c);
     13 @@ -237,7 +238,7 @@ static void zoom(const Arg *arg);
     14  
     15  /* variables */
     16  static const char broken[] = "broken";
     17 -static char stext[256];
     18 +static char stext[1024];
     19  static int screen;
     20  static int sw, sh;           /* X display screen geometry width, height */
     21  static int bh, blw = 0;      /* bar geometry */
     22 @@ -483,7 +484,7 @@ cleanup(void)
     23  		cleanupmon(mons);
     24  	for (i = 0; i < CurLast; i++)
     25  		drw_cur_free(drw, cursor[i]);
     26 -	for (i = 0; i < LENGTH(colors); i++)
     27 +	for (i = 0; i < LENGTH(colors) + 1; i++)
     28  		free(scheme[i]);
     29  	XDestroyWindow(dpy, wmcheckwin);
     30  	drw_free(drw);
     31 @@ -690,6 +691,114 @@ dirtomon(int dir)
     32  	return m;
     33  }
     34  
     35 +int
     36 +drawstatusbar(Monitor *m, int bh, char* stext) {
     37 +	int ret, i, w, x, len;
     38 +	short isCode = 0;
     39 +	char *text;
     40 +	char *p;
     41 +
     42 +	len = strlen(stext) + 1 ;
     43 +	if (!(text = (char*) malloc(sizeof(char)*len)))
     44 +		die("malloc");
     45 +	p = text;
     46 +	memcpy(text, stext, len);
     47 +
     48 +	/* compute width of the status text */
     49 +	w = 0;
     50 +	i = -1;
     51 +	while (text[++i]) {
     52 +		if (text[i] == '^') {
     53 +			if (!isCode) {
     54 +				isCode = 1;
     55 +				text[i] = '\0';
     56 +				w += TEXTW(text) - lrpad;
     57 +				text[i] = '^';
     58 +				if (text[++i] == 'f')
     59 +					w += atoi(text + ++i);
     60 +			} else {
     61 +				isCode = 0;
     62 +				text = text + i + 1;
     63 +				i = -1;
     64 +			}
     65 +		}
     66 +	}
     67 +	if (!isCode)
     68 +		w += TEXTW(text) - lrpad;
     69 +	else
     70 +		isCode = 0;
     71 +	text = p;
     72 +
     73 +	w += 2; /* 1px padding on both sides */
     74 +	ret = x = m->ww - w;
     75 +
     76 +	drw_setscheme(drw, scheme[LENGTH(colors)]);
     77 +	drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
     78 +	drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
     79 +	drw_rect(drw, x, 0, w, bh, 1, 1);
     80 +	x++;
     81 +
     82 +	/* process status text */
     83 +	i = -1;
     84 +	while (text[++i]) {
     85 +		if (text[i] == '^' && !isCode) {
     86 +			isCode = 1;
     87 +
     88 +			text[i] = '\0';
     89 +			w = TEXTW(text) - lrpad;
     90 +			drw_text(drw, x, 0, w, bh, 0, text, 0);
     91 +
     92 +			x += w;
     93 +
     94 +			/* process code */
     95 +			while (text[++i] != '^') {
     96 +				if (text[i] == 'c') {
     97 +					char buf[8];
     98 +					memcpy(buf, (char*)text+i+1, 7);
     99 +					buf[7] = '\0';
    100 +					drw_clr_create(drw, &drw->scheme[ColFg], buf);
    101 +					i += 7;
    102 +				} else if (text[i] == 'b') {
    103 +					char buf[8];
    104 +					memcpy(buf, (char*)text+i+1, 7);
    105 +					buf[7] = '\0';
    106 +					drw_clr_create(drw, &drw->scheme[ColBg], buf);
    107 +					i += 7;
    108 +				} else if (text[i] == 'd') {
    109 +					drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
    110 +					drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
    111 +				} else if (text[i] == 'r') {
    112 +					int rx = atoi(text + ++i);
    113 +					while (text[++i] != ',');
    114 +					int ry = atoi(text + ++i);
    115 +					while (text[++i] != ',');
    116 +					int rw = atoi(text + ++i);
    117 +					while (text[++i] != ',');
    118 +					int rh = atoi(text + ++i);
    119 +
    120 +					drw_rect(drw, rx + x, ry, rw, rh, 1, 0);
    121 +				} else if (text[i] == 'f') {
    122 +					x += atoi(text + ++i);
    123 +				}
    124 +			}
    125 +
    126 +			text = text + i + 1;
    127 +			i=-1;
    128 +			isCode = 0;
    129 +		}
    130 +	}
    131 +
    132 +	if (!isCode) {
    133 +		w = TEXTW(text) - lrpad;
    134 +		drw_text(drw, x, 0, w, bh, 0, text, 0);
    135 +	}
    136 +
    137 +	drw_setscheme(drw, scheme[SchemeNorm]);
    138 +	free(p);
    139 +
    140 +	return ret;
    141 +}
    142 +
    143  void
    144  drawbar(Monitor *m)
    145  {
    146 @@ -701,9 +802,7 @@ drawbar(Monitor *m)
    147  
    148  	/* draw status first so it can be overdrawn by tags later */
    149  	if (m == selmon) { /* status is only drawn on selected monitor */
    150 -		drw_setscheme(drw, scheme[SchemeNorm]);
    151 -		sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
    152 -		drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0);
    153 +		sw = m->ww - drawstatusbar(m, bh, stext);
    154  	}
    155  
    156  	for (c = m->clients; c; c = c->next) {
    157 @@ -1572,7 +1671,8 @@ setup(void)
    158  	cursor[CurResize] = drw_cur_create(drw, XC_sizing);
    159  	cursor[CurMove] = drw_cur_create(drw, XC_fleur);
    160  	/* init appearance */
    161 -	scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
    162 +	scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *));
    163 +	scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3);
    164  	for (i = 0; i < LENGTH(colors); i++)
    165  		scheme[i] = drw_scm_create(drw, colors[i], 3);
    166  	/* init bars */