From fdbe9ee29a62eb19938b6a8a39cb7b208b84ec16 Mon Sep 17 00:00:00 2001 From: "Devin J. Pohly" Date: Wed, 22 Apr 2020 11:05:41 -0500 Subject: [PATCH] Don't change tiling order in focusnext() Use the focus stack instead to determine which client is focused --- dwl.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/dwl.c b/dwl.c index e028114..bba372f 100644 --- a/dwl.c +++ b/dwl.c @@ -413,16 +413,18 @@ focus(Client *c, struct wlr_surface *surface) void focusnext(const Arg *arg) { - /* Cycle to the next client */ + /* XXX will need more logic with clients on different monitors */ if (wl_list_length(&clients) < 2) { return; } - Client *c = wl_container_of(clients.next, c, link); + /* Find the selected client (top of fstack) and focus the client + * following it in tiling order */ + Client *c = wl_container_of(fstack.next, c, flink); Client *n = wl_container_of(c->link.next, n, link); + /* Skip the sentinel node if we wrap around the end of the list */ + if (&n->link == &clients) + n = wl_container_of(n->link.next, n, link); focus(n, n->xdg_surface->surface); - /* Move the previous client to the end of the list */ - wl_list_remove(&c->link); - wl_list_insert(clients.prev, &c->link); } void