dwm

my dwm build
git clone https://git.afify.dev/dwm.git
Log | Files | Refs | README | LICENSE

commit 3236a84ff9e16b7e3d6ec14951e254935610cb0a
parent 142b05c6f5471df66be36210313b67fbb9b0d023
Author: afify <hassan@afify.dev>
Date:   Wed,  8 Jun 2022 11:17:27 +0300

[feat] add status2d

Diffstat:
Mconfig.h | 5-----
Mdwm.c | 151++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
2 files changed, 115 insertions(+), 41 deletions(-)

diff --git a/config.h b/config.h @@ -22,11 +22,6 @@ static const char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { col_ng1, col_black, col_gray1 }, [SchemeSel] = { col_gray3, col_black, col_gray2 }, - [SchemeRed] = { col_red, col_black, col_black }, - [SchemeGreen] = { col_green, col_black, col_black }, - [SchemeCyan] = { col_cyan, col_black, col_black }, - [SchemeYellow] = { col_yellow, col_black, col_black }, - [SchemeOrange] = { col_orange, col_black, col_black }, }; /* tagging */ diff --git a/dwm.c b/dwm.c @@ -59,9 +59,7 @@ /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel, - SchemeRed, SchemeGreen, SchemeCyan, - SchemeYellow, SchemeOrange }; /* color schemes */ +enum { SchemeNorm, SchemeSel }; /* color schemes */ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ @@ -165,6 +163,7 @@ static void detachstack(Client *c); static Monitor *dirtomon(int dir); static void drawbar(Monitor *m); static void drawbars(void); +static int drawstatusbar(Monitor *m, int bh, char* text); static void enternotify(XEvent *e); static void expose(XEvent *e); static void focus(Client *c); @@ -239,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 */ @@ -489,7 +488,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]); free(scheme); XDestroyWindow(dpy, wmcheckwin); @@ -698,6 +697,114 @@ 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->scheme[ColBg] = scheme[SchemeNorm][ColBg]; + 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] == 'b') { + char buf[8]; + memcpy(buf, (char*)text+i+1, 7); + buf[7] = '\0'; + drw_clr_create(drw, &drw->scheme[ColBg], buf); + i += 7; + } else if (text[i] == 'd') { + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; + } 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) { @@ -705,43 +812,14 @@ drawbar(Monitor *m) int boxs = drw->fonts->h / 9; int boxw = drw->fonts->h / 6 + 2; unsigned int i, occ = 0, urg = 0; - char *ts = stext; - char *tp = stext; - int tx = 0; - char ctmp; Client *c; if (!m->showbar) return; - /* correction for colours */ - int correct = 0; - char *xcape = malloc (sizeof (char) * 128); - memset(xcape,0,sizeof (char) * 128); - for ( ; *ts != '\0' ; ts++) { - if (*ts <= LENGTH(colors)) { - sprintf(xcape,"%c",*ts); - correct += TEXTW(xcape) - lrpad; - } - } - free(xcape); - ts = stext; - /* 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]); - tw = TEXTW(stext) - lrpad + 2 - correct; /* 2px right padding */ - while (1) { - if ((unsigned int)*ts > LENGTH(colors)) { ts++; continue ; } - ctmp = *ts; - *ts = '\0'; - drw_text(drw, m->ww - tw + tx, 0, tw - tx, bh, 0, tp, 0); - tx += TEXTW(tp) -lrpad; - if (ctmp == '\0') { break; } - drw_setscheme(drw, scheme[(unsigned int)(ctmp-1)]); - *ts = ctmp; - tp = ++ts; - } + tw = m->ww - drawstatusbar(m, bh, stext); } for (c = m->clients; c; c = c->next) { @@ -1605,7 +1683,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(Clr *)); + scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *)); + 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 */