dwm-zoomswap-6.2.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-zoomswap-6.2.diff (2378B)
---
1 From 3867ef5a68e15a4faff377ddbc8371853de4a800 Mon Sep 17 00:00:00 2001
2 From: aleks <aleks.stier@icloud.com>
3 Date: Sat, 19 Oct 2019 00:56:21 +0200
4 Subject: [PATCH] Put master to exact position of zoomed client
5
6 The default behaviour when zooming a client is to put the previous
7 master on top of the client-stack. This patch puts the master to the
8 exact position of the zoomed client in the stack.
9 ---
10 dwm.c | 44 ++++++++++++++++++++++++++++++++++++++++----
11 1 file changed, 40 insertions(+), 4 deletions(-)
12
13 diff --git a/dwm.c b/dwm.c
14 index 4465af1..1719b36 100644
15 --- a/dwm.c
16 +++ b/dwm.c
17 @@ -165,6 +165,7 @@ static void drawbar(Monitor *m);
18 static void drawbars(void);
19 static void enternotify(XEvent *e);
20 static void expose(XEvent *e);
21 +static Client *findbefore(Client *c);
22 static void focus(Client *c);
23 static void focusin(XEvent *e);
24 static void focusmon(const Arg *arg);
25 @@ -235,6 +236,7 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee);
26 static void zoom(const Arg *arg);
27
28 /* variables */
29 +static Client *prevzoom = NULL;
30 static const char broken[] = "broken";
31 static char stext[256];
32 static int screen;
33 @@ -780,6 +782,16 @@ expose(XEvent *e)
34 drawbar(m);
35 }
36
37 +Client *
38 +findbefore(Client *c)
39 +{
40 + Client *tmp;
41 + if (c == selmon->clients)
42 + return NULL;
43 + for (tmp = selmon->clients; tmp && tmp->next != c; tmp = tmp->next);
44 + return tmp;
45 +}
46 +
47 void
48 focus(Client *c)
49 {
50 @@ -2114,14 +2126,38 @@ void
51 zoom(const Arg *arg)
52 {
53 Client *c = selmon->sel;
54 + Client *at = NULL, *cold, *cprevious = NULL;
55
56 if (!selmon->lt[selmon->sellt]->arrange
57 || (selmon->sel && selmon->sel->isfloating))
58 return;
59 - if (c == nexttiled(selmon->clients))
60 - if (!c || !(c = nexttiled(c->next)))
61 - return;
62 - pop(c);
63 + if (c == nexttiled(selmon->clients)) {
64 + at = findbefore(prevzoom);
65 + if (at)
66 + cprevious = nexttiled(at->next);
67 + if (!cprevious || cprevious != prevzoom) {
68 + prevzoom = NULL;
69 + if (!c || !(c = nexttiled(c->next)))
70 + return;
71 + } else
72 + c = cprevious;
73 + }
74 + cold = nexttiled(selmon->clients);
75 + if (c != cold && !at)
76 + at = findbefore(c);
77 + detach(c);
78 + attach(c);
79 + /* swap windows instead of pushing the previous one down */
80 + if (c != cold && at) {
81 + prevzoom = cold;
82 + if (cold && at != cold) {
83 + detach(cold);
84 + cold->next = at->next;
85 + at->next = cold;
86 + }
87 + }
88 + focus(c);
89 + arrange(c->mon);
90 }
91
92 int
93 --
94 2.23.0
95