summaryrefslogtreecommitdiff
path: root/src/libinput.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libinput.c')
-rw-r--r--src/libinput.c84
1 files changed, 81 insertions, 3 deletions
diff --git a/src/libinput.c b/src/libinput.c
index 2c286636..a51e76a9 100644
--- a/src/libinput.c
+++ b/src/libinput.c
@@ -226,6 +226,9 @@ libinput_log_set_handler(struct libinput *libinput,
}
static void
+libinput_device_group_destroy(struct libinput_device_group *group);
+
+static void
libinput_post_event(struct libinput *libinput,
struct libinput_event *event);
@@ -1206,6 +1209,7 @@ libinput_init(struct libinput *libinput,
libinput->refcount = 1;
list_init(&libinput->source_destroy_list);
list_init(&libinput->seat_list);
+ list_init(&libinput->device_group_list);
list_init(&libinput->tool_list);
if (libinput_timer_subsys_init(libinput) != 0) {
@@ -1247,6 +1251,7 @@ libinput_unref(struct libinput *libinput)
struct libinput_device *device, *next_device;
struct libinput_seat *seat, *next_seat;
struct libinput_tool *tool, *next_tool;
+ struct libinput_device_group *group, *next_group;
if (libinput == NULL)
return NULL;
@@ -1274,6 +1279,13 @@ libinput_unref(struct libinput *libinput)
libinput_seat_destroy(seat);
}
+ list_for_each_safe(group,
+ next_group,
+ &libinput->device_group_list,
+ link) {
+ libinput_device_group_destroy(group);
+ }
+
list_for_each_safe(tool, next_tool, &libinput->tool_list, link) {
libinput_tool_unref(tool);
}
@@ -2349,7 +2361,8 @@ libinput_device_group_ref(struct libinput_device_group *group)
}
struct libinput_device_group *
-libinput_device_group_create(const char *identifier)
+libinput_device_group_create(struct libinput *libinput,
+ const char *identifier)
{
struct libinput_device_group *group;
@@ -2362,13 +2375,32 @@ libinput_device_group_create(const char *identifier)
group->identifier = strdup(identifier);
if (!group->identifier) {
free(group);
- group = NULL;
+ return NULL;
}
}
+ list_init(&group->link);
+ list_insert(&libinput->device_group_list, &group->link);
+
return group;
}
+struct libinput_device_group *
+libinput_device_group_find_group(struct libinput *libinput,
+ const char *identifier)
+{
+ struct libinput_device_group *g = NULL;
+
+ list_for_each(g, &libinput->device_group_list, link) {
+ if (identifier && g->identifier &&
+ streq(g->identifier, identifier)) {
+ return g;
+ }
+ }
+
+ return g;
+}
+
void
libinput_device_set_device_group(struct libinput_device *device,
struct libinput_device_group *group)
@@ -2380,6 +2412,7 @@ libinput_device_set_device_group(struct libinput_device *device,
static void
libinput_device_group_destroy(struct libinput_device_group *group)
{
+ list_remove(&group->link);
free(group->identifier);
free(group);
}
@@ -2599,7 +2632,6 @@ libinput_device_config_accel_set_speed(struct libinput_device *device,
return device->config.accel->set_speed(device, speed);
}
-
LIBINPUT_EXPORT double
libinput_device_config_accel_get_speed(struct libinput_device *device)
{
@@ -2618,6 +2650,52 @@ libinput_device_config_accel_get_default_speed(struct libinput_device *device)
return device->config.accel->get_default_speed(device);
}
+LIBINPUT_EXPORT uint32_t
+libinput_device_config_accel_get_profiles(struct libinput_device *device)
+{
+ if (!libinput_device_config_accel_is_available(device))
+ return 0;
+
+ return device->config.accel->get_profiles(device);
+}
+
+LIBINPUT_EXPORT enum libinput_config_accel_profile
+libinput_device_config_accel_get_profile(struct libinput_device *device)
+{
+ if (!libinput_device_config_accel_is_available(device))
+ return LIBINPUT_CONFIG_ACCEL_PROFILE_NONE;
+
+ return device->config.accel->get_profile(device);
+}
+
+LIBINPUT_EXPORT enum libinput_config_accel_profile
+libinput_device_config_accel_get_default_profile(struct libinput_device *device)
+{
+ if (!libinput_device_config_accel_is_available(device))
+ return LIBINPUT_CONFIG_ACCEL_PROFILE_NONE;
+
+ return device->config.accel->get_profile(device);
+}
+
+LIBINPUT_EXPORT enum libinput_config_status
+libinput_device_config_accel_set_profile(struct libinput_device *device,
+ enum libinput_config_accel_profile profile)
+{
+ switch (profile) {
+ case LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT:
+ case LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE:
+ break;
+ default:
+ return LIBINPUT_CONFIG_STATUS_INVALID;
+ }
+
+ if (!libinput_device_config_accel_is_available(device) ||
+ (libinput_device_config_accel_get_profiles(device) & profile) == 0)
+ return LIBINPUT_CONFIG_STATUS_UNSUPPORTED;
+
+ return device->config.accel->set_profile(device, profile);
+}
+
LIBINPUT_EXPORT int
libinput_device_config_scroll_has_natural_scroll(struct libinput_device *device)
{