* Note: If current==NULL, the list's second view is returned
*/
struct view *desktop_next_view(struct server *server, struct view *current);
-void desktop_focus_next_mapped_view(struct view *current);
+void desktop_focus_topmost_mapped_view(struct server *server);
struct view *desktop_view_at(struct server *server, double lx, double ly,
struct wlr_surface **surface, double *sx,
double *sy, int *view_area);
return false;
}
-struct view *
-desktop_next_mapped_view(struct view *current)
+static struct view *
+topmost_mapped_view(struct server *server)
{
- assert(current);
- struct server *server = current->server;
if (!has_mapped_view(&server->views)) {
return NULL;
}
- struct view *view = first_view(server);
+
+ /* start from tail of server->views */
+ struct view *view = wl_container_of(server->views.prev, view, link);
do {
view = wl_container_of(view->link.next, view, link);
} while (&view->link == &server->views || !view->mapped);
return view;
}
+
void
-desktop_focus_next_mapped_view(struct view *current)
+desktop_focus_topmost_mapped_view(struct server *server)
{
- assert(current);
- struct view *view = desktop_next_mapped_view(current);
- desktop_focus_view(¤t->server->seat, view);
+ struct view *view = topmost_mapped_view(server);
+ desktop_focus_view(&server->seat, view);
}
static bool
{
view->mapped = false;
wl_list_remove(&view->commit.link);
- desktop_focus_next_mapped_view(view);
+ desktop_focus_topmost_mapped_view(view->server);
}
static const struct view_impl xdg_toplevel_view_impl = {
{
view->mapped = false;
wl_list_remove(&view->commit.link);
- desktop_focus_next_mapped_view(view);
+ desktop_focus_topmost_mapped_view(view->server);
}
static const struct view_impl xwl_view_impl = {