summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2012-08-29 22:13:03 +0200
committerKristian Høgsberg <krh@bitplanet.net>2012-08-31 19:51:55 -0400
commit8538b22ff4ad8879b4e3288be053508167562859 (patch)
treedfa611487316e7c370d752eb87e6035fe3d140c5
parent14c92ff07239c3cb7b98c5e86244c59ef4268d9e (diff)
shell: Improve focus handling when moving surfaces between workspaces
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
-rw-r--r--src/shell.c35
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);