dwm-zoomswap-20160731-56a31dc.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-zoomswap-20160731-56a31dc.diff (2457B)
---
1 Author: Jan Christoph Ebersbach <jceb@e-jc.de>
2 URL: http://dwm.suckless.org/patches/zoomswap
3 This patch swaps the current window with the previous master when zooming.
4
5 Index: dwm/dwm.c
6 ===================================================================
7 --- dwm/dwm.c.orig
8 +++ dwm/dwm.c
9 @@ -236,6 +236,7 @@ static int xerrorstart(Display *dpy, XEr
10 static void zoom(const Arg *arg);
11
12 /* variables */
13 +static Client *prevzoom = NULL;
14 static const char broken[] = "broken";
15 static char stext[256];
16 static int screen;
17 @@ -2109,14 +2110,38 @@ void
18 zoom(const Arg *arg)
19 {
20 Client *c = selmon->sel;
21 + Client *at = NULL, *cold, *cprevious = NULL;
22
23 if (!selmon->lt[selmon->sellt]->arrange
24 || (selmon->sel && selmon->sel->isfloating))
25 return;
26 - if (c == nexttiled(selmon->clients))
27 - if (!c || !(c = nexttiled(c->next)))
28 - return;
29 - pop(c);
30 + if (c == nexttiled(selmon->clients)) {
31 + at = findbefore(prevzoom);
32 + if (at)
33 + cprevious = nexttiled(at->next);
34 + if (!cprevious || cprevious != prevzoom) {
35 + prevzoom = NULL;
36 + if(!c || !(c = nexttiled(c->next)))
37 + return;
38 + } else
39 + c = cprevious;
40 + }
41 + cold = nexttiled(selmon->clients);
42 + if (c != cold && !at)
43 + at = findbefore(c);
44 + detach(c);
45 + attach(c);
46 + /* swap windows instead of pushing the previous one down */
47 + if (c != cold && at) {
48 + prevzoom = cold;
49 + if(cold && at != cold) {
50 + detach(cold);
51 + cold->next = at->next;
52 + at->next = cold;
53 + }
54 + }
55 + focus(c);
56 + arrange(c->mon);
57 }
58
59 int
60 Index: dwm/zoomswap.c
61 ===================================================================
62 --- /dev/null
63 +++ dwm/zoomswap.c
64 @@ -0,0 +1,10 @@
65 +static Client * findbefore(Client *c);
66 +
67 +Client *
68 +findbefore(Client *c) {
69 + Client *tmp;
70 + if(c == selmon->clients)
71 + return NULL;
72 + for(tmp = selmon->clients; tmp && tmp->next != c; tmp = tmp->next) ;
73 + return tmp;
74 +}
75 Index: dwm/config.def.h
76 ===================================================================
77 --- dwm/config.def.h.orig
78 +++ dwm/config.def.h
79 @@ -59,6 +59,7 @@ static char dmenumon[2] = "0"; /* compon
80 static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
81 static const char *termcmd[] = { "st", NULL };
82
83 +#include "zoomswap.c"
84 static Key keys[] = {
85 /* modifier key function argument */
86 { MODKEY, XK_p, spawn, {.v = dmenucmd } },