added zoom swap patch
This commit is contained in:
44
dwm.c
44
dwm.c
@@ -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
|
||||
|
Reference in New Issue
Block a user