mirror of
https://github.com/Horhik/dotfiles.git
synced 2024-11-29 19:41:27 +00:00
226 lines
7.4 KiB
Diff
226 lines
7.4 KiB
Diff
diff --git a/dwm.c b/dwm.c
|
|
index 4465af1..3c94e4b 100644
|
|
--- a/dwm.c
|
|
+++ b/dwm.c
|
|
@@ -143,7 +143,7 @@ typedef struct {
|
|
|
|
/* function declarations */
|
|
static void applyrules(Client *c);
|
|
-static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
|
|
+static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int *bw, int interact);
|
|
static void arrange(Monitor *m);
|
|
static void arrangemon(Monitor *m);
|
|
static void attach(Client *c);
|
|
@@ -188,8 +188,8 @@ static void pop(Client *);
|
|
static void propertynotify(XEvent *e);
|
|
static void quit(const Arg *arg);
|
|
static Monitor *recttomon(int x, int y, int w, int h);
|
|
-static void resize(Client *c, int x, int y, int w, int h, int interact);
|
|
-static void resizeclient(Client *c, int x, int y, int w, int h);
|
|
+static void resize(Client *c, int x, int y, int w, int h, int bw, int interact);
|
|
+static void resizeclient(Client *c, int x, int y, int w, int h, int bw);
|
|
static void resizemouse(const Arg *arg);
|
|
static void restack(Monitor *m);
|
|
static void run(void);
|
|
@@ -312,7 +312,7 @@ applyrules(Client *c)
|
|
}
|
|
|
|
int
|
|
-applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
|
|
+applysizehints(Client *c, int *x, int *y, int *w, int *h, int *bw, int interact)
|
|
{
|
|
int baseismin;
|
|
Monitor *m = c->mon;
|
|
@@ -325,18 +325,18 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
|
|
*x = sw - WIDTH(c);
|
|
if (*y > sh)
|
|
*y = sh - HEIGHT(c);
|
|
- if (*x + *w + 2 * c->bw < 0)
|
|
+ if (*x + *w + 2 * *bw < 0)
|
|
*x = 0;
|
|
- if (*y + *h + 2 * c->bw < 0)
|
|
+ if (*y + *h + 2 * *bw < 0)
|
|
*y = 0;
|
|
} else {
|
|
if (*x >= m->wx + m->ww)
|
|
*x = m->wx + m->ww - WIDTH(c);
|
|
if (*y >= m->wy + m->wh)
|
|
*y = m->wy + m->wh - HEIGHT(c);
|
|
- if (*x + *w + 2 * c->bw <= m->wx)
|
|
+ if (*x + *w + 2 * *bw <= m->wx)
|
|
*x = m->wx;
|
|
- if (*y + *h + 2 * c->bw <= m->wy)
|
|
+ if (*y + *h + 2 * *bw <= m->wy)
|
|
*y = m->wy;
|
|
}
|
|
if (*h < bh)
|
|
@@ -374,7 +374,7 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
|
|
if (c->maxh)
|
|
*h = MIN(*h, c->maxh);
|
|
}
|
|
- return *x != c->x || *y != c->y || *w != c->w || *h != c->h;
|
|
+ return *x != c->x || *y != c->y || *w != c->w || *h != c->h || *bw != c->bw;
|
|
}
|
|
|
|
void
|
|
@@ -394,9 +394,16 @@ arrange(Monitor *m)
|
|
void
|
|
arrangemon(Monitor *m)
|
|
{
|
|
+ Client *c;
|
|
+
|
|
strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
|
|
if (m->lt[m->sellt]->arrange)
|
|
m->lt[m->sellt]->arrange(m);
|
|
+ else
|
|
+ /* <>< case; rather than providing an arrange function and upsetting other logic that tests for its presence, simply add borders here */
|
|
+ for (c = selmon->clients; c; c = c->next)
|
|
+ if (ISVISIBLE(c) && c->bw == 0)
|
|
+ resize(c, c->x, c->y, c->w - 2*borderpx, c->h - 2*borderpx, borderpx, 0);
|
|
}
|
|
|
|
void
|
|
@@ -566,7 +573,7 @@ configurenotify(XEvent *e)
|
|
for (m = mons; m; m = m->next) {
|
|
for (c = m->clients; c; c = c->next)
|
|
if (c->isfullscreen)
|
|
- resizeclient(c, m->mx, m->my, m->mw, m->mh);
|
|
+ resizeclient(c, m->mx, m->my, m->mw, m->mh, 0);
|
|
XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
|
|
}
|
|
focus(NULL);
|
|
@@ -1112,7 +1119,7 @@ monocle(Monitor *m)
|
|
if (n > 0) /* override layout symbol */
|
|
snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
|
|
for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
|
|
- resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
|
|
+ resize(c, m->wx, m->wy, m->ww, m->wh, 0, 0);
|
|
}
|
|
|
|
void
|
|
@@ -1180,7 +1187,7 @@ movemouse(const Arg *arg)
|
|
&& (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
|
|
togglefloating(NULL);
|
|
if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
|
|
- resize(c, nx, ny, c->w, c->h, 1);
|
|
+ resize(c, nx, ny, c->w, c->h, c->bw, 1);
|
|
break;
|
|
}
|
|
} while (ev.type != ButtonRelease);
|
|
@@ -1266,14 +1273,14 @@ recttomon(int x, int y, int w, int h)
|
|
}
|
|
|
|
void
|
|
-resize(Client *c, int x, int y, int w, int h, int interact)
|
|
+resize(Client *c, int x, int y, int w, int h, int bw, int interact)
|
|
{
|
|
- if (applysizehints(c, &x, &y, &w, &h, interact))
|
|
- resizeclient(c, x, y, w, h);
|
|
+ if (applysizehints(c, &x, &y, &w, &h, &bw, interact))
|
|
+ resizeclient(c, x, y, w, h, bw);
|
|
}
|
|
|
|
void
|
|
-resizeclient(Client *c, int x, int y, int w, int h)
|
|
+resizeclient(Client *c, int x, int y, int w, int h, int bw)
|
|
{
|
|
XWindowChanges wc;
|
|
|
|
@@ -1281,7 +1288,7 @@ resizeclient(Client *c, int x, int y, int w, int h)
|
|
c->oldy = c->y; c->y = wc.y = y;
|
|
c->oldw = c->w; c->w = wc.width = w;
|
|
c->oldh = c->h; c->h = wc.height = h;
|
|
- wc.border_width = c->bw;
|
|
+ c->oldbw = c->bw; c->bw = wc.border_width = bw;
|
|
XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
|
|
configure(c);
|
|
XSync(dpy, False);
|
|
@@ -1330,7 +1337,7 @@ resizemouse(const Arg *arg)
|
|
togglefloating(NULL);
|
|
}
|
|
if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
|
|
- resize(c, c->x, c->y, nw, nh, 1);
|
|
+ resize(c, c->x, c->y, nw, nh, c->bw, 1);
|
|
break;
|
|
}
|
|
} while (ev.type != ButtonRelease);
|
|
@@ -1477,22 +1484,20 @@ setfullscreen(Client *c, int fullscreen)
|
|
PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
|
|
c->isfullscreen = 1;
|
|
c->oldstate = c->isfloating;
|
|
- c->oldbw = c->bw;
|
|
- c->bw = 0;
|
|
c->isfloating = 1;
|
|
- resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh);
|
|
+ resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh, 0);
|
|
XRaiseWindow(dpy, c->win);
|
|
} else if (!fullscreen && c->isfullscreen){
|
|
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
|
|
PropModeReplace, (unsigned char*)0, 0);
|
|
c->isfullscreen = 0;
|
|
c->isfloating = c->oldstate;
|
|
- c->bw = c->oldbw;
|
|
c->x = c->oldx;
|
|
c->y = c->oldy;
|
|
c->w = c->oldw;
|
|
c->h = c->oldh;
|
|
- resizeclient(c, c->x, c->y, c->w, c->h);
|
|
+ c->bw = c->oldbw;
|
|
+ resizeclient(c, c->x, c->y, c->w, c->h, c->bw);
|
|
arrange(c->mon);
|
|
}
|
|
}
|
|
@@ -1619,7 +1624,7 @@ showhide(Client *c)
|
|
/* show clients top down */
|
|
XMoveWindow(dpy, c->win, c->x, c->y);
|
|
if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
|
|
- resize(c, c->x, c->y, c->w, c->h, 0);
|
|
+ resize(c, c->x, c->y, c->w, c->h, c->bw, 0);
|
|
showhide(c->snext);
|
|
} else {
|
|
/* hide clients bottom up */
|
|
@@ -1673,13 +1678,17 @@ tagmon(const Arg *arg)
|
|
void
|
|
tile(Monitor *m)
|
|
{
|
|
- unsigned int i, n, h, mw, my, ty;
|
|
+ unsigned int i, n, h, mw, my, ty, bw;
|
|
Client *c;
|
|
|
|
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
|
|
if (n == 0)
|
|
return;
|
|
|
|
+ if (n == 1)
|
|
+ bw = 0;
|
|
+ else
|
|
+ bw = borderpx;
|
|
if (n > m->nmaster)
|
|
mw = m->nmaster ? m->ww * m->mfact : 0;
|
|
else
|
|
@@ -1687,11 +1696,11 @@ tile(Monitor *m)
|
|
for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
|
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);
|
|
+ resize(c, m->wx, m->wy + my, mw - 2*bw, h - 2*bw, bw, 0);
|
|
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);
|
|
+ resize(c, m->wx + mw, m->wy + ty, m->ww - mw - 2*bw, h - 2*bw, bw, 0);
|
|
ty += HEIGHT(c);
|
|
}
|
|
}
|
|
@@ -1715,7 +1724,9 @@ togglefloating(const Arg *arg)
|
|
selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed;
|
|
if (selmon->sel->isfloating)
|
|
resize(selmon->sel, selmon->sel->x, selmon->sel->y,
|
|
- selmon->sel->w, selmon->sel->h, 0);
|
|
+ selmon->sel->w - 2 * (borderpx - selmon->sel->bw),
|
|
+ selmon->sel->h - 2 * (borderpx - selmon->sel->bw),
|
|
+ borderpx, 0);
|
|
arrange(selmon);
|
|
}
|
|
|