[PATCH weston 1/6] input: Add helpers for all keyboard/pointer/touch events

Quentin Glidic sardemff7+wayland at sardemff7.net
Fri Aug 12 08:41:32 UTC 2016


From: Quentin Glidic <sardemff7+git at sardemff7.net>

These are useful to implement grabs.

Signed-off-by: Quentin Glidic <sardemff7+git at sardemff7.net>
Reviewed-by: Jonas Ã…dahl <jadahl at gmail.com>
Acked-by: Giulio Camuffo <giulio.camuffo at kdab.com>

Differential Revision: https://phabricator.freedesktop.org/D1245
---
 libweston/compositor.h |  33 +++++
 libweston/input.c      | 374 +++++++++++++++++++++++++++++++++++++------------
 2 files changed, 316 insertions(+), 91 deletions(-)

diff --git a/libweston/compositor.h b/libweston/compositor.h
index 0133084..fdf4592 100644
--- a/libweston/compositor.h
+++ b/libweston/compositor.h
@@ -424,6 +424,14 @@ weston_pointer_create(struct weston_seat *seat);
 void
 weston_pointer_destroy(struct weston_pointer *pointer);
 void
+weston_pointer_send_motion(struct weston_pointer *pointer, uint32_t time,
+			   struct weston_pointer_motion_event *event);
+bool
+weston_pointer_has_focus_resource(struct weston_pointer *pointer);
+void
+weston_pointer_send_button(struct weston_pointer *pointer,
+			   uint32_t time, uint32_t button, uint32_t state_w);
+void
 weston_pointer_send_axis(struct weston_pointer *pointer,
 			 uint32_t time,
 			 struct weston_pointer_axis_event *event);
@@ -477,6 +485,18 @@ int
 weston_keyboard_set_locks(struct weston_keyboard *keyboard,
 			  uint32_t mask, uint32_t value);
 
+bool
+weston_keyboard_has_focus_resource(struct weston_keyboard *keyboard);
+void
+weston_keyboard_send_key(struct weston_keyboard *keyboard,
+			 uint32_t time, uint32_t key,
+			 enum wl_keyboard_key_state state);
+void
+weston_keyboard_send_modifiers(struct weston_keyboard *keyboard,
+			       uint32_t serial, uint32_t mods_depressed,
+			       uint32_t mods_latched,
+			       uint32_t mods_locked, uint32_t group);
+
 struct weston_touch *
 weston_touch_create(void);
 void
@@ -490,6 +510,19 @@ weston_touch_start_grab(struct weston_touch *device,
 void
 weston_touch_end_grab(struct weston_touch *touch);
 
+bool
+weston_touch_has_focus_resource(struct weston_touch *touch);
+void
+weston_touch_send_down(struct weston_touch *touch, uint32_t time,
+		       int touch_id, wl_fixed_t x, wl_fixed_t y);
+void
+weston_touch_send_up(struct weston_touch *touch, uint32_t time, int touch_id);
+void
+weston_touch_send_motion(struct weston_touch *touch, uint32_t time,
+			 int touch_id, wl_fixed_t x, wl_fixed_t y);
+void
+weston_touch_send_frame(struct weston_touch *touch);
+
 void
 wl_data_device_set_keyboard_focus(struct weston_seat *seat);
 
diff --git a/libweston/input.c b/libweston/input.c
index 6e931bd..4ed08fd 100644
--- a/libweston/input.c
+++ b/libweston/input.c
@@ -340,9 +340,9 @@ default_grab_pointer_focus(struct weston_pointer_grab *grab)
 }
 
 static void
-weston_pointer_send_relative_motion(struct weston_pointer *pointer,
-				    uint32_t time,
-				    struct weston_pointer_motion_event *event)
+pointer_send_relative_motion(struct weston_pointer *pointer,
+			     uint32_t time,
+			     struct weston_pointer_motion_event *event)
 {
 	uint64_t time_usec;
 	double dx, dy, dx_unaccel, dy_unaccel;
@@ -379,8 +379,8 @@ weston_pointer_send_relative_motion(struct weston_pointer *pointer,
 }
 
 static void
-weston_pointer_send_motion(struct weston_pointer *pointer, uint32_t time,
-			   wl_fixed_t sx, wl_fixed_t sy)
+pointer_send_motion(struct weston_pointer *pointer, uint32_t time,
+		    wl_fixed_t sx, wl_fixed_t sy)
 {
 	struct wl_list *resource_list;
 	struct wl_resource *resource;
@@ -393,11 +393,10 @@ weston_pointer_send_motion(struct weston_pointer *pointer, uint32_t time,
 		wl_pointer_send_motion(resource, time, sx, sy);
 }
 
-static void
-default_grab_pointer_motion(struct weston_pointer_grab *grab, uint32_t time,
-			    struct weston_pointer_motion_event *event)
+WL_EXPORT void
+weston_pointer_send_motion(struct weston_pointer *pointer, uint32_t time,
+			   struct weston_pointer_motion_event *event)
 {
-	struct weston_pointer *pointer = grab->pointer;
 	wl_fixed_t x, y;
 	wl_fixed_t old_sx = pointer->sx;
 	wl_fixed_t old_sy = pointer->sy;
@@ -411,50 +410,78 @@ default_grab_pointer_motion(struct weston_pointer_grab *grab, uint32_t time,
 	weston_pointer_move(pointer, event);
 
 	if (old_sx != pointer->sx || old_sy != pointer->sy) {
-		weston_pointer_send_motion(pointer, time,
-					   pointer->sx, pointer->sy);
+		pointer_send_motion(pointer, time,
+				    pointer->sx, pointer->sy);
 	}
 
-	weston_pointer_send_relative_motion(pointer, time, event);
+	pointer_send_relative_motion(pointer, time, event);
 }
 
 static void
+default_grab_pointer_motion(struct weston_pointer_grab *grab, uint32_t time,
+			    struct weston_pointer_motion_event *event)
+{
+	weston_pointer_send_motion(grab->pointer, time, event);
+}
+
+/** Check if the pointer has focused resources.
+ *
+ * \param pointer The pointer to check for focused resources.
+ * \return Whether or not this pointer has focused resources
+ */
+WL_EXPORT bool
+weston_pointer_has_focus_resource(struct weston_pointer *pointer)
+{
+	if (!pointer->focus_client)
+		return false;
+
+	if (wl_list_empty(&pointer->focus_client->pointer_resources))
+		return false;
+
+	return true;
+}
+
+/** Send wl_pointer.button events to focused resources.
+ *
+ * \param pointer The pointer where the button events originates from.
+ * \param time The timestamp of the event
+ * \param button The button value of the event
+ * \param value The state enum value of the event
+ *
+ * For every resource that is currently in focus, send a wl_pointer.button event
+ * with the passed parameters. The focused resources are the wl_pointer
+ * resources of the client which currently has the surface with pointer focus.
+ */
+WL_EXPORT void
 weston_pointer_send_button(struct weston_pointer *pointer,
-			   uint32_t time, uint32_t button, uint32_t state_w)
+			   uint32_t time, uint32_t button,
+			   enum wl_pointer_button_state state)
 {
 	struct wl_display *display = pointer->seat->compositor->wl_display;
 	struct wl_list *resource_list;
 	struct wl_resource *resource;
 	uint32_t serial;
 
-	if (!pointer->focus_client)
+	if (!weston_pointer_has_focus_resource(pointer))
 		return;
 
 	resource_list = &pointer->focus_client->pointer_resources;
-	if (resource_list && !wl_list_empty(resource_list)) {
-		resource_list = &pointer->focus_client->pointer_resources;
-		serial = wl_display_next_serial(display);
-		wl_resource_for_each(resource, resource_list) {
-			wl_pointer_send_button(resource,
-					       serial,
-					       time,
-					       button,
-					       state_w);
-		}
-	}
+	serial = wl_display_next_serial(display);
+	wl_resource_for_each(resource, resource_list)
+		wl_pointer_send_button(resource, serial, time, button, state);
 }
 
 static void
 default_grab_pointer_button(struct weston_pointer_grab *grab,
-			    uint32_t time, uint32_t button, uint32_t state_w)
+			    uint32_t time, uint32_t button,
+			    enum wl_pointer_button_state state)
 {
 	struct weston_pointer *pointer = grab->pointer;
 	struct weston_compositor *compositor = pointer->seat->compositor;
 	struct weston_view *view;
-	enum wl_pointer_button_state state = state_w;
 	wl_fixed_t sx, sy;
 
-	weston_pointer_send_button(pointer, time, button, state_w);
+	weston_pointer_send_button(pointer, time, button, state);
 
 	if (pointer->button_count == 0 &&
 	    state == WL_POINTER_BUTTON_STATE_RELEASED) {
@@ -485,7 +512,7 @@ weston_pointer_send_axis(struct weston_pointer *pointer,
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
 
-	if (!pointer->focus_client)
+	if (!weston_pointer_has_focus_resource(pointer))
 		return;
 
 	resource_list = &pointer->focus_client->pointer_resources;
@@ -507,13 +534,23 @@ weston_pointer_send_axis(struct weston_pointer *pointer,
 	}
 }
 
+/** Send wl_pointer.axis_source events to focused resources.
+ *
+ * \param pointer The pointer where the axis_source events originates from.
+ * \param source The axis_source enum value of the event
+ *
+ * For every resource that is currently in focus, send a wl_pointer.axis_source
+ * event with the passed parameter. The focused resources are the wl_pointer
+ * resources of the client which currently has the surface with pointer focus.
+ */
 WL_EXPORT void
-weston_pointer_send_axis_source(struct weston_pointer *pointer, uint32_t source)
+weston_pointer_send_axis_source(struct weston_pointer *pointer,
+				enum wl_pointer_axis_source source)
 {
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
 
-	if (!pointer->focus_client)
+	if (!weston_pointer_has_focus_resource(pointer))
 		return;
 
 	resource_list = &pointer->focus_client->pointer_resources;
@@ -534,13 +571,21 @@ pointer_send_frame(struct wl_resource *resource)
 	}
 }
 
+/** Send wl_pointer.frame events to focused resources.
+ *
+ * \param pointer The pointer where the frame events originates from.
+ *
+ * For every resource that is currently in focus, send a wl_pointer.frame event.
+ * The focused resources are the wl_pointer resources of the client which
+ * currently has the surface with pointer focus.
+ */
 WL_EXPORT void
 weston_pointer_send_frame(struct weston_pointer *pointer)
 {
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
 
-	if (!pointer->focus_client)
+	if (!weston_pointer_has_focus_resource(pointer))
 		return;
 
 	resource_list = &pointer->focus_client->pointer_resources;
@@ -558,7 +603,7 @@ default_grab_pointer_axis(struct weston_pointer_grab *grab,
 
 static void
 default_grab_pointer_axis_source(struct weston_pointer_grab *grab,
-				 uint32_t source)
+				 enum wl_pointer_axis_source source)
 {
 	weston_pointer_send_axis_source(grab->pointer, source);
 }
@@ -585,65 +630,125 @@ static const struct weston_pointer_grab_interface
 	default_grab_pointer_cancel,
 };
 
-static void
-default_grab_touch_down(struct weston_touch_grab *grab, uint32_t time,
-			int touch_id, wl_fixed_t x, wl_fixed_t y)
+/** Check if the touch has focused resources.
+ *
+ * \param touch The touch to check for focused resources.
+ * \return Whether or not this touch has focused resources
+ */
+WL_EXPORT bool
+weston_touch_has_focus_resource(struct weston_touch *touch)
+{
+	if (!touch->focus)
+		return false;
+
+	if (wl_list_empty(&touch->focus_resource_list))
+		return false;
+
+	return true;
+}
+
+/** Send wl_touch.down events to focused resources.
+ *
+ * \param touch The touch where the down events originates from.
+ * \param time The timestamp of the event
+ * \param touch_id The touch_id value of the event
+ * \param x The x value of the event
+ * \param y The y value of the event
+ *
+ * For every resource that is currently in focus, send a wl_touch.down event
+ * with the passed parameters. The focused resources are the wl_touch
+ * resources of the client which currently has the surface with touch focus.
+ */
+WL_EXPORT void
+weston_touch_send_down(struct weston_touch *touch, uint32_t time,
+		       int touch_id, wl_fixed_t x, wl_fixed_t y)
 {
-	struct weston_touch *touch = grab->touch;
 	struct wl_display *display = touch->seat->compositor->wl_display;
 	uint32_t serial;
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
 	wl_fixed_t sx, sy;
 
-	if (!touch->focus)
+	if (!weston_touch_has_focus_resource(touch))
 		return;
 
 	weston_view_from_global_fixed(touch->focus, x, y, &sx, &sy);
 
 	resource_list = &touch->focus_resource_list;
-
-	if (!wl_list_empty(resource_list)) {
-		serial = wl_display_next_serial(display);
-		wl_resource_for_each(resource, resource_list)
-				wl_touch_send_down(resource, serial, time,
-						   touch->focus->surface->resource,
-						   touch_id, sx, sy);
-	}
+	serial = wl_display_next_serial(display);
+	wl_resource_for_each(resource, resource_list)
+			wl_touch_send_down(resource, serial, time,
+					   touch->focus->surface->resource,
+					   touch_id, sx, sy);
 }
 
 static void
-default_grab_touch_up(struct weston_touch_grab *grab,
-		      uint32_t time, int touch_id)
+default_grab_touch_down(struct weston_touch_grab *grab, uint32_t time,
+			int touch_id, wl_fixed_t x, wl_fixed_t y)
+{
+	weston_touch_send_down(grab->touch, time, touch_id, x, y);
+}
+
+/** Send wl_touch.up events to focused resources.
+ *
+ * \param touch The touch where the up events originates from.
+ * \param time The timestamp of the event
+ * \param touch_id The touch_id value of the event
+ *
+ * For every resource that is currently in focus, send a wl_touch.up event
+ * with the passed parameters. The focused resources are the wl_touch
+ * resources of the client which currently has the surface with touch focus.
+ */
+WL_EXPORT void
+weston_touch_send_up(struct weston_touch *touch, uint32_t time, int touch_id)
 {
-	struct weston_touch *touch = grab->touch;
 	struct wl_display *display = touch->seat->compositor->wl_display;
 	uint32_t serial;
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
 
-	resource_list = &touch->focus_resource_list;
+	if (!weston_touch_has_focus_resource(touch))
+		return;
 
-	if (!wl_list_empty(resource_list)) {
-		serial = wl_display_next_serial(display);
-		wl_resource_for_each(resource, resource_list)
-			wl_touch_send_up(resource, serial, time, touch_id);
-	}
+	resource_list = &touch->focus_resource_list;
+	serial = wl_display_next_serial(display);
+	wl_resource_for_each(resource, resource_list)
+		wl_touch_send_up(resource, serial, time, touch_id);
 }
 
 static void
-default_grab_touch_motion(struct weston_touch_grab *grab, uint32_t time,
-			  int touch_id, wl_fixed_t x, wl_fixed_t y)
+default_grab_touch_up(struct weston_touch_grab *grab,
+		      uint32_t time, int touch_id)
+{
+	weston_touch_send_up(grab->touch, time, touch_id);
+}
+
+/** Send wl_touch.motion events to focused resources.
+ *
+ * \param touch The touch where the motion events originates from.
+ * \param time The timestamp of the event
+ * \param touch_id The touch_id value of the event
+ * \param x The x value of the event
+ * \param y The y value of the event
+ *
+ * For every resource that is currently in focus, send a wl_touch.motion event
+ * with the passed parameters. The focused resources are the wl_touch
+ * resources of the client which currently has the surface with touch focus.
+ */
+WL_EXPORT void
+weston_touch_send_motion(struct weston_touch *touch, uint32_t time,
+			 int touch_id, wl_fixed_t x, wl_fixed_t y)
 {
-	struct weston_touch *touch = grab->touch;
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
 	wl_fixed_t sx, sy;
 
+	if (!weston_touch_has_focus_resource(touch))
+		return;
+
 	weston_view_from_global_fixed(touch->focus, x, y, &sx, &sy);
 
 	resource_list = &touch->focus_resource_list;
-
 	wl_resource_for_each(resource, resource_list) {
 		wl_touch_send_motion(resource, time,
 				     touch_id, sx, sy);
@@ -651,14 +756,39 @@ default_grab_touch_motion(struct weston_touch_grab *grab, uint32_t time,
 }
 
 static void
-default_grab_touch_frame(struct weston_touch_grab *grab)
+default_grab_touch_motion(struct weston_touch_grab *grab, uint32_t time,
+			  int touch_id, wl_fixed_t x, wl_fixed_t y)
+{
+	weston_touch_send_motion(grab->touch, time, touch_id, x, y);
+}
+
+
+/** Send wl_touch.frame events to focused resources.
+ *
+ * \param touch The touch where the frame events originates from.
+ *
+ * For every resource that is currently in focus, send a wl_touch.frame event.
+ * The focused resources are the wl_touch resources of the client which
+ * currently has the surface with touch focus.
+ */
+WL_EXPORT void
+weston_touch_send_frame(struct weston_touch *touch)
 {
 	struct wl_resource *resource;
 
-	wl_resource_for_each(resource, &grab->touch->focus_resource_list)
+	if (!weston_touch_has_focus_resource(touch))
+		return;
+
+	wl_resource_for_each(resource, &touch->focus_resource_list)
 		wl_touch_send_frame(resource);
 }
 
+static void
+default_grab_touch_frame(struct weston_touch_grab *grab)
+{
+	weston_touch_send_frame(grab->touch);
+}
+
 static void
 default_grab_touch_cancel(struct weston_touch_grab *grab)
 {
@@ -672,26 +802,58 @@ static const struct weston_touch_grab_interface default_touch_grab_interface = {
 	default_grab_touch_cancel,
 };
 
-static void
-default_grab_keyboard_key(struct weston_keyboard_grab *grab,
-			  uint32_t time, uint32_t key, uint32_t state)
+/** Check if the keyboard has focused resources.
+ *
+ * \param keyboard The keyboard to check for focused resources.
+ * \return Whether or not this keyboard has focused resources
+ */
+WL_EXPORT bool
+weston_keyboard_has_focus_resource(struct weston_keyboard *keyboard)
+{
+	if (!keyboard->focus)
+		return false;
+
+	if (wl_list_empty(&keyboard->focus_resource_list))
+		return false;
+
+	return true;
+}
+
+/** Send wl_keyboard.key events to focused resources.
+ *
+ * \param keyboard The keyboard where the key events originates from.
+ * \param time The timestamp of the event
+ * \param key The key value of the event
+ * \param state The state enum value of the event
+ *
+ * For every resource that is currently in focus, send a wl_keyboard.key event
+ * with the passed parameters. The focused resources are the wl_keyboard
+ * resources of the client which currently has the surface with keyboard focus.
+ */
+WL_EXPORT void
+weston_keyboard_send_key(struct weston_keyboard *keyboard,
+			 uint32_t time, uint32_t key,
+			 enum wl_keyboard_key_state state)
 {
-	struct weston_keyboard *keyboard = grab->keyboard;
 	struct wl_resource *resource;
 	struct wl_display *display = keyboard->seat->compositor->wl_display;
 	uint32_t serial;
 	struct wl_list *resource_list;
 
+	if (!weston_keyboard_has_focus_resource(keyboard))
+		return;
+
 	resource_list = &keyboard->focus_resource_list;
-	if (!wl_list_empty(resource_list)) {
-		serial = wl_display_next_serial(display);
-		wl_resource_for_each(resource, resource_list)
-			wl_keyboard_send_key(resource,
-					     serial,
-					     time,
-					     key,
-					     state);
-	}
+	serial = wl_display_next_serial(display);
+	wl_resource_for_each(resource, resource_list)
+		wl_keyboard_send_key(resource, serial, time, key, state);
+};
+
+static void
+default_grab_keyboard_key(struct weston_keyboard_grab *grab,
+			  uint32_t time, uint32_t key, uint32_t state)
+{
+	weston_keyboard_send_key(grab->keyboard, time, key, state);
 }
 
 static void
@@ -760,28 +922,48 @@ find_resource_for_surface(struct wl_list *list, struct weston_surface *surface)
 	return wl_resource_find_for_client(list, wl_resource_get_client(surface->resource));
 }
 
-static void
-default_grab_keyboard_modifiers(struct weston_keyboard_grab *grab,
-				uint32_t serial, uint32_t mods_depressed,
-				uint32_t mods_latched,
-				uint32_t mods_locked, uint32_t group)
+/** Send wl_keyboard.modifiers events to focused resources and pointer
+ *  focused resources.
+ *
+ * \param keyboard The keyboard where the modifiers events originates from.
+ * \param serial The serial of the event
+ * \param mods_depressed The mods_depressed value of the event
+ * \param mods_latched The mods_latched value of the event
+ * \param mods_locked The mods_locked value of the event
+ * \param group The group value of the event
+ *
+ * For every resource that is currently in focus, send a wl_keyboard.modifiers
+ * event with the passed parameters. The focused resources are the wl_keyboard
+ * resources of the client which currently has the surface with keyboard focus.
+ * This also sends wl_keyboard.modifiers events to the wl_keyboard resources of
+ * the client having pointer focus (if different from the keyboard focus client).
+ */
+WL_EXPORT void
+weston_keyboard_send_modifiers(struct weston_keyboard *keyboard,
+			       uint32_t serial, uint32_t mods_depressed,
+			       uint32_t mods_latched,
+			       uint32_t mods_locked, uint32_t group)
 {
-	struct weston_keyboard *keyboard = grab->keyboard;
 	struct weston_pointer *pointer =
-		weston_seat_get_pointer(grab->keyboard->seat);
-	struct wl_resource *resource;
-	struct wl_list *resource_list;
+		weston_seat_get_pointer(keyboard->seat);
 
-	resource_list = &keyboard->focus_resource_list;
+	if (weston_keyboard_has_focus_resource(keyboard)) {
+		struct wl_list *resource_list;
+		struct wl_resource *resource;
 
-	wl_resource_for_each(resource, resource_list) {
-		wl_keyboard_send_modifiers(resource, serial, mods_depressed,
-					   mods_latched, mods_locked, group);
+		resource_list = &keyboard->focus_resource_list;
+		wl_resource_for_each(resource, resource_list) {
+			wl_keyboard_send_modifiers(resource, serial,
+						   mods_depressed, mods_latched,
+						   mods_locked, group);
+		}
 	}
+
 	if (pointer && pointer->focus && pointer->focus->surface->resource &&
 	    pointer->focus->surface != keyboard->focus) {
 		struct wl_client *pointer_client =
 			wl_resource_get_client(pointer->focus->surface->resource);
+
 		send_modifiers_to_client_in_list(pointer_client,
 						 &keyboard->resource_list,
 						 serial,
@@ -789,6 +971,16 @@ default_grab_keyboard_modifiers(struct weston_keyboard_grab *grab,
 	}
 }
 
+static void
+default_grab_keyboard_modifiers(struct weston_keyboard_grab *grab,
+				uint32_t serial, uint32_t mods_depressed,
+				uint32_t mods_latched,
+				uint32_t mods_locked, uint32_t group)
+{
+	weston_keyboard_send_modifiers(grab->keyboard, serial, mods_depressed,
+				       mods_latched, mods_locked, group);
+}
+
 static void
 default_grab_keyboard_cancel(struct weston_keyboard_grab *grab)
 {
@@ -3200,7 +3392,7 @@ locked_pointer_grab_pointer_motion(struct weston_pointer_grab *grab,
 				   uint32_t time,
 				   struct weston_pointer_motion_event *event)
 {
-	weston_pointer_send_relative_motion(grab->pointer, time, event);
+	pointer_send_relative_motion(grab->pointer, time, event);
 }
 
 static void
@@ -4204,11 +4396,11 @@ confined_pointer_grab_pointer_motion(struct weston_pointer_grab *grab,
 				      &pointer->sx, &pointer->sy);
 
 	if (old_sx != pointer->sx || old_sy != pointer->sy) {
-		weston_pointer_send_motion(pointer, time,
-					   pointer->sx, pointer->sy);
+		pointer_send_motion(pointer, time,
+				    pointer->sx, pointer->sy);
 	}
 
-	weston_pointer_send_relative_motion(pointer, time, event);
+	pointer_send_relative_motion(pointer, time, event);
 }
 
 static void
-- 
2.9.2



More information about the wayland-devel mailing list