diff options
-rw-r--r-- | dwl.c | 19 |
1 files changed, 11 insertions, 8 deletions
@@ -1640,28 +1640,31 @@ xytomon(double x, double y) void zoom(const Arg *arg) { - unsigned int n = 0; Client *c, *sel = selclient(); if (!sel || !selmon->lt[selmon->sellt]->arrange || sel->isfloating) return; + /* Search for the first tiled window that is not sel, marking sel as + * NULL if we pass it along the way */ wl_list_for_each(c, &clients, link) if (VISIBLEON(c, selmon) && !c->isfloating) { - if (++n == 1 && c == sel) - sel = NULL; - else if (n == 2) { - if (!sel) - sel = c; + if (c != sel) break; - } + sel = NULL; } - if (n == 1) + /* Return if no other tiled window was found */ + if (&c->link == &clients) return; + /* If we passed sel, move c to the front; otherwise, move sel to the + * front */ + if (!sel) + sel = c; wl_list_remove(&sel->link); wl_list_insert(&clients, &sel->link); + focusclient(sel, NULL, 1); arrange(selmon); } |