dwm-status2d-barpadding-20241018-44e9799.diff (8229B)
1 From 44e97990dcea2c2866b0c03abbb9372e10cfb185 Mon Sep 17 00:00:00 2001 2 From: elbachir-one <bachiralfa@gmail.com> 3 Date: Fri, 18 Oct 2024 19:22:49 +0100 4 Subject: [PATCH] Status2d + Barpadding 5 6 --- 7 config.def.h | 2 + 8 dwm.c | 143 +++++++++++++++++++++++++++++++++++++++++++++------ 9 2 files changed, 130 insertions(+), 15 deletions(-) 10 11 diff --git a/config.def.h b/config.def.h 12 index 4412cb1..63fa9f3 100644 13 --- a/config.def.h 14 +++ b/config.def.h 15 @@ -5,6 +5,8 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ 16 static const unsigned int snap = 32; /* snap pixel */ 17 static const int showbar = 1; /* 0 means no bar */ 18 static const int topbar = 1; /* 0 means bottom bar */ 19 +static const int vertpad = 10; /* vertical padding of bar */ 20 +static const int sidepad = 10; /* horizontal padding of bar */ 21 static const char *fonts[] = { "monospace:size=10" }; 22 static const char dmenufont[] = "monospace:size=10"; 23 static const char col_gray1[] = "#222222"; 24 diff --git a/dwm.c b/dwm.c 25 index 1443802..aa6e2d0 100644 26 --- a/dwm.c 27 +++ b/dwm.c 28 @@ -162,6 +162,7 @@ static void detachstack(Client *c); 29 static Monitor *dirtomon(int dir); 30 static void drawbar(Monitor *m); 31 static void drawbars(void); 32 +static int drawstatusbar(Monitor *m, int bh, char* text); 33 static void enternotify(XEvent *e); 34 static void expose(XEvent *e); 35 static void focus(Client *c); 36 @@ -235,11 +236,13 @@ static void zoom(const Arg *arg); 37 38 /* variables */ 39 static const char broken[] = "broken"; 40 -static char stext[256]; 41 +static char stext[1024]; 42 static int screen; 43 static int sw, sh; /* X display screen geometry width, height */ 44 static int bh; /* bar height */ 45 static int lrpad; /* sum of left and right padding for text */ 46 +static int vp; /* vertical padding for bar */ 47 +static int sp; /* side padding for bar */ 48 static int (*xerrorxlib)(Display *, XErrorEvent *); 49 static unsigned int numlockmask = 0; 50 static void (*handler[LASTEvent]) (XEvent *) = { 51 @@ -485,7 +488,7 @@ cleanup(void) 52 cleanupmon(mons); 53 for (i = 0; i < CurLast; i++) 54 drw_cur_free(drw, cursor[i]); 55 - for (i = 0; i < LENGTH(colors); i++) 56 + for (i = 0; i < LENGTH(colors) + 1; i++) 57 free(scheme[i]); 58 free(scheme); 59 XDestroyWindow(dpy, wmcheckwin); 60 @@ -569,7 +572,7 @@ configurenotify(XEvent *e) 61 for (c = m->clients; c; c = c->next) 62 if (c->isfullscreen) 63 resizeclient(c, m->mx, m->my, m->mw, m->mh); 64 - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); 65 + XMoveResizeWindow(dpy, m->barwin, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh); 66 } 67 focus(NULL); 68 arrange(NULL); 69 @@ -694,6 +697,114 @@ dirtomon(int dir) 70 return m; 71 } 72 73 +int 74 +drawstatusbar(Monitor *m, int bh, char* stext) { 75 + int ret, i, w, x, len; 76 + short isCode = 0; 77 + char *text; 78 + char *p; 79 + 80 + len = strlen(stext) + 1 ; 81 + if (!(text = (char*) malloc(sizeof(char)*len))) 82 + die("malloc"); 83 + p = text; 84 + memcpy(text, stext, len); 85 + 86 + /* compute width of the status text */ 87 + w = 0; 88 + i = -1; 89 + while (text[++i]) { 90 + if (text[i] == '^') { 91 + if (!isCode) { 92 + isCode = 1; 93 + text[i] = '\0'; 94 + w += TEXTW(text) - lrpad; 95 + text[i] = '^'; 96 + if (text[++i] == 'f') 97 + w += atoi(text + ++i); 98 + } else { 99 + isCode = 0; 100 + text = text + i + 1; 101 + i = -1; 102 + } 103 + } 104 + } 105 + if (!isCode) 106 + w += TEXTW(text) - lrpad; 107 + else 108 + isCode = 0; 109 + text = p; 110 + 111 + w += 2; /* 1px padding on both sides */ 112 + ret = x = m->ww - w; 113 + 114 + drw_setscheme(drw, scheme[LENGTH(colors)]); 115 + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; 116 + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; 117 + drw_rect(drw, x - 2 * sp, 0, w, bh, 1, 1); 118 + x++; 119 + 120 + /* process status text */ 121 + i = -1; 122 + while (text[++i]) { 123 + if (text[i] == '^' && !isCode) { 124 + isCode = 1; 125 + 126 + text[i] = '\0'; 127 + w = TEXTW(text) - lrpad; 128 + drw_text(drw, x - 2 * sp, 0, w, bh, 0, text, 0); 129 + 130 + x += w; 131 + 132 + /* process code */ 133 + while (text[++i] != '^') { 134 + if (text[i] == 'c') { 135 + char buf[8]; 136 + memcpy(buf, (char*)text+i+1, 7); 137 + buf[7] = '\0'; 138 + drw_clr_create(drw, &drw->scheme[ColFg], buf); 139 + i += 7; 140 + } else if (text[i] == 'b') { 141 + char buf[8]; 142 + memcpy(buf, (char*)text+i+1, 7); 143 + buf[7] = '\0'; 144 + drw_clr_create(drw, &drw->scheme[ColBg], buf); 145 + i += 7; 146 + } else if (text[i] == 'd') { 147 + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; 148 + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; 149 + } else if (text[i] == 'r') { 150 + int rx = atoi(text + ++i); 151 + while (text[++i] != ','); 152 + int ry = atoi(text + ++i); 153 + while (text[++i] != ','); 154 + int rw = atoi(text + ++i); 155 + while (text[++i] != ','); 156 + int rh = atoi(text + ++i); 157 + 158 + drw_rect(drw, rx + x - 2 * sp, ry, rw, rh, 1, 0); 159 + } else if (text[i] == 'f') { 160 + x += atoi(text + ++i); 161 + } 162 + } 163 + 164 + text = text + i + 1; 165 + i=-1; 166 + isCode = 0; 167 + } 168 + } 169 + 170 + if (!isCode) { 171 + w = TEXTW(text) - lrpad; 172 + drw_text(drw, x - 2 * sp, 0, w, bh, 0, text, 0); 173 + } 174 + 175 + drw_setscheme(drw, scheme[SchemeNorm]); 176 + free(p); 177 + 178 + return ret; 179 +} 180 + 181 void 182 drawbar(Monitor *m) 183 { 184 @@ -708,9 +819,7 @@ drawbar(Monitor *m) 185 186 /* draw status first so it can be overdrawn by tags later */ 187 if (m == selmon) { /* status is only drawn on selected monitor */ 188 - drw_setscheme(drw, scheme[SchemeNorm]); 189 - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ 190 - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); 191 + tw = m->ww - drawstatusbar(m, bh, stext); 192 } 193 194 for (c = m->clients; c; c = c->next) { 195 @@ -736,12 +845,12 @@ drawbar(Monitor *m) 196 if ((w = m->ww - tw - x) > bh) { 197 if (m->sel) { 198 drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); 199 - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); 200 + drw_text(drw, x, 0, w - 2 * sp, bh, lrpad / 2, m->sel->name, 0); 201 if (m->sel->isfloating) 202 drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); 203 } else { 204 drw_setscheme(drw, scheme[SchemeNorm]); 205 - drw_rect(drw, x, 0, w, bh, 1, 1); 206 + drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1); 207 } 208 } 209 drw_map(drw, m->barwin, 0, 0, m->ww, bh); 210 @@ -1562,7 +1671,10 @@ setup(void) 211 die("no fonts could be loaded."); 212 lrpad = drw->fonts->h; 213 bh = drw->fonts->h + 2; 214 + sp = sidepad; 215 + vp = (topbar == 1) ? vertpad : - vertpad; 216 updategeom(); 217 + 218 /* init atoms */ 219 utf8string = XInternAtom(dpy, "UTF8_STRING", False); 220 wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); 221 @@ -1583,7 +1695,8 @@ setup(void) 222 cursor[CurResize] = drw_cur_create(drw, XC_sizing); 223 cursor[CurMove] = drw_cur_create(drw, XC_fleur); 224 /* init appearance */ 225 - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); 226 + scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *)); 227 + scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3); 228 for (i = 0; i < LENGTH(colors); i++) 229 scheme[i] = drw_scm_create(drw, colors[i], 3); 230 /* init bars */ 231 @@ -1716,7 +1829,7 @@ togglebar(const Arg *arg) 232 { 233 selmon->showbar = !selmon->showbar; 234 updatebarpos(selmon); 235 - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); 236 + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx + sp, selmon->by + vp, selmon->ww - 2 * sp, bh); 237 arrange(selmon); 238 } 239 240 @@ -1827,7 +1940,7 @@ updatebars(void) 241 for (m = mons; m; m = m->next) { 242 if (m->barwin) 243 continue; 244 - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), 245 + m->barwin = XCreateWindow(dpy, root, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh, 0, DefaultDepth(dpy, screen), 246 CopyFromParent, DefaultVisual(dpy, screen), 247 CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); 248 XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); 249 @@ -1842,11 +1955,11 @@ updatebarpos(Monitor *m) 250 m->wy = m->my; 251 m->wh = m->mh; 252 if (m->showbar) { 253 - m->wh -= bh; 254 - m->by = m->topbar ? m->wy : m->wy + m->wh; 255 - m->wy = m->topbar ? m->wy + bh : m->wy; 256 + m->wh = m->wh - vertpad - bh; 257 + m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad; 258 + m->wy = m->topbar ? m->wy + bh + vp : m->wy; 259 } else 260 - m->by = -bh; 261 + m->by = -bh - vp; 262 } 263 264 void 265 -- 266 2.46.2 267