add selclient() helper

This may get inlined later, but it's nice for now.  The focused client
if any should always be both at the top of fstack and visible on selmon.
This commit is contained in:
Devin J. Pohly 2020-04-23 00:27:53 -05:00
parent 3593da0e15
commit 9b2eec24c2

24
dwl.c
View File

@ -141,6 +141,7 @@ static void rendermon(struct wl_listener *listener, void *data);
static void resize(Client *c, int x, int y, int w, int h); static void resize(Client *c, int x, int y, int w, int h);
static void resizemouse(const Arg *arg); static void resizemouse(const Arg *arg);
static void run(char *startup_cmd); static void run(char *startup_cmd);
static Client *selclient(void);
static void setcursor(struct wl_listener *listener, void *data); static void setcursor(struct wl_listener *listener, void *data);
static void setlayout(const Arg *arg); static void setlayout(const Arg *arg);
static void setup(void); static void setup(void);
@ -410,18 +411,16 @@ focus(Client *c, struct wlr_surface *surface)
void void
focusnext(const Arg *arg) focusnext(const Arg *arg)
{ {
/* XXX will need more logic with clients on different monitors */ Client *sel = selclient();
if (wl_list_length(&clients) < 2) { if (!sel)
return; return;
}
/* Find the selected client (top of fstack) and focus the client /* Find the selected client (top of fstack) and focus the client
* following it in tiling order */ * following it in tiling order */
Client *c = wl_container_of(fstack.next, c, flink); Client *c = wl_container_of(sel->link.next, c, link);
Client *n = wl_container_of(c->link.next, n, link);
/* Skip the sentinel node if we wrap around the end of the list */ /* Skip the sentinel node if we wrap around the end of the list */
if (&n->link == &clients) if (&c->link == &clients)
n = wl_container_of(n->link.next, n, link); c = wl_container_of(c->link.next, c, link);
focus(n, n->xdg_surface->surface); focus(c, c->xdg_surface->surface);
} }
void void
@ -849,6 +848,15 @@ run(char *startup_cmd)
} }
} }
Client *
selclient(void)
{
Client *c = wl_container_of(fstack.next, c, flink);
if (wl_list_empty(&fstack) || !VISIBLEON(c, selmon))
return NULL;
return c;
}
void void
setcursor(struct wl_listener *listener, void *data) setcursor(struct wl_listener *listener, void *data)
{ {