From 10bf0ff566e5e973a2f7a5f67ac8f149e39b4307 Mon Sep 17 00:00:00 2001 From: "Devin J. Pohly" Date: Wed, 22 Apr 2020 10:42:40 -0500 Subject: [PATCH] add separate list of clients for focus order Previously, clicking a client to focus it would change where it was in the tiled layout as well. --- dwl.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/dwl.c b/dwl.c index 177a946..e028114 100644 --- a/dwl.c +++ b/dwl.c @@ -55,6 +55,7 @@ typedef struct { typedef struct Monitor Monitor; typedef struct { struct wl_list link; + struct wl_list flink; struct wlr_xdg_surface *xdg_surface; struct wl_listener map; struct wl_listener unmap; @@ -156,7 +157,8 @@ static struct wlr_renderer *renderer; static struct wlr_xdg_shell *xdg_shell; static struct wl_listener new_xdg_surface; -static struct wl_list clients; +static struct wl_list clients; /* tiling order */ +static struct wl_list fstack; /* focus order */ static struct wlr_cursor *cursor; static struct wlr_xcursor_manager *cursor_mgr; @@ -394,9 +396,9 @@ focus(Client *c, struct wlr_surface *surface) wlr_xdg_toplevel_set_activated(previous, false); } struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat); - /* Move the client to the front */ - wl_list_remove(&c->link); - wl_list_insert(&clients, &c->link); + /* Move the client to the front of the focus stack */ + wl_list_remove(&c->flink); + wl_list_insert(&fstack, &c->flink); /* Activate the new surface */ wlr_xdg_toplevel_set_activated(c->xdg_surface, true); /* @@ -528,6 +530,7 @@ maprequest(struct wl_listener *listener, void *data) /* Insert this client into the list and focus it. */ c->mon = selmon; wl_list_insert(&clients, &c->link); + wl_list_insert(&fstack, &c->flink); focus(c, c->xdg_surface->surface); } @@ -916,13 +919,14 @@ setup(void) new_output.notify = createmon; wl_signal_add(&backend->events.new_output, &new_output); - /* Set up our list of clients and the xdg-shell. The xdg-shell is a Wayland - * protocol which is used for application windows. For more detail on - * shells, refer to my article: + /* Set up our lists of clients and the xdg-shell. The xdg-shell is a + * Wayland protocol which is used for application windows. For more + * detail on shells, refer to the article: * * https://drewdevault.com/2018/07/29/Wayland-shells.html */ wl_list_init(&clients); + wl_list_init(&fstack); xdg_shell = wlr_xdg_shell_create(wl_display); new_xdg_surface.notify = createnotify; wl_signal_add(&xdg_shell->events.new_surface, @@ -1035,6 +1039,7 @@ unmapnotify(struct wl_listener *listener, void *data) /* Called when the surface is unmapped, and should no longer be shown. */ Client *c = wl_container_of(listener, c, unmap); wl_list_remove(&c->link); + wl_list_remove(&c->flink); } Client *