Signed-off-by: Stephen Chandler Paul <thatsly...@gmail.com> --- clients/window.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- clients/window.h | 20 +++++++++++++ 2 files changed, 108 insertions(+), 2 deletions(-)
diff --git a/clients/window.c b/clients/window.c index 325c3f2..6001b55 100644 --- a/clients/window.c +++ b/clients/window.c @@ -136,6 +136,18 @@ struct display { int seat_version; }; +struct tablet_tool { + struct wl_tablet_tool *wl_tablet_tool; + + enum wl_tablet_tool_type type; + uint32_t serial; + + void *user_data; + + int refcount; + struct wl_list link; +}; + struct tablet { struct wl_tablet *tablet; double sx, sy; @@ -150,6 +162,8 @@ struct tablet { uint32_t cursor_anim_start; struct wl_callback *cursor_frame_cb; + struct tablet_tool *current_tool; + char *name; int32_t vid; int32_t pid; @@ -331,6 +345,7 @@ struct input { struct wl_list touch_point_list; struct wl_tablet_manager *tablet_manager; struct wl_list tablet_list; + struct wl_list tablet_tool_list; struct window *pointer_focus; struct window *keyboard_focus; struct window *touch_focus; @@ -2587,6 +2602,47 @@ tablet_get_position(struct tablet *tablet, int32_t *x, int32_t *y) *y = tablet->sy; } +enum wl_tablet_tool_type +tablet_tool_get_type(struct tablet_tool *tool) +{ + return tool->type; +} + +uint32_t +tablet_tool_get_serial(struct tablet_tool *tool) +{ + return tool->serial; +} + +void +tablet_tool_set_user_data(struct tablet_tool *tool, void *data) +{ + tool->user_data = data; +} + +void * +tablet_tool_get_user_data(struct tablet_tool *tool) +{ + return tool->user_data; +} + +void +tablet_tool_ref(struct tablet_tool *tool) +{ + tool->refcount++; +} + +void +tablet_tool_unref(struct tablet_tool *tool) +{ + tool->refcount--; + if (tool->refcount == 0) { + wl_list_remove(&tool->link); + wl_tablet_tool_release(tool->wl_tablet_tool); + free(tool); + } +} + void tablet_set_user_data(struct tablet *tablet, void *data) { @@ -3267,7 +3323,8 @@ tablet_set_focus_widget(struct tablet *tablet, struct window *window, if (widget->tablet_proximity_in_handler) widget->tablet_proximity_in_handler( - widget, tablet, widget_get_user_data(widget)); + widget, tablet, tablet->current_tool, + widget_get_user_data(widget)); tablet->focus_widget = widget; } @@ -3280,6 +3337,7 @@ tablet_handle_proximity_in(void *data, struct wl_tablet *wl_tablet, struct wl_surface *surface) { struct tablet *tablet = data; + struct tablet_tool *tablet_tool = wl_tablet_tool_get_user_data(tool); struct window *window; DBG("tablet_handle_proximity_in\n"); @@ -3290,6 +3348,7 @@ tablet_handle_proximity_in(void *data, struct wl_tablet *wl_tablet, return; } tablet->focus = window; + tablet->current_tool = tablet_tool; tablet->enter_serial = serial; } @@ -3347,11 +3406,16 @@ static void tablet_handle_removed(void *data, struct wl_tablet *wl_tablet) { struct tablet *tablet = data; + struct input *input = tablet->input; + struct tablet_tool *tool, *tmp; wl_list_remove(&tablet->link); free(tablet->name); free(tablet); + wl_list_for_each_safe(tool, tmp, &input->tablet_tool_list, link) + tablet_tool_unref(tool); + wl_tablet_release(wl_tablet); } @@ -3404,6 +3468,27 @@ tablet_manager_handle_device_added(void *data, } static void +tablet_manager_handle_tool_added(void *data, + struct wl_tablet_manager *wl_tablet_manager, + struct wl_tablet_tool *tool, + enum wl_tablet_tool_type tool_type, + uint32_t tool_serial) +{ + struct input *input = data; + struct tablet_tool *tablet_tool = xzalloc(sizeof(*tablet_tool)); + + *tablet_tool = (struct tablet_tool) { + .type = tool_type, + .serial = tool_serial, + .refcount = 1, + .wl_tablet_tool = tool, + }; + wl_list_insert(&input->tablet_tool_list, &tablet_tool->link); + + wl_tablet_tool_set_user_data(tool, tablet_tool); +} + +static void tablet_manager_handle_seat(void *data, struct wl_tablet_manager *wl_tablet_manager, struct wl_seat *seat) @@ -3415,7 +3500,7 @@ tablet_manager_handle_seat(void *data, static const struct wl_tablet_manager_listener tablet_manager_listener = { tablet_manager_handle_device_added, - NULL, + tablet_manager_handle_tool_added, tablet_manager_handle_seat, }; @@ -5332,6 +5417,7 @@ display_add_input(struct display *d, uint32_t id) wl_list_init(&input->touch_point_list); wl_list_insert(d->input_list.prev, &input->link); wl_list_init(&input->tablet_list); + wl_list_init(&input->tablet_tool_list); wl_seat_add_listener(input->seat, &seat_listener, input); wl_seat_set_user_data(input->seat, input); diff --git a/clients/window.h b/clients/window.h index 8adf065..6ef7792 100644 --- a/clients/window.h +++ b/clients/window.h @@ -43,6 +43,7 @@ struct display; struct input; struct output; struct tablet; +struct tablet_tool; struct task { void (*run)(struct task *task, uint32_t events); @@ -279,6 +280,7 @@ typedef int (*widget_tablet_motion_handler_t)(struct widget *widget, void *data); typedef void (*widget_tablet_proximity_in_handler_t)(struct widget *widget, struct tablet *tablet, + struct tablet_tool *tool, void *data); typedef void (*widget_tablet_proximity_out_handler_t)(struct widget *widget, struct tablet *tablet, @@ -649,6 +651,24 @@ output_get_make(struct output *output); const char * output_get_model(struct output *output); +enum wl_tablet_tool_type +tablet_tool_get_type(struct tablet_tool *tool); + +uint32_t +tablet_tool_get_serial(struct tablet_tool *tool); + +void * +tablet_tool_get_user_data(struct tablet_tool *tool); + +void +tablet_tool_set_user_data(struct tablet_tool *tool, void *data); + +void +tablet_tool_ref(struct tablet_tool *tool); + +void +tablet_tool_unref(struct tablet_tool *tool); + void tablet_get_position(struct tablet *tablet, int32_t *x, int32_t *y); -- 1.8.5.5 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel