commit: a3e014adf1f0162c1b18194471650b6288131d9f
parent: 70808cea0a10524f6d298a8e664e32cc4644126d
author: Chris Noxz <chris@noxz.tech>
date: Thu, 12 Nov 2020 14:29:38 +0100
implement dwm changes since 2019-02-02:
* setmfact: Unify bounds for compile-time and runtime mfact
* getatomprop: Add forward declaration
* drawbar: Don't shadow sw global
* dwm crashes when opening 50+ clients (tile layout)
* Fix memory leaks in drw
* dwm.1: fix wrong text in man page
* Fix x coordinate calculation in buttonpress.
3 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/drw.c b/drw.c
@@ -95,6 +95,7 @@ drw_free(Drw *drw)
{
XFreePixmap(drw->dpy, drw->drawable);
XFreeGC(drw->dpy, drw->gc);
+ drw_fontset_free(drw->fonts);
free(drw);
}
diff --git a/dwm.1 b/dwm.1
@@ -33,7 +33,7 @@ dwm draws a small border around windows to indicate the focus state.
.SH OPTIONS
.TP
.B \-v
-prints version information to standard output, then exits.
+prints version information to stderr, then exits.
.SH USAGE
.SS Status bar
.TP
diff --git a/dwm.c b/dwm.c
@@ -180,6 +180,7 @@ static void focus(Client *c);
static void focusin(XEvent *e);
static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
+static Atom getatomprop(Client *c, Atom prop);
static int getrootptr(int *x, int *y);
static long getstate(Window w);
static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
@@ -464,7 +465,7 @@ buttonpress(XEvent *e)
arg.ui = 1 << i;
} else if (ev->x < x + blw)
click = ClkLtSymbol;
- else if (ev->x > selmon->ww - TEXTW(stext))
+ else if (ev->x > selmon->ww - (int)TEXTW(stext))
click = ClkStatusText;
else
click = ClkWinTitle;
@@ -834,7 +835,7 @@ dispatchcmd(void)
void
drawbar(Monitor *m)
{
- int x, w, mid, sw = 0;
+ int x, w, mid, tw = 0;
int boxs = drw->fonts->h / 9;
int boxw = drw->fonts->h / 6 + 2;
unsigned int i, occ = 0, urg = 0;
@@ -852,19 +853,19 @@ drawbar(Monitor *m)
if ((unsigned int)*ts > LENGTH(colors)) { ts++; continue ; }
ctmp = *ts;
*ts = '\0';
- sw += TEXTW(tp) -lrpad;
+ tw += TEXTW(tp) -lrpad;
if (ctmp == '\0') { break; }
*ts = ctmp;
tp = ++ts;
}
- sw += 2; /* 2px right padding */
+ tw += 2; /* 2px right padding */
ts = stext;
tp = stext;
while (1) {
if ((unsigned int)*ts > LENGTH(colors)) { ts++; continue ; }
ctmp = *ts;
*ts = '\0';
- drw_text(drw, m->ww - sw + tx, 0, sw - tx, bh, 0, tp, 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)]);
@@ -893,7 +894,7 @@ drawbar(Monitor *m)
drw_setscheme(drw, scheme[SchemeTagsSel]);
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
- if ((w = m->ww - sw - x) > bh) {
+ if ((w = m->ww - tw - x) > bh) {
if (m->sel) {
mid = (m->ww - TEXTW(m->sel->name)) / 2 - x;
drw_setscheme(drw, scheme[m == selmon ? SchemeTitleSel : SchemeTitleNorm]);
@@ -1793,7 +1794,7 @@ setmfact(const Arg *arg)
if (!arg || !selmon->lt[selmon->sellt]->arrange)
return;
f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- if (f < 0.1 || f > 0.9)
+ if (f < 0.05 || f > 0.95)
return;
selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f;
arrange(selmon);
@@ -2039,11 +2040,13 @@ tile(Monitor *m)
if (i < m->nmaster) {
h = (m->wh - my) / (MIN(n, m->nmaster) - i);
resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
- my += HEIGHT(c);
+ if (my + HEIGHT(c) < m->wh)
+ my += HEIGHT(c);
} else {
h = (m->wh - ty) / (n - i);
resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
- ty += HEIGHT(c);
+ if (ty + HEIGHT(c) < m->wh)
+ ty += HEIGHT(c);
}
}