]> git.armaanb.net Git - dwm.git/commitdiff
Apply zoomswap patch
authorArmaan Bhojwani <me@armaanb.net>
Wed, 23 Jun 2021 15:18:38 +0000 (11:18 -0400)
committerArmaan Bhojwani <me@armaanb.net>
Wed, 23 Jun 2021 15:25:34 +0000 (11:25 -0400)
dwm.c

diff --git a/dwm.c b/dwm.c
index 4b4d10d91d8fa65b18fc556e1201319ef96af4ad..f2ab57c130000c0bb1f59135b879678fa840dd55 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -167,6 +167,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);
@@ -187,7 +188,6 @@ static void monocle(Monitor *m);
 static void motionnotify(XEvent *e);
 static void movemouse(const Arg *arg);
 static Client *nexttiled(Client *c);
-static void pop(Client *);
 static Client *prevtiled(Client *c);
 static void propertynotify(XEvent *e);
 static void pushdown(const Arg *arg);
@@ -241,6 +241,7 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee);
 static void zoom(const Arg *arg);
 
 /* variables */
+static Client *prevzoom = NULL;
 static const char broken[] = "broken";
 static char stext[256];
 static int screen;
@@ -791,6 +792,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)
 {
@@ -1208,15 +1219,6 @@ nexttiled(Client *c)
        return c;
 }
 
-void
-pop(Client *c)
-{
-       detach(c);
-       attach(c);
-       focus(c);
-       arrange(c->mon);
-}
-
 Client *
 prevtiled(Client *c) {
        Client *p, *r;
@@ -2161,14 +2163,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