commit ff50fbe7f2a5f821d7e73cffc053b0811ee0b99c
parent b3a579c03ab9e58e1d11e0706ecea5f5dce1fcaf
Author: lhark <lhark@ntymail.com>
Date: Sat, 31 Dec 2016 03:24:07 -0500
[dwm] Update status2d patch for HEAD: bb3bd6f
Diffstat:
2 files changed, 170 insertions(+), 13 deletions(-)
diff --git a/dwm.suckless.org/patches/dwm-status2d-20161231-bb3bd6f.diff b/dwm.suckless.org/patches/dwm-status2d-20161231-bb3bd6f.diff
@@ -0,0 +1,158 @@
+diff --git a/dwm.c b/dwm.c
+index d27cb67..464c9d6 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -163,6 +163,7 @@ static void detach(Client *c);
+ static void detachstack(Client *c);
+ static Monitor *dirtomon(int dir);
+ static void drawbar(Monitor *m);
++static int drawstatusbar(Monitor *m, int bh, char* text);
+ static void drawbars(void);
+ static void enternotify(XEvent *e);
+ static void expose(XEvent *e);
+@@ -237,7 +238,7 @@ static void zoom(const Arg *arg);
+
+ /* variables */
+ static const char broken[] = "broken";
+-static char stext[256];
++static char stext[1024];
+ static int screen;
+ static int sw, sh; /* X display screen geometry width, height */
+ static int bh, blw = 0; /* bar geometry */
+@@ -483,7 +484,7 @@ cleanup(void)
+ cleanupmon(mons);
+ for (i = 0; i < CurLast; i++)
+ drw_cur_free(drw, cursor[i]);
+- for (i = 0; i < LENGTH(colors); i++)
++ for (i = 0; i < LENGTH(colors) + 1; i++)
+ free(scheme[i]);
+ XDestroyWindow(dpy, wmcheckwin);
+ drw_free(drw);
+@@ -690,6 +691,106 @@ dirtomon(int dir)
+ return m;
+ }
+
++int
++drawstatusbar(Monitor *m, int bh, char* stext) {
++ int ret, i, w, x, len;
++ short isCode = 0;
++ char *text;
++ char *p;
++
++ len = strlen(stext) + 1 ;
++ if (!(text = (char*) malloc(sizeof(char)*len)))
++ die("malloc");
++ p = text;
++ memcpy(text, stext, len);
++
++ /* compute width of the status text */
++ w = 0;
++ i = -1;
++ while (text[++i]) {
++ if (text[i] == '^') {
++ if (!isCode) {
++ isCode = 1;
++ text[i] = '\0';
++ w += TEXTW(text) - lrpad;
++ text[i] = '^';
++ if (text[++i] == 'f')
++ w += atoi(text + ++i);
++ } else {
++ isCode = 0;
++ text = text + i + 1;
++ i = -1;
++ }
++ }
++ }
++ if (!isCode)
++ w += TEXTW(text) - lrpad;
++ else
++ isCode = 0;
++ text = p;
++
++ w += 2; /* 1px padding on both sides */
++ ret = x = m->ww - w;
++
++ drw_setscheme(drw, scheme[LENGTH(colors)]);
++ drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
++ drw_rect(drw, x, 0, w, bh, 1, 1);
++ x++;
++
++ /* process status text */
++ i = -1;
++ while (text[++i]) {
++ if (text[i] == '^' && !isCode) {
++ isCode = 1;
++
++ text[i] = '\0';
++ w = TEXTW(text) - lrpad;
++ drw_text(drw, x, 0, w, bh, 0, text, 0);
++
++ x += w;
++
++ /* process code */
++ while (text[++i] != '^') {
++ if (text[i] == 'c') {
++ char buf[8];
++ memcpy(buf, (char*)text+i+1, 7);
++ buf[7] = '\0';
++ drw_clr_create(drw, &drw->scheme[ColFg], buf);
++ i += 7;
++ } else if (text[i] == 'd') {
++ drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
++ } else if (text[i] == 'r') {
++ int rx = atoi(text + ++i);
++ while (text[++i] != ',');
++ int ry = atoi(text + ++i);
++ while (text[++i] != ',');
++ int rw = atoi(text + ++i);
++ while (text[++i] != ',');
++ int rh = atoi(text + ++i);
++
++ drw_rect(drw, rx + x, ry, rw, rh, 1, 0);
++ } else if (text[i] == 'f') {
++ x += atoi(text + ++i);
++ }
++ }
++
++ text = text + i + 1;
++ i=-1;
++ isCode = 0;
++ }
++ }
++
++ if (!isCode) {
++ w = TEXTW(text) - lrpad;
++ drw_text(drw, x, 0, w, bh, 0, text, 0);
++ }
++
++ drw_setscheme(drw, scheme[SchemeNorm]);
++ free(p);
++
++ return ret;
++}
++
+ void
+ drawbar(Monitor *m)
+ {
+@@ -701,9 +802,7 @@ drawbar(Monitor *m)
+
+ /* draw status first so it can be overdrawn by tags later */
+ if (m == selmon) { /* status is only drawn on selected monitor */
+- drw_setscheme(drw, scheme[SchemeNorm]);
+- sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
+- drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0);
++ sw = m->ww - drawstatusbar(m, bh, stext);
+ }
+
+ for (c = m->clients; c; c = c->next) {
+@@ -1572,7 +1671,8 @@ setup(void)
+ cursor[CurResize] = drw_cur_create(drw, XC_sizing);
+ cursor[CurMove] = drw_cur_create(drw, XC_fleur);
+ /* init appearance */
+- scheme = ecalloc(LENGTH(colors), sizeof(Scm));
++ scheme = ecalloc(LENGTH(colors) + 1, sizeof(Scm));
++ scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3);
+ for (i = 0; i < LENGTH(colors); i++)
+ scheme[i] = drw_scm_create(drw, colors[i], 3);
+ /* init bars */
diff --git a/dwm.suckless.org/patches/status2d.md b/dwm.suckless.org/patches/status2d.md
@@ -3,35 +3,34 @@ Status2d
Description
-----------
-Status2d allows colors and rectangle drawing in your DWM status bar.
+Status2d allows colors and rectangle drawing in your DWM status bar.
See below an example of my status bar with multi-cpu and battery.
![Status2d screenshot](status2d.png)
Download
--------
-Get the patch from github: [https://github.com/sipi/dwm-status2d](https://github.com/sipi/dwm-status2d))
-Direct download: [dwm-r35db6d-status2d.diff](dwm-r35db6d-status2d.diff)
-
-apply it to dwm.c like so:
-
- patch -p1 dwm.c < dwm-*-status2d.diff
+ * [https://github.com/sipi/dwm-status2d](https://github.com/sipi/dwm-status2d) (last updated : march 2015)
+ * [dwm-status2d-20161231-bb3bd6f.diff](dwm-status2d-20161231-bb3bd6f.diff)
Usage
-----
-* draw rectangle
-Add ^rx,y,w,h^ in the status text.
+* ^rx,y,w,h^ : draw a rectangle.
-* change color
-Add ^c#FF0000^ in the status text.
+* ^c#FF0000^ : set foreground color.
-* forward the x position for next drawing
-Add ^f11^ in the status text.
+* ^f11^ : forward the x draawing cursor, only needed for drawings, not text.
+
+* ^d^ : reset foreground color to SchemeNorm.
Example
-------
xsetroot -name "dwmstatus ^c#FF0000^ in red with red rectangle ^r0,0,10,10^^f10^^c#FFFFFF^ and white text"
+Authors
+-------
+ * [sipi](https://github.com/sipi)
+ * lhark - <lhark@ntymail.com> (bb3bd6f port)