summaryrefslogtreecommitdiffhomepage
path: root/patch/status2d.c
diff options
context:
space:
mode:
Diffstat (limited to 'patch/status2d.c')
-rw-r--r--patch/status2d.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/patch/status2d.c b/patch/status2d.c
new file mode 100644
index 0000000..1ab9043
--- /dev/null
+++ b/patch/status2d.c
@@ -0,0 +1,128 @@
+int
+drawstatusbar(Monitor *m, int bh, char* stext, int stw, int stp)
+{
+ 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 = stp * 2;;
+ 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 */
+ x = m->ww - w - stw + stp;
+ ret = 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 - stp - 1, 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];
+ if (i + 7 > len) {
+ i += 7;
+ break;
+ }
+ memcpy(buf, (char*)text+i+1, 7);
+ buf[7] = '\0';
+ #if ALPHA_PATCH && STATUS2D_NO_ALPHA_PATCH
+ drw_clr_create(drw, &drw->scheme[ColFg], buf, 0xff);
+ #elif ALPHA_PATCH
+ drw_clr_create(drw, &drw->scheme[ColFg], buf, alphas[SchemeNorm][ColFg]);
+ #else
+ drw_clr_create(drw, &drw->scheme[ColFg], buf);
+ #endif // ALPHA_PATCH
+ i += 7;
+ } else if (text[i] == 'b') {
+ char buf[8];
+ if (i + 7 > len) {
+ i += 7;
+ break;
+ }
+ memcpy(buf, (char*)text+i+1, 7);
+ buf[7] = '\0';
+ #if ALPHA_PATCH && STATUS2D_NO_ALPHA_PATCH
+ drw_clr_create(drw, &drw->scheme[ColBg], buf, 0xff);
+ #elif ALPHA_PATCH
+ drw_clr_create(drw, &drw->scheme[ColBg], buf, alphas[SchemeNorm][ColBg]);
+ #else
+ drw_clr_create(drw, &drw->scheme[ColBg], buf);
+ #endif // ALPHA_PATCH
+ 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;
+} \ No newline at end of file