From: Stephen Chandler Paul <thatsly...@gmail.com>

Co-authored-by: Peter Hutterer <peter.hutte...@who-t.net>
Signed-off-by: Stephen Chandler Paul <thatsly...@gmail.com>
Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
 desktop-shell/shell.c | 14 ++++++++++++++
 src/bindings.c        | 39 ++++++++++++++++++++++++++++++++++++++-
 src/compositor.c      |  1 +
 src/compositor.h      | 16 ++++++++++++++++
 src/input.c           |  6 ++++++
 5 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index 958c7ea..c1425e3 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -5446,6 +5446,18 @@ touch_to_activate_binding(struct weston_touch *touch, 
uint32_t time,
 }
 
 static void
+tablet_tool_activate_binding(struct weston_tablet_tool *tool,
+                            uint32_t button, void *data)
+{
+       if (tool->grab != &tool->default_grab)
+               return;
+       if (tool->focus == NULL)
+               return;
+
+       activate_binding(tool->seat, data, tool->focus);
+}
+
+static void
 unfocus_all_seats(struct desktop_shell *shell)
 {
        struct weston_seat *seat, *next;
@@ -6748,6 +6760,8 @@ shell_add_bindings(struct weston_compositor *ec, struct 
desktop_shell *shell)
        weston_compositor_add_touch_binding(ec, 0,
                                            touch_to_activate_binding,
                                            shell);
+       weston_compositor_add_tablet_tool_binding(ec, BTN_TOUCH, 0,
+                                                 tablet_tool_activate_binding, 
shell);
        weston_compositor_add_axis_binding(ec, WL_POINTER_AXIS_VERTICAL_SCROLL,
                                           MODIFIER_SUPER | MODIFIER_ALT,
                                           surface_opacity_binding, NULL);
diff --git a/src/bindings.c b/src/bindings.c
index cc68cfe..64e151b 100644
--- a/src/bindings.c
+++ b/src/bindings.c
@@ -135,6 +135,24 @@ weston_compositor_add_touch_binding(struct 
weston_compositor *compositor,
 }
 
 WL_EXPORT struct weston_binding *
+weston_compositor_add_tablet_tool_binding(struct weston_compositor *compositor,
+                                         uint32_t button, uint32_t modifier,
+                                         weston_tablet_tool_binding_handler_t 
handler,
+                                         void *data)
+{
+       struct weston_binding *binding;
+
+       binding = weston_compositor_add_binding(compositor, 0, button, 0,
+                                               modifier, handler, data);
+       if (binding == NULL)
+               return NULL;
+
+       wl_list_insert(compositor->tablet_tool_binding_list.prev, 
&binding->link);
+
+       return binding;
+}
+
+WL_EXPORT struct weston_binding *
 weston_compositor_add_axis_binding(struct weston_compositor *compositor,
                                   uint32_t axis, uint32_t modifier,
                                   weston_axis_binding_handler_t handler,
@@ -387,7 +405,26 @@ weston_compositor_run_touch_binding(struct 
weston_compositor *compositor,
        }
 }
 
-int
+WL_EXPORT void
+weston_compositor_run_tablet_tool_binding(struct weston_compositor *compositor,
+                                         struct weston_tablet_tool *tool,
+                                         uint32_t button,
+                                         enum zwp_tablet_tool_v1_button_state 
state)
+{
+       struct weston_binding *b;
+
+       if (state != ZWP_TABLET_TOOL_V1_BUTTON_STATE_PRESSED)
+               return;
+
+       wl_list_for_each(b, &compositor->tablet_tool_binding_list, link) {
+               if (b->modifier == tool->seat->modifier_state) {
+                       weston_tablet_tool_binding_handler_t handler = 
b->handler;
+                       handler(tool, button, b->data);
+               }
+       }
+}
+
+WL_EXPORT int
 weston_compositor_run_axis_binding(struct weston_compositor *compositor,
                                   struct weston_pointer *pointer,
                                   uint32_t time,
diff --git a/src/compositor.c b/src/compositor.c
index f419818..d93917b 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -4773,6 +4773,7 @@ weston_compositor_create(struct wl_display *display, void 
*user_data)
        wl_list_init(&ec->modifier_binding_list);
        wl_list_init(&ec->button_binding_list);
        wl_list_init(&ec->touch_binding_list);
+       wl_list_init(&ec->tablet_tool_binding_list);
        wl_list_init(&ec->axis_binding_list);
        wl_list_init(&ec->debug_binding_list);
        wl_list_init(&ec->tablet_manager_resource_list);
diff --git a/src/compositor.h b/src/compositor.h
index 6806d06..bd6af4d 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -869,6 +869,7 @@ struct weston_compositor {
        struct wl_list modifier_binding_list;
        struct wl_list button_binding_list;
        struct wl_list touch_binding_list;
+       struct wl_list tablet_tool_binding_list;
        struct wl_list axis_binding_list;
        struct wl_list debug_binding_list;
 
@@ -1459,6 +1460,16 @@ weston_compositor_add_touch_binding(struct 
weston_compositor *compositor,
                                    weston_touch_binding_handler_t binding,
                                    void *data);
 
+typedef void (*weston_tablet_tool_binding_handler_t)(struct weston_tablet_tool 
*tool,
+                                                    uint32_t button,
+                                                    void *data);
+struct weston_binding *
+weston_compositor_add_tablet_tool_binding(struct weston_compositor *compositor,
+                                         uint32_t button,
+                                         enum weston_keyboard_modifier 
modifier,
+                                         weston_tablet_tool_binding_handler_t 
binding,
+                                         void *data);
+
 typedef void (*weston_axis_binding_handler_t)(struct weston_pointer *pointer,
                                              uint32_t time,
                                              struct weston_pointer_axis_event 
*event,
@@ -1505,6 +1516,11 @@ void
 weston_compositor_run_touch_binding(struct weston_compositor *compositor,
                                    struct weston_touch *touch, uint32_t time,
                                    int touch_type);
+void
+weston_compositor_run_tablet_tool_binding(struct weston_compositor *compositor,
+                                         struct weston_tablet_tool *tool,
+                                         uint32_t button,
+                                         enum zwp_tablet_tool_v1_button_state 
state);
 int
 weston_compositor_run_axis_binding(struct weston_compositor *compositor,
                                   struct weston_pointer *pointer, uint32_t 
time,
diff --git a/src/input.c b/src/input.c
index b58d7f3..11ed0c4 100644
--- a/src/input.c
+++ b/src/input.c
@@ -33,6 +33,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <limits.h>
+#include <linux/input.h>
 
 #include "shared/helpers.h"
 #include "shared/os-compatibility.h"
@@ -2657,6 +2658,9 @@ notify_tablet_tool_button(struct weston_tablet_tool *tool,
        }
 
        tool->grab_serial = wl_display_next_serial(compositor->wl_display);
+
+       weston_compositor_run_tablet_tool_binding(compositor, tool, button, 
state);
+
        grab->interface->button(grab, time, button, state);
 }
 
@@ -2674,6 +2678,8 @@ notify_tablet_tool_down(struct weston_tablet_tool *tool,
         tool->grab_x = tool->x;
         tool->grab_y = tool->y;
 
+        weston_compositor_run_tablet_tool_binding(compositor, tool, BTN_TOUCH,
+                                                  
ZWP_TABLET_TOOL_V1_BUTTON_STATE_PRESSED);
         grab->interface->down(grab, time);
 }
 
-- 
2.5.0

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to