From 8538b22ff4ad8879b4e3288be053508167562859 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jonas=20=C3=85dahl?= Date: Wed, 29 Aug 2012 22:13:03 +0200 Subject: [PATCH] shell: Improve focus handling when moving surfaces between workspaces MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jonas Ådahl --- src/shell.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/shell.c b/src/shell.c index 20bc355..6610927 100644 --- a/src/shell.c +++ b/src/shell.c @@ -439,6 +439,22 @@ focus_state_create(struct weston_seat *seat, struct workspace *ws) return state; } +static struct focus_state * +ensure_focus_state(struct desktop_shell *shell, struct weston_seat *seat) +{ + struct workspace *ws = get_current_workspace(shell); + struct focus_state *state; + + wl_list_for_each(state, &ws->focus_list, link) + if (state->seat == seat) + break; + + if (&state->link == &ws->focus_list) + state = focus_state_create(seat, ws); + + return state; +} + static void restore_focus_state(struct desktop_shell *shell, struct workspace *ws) { @@ -859,6 +875,7 @@ take_surface_to_workspace_by_seat(struct desktop_shell *shell, struct shell_surface *shsurf; struct workspace *from; struct workspace *to; + struct focus_state *state; if (surface == NULL || index == shell->workspaces.current) @@ -902,6 +919,10 @@ take_surface_to_workspace_by_seat(struct desktop_shell *shell, } broadcast_current_workspace_state(shell); + + state = ensure_focus_state(shell, seat); + if (state != NULL) + state->keyboard_focus = surface; } static void @@ -2590,20 +2611,14 @@ static void activate(struct desktop_shell *shell, struct weston_surface *es, struct weston_seat *seat) { - struct workspace *ws = get_current_workspace(shell); struct focus_state *state; + struct workspace *ws; weston_surface_activate(es, seat); - wl_list_for_each(state, &ws->focus_list, link) - if (state->seat == seat) - break; - - if (&state->link == &ws->focus_list) { - state = focus_state_create(seat, ws); - if (state == NULL) - return; - } + state = ensure_focus_state(shell, seat); + if (state == NULL) + return; state->keyboard_focus = es; wl_list_remove(&state->surface_destroy_listener.link); -- 2.7.4