diff options
author | Daniel Stone <daniel@fooishbar.org> | 2012-05-30 16:31:39 +0100 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-31 13:58:49 -0400 |
commit | 17b13bd89f70c82c29cad8a2d2614b0b304adf7d (patch) | |
tree | b33286bbec50634d4bc79319e8a36572db7a52bc | |
parent | 3ae50bb45c4087da7b6de7733e8b44a5ea720398 (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.c | 23 |
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 |