From e5a6c57a6e966d29bf63d4d5fd801c71437aa705 Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Sun, 20 Aug 2023 16:43:29 +0100 Subject: [PATCH] Move isfocusable() from desktop.c to view.c --- include/labwc.h | 1 - include/view.h | 14 ++++++++++++++ src/desktop.c | 25 ++++--------------------- src/osd.c | 2 +- src/view.c | 11 ++++++++++- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index efe694dc..71ec2ca5 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -388,7 +388,6 @@ struct view *desktop_cycle_view(struct server *server, struct view *start_view, enum lab_cycle_dir dir); struct view *desktop_focused_view(struct server *server); void desktop_focus_topmost_mapped_view(struct server *server); -bool isfocusable(struct view *view); void keyboard_cancel_keybind_repeat(struct keyboard *keyboard); void keyboard_key_notify(struct wl_listener *listener, void *data); diff --git a/include/view.h b/include/view.h index 9e5ddd62..411cbb0b 100644 --- a/include/view.h +++ b/include/view.h @@ -229,6 +229,20 @@ struct view *view_next(struct wl_list *head, struct view *view, void view_array_append(struct server *server, struct wl_array *views, enum lab_view_criteria criteria); +/** + * view_isfocusable() - Check whether or not a view can be focused + * @view: view to be checked + * + * The purpose of this test is to filter out views (generally Xwayland) which + * are not meant to be focused such as those with surfaces + * a. that have been created but never mapped; + * b. set to NULL after client minimize-request. + * + * The only views that are allowed to be focusd are those that have a surface + * and have been mapped at some point since creation. + */ +bool view_isfocusable(struct view *view); + bool view_inhibits_keybinds(struct view *view); void view_toggle_keybinds(struct view *view); diff --git a/src/desktop.c b/src/desktop.c index 00fcda64..c5a6657e 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -45,7 +45,7 @@ desktop_focus_and_activate_view(struct seat *seat, struct view *view) /* * Guard against views with no mapped surfaces when handling * 'request_activate' and 'request_minimize'. - * See notes by isfocusable() + * See notes by view_isfocusable() */ if (!view->surface) { return; @@ -81,23 +81,6 @@ desktop_focus_and_activate_view(struct seat *seat, struct view *view) seat_focus_surface(seat, view->surface); } -/* - * Some xwayland apps produce unmapped surfaces on startup and also leave - * some unmapped surfaces kicking around on 'close' (for example leafpad's - * "about" dialogue). Whilst this is not normally a problem, we have to be - * careful when cycling between views. The only views we should focus are - * those that are already mapped and those that have been minimized. - */ -bool -isfocusable(struct view *view) -{ - /* filter out those xwayland surfaces that have never been mapped */ - if (!view->surface) { - return false; - } - return (view->mapped || view->minimized); -} - static struct wl_list * get_prev_item(struct wl_list *item) { @@ -122,7 +105,7 @@ first_view(struct server *server) continue; } struct view *view = node_view_from_node(node); - if (isfocusable(view)) { + if (view_isfocusable(view)) { return view; } } @@ -194,7 +177,7 @@ desktop_cycle_view(struct server *server, struct view *start_view, view = node_view_from_node(node); enum property skip = window_rules_get_property(view, "skipWindowSwitcher"); - if (isfocusable(view) && skip != LAB_PROP_TRUE) { + if (view_isfocusable(view) && skip != LAB_PROP_TRUE) { return view; } } while (view != start_view); @@ -269,7 +252,7 @@ desktop_focus_output(struct output *output) continue; } view = node_view_from_node(node); - if (!isfocusable(view)) { + if (!view_isfocusable(view)) { continue; } if (wlr_output_layout_intersects(layout, diff --git a/src/osd.c b/src/osd.c index f6d6766b..8e5f96e8 100644 --- a/src/osd.c +++ b/src/osd.c @@ -475,7 +475,7 @@ osd_update(struct server *server) /* Outline current window */ if (rc.window_switcher.outlines) { - if (isfocusable(server->osd_state.cycle_view)) { + if (view_isfocusable(server->osd_state.cycle_view)) { osd_update_preview_outlines(server->osd_state.cycle_view); } } diff --git a/src/view.c b/src/view.c index aa696755..4d1e5490 100644 --- a/src/view.c +++ b/src/view.c @@ -22,7 +22,7 @@ static bool matches_criteria(struct view *view, enum lab_view_criteria criteria) { - if (!isfocusable(view)) { + if (!view_isfocusable(view)) { return false; } if (criteria & LAB_VIEW_CRITERIA_CURRENT_WORKSPACE) { @@ -80,6 +80,15 @@ view_array_append(struct server *server, struct wl_array *views, } } +bool +view_isfocusable(struct view *view) +{ + if (!view->surface) { + return false; + } + return (view->mapped || view->minimized); +} + /** * All view_apply_xxx_geometry() functions must *not* modify * any state besides repositioning or resizing the view.