seat: use focus_change event to update focused/active view

- Connect to wlr_seat_keyboard_state's focus_change event.
- Add view_from_wlr_surface(), which does what the name says.
- Use focus_change event along with view_from_wlr_surface() to update
  server->focused_view and set SSD states via view_set_activated().
- Eliminate desktop_focused_view() since server->focused_view should be
  reliably up-to-date now.
- Eliminate view_focus/defocus() since we can now just call
  seat_focus_surface() directly.
This commit is contained in:
John Lindgren 2023-09-27 18:24:35 -04:00 committed by Johan Malm
parent bb5d272dc9
commit 4028a9482f
9 changed files with 77 additions and 100 deletions

View file

@ -167,6 +167,7 @@ struct seat {
struct wl_client *active_client_while_inhibited;
struct wl_list inputs;
struct wl_listener new_input;
struct wl_listener focus_change;
struct wl_listener cursor_motion;
struct wl_listener cursor_motion_absolute;
@ -247,11 +248,8 @@ struct server {
/* SSD state */
/*
* Currently focused view (cached value). This pointer is used
* primarily to track which view is being drawn with "active"
* SSD coloring. We consider it a bug if this gets out of sync
* with the actual keyboard focus (according to wlroots). See
* also desktop_focused_view().
* Currently focused view. Updated with each "focus change"
* event. This view is drawn with "active" SSD coloring.
*/
struct view *focused_view;
struct ssd_hover_state *ssd_hover_state;
@ -395,14 +393,6 @@ enum lab_cycle_dir {
*/
struct view *desktop_cycle_view(struct server *server, struct view *start_view,
enum lab_cycle_dir dir);
/**
* desktop_focused_view - return the view that is currently focused
* (determined on-the-fly from the wlroots keyboard focus). The return
* value should ideally match server->focused_view (we consider it a
* bug otherwise) but is guaranteed to be up-to-date even if
* server->focused_view gets out of sync.
*/
struct view *desktop_focused_view(struct server *server);
void desktop_focus_topmost_mapped_view(struct server *server);
void keyboard_cancel_keybind_repeat(struct keyboard *keyboard);

View file

@ -186,6 +186,12 @@ enum lab_view_criteria {
LAB_VIEW_CRITERIA_NO_SKIP_WINDOW_SWITCHER = 1 << 2,
};
/**
* view_from_wlr_surface() - returns the view associated with a
* wlr_surface, or NULL if the surface has no associated view.
*/
struct view *view_from_wlr_surface(struct wlr_surface *surface);
/**
* for_each_view() - iterate over all views which match criteria
* @view: Iterator.
@ -257,8 +263,7 @@ bool view_isfocusable(struct view *view);
bool view_inhibits_keybinds(struct view *view);
void view_toggle_keybinds(struct view *view);
void view_focus(struct view *view);
void view_defocus(struct view *view);
void view_set_activated(struct view *view, bool activated);
void view_set_output(struct view *view, struct output *output);
void view_close(struct view *view);