dwm-zoomswap-6.0.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.0.diff (1578B)
       ---
            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 diff -r ec4baab78314 dwm.c
            6 --- a/dwm.c        Mon Dec 19 15:38:30 2011 +0100
            7 +++ b/dwm.c        Fri Apr 06 08:23:45 2012 +0200
            8 @@ -253,6 +253,7 @@
            9  static void zoom(const Arg *arg);
           10  
           11  /* variables */
           12 +static Client *prevzoom = NULL;
           13  static const char broken[] = "broken";
           14  static char stext[256];
           15  static int screen;
           16 @@ -2116,14 +2117,36 @@
           17  void
           18  zoom(const Arg *arg) {
           19          Client *c = selmon->sel;
           20 +        Client *at, *tmp;
           21  
           22          if(!selmon->lt[selmon->sellt]->arrange
           23          || (selmon->sel && selmon->sel->isfloating))
           24                  return;
           25 -        if(c == nexttiled(selmon->clients))
           26 -                if(!c || !(c = nexttiled(c->next)))
           27 -                        return;
           28 +        if(c == nexttiled(selmon->clients)) {
           29 +                for(tmp = selmon->clients; tmp && tmp != prevzoom; tmp = tmp->next) ;
           30 +                if(tmp != prevzoom)
           31 +                        prevzoom = NULL;
           32 +                if(!c || !(c = nexttiled(prevzoom))) {
           33 +                        c = selmon->sel;
           34 +                        if(!c || !(c = nexttiled(c->next)))
           35 +                                return;
           36 +                }
           37 +        }
           38 +        for(at = selmon->clients; at && at->next && at != c && at->next != c; at = nexttiled(at->next)) ;
           39          pop(c);
           40 +        /* swap windows instead of pushing the previous one down */
           41 +        if(at && at != c) {
           42 +                /* store c's next neighbor - this window needs to be moved away */
           43 +                tmp = prevzoom = c->next;
           44 +                if(c->next != at) {
           45 +                        /* detach c's neighbor from the list of windows */
           46 +                        c->next = tmp->next;
           47 +                        /* attach tmp after c's previous neighbor */
           48 +                        tmp->next = at->next;
           49 +                        at->next = tmp;
           50 +                        arrange(c->mon);
           51 +                }
           52 +        }
           53  }
           54  
           55  int