Fixed segfault issues with moving windows between monitors.

Still some issues with centerfirst states persistion when moving windows
between monitors.
This commit is contained in:
Sheldon Lee 2021-12-23 05:40:26 +08:00
parent 8ed3417a0d
commit 190d3cd72d

16
dwm.c
View File

@ -132,6 +132,7 @@ struct Monitor {
Window barwin; Window barwin;
const Layout *lt[2]; const Layout *lt[2];
Pertag *pertag; Pertag *pertag;
int centerfirst;
}; };
typedef struct { typedef struct {
@ -668,6 +669,7 @@ createmon(void)
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
m->pertag = ecalloc(1, sizeof(Pertag)); m->pertag = ecalloc(1, sizeof(Pertag));
m->pertag->curtag = m->pertag->prevtag = 1; m->pertag->curtag = m->pertag->prevtag = 1;
m->centerfirst = centerfirst;
for (i = 0; i <= LENGTH(tags); i++) { for (i = 0; i <= LENGTH(tags); i++) {
m->pertag->nmasters[i] = m->nmaster; m->pertag->nmasters[i] = m->nmaster;
@ -679,7 +681,7 @@ createmon(void)
m->pertag->showbars[i] = m->showbar; m->pertag->showbars[i] = m->showbar;
m->pertag->centerfirst[i] = centerfirst; m->pertag->centerfirst[i] = m->centerfirst;
} }
return m; return m;
@ -898,7 +900,7 @@ focusstack(const Arg *arg)
if (c) { if (c) {
focus(c); focus(c);
restack(selmon); restack(selmon);
//XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2); XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2);
} }
} }
@ -1762,13 +1764,13 @@ tile(Monitor *m)
return; return;
c = nexttiled(m->clients); c = nexttiled(m->clients);
if (n == 1 && m->pertag->centerfirst[m->pertag->curtag] && c && c->iscentered){ if (n <= 1 && selmon->centerfirst && c && c->iscentered){
resize( resize(
c, c,
m->wx + m->ww*(1 - m->mfact)/2, m->wx + m->ww*(1 - m->mfact)/2,
m->wy, m->wy,
m->ww * m->mfact - 2 * m->sel->bw, m->ww * m->mfact - 2 * c->bw,
m->wh - 2 * m->sel->bw, m->wh - 2 * c->bw,
0 0
); );
return; return;
@ -1857,6 +1859,7 @@ toggleview(const Arg *arg)
selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
selmon->centerfirst = selmon->pertag->centerfirst[selmon->pertag->curtag];
if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
togglebar(NULL); togglebar(NULL);
@ -2184,6 +2187,7 @@ view(const Arg *arg)
selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
selmon->centerfirst = selmon->pertag->centerfirst[selmon->pertag->curtag];
if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
togglebar(NULL); togglebar(NULL);
@ -2423,7 +2427,7 @@ togglecenterfirst(const Arg* arg)
{ {
if (!arg || !selmon->lt[selmon->sellt]->arrange) if (!arg || !selmon->lt[selmon->sellt]->arrange)
return; return;
selmon->pertag->centerfirst[selmon->pertag->curtag] ^= 1; selmon->centerfirst = selmon->pertag->centerfirst[selmon->pertag->curtag] ^= 1;
arrange(selmon); arrange(selmon);
} }