|
|
|
@ -234,9 +234,9 @@ static void add_tablet_client(struct wlr_tablet_seat_client_v2 *seat,
|
|
|
|
|
}
|
|
|
|
|
zwp_tablet_v2_send_id(client->resource,
|
|
|
|
|
tablet->wlr_device->vendor, tablet->wlr_device->product);
|
|
|
|
|
struct wlr_tablet_path *path;
|
|
|
|
|
wl_list_for_each(path, &tablet->wlr_tool->paths, link) {
|
|
|
|
|
zwp_tablet_v2_send_path(client->resource, path->path);
|
|
|
|
|
for (size_t i = 0; i < tablet->wlr_tool->paths.length; ++i) {
|
|
|
|
|
zwp_tablet_v2_send_path(client->resource,
|
|
|
|
|
tablet->wlr_tool->paths.items[i]);
|
|
|
|
|
}
|
|
|
|
|
zwp_tablet_v2_send_done(client->resource);
|
|
|
|
|
|
|
|
|
@ -546,6 +546,7 @@ static void destroy_tablet_pad_ring_v2(struct wl_resource *resource) {
|
|
|
|
|
|
|
|
|
|
aux->pad->rings[aux->index] = NULL;
|
|
|
|
|
free(aux);
|
|
|
|
|
wl_resource_set_user_data(resource, NULL);
|
|
|
|
|
}
|
|
|
|
|
static void handle_tablet_pad_ring_v2_set_feedback(struct wl_client *client,
|
|
|
|
|
struct wl_resource *resource, const char *description,
|
|
|
|
@ -582,6 +583,7 @@ static void destroy_tablet_pad_strip_v2(struct wl_resource *resource) {
|
|
|
|
|
|
|
|
|
|
aux->pad->strips[aux->index] = NULL;
|
|
|
|
|
free(aux);
|
|
|
|
|
wl_resource_set_user_data(resource, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void handle_tablet_pad_strip_v2_set_feedback(struct wl_client *client,
|
|
|
|
@ -631,14 +633,15 @@ static struct zwp_tablet_pad_v2_interface tablet_pad_impl = {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void destroy_tablet_pad_group_v2(struct wl_resource *resource) {
|
|
|
|
|
struct wlr_tablet_pad_client_v2 *client = wl_resource_get_user_data(resource);
|
|
|
|
|
struct tablet_pad_auxiliary_user_data *aux = wl_resource_get_user_data(resource);
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < client->group_count; ++i) {
|
|
|
|
|
if (client->groups[i] == resource) {
|
|
|
|
|
client->groups[i] = NULL;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!aux) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
aux->pad->groups[aux->index] = NULL;
|
|
|
|
|
free(aux);
|
|
|
|
|
wl_resource_set_user_data(resource, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void handle_tablet_pad_group_v2_destroy(struct wl_client *client,
|
|
|
|
@ -659,8 +662,15 @@ static void add_tablet_pad_group(struct wlr_tablet_v2_tablet_pad *pad,
|
|
|
|
|
wl_client_post_no_memory(client->client);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
struct tablet_pad_auxiliary_user_data *user_data =
|
|
|
|
|
calloc(1, sizeof(struct tablet_pad_auxiliary_user_data));
|
|
|
|
|
if (!user_data) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
user_data->pad = client;
|
|
|
|
|
user_data->index = index;
|
|
|
|
|
wl_resource_set_implementation(client->groups[index], &tablet_pad_group_impl,
|
|
|
|
|
client, destroy_tablet_pad_group_v2);
|
|
|
|
|
user_data, destroy_tablet_pad_group_v2);
|
|
|
|
|
|
|
|
|
|
zwp_tablet_pad_v2_send_group(client->resource, client->groups[index]);
|
|
|
|
|
zwp_tablet_pad_group_v2_send_modes(client->groups[index], group->mode_count);
|
|
|
|
@ -762,9 +772,9 @@ static void add_tablet_pad_client(struct wlr_tablet_seat_client_v2 *seat,
|
|
|
|
|
if (pad->wlr_pad->button_count) {
|
|
|
|
|
zwp_tablet_pad_v2_send_buttons(client->resource, pad->wlr_pad->button_count);
|
|
|
|
|
}
|
|
|
|
|
struct wlr_tablet_path *path;
|
|
|
|
|
wl_list_for_each(path, &pad->wlr_pad->paths, link) {
|
|
|
|
|
zwp_tablet_pad_v2_send_path(client->resource, path->path);
|
|
|
|
|
for (size_t i = 0; i < pad->wlr_pad->paths.length; ++i) {
|
|
|
|
|
zwp_tablet_pad_v2_send_path(client->resource,
|
|
|
|
|
pad->wlr_pad->paths.items[i]);
|
|
|
|
|
}
|
|
|
|
|
size_t i = 0;
|
|
|
|
|
struct wlr_tablet_pad_group *group;
|
|
|
|
@ -786,6 +796,18 @@ static void handle_wlr_tablet_pad_destroy(struct wl_listener *listener, void *da
|
|
|
|
|
wl_list_for_each_safe(pos, tmp, &pad->clients, pad_link) {
|
|
|
|
|
// XXX: Add a timer/flag to destroy if client is slow?
|
|
|
|
|
zwp_tablet_pad_v2_send_removed(pos->resource);
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < pos->group_count; ++i) {
|
|
|
|
|
destroy_tablet_pad_group_v2(pos->groups[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < pos->strip_count; ++i) {
|
|
|
|
|
destroy_tablet_pad_strip_v2(pos->strips[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < pos->ring_count; ++i) {
|
|
|
|
|
destroy_tablet_pad_ring_v2(pos->rings[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wl_list_remove(&pad->clients);
|
|
|
|
|