mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-05-05 19:18:03 +02:00
tablet: keep a ref to the last tablet in proximity for each tool
99.9% of the time the next tablet will be the same tablet it was used on last. Having a ref means we can modify tablet settings while the tool is out of proximity. Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1218>
This commit is contained in:
parent
28e50024ab
commit
e7ebb1bca6
3 changed files with 38 additions and 5 deletions
|
|
@ -1289,6 +1289,7 @@ tablet_new_tool(struct tablet_dispatch *tablet,
|
||||||
.serial = serial,
|
.serial = serial,
|
||||||
.tool_id = tool_id,
|
.tool_id = tool_id,
|
||||||
.refcount = 1,
|
.refcount = 1,
|
||||||
|
.last_device = NULL,
|
||||||
|
|
||||||
.pressure.range.min = 0.0,
|
.pressure.range.min = 0.0,
|
||||||
.pressure.range.max = 0.0, /* to trigger configuration */
|
.pressure.range.max = 0.0, /* to trigger configuration */
|
||||||
|
|
@ -1313,6 +1314,7 @@ tablet_get_tool(struct tablet_dispatch *tablet,
|
||||||
uint32_t tool_id,
|
uint32_t tool_id,
|
||||||
uint32_t serial)
|
uint32_t serial)
|
||||||
{
|
{
|
||||||
|
struct evdev_device *device = tablet->device;
|
||||||
struct libinput *libinput = tablet_libinput_context(tablet);
|
struct libinput *libinput = tablet_libinput_context(tablet);
|
||||||
struct libinput_tablet_tool *tool = NULL, *t;
|
struct libinput_tablet_tool *tool = NULL, *t;
|
||||||
struct list *tool_list;
|
struct list *tool_list;
|
||||||
|
|
@ -1361,6 +1363,11 @@ tablet_get_tool(struct tablet_dispatch *tablet,
|
||||||
list_insert(tool_list, &tool->link);
|
list_insert(tool_list, &tool->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct libinput_device *last = tool->last_device;
|
||||||
|
tool->last_device = libinput_device_ref(&device->base);
|
||||||
|
if (last)
|
||||||
|
libinput_device_unref(last);
|
||||||
|
|
||||||
return tool;
|
return tool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2441,6 +2448,29 @@ tablet_suspend(struct evdev_dispatch *dispatch,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
tablet_remove(struct evdev_dispatch *dispatch)
|
||||||
|
{
|
||||||
|
struct tablet_dispatch *tablet = tablet_dispatch(dispatch);
|
||||||
|
struct libinput_device *device = &tablet->device->base;
|
||||||
|
struct libinput *libinput = tablet_libinput_context(tablet);
|
||||||
|
struct libinput_tablet_tool *tool;
|
||||||
|
|
||||||
|
list_for_each_safe(tool, &tablet->tool_list, link) {
|
||||||
|
if (tool->last_device == device) {
|
||||||
|
libinput_device_unref(tool->last_device);
|
||||||
|
tool->last_device = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list_for_each_safe(tool, &libinput->tool_list, link) {
|
||||||
|
if (tool->last_device == device) {
|
||||||
|
libinput_device_unref(tool->last_device);
|
||||||
|
tool->last_device = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tablet_destroy(struct evdev_dispatch *dispatch)
|
tablet_destroy(struct evdev_dispatch *dispatch)
|
||||||
{
|
{
|
||||||
|
|
@ -2625,7 +2655,7 @@ tablet_left_handed_toggled(struct evdev_dispatch *dispatch,
|
||||||
static struct evdev_dispatch_interface tablet_interface = {
|
static struct evdev_dispatch_interface tablet_interface = {
|
||||||
.process = tablet_process,
|
.process = tablet_process,
|
||||||
.suspend = tablet_suspend,
|
.suspend = tablet_suspend,
|
||||||
.remove = NULL,
|
.remove = tablet_remove,
|
||||||
.destroy = tablet_destroy,
|
.destroy = tablet_destroy,
|
||||||
.device_added = tablet_device_added,
|
.device_added = tablet_device_added,
|
||||||
.device_removed = tablet_device_removed,
|
.device_removed = tablet_device_removed,
|
||||||
|
|
|
||||||
|
|
@ -566,6 +566,7 @@ struct libinput_tablet_tool {
|
||||||
unsigned char buttons[NCHARS(KEY_MAX) + 1];
|
unsigned char buttons[NCHARS(KEY_MAX) + 1];
|
||||||
int refcount;
|
int refcount;
|
||||||
void *user_data;
|
void *user_data;
|
||||||
|
struct libinput_device *last_device;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
/* We're assuming that the *configured* pressure range is per
|
/* We're assuming that the *configured* pressure range is per
|
||||||
|
|
|
||||||
|
|
@ -1759,6 +1759,8 @@ libinput_tablet_tool_unref(struct libinput_tablet_tool *tool)
|
||||||
return tool;
|
return tool;
|
||||||
|
|
||||||
list_remove(&tool->link);
|
list_remove(&tool->link);
|
||||||
|
if (tool->last_device)
|
||||||
|
tool->last_device = libinput_device_unref(tool->last_device);
|
||||||
free(tool);
|
free(tool);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -1979,6 +1981,10 @@ libinput_unref(struct libinput *libinput)
|
||||||
|
|
||||||
free(libinput->events);
|
free(libinput->events);
|
||||||
|
|
||||||
|
list_for_each_safe(tool, &libinput->tool_list, link) {
|
||||||
|
libinput_tablet_tool_unref(tool);
|
||||||
|
}
|
||||||
|
|
||||||
libinput_plugin_system_destroy(&libinput->plugin_system);
|
libinput_plugin_system_destroy(&libinput->plugin_system);
|
||||||
|
|
||||||
list_for_each_safe(seat, &libinput->seat_list, link) {
|
list_for_each_safe(seat, &libinput->seat_list, link) {
|
||||||
|
|
@ -1996,10 +2002,6 @@ libinput_unref(struct libinput *libinput)
|
||||||
libinput_device_group_destroy(group);
|
libinput_device_group_destroy(group);
|
||||||
}
|
}
|
||||||
|
|
||||||
list_for_each_safe(tool, &libinput->tool_list, link) {
|
|
||||||
libinput_tablet_tool_unref(tool);
|
|
||||||
}
|
|
||||||
|
|
||||||
libinput_timer_subsys_destroy(libinput);
|
libinput_timer_subsys_destroy(libinput);
|
||||||
libinput_drop_destroyed_sources(libinput);
|
libinput_drop_destroyed_sources(libinput);
|
||||||
quirks_context_unref(libinput->quirks);
|
quirks_context_unref(libinput->quirks);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue