}
}
+static void
+fallback_device_interface_free_aux_data(struct evdev_dispatch *evdev_dispatch)
+{
+ int i;
+ struct fallback_dispatch *dispatch;
+ struct mt_aux_data *aux_data;
+
+ dispatch = fallback_dispatch(evdev_dispatch);
+
+ for (i = 0; i < (int)dispatch->mt.slots_len; i++) {
+ list_for_each_safe(aux_data, &dispatch->mt.aux_data_list[i], link) {
+ list_remove(&aux_data->link);
+ free(aux_data);
+ }
+ list_remove(&dispatch->mt.aux_data_list[i]);
+ }
+ free(dispatch->mt.aux_data_list);
+}
+
struct evdev_dispatch_device_interface fallback_device_interface = {
.set_aux_data = fallback_device_interface_set_aux_data
};
ABS_MT_TOOL_TYPE);
dispatch->mt.aux_data_list = calloc(num_slots, sizeof(struct list));
- if (device->mt.aux_data_list) {
+ if (dispatch->mt.aux_data_list) {
int i;
for (i = 0; i < num_slots; i++) {
- list_init(&device->mt.aux_data_list[i]);
+ list_init(&dispatch->mt.aux_data_list[i]);
}
}
else
libinput_seat_unref(device->base.seat);
libevdev_free(device->evdev);
udev_device_unref(device->udev_device);
+ evdev_device_free_aux_data(device);
free(device);
}
if (!dispatch) return;
if (!dispatch->device_interface) return;
- if (dispatch->device_interface->set_auxdata) {
- dispatch->device_interface->set_auxdata(dispatch, code);
+ if (dispatch->device_interface->set_aux_data) {
+ dispatch->device_interface->set_aux_data(dispatch, code);
+ }
+}
+
+void
+evdev_device_free_aux_data(struct evdev_device *device)
+{
+ struct evdev_dispatch *dispatch = device->dispatch;
+ if (!dispatch) return;
+ if (!dispatch->device_interface) return;
+
+ if (dispatch->device_interface->free_aux_data) {
+ dispatch->device_interface->free_aux_data(dispatch, code);
}
}
struct evdev_dispatch_device_interface {
void (*set_aux_data) (struct evdev_dispatch *dispatch, uint32_t code);
+ void (*free_aux_data) (struct evdev_dispatch *dispatch);
};
enum evdev_dispatch_type {
void
evdev_device_set_aux_data(struct evdev_device *device, uint32_t code);
+void
+evdev_device_free_aux_data(struct evdev_device *device);
#endif /* EVDEV_H */