sites

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

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