sites

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

dwm-status2d-extrabar-6.2.diff (9655B)


      1 From e741941428f60f2d8c8d1125c965dec4cfc2d1ba Mon Sep 17 00:00:00 2001
      2 From: klassiker <suckless@lupia.eu>
      3 Date: Tue, 14 Jul 2020 15:23:06 +0200
      4 Subject: [PATCH] status2d patched with the extrabar patch for dwm 6.2
      5 
      6 ---
      7  config.def.h |   2 +-
      8  dwm.c        | 188 +++++++++++++++++++++++++++++++++++++++++++++------
      9  2 files changed, 169 insertions(+), 21 deletions(-)
     10 
     11 diff --git a/config.def.h b/config.def.h
     12 index 1c0b587..8ce3e96 100644
     13 --- a/config.def.h
     14 +++ b/config.def.h
     15 @@ -5,6 +5,7 @@ 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 char statussep         = ';';      /* separator between status bars */
     20  static const char *fonts[]          = { "monospace:size=10" };
     21  static const char dmenufont[]       = "monospace:size=10";
     22  static const char col_gray1[]       = "#222222";
     23 @@ -112,4 +113,3 @@ static Button buttons[] = {
     24  	{ ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
     25  	{ ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
     26  };
     27 -
     28 diff --git a/dwm.c b/dwm.c
     29 index 4465af1..f3c97c4 100644
     30 --- a/dwm.c
     31 +++ b/dwm.c
     32 @@ -117,6 +117,7 @@ struct Monitor {
     33  	int nmaster;
     34  	int num;
     35  	int by;               /* bar geometry */
     36 +	int eby;	      /* extra bar geometry */
     37  	int mx, my, mw, mh;   /* screen size */
     38  	int wx, wy, ww, wh;   /* window area  */
     39  	unsigned int seltags;
     40 @@ -129,6 +130,7 @@ struct Monitor {
     41  	Client *stack;
     42  	Monitor *next;
     43  	Window barwin;
     44 +	Window extrabarwin;
     45  	const Layout *lt[2];
     46  };
     47  
     48 @@ -163,6 +165,7 @@ static void detachstack(Client *c);
     49  static Monitor *dirtomon(int dir);
     50  static void drawbar(Monitor *m);
     51  static void drawbars(void);
     52 +static int drawstatusbar(Monitor *m, int bh, int extra, char* text);
     53  static void enternotify(XEvent *e);
     54  static void expose(XEvent *e);
     55  static void focus(Client *c);
     56 @@ -236,7 +239,8 @@ static void zoom(const Arg *arg);
     57  
     58  /* variables */
     59  static const char broken[] = "broken";
     60 -static char stext[256];
     61 +static char stext[1024];
     62 +static char estext[1024];
     63  static int screen;
     64  static int sw, sh;           /* X display screen geometry width, height */
     65  static int bh, blw = 0;      /* bar geometry */
     66 @@ -484,7 +488,7 @@ cleanup(void)
     67  		cleanupmon(mons);
     68  	for (i = 0; i < CurLast; i++)
     69  		drw_cur_free(drw, cursor[i]);
     70 -	for (i = 0; i < LENGTH(colors); i++)
     71 +	for (i = 0; i < LENGTH(colors) + 1; i++)
     72  		free(scheme[i]);
     73  	XDestroyWindow(dpy, wmcheckwin);
     74  	drw_free(drw);
     75 @@ -505,7 +509,9 @@ cleanupmon(Monitor *mon)
     76  		m->next = mon->next;
     77  	}
     78  	XUnmapWindow(dpy, mon->barwin);
     79 +	XUnmapWindow(dpy, mon->extrabarwin);
     80  	XDestroyWindow(dpy, mon->barwin);
     81 +	XDestroyWindow(dpy, mon->extrabarwin);
     82  	free(mon);
     83  }
     84  
     85 @@ -568,6 +574,7 @@ configurenotify(XEvent *e)
     86  					if (c->isfullscreen)
     87  						resizeclient(c, m->mx, m->my, m->mw, m->mh);
     88  				XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
     89 +				XMoveResizeWindow(dpy, m->extrabarwin, m->wx, m->eby, m->ww, bh);
     90  			}
     91  			focus(NULL);
     92  			arrange(NULL);
     93 @@ -692,6 +699,119 @@ dirtomon(int dir)
     94  	return m;
     95  }
     96  
     97 +int
     98 +drawstatusbar(Monitor *m, int bh, int extra, char* stext) {
     99 +	int ret, i, w, x, len;
    100 +	short isCode = 0;
    101 +	char *text;
    102 +	char *p;
    103 +
    104 +	len = strlen(stext) + 1 ;
    105 +	if (!(text = (char*) malloc(sizeof(char)*len)))
    106 +		die("malloc");
    107 +	p = text;
    108 +	memcpy(text, stext, len);
    109 +
    110 +	/* compute width of the status text */
    111 +	w = 0;
    112 +	i = -1;
    113 +	while (text[++i]) {
    114 +		if (text[i] == '^') {
    115 +			if (!isCode) {
    116 +				isCode = 1;
    117 +				text[i] = '\0';
    118 +				w += TEXTW(text) - lrpad;
    119 +				text[i] = '^';
    120 +				if (text[++i] == 'f')
    121 +					w += atoi(text + ++i);
    122 +			} else {
    123 +				isCode = 0;
    124 +				text = text + i + 1;
    125 +				i = -1;
    126 +			}
    127 +		}
    128 +	}
    129 +	if (!isCode)
    130 +		w += TEXTW(text) - lrpad;
    131 +	else
    132 +		isCode = 0;
    133 +	text = p;
    134 +
    135 +	if (extra) {
    136 +		w = m->ww;
    137 +		ret = x = 1;
    138 +	} else {
    139 +		w += 2; /* 1px padding on both sides */
    140 +		ret = x = m->ww - w;
    141 +	}
    142 +
    143 +	drw_setscheme(drw, scheme[LENGTH(colors)]);
    144 +	drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
    145 +	drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
    146 +	drw_rect(drw, x, 0, w, bh, 1, 1);
    147 +	x++;
    148 +
    149 +	/* process status text */
    150 +	i = -1;
    151 +	while (text[++i]) {
    152 +		if (text[i] == '^' && !isCode) {
    153 +			isCode = 1;
    154 +
    155 +			text[i] = '\0';
    156 +			w = TEXTW(text) - lrpad;
    157 +			drw_text(drw, x, 0, w, bh, 0, text, 0);
    158 +
    159 +			x += w;
    160 +
    161 +			/* process code */
    162 +			while (text[++i] != '^') {
    163 +				if (text[i] == 'c') {
    164 +					char buf[8];
    165 +					memcpy(buf, (char*)text+i+1, 7);
    166 +					buf[7] = '\0';
    167 +					drw_clr_create(drw, &drw->scheme[ColFg], buf);
    168 +					i += 7;
    169 +				} else if (text[i] == 'b') {
    170 +					char buf[8];
    171 +					memcpy(buf, (char*)text+i+1, 7);
    172 +					buf[7] = '\0';
    173 +					drw_clr_create(drw, &drw->scheme[ColBg], buf);
    174 +					i += 7;
    175 +				} else if (text[i] == 'd') {
    176 +					drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
    177 +					drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
    178 +				} else if (text[i] == 'r') {
    179 +					int rx = atoi(text + ++i);
    180 +					while (text[++i] != ',');
    181 +					int ry = atoi(text + ++i);
    182 +					while (text[++i] != ',');
    183 +					int rw = atoi(text + ++i);
    184 +					while (text[++i] != ',');
    185 +					int rh = atoi(text + ++i);
    186 +
    187 +					drw_rect(drw, rx + x, ry, rw, rh, 1, 0);
    188 +				} else if (text[i] == 'f') {
    189 +					x += atoi(text + ++i);
    190 +				}
    191 +			}
    192 +
    193 +			text = text + i + 1;
    194 +			i=-1;
    195 +			isCode = 0;
    196 +		}
    197 +	}
    198 +
    199 +	if (!isCode) {
    200 +		w = TEXTW(text) - lrpad;
    201 +		drw_text(drw, x, 0, w, bh, 0, text, 0);
    202 +	}
    203 +
    204 +	drw_setscheme(drw, scheme[SchemeNorm]);
    205 +	free(p);
    206 +
    207 +	return ret;
    208 +}
    209 +
    210  void
    211  drawbar(Monitor *m)
    212  {
    213 @@ -703,9 +823,7 @@ drawbar(Monitor *m)
    214  
    215  	/* draw status first so it can be overdrawn by tags later */
    216  	if (m == selmon) { /* status is only drawn on selected monitor */
    217 -		drw_setscheme(drw, scheme[SchemeNorm]);
    218 -		sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
    219 -		drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0);
    220 +		sw = m->ww - drawstatusbar(m, bh, 0, stext);
    221  	}
    222  
    223  	for (c = m->clients; c; c = c->next) {
    224 @@ -740,6 +858,11 @@ drawbar(Monitor *m)
    225  		}
    226  	}
    227  	drw_map(drw, m->barwin, 0, 0, m->ww, bh);
    228 +
    229 +	if (m == selmon) { /* extra status is only drawn on selected monitor */
    230 +		sw = drawstatusbar(m, bh, 1, estext);
    231 +		drw_map(drw, m->extrabarwin, 0, 0, m->ww, bh);
    232 +	}
    233  }
    234  
    235  void
    236 @@ -1567,7 +1690,8 @@ setup(void)
    237  	cursor[CurResize] = drw_cur_create(drw, XC_sizing);
    238  	cursor[CurMove] = drw_cur_create(drw, XC_fleur);
    239  	/* init appearance */
    240 -	scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
    241 +	scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *));
    242 +	scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3);
    243  	for (i = 0; i < LENGTH(colors); i++)
    244  		scheme[i] = drw_scm_create(drw, colors[i], 3);
    245  	/* init bars */
    246 @@ -1702,6 +1826,7 @@ togglebar(const Arg *arg)
    247  	selmon->showbar = !selmon->showbar;
    248  	updatebarpos(selmon);
    249  	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
    250 +	XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx, selmon->eby, selmon->ww, bh);
    251  	arrange(selmon);
    252  }
    253  
    254 @@ -1809,14 +1934,22 @@ updatebars(void)
    255  	};
    256  	XClassHint ch = {"dwm", "dwm"};
    257  	for (m = mons; m; m = m->next) {
    258 -		if (m->barwin)
    259 -			continue;
    260 -		m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
    261 -				CopyFromParent, DefaultVisual(dpy, screen),
    262 -				CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
    263 -		XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
    264 -		XMapRaised(dpy, m->barwin);
    265 -		XSetClassHint(dpy, m->barwin, &ch);
    266 +		if (!m->barwin) {
    267 +			m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
    268 +					CopyFromParent, DefaultVisual(dpy, screen),
    269 +					CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
    270 +			XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
    271 +			XMapRaised(dpy, m->barwin);
    272 +			XSetClassHint(dpy, m->barwin, &ch);
    273 +		}
    274 +		if (!m->extrabarwin) {
    275 +			m->extrabarwin = XCreateWindow(dpy, root, m->wx, m->eby, m->ww, bh, 0, DefaultDepth(dpy, screen),
    276 +					CopyFromParent, DefaultVisual(dpy, screen),
    277 +					CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
    278 +			XDefineCursor(dpy, m->extrabarwin, cursor[CurNormal]->cursor);
    279 +			XMapRaised(dpy, m->extrabarwin);
    280 +			XSetClassHint(dpy, m->extrabarwin, &ch);
    281 +		}
    282  	}
    283  }
    284  
    285 @@ -1825,12 +1958,15 @@ updatebarpos(Monitor *m)
    286  {
    287  	m->wy = m->my;
    288  	m->wh = m->mh;
    289 +	m->wh -= bh * m->showbar * 2;
    290 +	m->wy = m->showbar ? m->wy + bh : m->wy;
    291  	if (m->showbar) {
    292 -		m->wh -= bh;
    293 -		m->by = m->topbar ? m->wy : m->wy + m->wh;
    294 -		m->wy = m->topbar ? m->wy + bh : m->wy;
    295 -	} else
    296 +		m->by = m->topbar ? m->wy - bh : m->wy + m->wh;
    297 +		m->eby = m->topbar ? m->wy + m->wh : m->wy - bh;
    298 +	} else {
    299  		m->by = -bh;
    300 +		m->eby = -bh;
    301 +	}
    302  }
    303  
    304  void
    305 @@ -1987,8 +2123,20 @@ updatesizehints(Client *c)
    306  void
    307  updatestatus(void)
    308  {
    309 -	if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
    310 +	char text[2048];
    311 +	if (!gettextprop(root, XA_WM_NAME, text, sizeof(text))) {
    312  		strcpy(stext, "dwm-"VERSION);
    313 +		estext[0] = '\0';
    314 +	} else {
    315 +		char *e = strchr(text, statussep);
    316 +		if (e) {
    317 +			*e = '\0'; e++;
    318 +			strncpy(estext, e, sizeof(estext) - 1);
    319 +		} else {
    320 +			estext[0] = '\0';
    321 +		}
    322 +		strncpy(stext, text, sizeof(stext) - 1);
    323 +	}
    324  	drawbar(selmon);
    325  }
    326  
    327 @@ -2067,7 +2215,7 @@ wintomon(Window w)
    328  	if (w == root && getrootptr(&x, &y))
    329  		return recttomon(x, y, 1, 1);
    330  	for (m = mons; m; m = m->next)
    331 -		if (w == m->barwin)
    332 +		if (w == m->barwin || w == m->extrabarwin)
    333  			return m;
    334  	if ((c = wintoclient(w)))
    335  		return c->mon;
    336 -- 
    337 2.27.0
    338