added zoom swap patch

This commit is contained in:
2020-07-05 15:14:13 +02:00
parent 473d03fefa
commit 9d1be1dc5c
3 changed files with 136 additions and 4 deletions

44
dwm.c
View File

@@ -169,6 +169,7 @@ static void drawbar(Monitor *m);
static void drawbars(void);
static void enternotify(XEvent *e);
static void expose(XEvent *e);
static Client *findbefore(Client *c);
static void focus(Client *c);
static void focusin(XEvent *e);
static void focusmon(const Arg *arg);
@@ -248,6 +249,7 @@ static void centeredmaster(Monitor *m);
static void centeredfloatingmaster(Monitor *m);
/* variables */
static Client *prevzoom = NULL;
static const char broken[] = "broken";
static char stext[256];
static int screen;
@@ -831,6 +833,16 @@ expose(XEvent *e)
drawbar(m);
}
Client *
findbefore(Client *c)
{
Client *tmp;
if (c == selmon->clients)
return NULL;
for (tmp = selmon->clients; tmp && tmp->next != c; tmp = tmp->next);
return tmp;
}
void
focus(Client *c)
{
@@ -2245,14 +2257,38 @@ void
zoom(const Arg *arg)
{
Client *c = selmon->sel;
Client *at = NULL, *cold, *cprevious = NULL;
if (!selmon->lt[selmon->sellt]->arrange
|| (selmon->sel && selmon->sel->isfloating))
return;
if (c == nexttiled(selmon->clients))
if (!c || !(c = nexttiled(c->next)))
return;
pop(c);
if (c == nexttiled(selmon->clients)) {
at = findbefore(prevzoom);
if (at)
cprevious = nexttiled(at->next);
if (!cprevious || cprevious != prevzoom) {
prevzoom = NULL;
if (!c || !(c = nexttiled(c->next)))
return;
} else
c = cprevious;
}
cold = nexttiled(selmon->clients);
if (c != cold && !at)
at = findbefore(c);
detach(c);
attach(c);
/* swap windows instead of pushing the previous one down */
if (c != cold && at) {
prevzoom = cold;
if (cold && at != cold) {
detach(cold);
cold->next = at->next;
at->next = cold;
}
}
focus(c);
arrange(c->mon);
}
int