}
static void
+focus_state_set_focus(struct focus_state *state,
+ struct weston_surface *surface)
+{
+ if (state->keyboard_focus) {
+ wl_list_remove(&state->surface_destroy_listener.link);
+ wl_list_init(&state->surface_destroy_listener.link);
+ }
+
+ state->keyboard_focus = surface;
+ if (surface)
+ wl_signal_add(&surface->destroy_signal,
+ &state->surface_destroy_listener);
+}
+
+static void
restore_focus_state(struct desktop_shell *shell, struct workspace *ws)
{
struct focus_state *state, *next;
struct weston_seat *seat)
{
struct focus_state *state;
- struct weston_surface *surface;
wl_list_for_each(state, &ws->focus_list, link) {
if (state->seat == seat) {
- surface = seat->keyboard->focus;
- state->keyboard_focus = surface;
+ focus_state_set_focus(state, seat->keyboard->focus);
return;
}
}
wl_list_for_each(state, &ws->focus_list, link)
if (state->keyboard_focus == surface)
- state->keyboard_focus = NULL;
+ focus_state_set_focus(state, NULL);
}
static void
state = ensure_focus_state(shell, seat);
if (state != NULL)
- state->keyboard_focus = surface;
+ focus_state_set_focus(state, surface);
}
static void
return;
old_es = state->keyboard_focus;
- state->keyboard_focus = es;
- wl_list_remove(&state->surface_destroy_listener.link);
- wl_signal_add(&es->destroy_signal, &state->surface_destroy_listener);
+ focus_state_set_focus(state, es);
shsurf = get_shell_surface(main_surface);
assert(shsurf);