[PATCH weston 10/19] tablet: Add support for button presses to weston

Stephen Chandler Paul thatslyude at gmail.com
Wed Aug 6 16:08:00 PDT 2014


Signed-off-by: Stephen Chandler Paul <thatslyude at gmail.com>
---
 src/compositor.h      |  6 ++++++
 src/input.c           | 39 ++++++++++++++++++++++++++++++++++++++-
 src/libinput-device.c | 23 +++++++++++++++++++++++
 3 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/src/compositor.h b/src/compositor.h
index 46619e3..f1e4353 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -418,12 +418,15 @@ struct weston_tablet {
 	struct wl_listener focus_view_listener;
 	struct wl_listener focus_resource_listener;
 	uint32_t focus_serial;
+	uint32_t grab_serial;
 
 	struct weston_tablet_tool *current_tool;
 
 	int32_t hotspot_x, hotspot_y;
 	wl_fixed_t x, y;
 
+	int button_count;
+
 	struct weston_view *sprite;
 	struct wl_listener sprite_destroy_listener;
 
@@ -1122,6 +1125,9 @@ void
 notify_tablet_motion(struct weston_tablet *tablet, uint32_t time,
 		     wl_fixed_t x, wl_fixed_t y);
 void
+notify_tablet_button(struct weston_tablet *tablet, uint32_t time,
+		     uint32_t button, enum wl_tablet_button_state state);
+void
 notify_tablet_frame(struct weston_tablet *tablet);
 
 void
diff --git a/src/input.c b/src/input.c
index 19e9971..87e4dd9 100644
--- a/src/input.c
+++ b/src/input.c
@@ -481,6 +481,22 @@ default_grab_tablet_motion(struct weston_tablet_grab *grab,
 }
 
 static void
+default_grab_tablet_button(struct weston_tablet_grab *grab,
+			   uint32_t time, uint32_t button,
+			   enum wl_tablet_button_state state)
+{
+	struct weston_tablet *tablet = grab->tablet;
+	struct wl_resource *resource;
+	struct wl_list *resource_list = &tablet->focus_resource_list;
+
+	if (!wl_list_empty(resource_list)) {
+		wl_resource_for_each(resource, resource_list)
+			wl_tablet_send_button(resource, tablet->grab_serial,
+					      time, button, state);
+	}
+}
+
+static void
 default_grab_tablet_frame(struct weston_tablet_grab *grab)
 {
 	struct wl_resource *resource;
@@ -507,7 +523,7 @@ static struct weston_tablet_grab_interface default_tablet_grab_interface = {
 	NULL,
 	NULL,
 	NULL,
-	NULL,
+	default_grab_tablet_button,
 	default_grab_tablet_frame,
 	default_grab_tablet_cancel,
 };
@@ -1865,6 +1881,27 @@ notify_tablet_frame(struct weston_tablet *tablet)
 	grab->interface->frame(grab);
 }
 
+WL_EXPORT void
+notify_tablet_button(struct weston_tablet *tablet, uint32_t time,
+		     uint32_t button, enum wl_tablet_button_state state)
+{
+	struct weston_tablet_grab *grab = tablet->grab;
+	struct weston_compositor *compositor = tablet->seat->compositor;
+
+	if (state == WL_TABLET_BUTTON_STATE_PRESSED) {
+		tablet->button_count++;
+		if (tablet->button_count == 1)
+			weston_compositor_idle_inhibit(compositor);
+	} else {
+		tablet->button_count--;
+		if (tablet->button_count == 0)
+			weston_compositor_idle_release(compositor);
+	}
+
+	tablet->grab_serial = wl_display_next_serial(compositor->wl_display);
+	grab->interface->button(grab, time, button, state);
+}
+
 static void
 pointer_cursor_surface_configure(struct weston_surface *es,
 				 int32_t dx, int32_t dy)
diff --git a/src/libinput-device.c b/src/libinput-device.c
index 0501e9b..2e913bd 100644
--- a/src/libinput-device.c
+++ b/src/libinput-device.c
@@ -331,6 +331,25 @@ handle_tablet_proximity_out(struct libinput_device *libinput_device,
 	notify_tablet_proximity_out(tablet, time);
 }
 
+static void
+handle_tablet_button(struct libinput_device *libinput_device,
+		     struct libinput_event_tablet *button_event)
+{
+	struct evdev_device *device =
+		libinput_device_get_user_data(libinput_device);
+	struct weston_tablet *tablet = device->tablet;
+	uint32_t button, time;
+	enum wl_tablet_button_state state;
+
+	time = libinput_event_tablet_get_time(button_event);
+	button = libinput_event_tablet_get_button(button_event);
+	state = (enum wl_tablet_button_state)
+		libinput_event_tablet_get_button_state(button_event);
+
+	if (button != BTN_TOUCH)
+		notify_tablet_button(tablet, time, button, state);
+}
+
 int
 evdev_device_process_event(struct libinput_event *event)
 {
@@ -389,6 +408,10 @@ evdev_device_process_event(struct libinput_event *event)
 		    libinput_device,
 		    libinput_event_get_tablet_event(event));
 		break;
+	case LIBINPUT_EVENT_TABLET_BUTTON:
+		handle_tablet_button(libinput_device,
+				     libinput_event_get_tablet_event(event));
+		break;
 	default:
 		handled = 0;
 		weston_log("unknown libinput event %d\n",
-- 
1.8.5.5



More information about the wayland-devel mailing list