[PATCH weston 01/31] Update pointer and keyboard focus on new listeners

Daniel Stone daniel at fooishbar.org
Wed May 30 08:31:39 PDT 2012


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 at fooishbar.org>
---
 src/compositor.c |   23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/src/compositor.c b/src/compositor.c
index b82ba08..14a9245 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -2072,6 +2072,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
@@ -2088,6 +2105,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
-- 
1.7.10



More information about the wayland-devel mailing list