96 lines
2.3 KiB
Diff
96 lines
2.3 KiB
Diff
|
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
|
||
|
|