[PATCH weston 12/19] tablet: Add support for up/down events to weston
Stephen Chandler Paul
thatslyude at gmail.com
Wed Aug 6 16:08:02 PDT 2014
Signed-off-by: Stephen Chandler Paul <thatslyude at gmail.com>
---
src/compositor.h | 8 +++++++
src/input.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++--
src/libinput-device.c | 7 +++++-
3 files changed, 77 insertions(+), 3 deletions(-)
diff --git a/src/compositor.h b/src/compositor.h
index f1e4353..91ce7b7 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -425,6 +425,10 @@ struct weston_tablet {
int32_t hotspot_x, hotspot_y;
wl_fixed_t x, y;
+ enum {
+ WESTON_TOOL_UP = 0,
+ WESTON_TOOL_DOWN = 1,
+ } tool_contact_status;
int button_count;
struct weston_view *sprite;
@@ -1128,6 +1132,10 @@ void
notify_tablet_button(struct weston_tablet *tablet, uint32_t time,
uint32_t button, enum wl_tablet_button_state state);
void
+notify_tablet_down(struct weston_tablet *tablet, uint32_t time);
+void
+notify_tablet_up(struct weston_tablet *tablet, uint32_t time);
+void
notify_tablet_frame(struct weston_tablet *tablet);
void
diff --git a/src/input.c b/src/input.c
index 87e4dd9..62b49ed 100644
--- a/src/input.c
+++ b/src/input.c
@@ -481,6 +481,33 @@ default_grab_tablet_motion(struct weston_tablet_grab *grab,
}
static void
+default_grab_tablet_down(struct weston_tablet_grab *grab, uint32_t time)
+{
+ 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_down(resource, tablet->grab_serial,
+ time);
+ }
+}
+
+static void
+default_grab_tablet_up(struct weston_tablet_grab *grab, uint32_t time)
+{
+ 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_up(resource, time);
+ }
+}
+
+static void
default_grab_tablet_button(struct weston_tablet_grab *grab,
uint32_t time, uint32_t button,
enum wl_tablet_button_state state)
@@ -518,8 +545,8 @@ static struct weston_tablet_grab_interface default_tablet_grab_interface = {
default_grab_tablet_proximity_in,
default_grab_tablet_proximity_out,
default_grab_tablet_motion,
- NULL,
- NULL,
+ default_grab_tablet_down,
+ default_grab_tablet_up,
NULL,
NULL,
NULL,
@@ -772,6 +799,9 @@ weston_tablet_set_focus(struct weston_tablet *tablet, struct weston_view *view,
if (tablet->focus && !wl_list_empty(focus_resource_list)) {
wl_resource_for_each(resource, focus_resource_list) {
+ if (tablet->tool_contact_status == WESTON_TOOL_DOWN)
+ wl_tablet_send_up(resource, time);
+
wl_tablet_send_proximity_out(resource, time);
wl_tablet_send_frame(resource);
}
@@ -821,6 +851,11 @@ weston_tablet_set_focus(struct weston_tablet *tablet, struct weston_view *view,
tablet->focus_serial,
time, tool_resource,
view->surface->resource);
+
+ if (tablet->tool_contact_status == WESTON_TOOL_DOWN)
+ wl_tablet_send_down(resource,
+ tablet->focus_serial,
+ time);
}
} else if (tablet->sprite)
tablet_unmap_sprite(tablet);
@@ -1902,6 +1937,32 @@ notify_tablet_button(struct weston_tablet *tablet, uint32_t time,
grab->interface->button(grab, time, button, state);
}
+WL_EXPORT void
+notify_tablet_down(struct weston_tablet *tablet, uint32_t time)
+{
+ struct weston_tablet_grab *grab = tablet->grab;
+ struct weston_compositor *compositor = tablet->seat->compositor;
+
+ weston_compositor_idle_inhibit(compositor);
+
+ tablet->tool_contact_status = WESTON_TOOL_DOWN;
+
+ grab->interface->down(grab, time);
+}
+
+WL_EXPORT void
+notify_tablet_up(struct weston_tablet *tablet, uint32_t time)
+{
+ struct weston_tablet_grab *grab = tablet->grab;
+ struct weston_compositor *compositor = tablet->seat->compositor;
+
+ weston_compositor_idle_release(compositor);
+
+ tablet->tool_contact_status = WESTON_TOOL_UP;
+
+ grab->interface->up(grab, time);
+}
+
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 2e913bd..6294466 100644
--- a/src/libinput-device.c
+++ b/src/libinput-device.c
@@ -346,7 +346,12 @@ handle_tablet_button(struct libinput_device *libinput_device,
state = (enum wl_tablet_button_state)
libinput_event_tablet_get_button_state(button_event);
- if (button != BTN_TOUCH)
+ if (button == BTN_TOUCH) {
+ if (state == WL_TABLET_BUTTON_STATE_PRESSED)
+ notify_tablet_down(tablet, time);
+ else
+ notify_tablet_up(tablet, time);
+ } else
notify_tablet_button(tablet, time, button, state);
}
--
1.8.5.5
More information about the wayland-devel
mailing list