desktop-shell: Embed keyboard focus handle code when activating
We shouldn't be constrained by having a keyboard plugged-in, so avoid activating/de-activating the window/surface in the keyboard focus handler and embed it straight into the window activation part. Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
This commit is contained in:
+25
-16
@@ -1889,22 +1889,7 @@ shell_surface_activate(struct shell_surface *shsurf)
|
|||||||
static void
|
static void
|
||||||
handle_keyboard_focus(struct wl_listener *listener, void *data)
|
handle_keyboard_focus(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
struct weston_keyboard *keyboard = data;
|
/* FIXME: To be removed later. */
|
||||||
struct shell_seat *seat = get_shell_seat(keyboard->seat);
|
|
||||||
|
|
||||||
if (seat->focused_surface) {
|
|
||||||
struct shell_surface *shsurf = get_shell_surface(seat->focused_surface);
|
|
||||||
if (shsurf)
|
|
||||||
shell_surface_deactivate(shsurf);
|
|
||||||
}
|
|
||||||
|
|
||||||
seat->focused_surface = weston_surface_get_main_surface(keyboard->focus);
|
|
||||||
|
|
||||||
if (seat->focused_surface) {
|
|
||||||
struct shell_surface *shsurf = get_shell_surface(seat->focused_surface);
|
|
||||||
if (shsurf)
|
|
||||||
shell_surface_activate(shsurf);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The surface will be inserted into the list immediately after the link
|
/* The surface will be inserted into the list immediately after the link
|
||||||
@@ -2461,6 +2446,7 @@ desktop_surface_removed(struct weston_desktop_surface *desktop_surface,
|
|||||||
struct shell_surface *shsurf_child, *tmp;
|
struct shell_surface *shsurf_child, *tmp;
|
||||||
struct weston_surface *surface =
|
struct weston_surface *surface =
|
||||||
weston_desktop_surface_get_surface(desktop_surface);
|
weston_desktop_surface_get_surface(desktop_surface);
|
||||||
|
struct weston_seat *seat;
|
||||||
|
|
||||||
if (!shsurf)
|
if (!shsurf)
|
||||||
return;
|
return;
|
||||||
@@ -2471,6 +2457,18 @@ desktop_surface_removed(struct weston_desktop_surface *desktop_surface,
|
|||||||
}
|
}
|
||||||
wl_list_remove(&shsurf->children_link);
|
wl_list_remove(&shsurf->children_link);
|
||||||
|
|
||||||
|
wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link) {
|
||||||
|
struct shell_seat *shseat = get_shell_seat(seat);
|
||||||
|
/* activate() controls the focused surface activation and
|
||||||
|
* removal of a surface requires invalidating the
|
||||||
|
* focused_surface to avoid activate() use a stale (and just
|
||||||
|
* removed) surface when attempting to de-activate it. It will
|
||||||
|
* also update the focused_surface once it has a chance to run.
|
||||||
|
*/
|
||||||
|
if (surface == shseat->focused_surface)
|
||||||
|
shseat->focused_surface = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
wl_signal_emit(&shsurf->destroy_signal, shsurf);
|
wl_signal_emit(&shsurf->destroy_signal, shsurf);
|
||||||
|
|
||||||
if (shsurf->fullscreen.black_view)
|
if (shsurf->fullscreen.black_view)
|
||||||
@@ -3867,6 +3865,7 @@ activate(struct desktop_shell *shell, struct weston_view *view,
|
|||||||
struct workspace *ws;
|
struct workspace *ws;
|
||||||
struct weston_surface *old_es;
|
struct weston_surface *old_es;
|
||||||
struct shell_surface *shsurf, *shsurf_child;
|
struct shell_surface *shsurf, *shsurf_child;
|
||||||
|
struct shell_seat *shseat = get_shell_seat(seat);
|
||||||
|
|
||||||
main_surface = weston_surface_get_main_surface(es);
|
main_surface = weston_surface_get_main_surface(es);
|
||||||
shsurf = get_shell_surface(main_surface);
|
shsurf = get_shell_surface(main_surface);
|
||||||
@@ -3886,6 +3885,16 @@ activate(struct desktop_shell *shell, struct weston_view *view,
|
|||||||
|
|
||||||
weston_view_activate(view, seat, flags);
|
weston_view_activate(view, seat, flags);
|
||||||
|
|
||||||
|
if (shseat->focused_surface) {
|
||||||
|
struct shell_surface *current_focus =
|
||||||
|
get_shell_surface(shseat->focused_surface);
|
||||||
|
assert(current_focus);
|
||||||
|
shell_surface_deactivate(current_focus);
|
||||||
|
}
|
||||||
|
|
||||||
|
shseat->focused_surface = main_surface;
|
||||||
|
shell_surface_activate(shsurf);
|
||||||
|
|
||||||
state = ensure_focus_state(shell, seat);
|
state = ensure_focus_state(shell, seat);
|
||||||
if (state == NULL)
|
if (state == NULL)
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user