aboutsummaryrefslogtreecommitdiffstats
path: root/dwm-zoomswap-6.2.diff
diff options
context:
space:
mode:
Diffstat (limited to 'dwm-zoomswap-6.2.diff')
-rw-r--r--dwm-zoomswap-6.2.diff95
1 files changed, 95 insertions, 0 deletions
diff --git a/dwm-zoomswap-6.2.diff b/dwm-zoomswap-6.2.diff
new file mode 100644
index 0000000..3c658e6
--- /dev/null
+++ b/dwm-zoomswap-6.2.diff
@@ -0,0 +1,95 @@
+From 3867ef5a68e15a4faff377ddbc8371853de4a800 Mon Sep 17 00:00:00 2001
+From: aleks <aleks.stier@icloud.com>
+Date: Sat, 19 Oct 2019 00:56:21 +0200
+Subject: [PATCH] Put master to exact position of zoomed client
+
+The default behaviour when zooming a client is to put the previous
+master on top of the client-stack. This patch puts the master to the
+exact position of the zoomed client in the stack.
+---
+ dwm.c | 44 ++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 40 insertions(+), 4 deletions(-)
+
+diff --git a/dwm.c b/dwm.c
+index 4465af1..1719b36 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -165,6 +165,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);
+@@ -235,6 +236,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;
+@@ -780,6 +782,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)
+ {
+@@ -2114,14 +2126,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
+--
+2.23.0
+