diff options
Diffstat (limited to 'src/libinput.c')
-rw-r--r-- | src/libinput.c | 84 |
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) { |