diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2012-08-29 22:13:03 +0200 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-08-31 19:51:55 -0400 |
commit | 8538b22ff4ad8879b4e3288be053508167562859 (patch) | |
tree | dfa611487316e7c370d752eb87e6035fe3d140c5 | |
parent | 14c92ff07239c3cb7b98c5e86244c59ef4268d9e (diff) |
shell: Improve focus handling when moving surfaces between workspaces
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
-rw-r--r-- | src/shell.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/src/shell.c b/src/shell.c index 20bc355f..6610927f 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); |