summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniel@fooishbar.org>2012-05-30 16:31:39 +0100
committerKristian Høgsberg <krh@bitplanet.net>2012-05-31 13:58:49 -0400
commit17b13bd89f70c82c29cad8a2d2614b0b304adf7d (patch)
treeb33286bbec50634d4bc79319e8a36572db7a52bc
parent3ae50bb45c4087da7b6de7733e8b44a5ea720398 (diff)
Update pointer and keyboard focus on new listeners
If we get a new wl_pointer or wl_keyboard listener from the client currently owning the focus resource, issue another wl_{pointer,keyboard}_set_focus so the focus_resource can be updated and the client can receive an enter event. Signed-off-by: Daniel Stone <daniel@fooishbar.org>
-rw-r--r--src/compositor.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/compositor.c b/src/compositor.c
index 4f10aba..13da40f 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -2070,6 +2070,23 @@ seat_get_pointer(struct wl_client *client, struct wl_resource *resource,
&pointer_interface, id, seat);
wl_list_insert(&seat->seat.pointer->resource_list, &cr->link);
cr->destroy = unbind_resource;
+
+ if (seat->seat.pointer->focus &&
+ seat->seat.pointer->focus->resource.client == client) {
+ struct weston_surface *surface;
+ wl_fixed_t sx, sy;
+
+ surface = (struct weston_surface *) seat->seat.pointer->focus;
+ weston_surface_from_global_fixed(surface,
+ seat->seat.pointer->x,
+ seat->seat.pointer->y,
+ &sx,
+ &sy);
+ wl_pointer_set_focus(seat->seat.pointer,
+ seat->seat.pointer->focus,
+ sx,
+ sy);
+ }
}
static void
@@ -2086,6 +2103,12 @@ seat_get_keyboard(struct wl_client *client, struct wl_resource *resource,
seat);
wl_list_insert(&seat->seat.keyboard->resource_list, &cr->link);
cr->destroy = unbind_resource;
+
+ if (seat->seat.keyboard->focus &&
+ seat->seat.keyboard->focus->resource.client == client) {
+ wl_keyboard_set_focus(seat->seat.keyboard,
+ seat->seat.keyboard->focus);
+ }
}
static void