Add two asserts to avoid underrunning the seat/device refcount
[platform/upstream/libinput.git] / src / libinput.c
1 /*
2  * Copyright © 2013 Jonas Ådahl
3  *
4  * Permission to use, copy, modify, distribute, and sell this software and
5  * its documentation for any purpose is hereby granted without fee, provided
6  * that the above copyright notice appear in all copies and that both that
7  * copyright notice and this permission notice appear in supporting
8  * documentation, and that the name of the copyright holders not be used in
9  * advertising or publicity pertaining to distribution of the software
10  * without specific, written prior permission.  The copyright holders make
11  * no representations about the suitability of this software for any
12  * purpose.  It is provided "as is" without express or implied warranty.
13  *
14  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
15  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
16  * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
17  * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
18  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
19  * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
20  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21  */
22
23 #include "config.h"
24
25 #include <errno.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <sys/epoll.h>
30 #include <unistd.h>
31 #include <assert.h>
32
33 #include "libinput.h"
34 #include "libinput-private.h"
35 #include "evdev.h"
36 #include "udev-seat.h"
37
38 enum libinput_event_class {
39         LIBINPUT_EVENT_CLASS_BASE,
40         LIBINPUT_EVENT_CLASS_SEAT,
41         LIBINPUT_EVENT_CLASS_DEVICE,
42 };
43
44 struct libinput_source {
45         libinput_source_dispatch_t dispatch;
46         void *user_data;
47         int fd;
48         struct list link;
49 };
50
51 struct libinput_event {
52         enum libinput_event_type type;
53         union libinput_event_target target;
54 };
55
56 struct libinput_event_added_seat {
57         struct libinput_event base;
58         struct libinput_seat *seat;
59 };
60
61 struct libinput_event_removed_seat {
62         struct libinput_event base;
63         struct libinput_seat *seat;
64 };
65
66 struct libinput_event_added_device {
67         struct libinput_event base;
68         struct libinput_device *device;
69 };
70
71 struct libinput_event_removed_device {
72         struct libinput_event base;
73         struct libinput_device *device;
74 };
75
76 struct libinput_event_device_register_capability {
77         struct libinput_event base;
78         enum libinput_device_capability capability;
79 };
80
81 struct libinput_event_device_unregister_capability {
82         struct libinput_event base;
83         enum libinput_device_capability capability;
84 };
85
86 struct libinput_event_keyboard_key {
87         struct libinput_event base;
88         uint32_t time;
89         uint32_t key;
90         enum libinput_keyboard_key_state state;
91 };
92
93 struct libinput_event_pointer_motion {
94         struct libinput_event base;
95         uint32_t time;
96         li_fixed_t dx;
97         li_fixed_t dy;
98 };
99
100 struct libinput_event_pointer_motion_absolute {
101         struct libinput_event base;
102         uint32_t time;
103         li_fixed_t x;
104         li_fixed_t y;
105 };
106
107 struct libinput_event_pointer_button {
108         struct libinput_event base;
109         uint32_t time;
110         uint32_t button;
111         enum libinput_pointer_button_state state;
112 };
113
114 struct libinput_event_pointer_axis {
115         struct libinput_event base;
116         uint32_t time;
117         enum libinput_pointer_axis axis;
118         li_fixed_t value;
119 };
120
121 struct libinput_event_touch_touch {
122         struct libinput_event base;
123         uint32_t time;
124         uint32_t slot;
125         li_fixed_t x;
126         li_fixed_t y;
127         enum libinput_touch_type touch_type;
128 };
129
130 static void
131 libinput_post_event(struct libinput *libinput,
132                     struct libinput_event *event);
133
134 LIBINPUT_EXPORT enum libinput_event_type
135 libinput_event_get_type(struct libinput_event *event)
136 {
137         return event->type;
138 }
139
140 LIBINPUT_EXPORT union libinput_event_target
141 libinput_event_get_target(struct libinput_event *event)
142 {
143         return event->target;
144 }
145
146 LIBINPUT_EXPORT struct libinput_seat *
147 libinput_event_added_seat_get_seat(struct libinput_event_added_seat *event)
148 {
149         return event->seat;
150 }
151
152 LIBINPUT_EXPORT struct libinput_seat *
153 libinput_event_removed_seat_get_seat(struct libinput_event_removed_seat *event)
154 {
155         return event->seat;
156 }
157
158 LIBINPUT_EXPORT struct libinput_device *
159 libinput_event_added_device_get_device(
160         struct libinput_event_added_device *event)
161 {
162         return event->device;
163 }
164
165 LIBINPUT_EXPORT struct libinput_device *
166 libinput_event_removed_device_get_device(
167         struct libinput_event_removed_device *event)
168 {
169         return event->device;
170 }
171
172 LIBINPUT_EXPORT enum libinput_device_capability
173 libinput_event_device_register_capability_get_capability(
174         struct libinput_event_device_register_capability *event)
175 {
176         return event->capability;
177 }
178
179 LIBINPUT_EXPORT enum libinput_device_capability
180 libinput_event_device_unregister_capability_get_capability(
181         struct libinput_event_device_unregister_capability *event)
182 {
183         return event->capability;
184 }
185
186 LIBINPUT_EXPORT uint32_t
187 libinput_event_keyboard_key_get_time(
188         struct libinput_event_keyboard_key *event)
189 {
190         return event->time;
191 }
192
193 LIBINPUT_EXPORT uint32_t
194 libinput_event_keyboard_key_get_key(
195         struct libinput_event_keyboard_key *event)
196 {
197         return event->key;
198 }
199
200 LIBINPUT_EXPORT enum libinput_keyboard_key_state
201 libinput_event_keyboard_key_get_state(
202         struct libinput_event_keyboard_key *event)
203 {
204         return event->state;
205 }
206
207 LIBINPUT_EXPORT uint32_t
208 libinput_event_pointer_motion_get_time(
209         struct libinput_event_pointer_motion *event)
210 {
211         return event->time;
212 }
213
214 LIBINPUT_EXPORT li_fixed_t
215 libinput_event_pointer_motion_get_dx(
216         struct libinput_event_pointer_motion *event)
217 {
218         return event->dx;
219 }
220
221 LIBINPUT_EXPORT li_fixed_t
222 libinput_event_pointer_motion_get_dy(
223         struct libinput_event_pointer_motion *event)
224 {
225         return event->dy;
226 }
227
228 LIBINPUT_EXPORT uint32_t
229 libinput_event_pointer_motion_absolute_get_time(
230         struct libinput_event_pointer_motion_absolute *event)
231 {
232         return event->time;
233 }
234
235 LIBINPUT_EXPORT li_fixed_t
236 libinput_event_pointer_motion_absolute_get_x(
237         struct libinput_event_pointer_motion_absolute *event)
238 {
239         return event->x;
240 }
241
242 LIBINPUT_EXPORT li_fixed_t
243 libinput_event_pointer_motion_absolute_get_y(
244         struct libinput_event_pointer_motion_absolute *event)
245 {
246         return event->y;
247 }
248
249 LIBINPUT_EXPORT uint32_t
250 libinput_event_pointer_button_get_time(
251         struct libinput_event_pointer_button *event)
252 {
253         return event->time;
254 }
255
256 LIBINPUT_EXPORT uint32_t
257 libinput_event_pointer_button_get_button(
258         struct libinput_event_pointer_button *event)
259 {
260         return event->button;
261 }
262
263 LIBINPUT_EXPORT enum libinput_pointer_button_state
264 libinput_event_pointer_button_get_state(
265         struct libinput_event_pointer_button *event)
266 {
267         return event->state;
268 }
269
270 LIBINPUT_EXPORT uint32_t
271 libinput_event_pointer_axis_get_time(
272         struct libinput_event_pointer_axis *event)
273 {
274         return event->time;
275 }
276
277 LIBINPUT_EXPORT enum libinput_pointer_axis
278 libinput_event_pointer_axis_get_axis(
279         struct libinput_event_pointer_axis *event)
280 {
281         return event->axis;
282 }
283
284 LIBINPUT_EXPORT li_fixed_t
285 libinput_event_pointer_axis_get_value(
286         struct libinput_event_pointer_axis *event)
287 {
288         return event->value;
289 }
290
291 LIBINPUT_EXPORT uint32_t
292 libinput_event_touch_touch_get_time(
293         struct libinput_event_touch_touch *event)
294 {
295         return event->time;
296 }
297
298 LIBINPUT_EXPORT uint32_t
299 libinput_event_touch_touch_get_slot(
300         struct libinput_event_touch_touch *event)
301 {
302         return event->slot;
303 }
304
305 LIBINPUT_EXPORT li_fixed_t
306 libinput_event_touch_touch_get_x(
307         struct libinput_event_touch_touch *event)
308 {
309         return event->x;
310 }
311
312 LIBINPUT_EXPORT li_fixed_t
313 libinput_event_touch_touch_get_y(
314         struct libinput_event_touch_touch *event)
315 {
316         return event->y;
317 }
318
319 LIBINPUT_EXPORT enum libinput_touch_type
320 libinput_event_touch_touch_get_touch_type(
321         struct libinput_event_touch_touch *event)
322 {
323         return event->touch_type;
324 }
325
326 struct libinput_source *
327 libinput_add_fd(struct libinput *libinput,
328                 int fd,
329                 libinput_source_dispatch_t dispatch,
330                 void *user_data)
331 {
332         struct libinput_source *source;
333         struct epoll_event ep;
334
335         source = malloc(sizeof *source);
336         if (!source)
337                 return NULL;
338
339         source->dispatch = dispatch;
340         source->user_data = user_data;
341         source->fd = fd;
342
343         memset(&ep, 0, sizeof ep);
344         ep.events = EPOLLIN;
345         ep.data.ptr = source;
346
347         if (epoll_ctl(libinput->epoll_fd, EPOLL_CTL_ADD, fd, &ep) < 0) {
348                 close(source->fd);
349                 free(source);
350                 return NULL;
351         }
352
353         return source;
354 }
355
356 void
357 libinput_remove_source(struct libinput *libinput,
358                        struct libinput_source *source)
359 {
360         epoll_ctl(libinput->epoll_fd, EPOLL_CTL_DEL, source->fd, NULL);
361         close(source->fd);
362         source->fd = -1;
363         list_insert(&libinput->source_destroy_list, &source->link);
364 }
365
366 int
367 libinput_init(struct libinput *libinput,
368               const struct libinput_interface *interface,
369               void *user_data)
370 {
371         libinput->epoll_fd = epoll_create1(EPOLL_CLOEXEC);;
372         if (libinput->epoll_fd < 0)
373                 return -1;
374
375         libinput->events_len = 4;
376         libinput->events = zalloc(libinput->events_len * sizeof(*libinput->events));
377         if (!libinput->events) {
378                 close(libinput->epoll_fd);
379                 return -1;
380         }
381
382         libinput->interface = interface;
383         libinput->user_data = user_data;
384         list_init(&libinput->source_destroy_list);
385         list_init(&libinput->seat_list);
386
387         return 0;
388 }
389
390 static void
391 libinput_device_destroy(struct libinput_device *device);
392
393 static void
394 libinput_seat_destroy(struct libinput_seat *seat);
395
396 LIBINPUT_EXPORT void
397 libinput_destroy(struct libinput *libinput)
398 {
399         struct libinput_event *event;
400         struct libinput_device *device, *next_device;
401         struct libinput_seat *seat, *next_seat;
402
403         while ((event = libinput_get_event(libinput)))
404                libinput_event_destroy(event);
405         free(libinput->events);
406
407         list_for_each_safe(seat, next_seat, &libinput->seat_list, link) {
408                 list_for_each_safe(device, next_device,
409                                    &seat->devices_list,
410                                    link)
411                         libinput_device_destroy(device);
412
413                 libinput_seat_destroy(seat);
414         }
415
416         close(libinput->epoll_fd);
417         free(libinput);
418 }
419
420 static enum libinput_event_class
421 libinput_event_get_class(struct libinput_event *event)
422 {
423         switch (event->type) {
424         case LIBINPUT_EVENT_ADDED_SEAT:
425         case LIBINPUT_EVENT_REMOVED_SEAT:
426         case LIBINPUT_EVENT_ADDED_DEVICE:
427         case LIBINPUT_EVENT_REMOVED_DEVICE:
428                 return LIBINPUT_EVENT_CLASS_BASE;
429
430         case LIBINPUT_EVENT_DEVICE_REGISTER_CAPABILITY:
431         case LIBINPUT_EVENT_DEVICE_UNREGISTER_CAPABILITY:
432         case LIBINPUT_EVENT_KEYBOARD_KEY:
433         case LIBINPUT_EVENT_POINTER_MOTION:
434         case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
435         case LIBINPUT_EVENT_POINTER_BUTTON:
436         case LIBINPUT_EVENT_POINTER_AXIS:
437         case LIBINPUT_EVENT_TOUCH_TOUCH:
438                 return LIBINPUT_EVENT_CLASS_DEVICE;
439         }
440
441         /* We should never end up here. */
442         abort();
443 }
444
445 LIBINPUT_EXPORT void
446 libinput_event_destroy(struct libinput_event *event)
447 {
448         if (event == NULL)
449                 return;
450
451         switch (libinput_event_get_class(event)) {
452         case LIBINPUT_EVENT_CLASS_BASE:
453                 break;
454         case LIBINPUT_EVENT_CLASS_SEAT:
455                 libinput_seat_unref(event->target.seat);
456                 break;
457         case LIBINPUT_EVENT_CLASS_DEVICE:
458                 libinput_device_unref(event->target.device);
459                 break;
460         }
461
462         free(event);
463 }
464
465 int
466 open_restricted(struct libinput *libinput,
467                 const char *path, int flags)
468 {
469         return libinput->interface->open_restricted(path,
470                                                     flags,
471                                                     libinput->user_data);
472 }
473
474 void
475 close_restricted(struct libinput *libinput, int fd)
476 {
477         return libinput->interface->close_restricted(fd, libinput->user_data);
478 }
479
480 void
481 libinput_seat_init(struct libinput_seat *seat,
482                    struct libinput *libinput,
483                    const char *name)
484 {
485         seat->refcount = 1;
486         seat->libinput = libinput;
487         seat->name = strdup(name);
488         list_init(&seat->devices_list);
489 }
490
491 LIBINPUT_EXPORT void
492 libinput_seat_ref(struct libinput_seat *seat)
493 {
494         seat->refcount++;
495 }
496
497 static void
498 libinput_seat_destroy(struct libinput_seat *seat)
499 {
500         free(seat->name);
501         udev_seat_destroy((struct udev_seat *) seat);
502 }
503
504 LIBINPUT_EXPORT void
505 libinput_seat_unref(struct libinput_seat *seat)
506 {
507         assert(seat->refcount > 0);
508         seat->refcount--;
509         if (seat->refcount == 0)
510                 libinput_seat_destroy(seat);
511 }
512
513 LIBINPUT_EXPORT void
514 libinput_seat_set_user_data(struct libinput_seat *seat, void *user_data)
515 {
516         seat->user_data = user_data;
517 }
518
519 LIBINPUT_EXPORT void *
520 libinput_seat_get_user_data(struct libinput_seat *seat)
521 {
522         return seat->user_data;
523 }
524
525 LIBINPUT_EXPORT const char *
526 libinput_seat_get_name(struct libinput_seat *seat)
527 {
528         return seat->name;
529 }
530
531 void
532 libinput_device_init(struct libinput_device *device,
533                      struct libinput_seat *seat)
534 {
535         device->seat = seat;
536         device->refcount = 1;
537 }
538
539 LIBINPUT_EXPORT void
540 libinput_device_ref(struct libinput_device *device)
541 {
542         device->refcount++;
543 }
544
545 static void
546 libinput_device_destroy(struct libinput_device *device)
547 {
548         evdev_device_destroy((struct evdev_device *) device);
549 }
550
551 LIBINPUT_EXPORT void
552 libinput_device_unref(struct libinput_device *device)
553 {
554         assert(device->refcount > 0);
555         device->refcount--;
556         if (device->refcount == 0)
557                 libinput_device_destroy(device);
558 }
559
560 LIBINPUT_EXPORT int
561 libinput_get_fd(struct libinput *libinput)
562 {
563         return libinput->epoll_fd;
564 }
565
566 LIBINPUT_EXPORT int
567 libinput_dispatch(struct libinput *libinput)
568 {
569         struct libinput_source *source, *next;
570         struct epoll_event ep[32];
571         int i, count;
572
573         count = epoll_wait(libinput->epoll_fd, ep, ARRAY_LENGTH(ep), 0);
574         if (count < 0)
575                 return -errno;
576
577         for (i = 0; i < count; ++i) {
578                 source = ep[i].data.ptr;
579                 if (source->fd == -1)
580                         continue;
581
582                 source->dispatch(source->user_data);
583         }
584
585         list_for_each_safe(source, next, &libinput->source_destroy_list, link)
586                 free(source);
587         list_init(&libinput->source_destroy_list);
588
589         return 0;
590 }
591
592 static void
593 init_event_base(struct libinput_event *event,
594                 enum libinput_event_type type,
595                 union libinput_event_target target)
596 {
597         event->type = type;
598         event->target = target;
599 }
600
601 static void
602 post_base_event(struct libinput *libinput,
603                 enum libinput_event_type type,
604                 struct libinput_event *event)
605 {
606         init_event_base(event, type,
607                         (union libinput_event_target) { .libinput = libinput });
608         libinput_post_event(libinput, event);
609 }
610
611 static void
612 post_device_event(struct libinput_device *device,
613                   enum libinput_event_type type,
614                   struct libinput_event *event)
615 {
616         init_event_base(event, type,
617                         (union libinput_event_target) { .device = device });
618         libinput_post_event(device->seat->libinput, event);
619 }
620
621 void
622 notify_added_seat(struct libinput_seat *seat)
623 {
624         struct libinput_event_added_seat *added_seat_event;
625
626         added_seat_event = malloc(sizeof *added_seat_event);
627         if (!added_seat_event)
628                 return;
629
630         *added_seat_event = (struct libinput_event_added_seat) {
631                 .seat = seat,
632         };
633
634         post_base_event(seat->libinput,
635                         LIBINPUT_EVENT_ADDED_SEAT,
636                         &added_seat_event->base);
637 }
638
639 void
640 notify_removed_seat(struct libinput_seat *seat)
641 {
642         struct libinput_event_removed_seat *removed_seat_event;
643
644         removed_seat_event = malloc(sizeof *removed_seat_event);
645         if (!removed_seat_event)
646                 return;
647
648         *removed_seat_event = (struct libinput_event_removed_seat) {
649                 .seat = seat,
650         };
651
652         post_base_event(seat->libinput,
653                         LIBINPUT_EVENT_REMOVED_SEAT,
654                         &removed_seat_event->base);
655 }
656
657 void
658 notify_added_device(struct libinput_device *device)
659 {
660         struct libinput_event_added_device *added_device_event;
661
662         added_device_event = malloc(sizeof *added_device_event);
663         if (!added_device_event)
664                 return;
665
666         *added_device_event = (struct libinput_event_added_device) {
667                 .device = device,
668         };
669
670         post_base_event(device->seat->libinput,
671                         LIBINPUT_EVENT_ADDED_DEVICE,
672                         &added_device_event->base);
673 }
674
675 void
676 notify_removed_device(struct libinput_device *device)
677 {
678         struct libinput_event_removed_device *removed_device_event;
679
680         removed_device_event = malloc(sizeof *removed_device_event);
681         if (!removed_device_event)
682                 return;
683
684         *removed_device_event = (struct libinput_event_removed_device) {
685                 .device = device,
686         };
687
688         post_base_event(device->seat->libinput,
689                         LIBINPUT_EVENT_REMOVED_DEVICE,
690                         &removed_device_event->base);
691 }
692
693 void
694 device_register_capability(struct libinput_device *device,
695                            enum libinput_device_capability capability)
696 {
697         struct libinput_event_device_register_capability *capability_event;
698
699         capability_event = malloc(sizeof *capability_event);
700
701         *capability_event = (struct libinput_event_device_register_capability) {
702                 .capability = capability,
703         };
704
705         post_device_event(device,
706                           LIBINPUT_EVENT_DEVICE_REGISTER_CAPABILITY,
707                           &capability_event->base);
708 }
709
710 void
711 device_unregister_capability(struct libinput_device *device,
712                              enum libinput_device_capability capability)
713 {
714         struct libinput_event_device_unregister_capability *capability_event;
715
716         capability_event = malloc(sizeof *capability_event);
717
718         *capability_event = (struct libinput_event_device_unregister_capability) {
719                 .capability = capability,
720         };
721
722         post_device_event(device,
723                           LIBINPUT_EVENT_DEVICE_UNREGISTER_CAPABILITY,
724                           &capability_event->base);
725 }
726
727 void
728 keyboard_notify_key(struct libinput_device *device,
729                     uint32_t time,
730                     uint32_t key,
731                     enum libinput_keyboard_key_state state)
732 {
733         struct libinput_event_keyboard_key *key_event;
734
735         key_event = malloc(sizeof *key_event);
736         if (!key_event)
737                 return;
738
739         *key_event = (struct libinput_event_keyboard_key) {
740                 .time = time,
741                 .key = key,
742                 .state = state,
743         };
744
745         post_device_event(device,
746                           LIBINPUT_EVENT_KEYBOARD_KEY,
747                           &key_event->base);
748 }
749
750 void
751 pointer_notify_motion(struct libinput_device *device,
752                       uint32_t time,
753                       li_fixed_t dx,
754                       li_fixed_t dy)
755 {
756         struct libinput_event_pointer_motion *motion_event;
757
758         motion_event = malloc(sizeof *motion_event);
759         if (!motion_event)
760                 return;
761
762         *motion_event = (struct libinput_event_pointer_motion) {
763                 .time = time,
764                 .dx = dx,
765                 .dy = dy,
766         };
767
768         post_device_event(device,
769                           LIBINPUT_EVENT_POINTER_MOTION,
770                           &motion_event->base);
771 }
772
773 void
774 pointer_notify_motion_absolute(struct libinput_device *device,
775                                uint32_t time,
776                                li_fixed_t x,
777                                li_fixed_t y)
778 {
779         struct libinput_event_pointer_motion_absolute *motion_absolute_event;
780
781         motion_absolute_event = malloc(sizeof *motion_absolute_event);
782         if (!motion_absolute_event)
783                 return;
784
785         *motion_absolute_event = (struct libinput_event_pointer_motion_absolute) {
786                 .time = time,
787                 .x = x,
788                 .y = y,
789         };
790
791         post_device_event(device,
792                           LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE,
793                           &motion_absolute_event->base);
794 }
795
796 void
797 pointer_notify_button(struct libinput_device *device,
798                       uint32_t time,
799                       int32_t button,
800                       enum libinput_pointer_button_state state)
801 {
802         struct libinput_event_pointer_button *button_event;
803
804         button_event = malloc(sizeof *button_event);
805         if (!button_event)
806                 return;
807
808         *button_event = (struct libinput_event_pointer_button) {
809                 .time = time,
810                 .button = button,
811                 .state = state,
812         };
813
814         post_device_event(device,
815                           LIBINPUT_EVENT_POINTER_BUTTON,
816                           &button_event->base);
817 }
818
819 void
820 pointer_notify_axis(struct libinput_device *device,
821                     uint32_t time,
822                     enum libinput_pointer_axis axis,
823                     li_fixed_t value)
824 {
825         struct libinput_event_pointer_axis *axis_event;
826
827         axis_event = malloc(sizeof *axis_event);
828         if (!axis_event)
829                 return;
830
831         *axis_event = (struct libinput_event_pointer_axis) {
832                 .time = time,
833                 .axis = axis,
834                 .value = value,
835         };
836
837         post_device_event(device,
838                           LIBINPUT_EVENT_POINTER_AXIS,
839                           &axis_event->base);
840 }
841
842 void
843 touch_notify_touch(struct libinput_device *device,
844                    uint32_t time,
845                    int32_t slot,
846                    li_fixed_t x,
847                    li_fixed_t y,
848                    enum libinput_touch_type touch_type)
849 {
850         struct libinput_event_touch_touch *touch_event;
851
852         touch_event = malloc(sizeof *touch_event);
853         if (!touch_event)
854                 return;
855
856         *touch_event = (struct libinput_event_touch_touch) {
857                 .time = time,
858                 .slot = slot,
859                 .x = x,
860                 .y = y,
861                 .touch_type = touch_type,
862         };
863
864         post_device_event(device,
865                           LIBINPUT_EVENT_TOUCH_TOUCH,
866                           &touch_event->base);
867 }
868
869 static void
870 libinput_post_event(struct libinput *libinput,
871                     struct libinput_event *event)
872 {
873         struct libinput_event **events = libinput->events;
874         size_t events_len = libinput->events_len;
875         size_t events_count = libinput->events_count;
876         size_t move_len;
877         size_t new_out;
878
879         events_count++;
880         if (events_count > events_len) {
881                 events_len *= 2;
882                 events = realloc(events, events_len * sizeof *events);
883                 if (!events) {
884                         fprintf(stderr, "Failed to reallocate event ring "
885                                 "buffer");
886                         return;
887                 }
888
889                 if (libinput->events_count > 0 && libinput->events_in == 0) {
890                         libinput->events_in = libinput->events_len;
891                 } else if (libinput->events_count > 0 &&
892                            libinput->events_out >= libinput->events_in) {
893                         move_len = libinput->events_len - libinput->events_out;
894                         new_out = events_len - move_len;
895                         memmove(events + new_out,
896                                 events + libinput->events_out,
897                                 move_len * sizeof *events);
898                         libinput->events_out = new_out;
899                 }
900
901                 libinput->events = events;
902                 libinput->events_len = events_len;
903         }
904
905         switch (libinput_event_get_class(event)) {
906         case LIBINPUT_EVENT_CLASS_BASE:
907                 break;
908         case LIBINPUT_EVENT_CLASS_SEAT:
909                 libinput_seat_ref(event->target.seat);
910                 break;
911         case LIBINPUT_EVENT_CLASS_DEVICE:
912                 libinput_device_ref(event->target.device);
913                 break;
914         }
915
916         libinput->events_count = events_count;
917         events[libinput->events_in] = event;
918         libinput->events_in = (libinput->events_in + 1) % libinput->events_len;
919 }
920
921 LIBINPUT_EXPORT struct libinput_event *
922 libinput_get_event(struct libinput *libinput)
923 {
924         struct libinput_event *event;
925
926         if (libinput->events_count == 0)
927                 return NULL;
928
929         event = libinput->events[libinput->events_out];
930         libinput->events_out =
931                 (libinput->events_out + 1) % libinput->events_len;
932         libinput->events_count--;
933
934         return event;
935 }
936
937 LIBINPUT_EXPORT void *
938 libinput_get_user_data(struct libinput *libinput)
939 {
940         return libinput->user_data;
941 }
942
943 LIBINPUT_EXPORT int
944 libinput_resume(struct libinput *libinput)
945 {
946         return udev_input_enable((struct udev_input *) libinput);
947 }
948
949 LIBINPUT_EXPORT void
950 libinput_suspend(struct libinput *libinput)
951 {
952         udev_input_disable((struct udev_input *) libinput);
953 }
954
955 LIBINPUT_EXPORT void
956 libinput_device_set_user_data(struct libinput_device *device, void *user_data)
957 {
958         device->user_data = user_data;
959 }
960
961 LIBINPUT_EXPORT void *
962 libinput_device_get_user_data(struct libinput_device *device)
963 {
964         return device->user_data;
965 }
966
967 LIBINPUT_EXPORT const char *
968 libinput_device_get_sysname(struct libinput_device *device)
969 {
970         return evdev_device_get_sysname((struct evdev_device *) device);
971 }
972
973 LIBINPUT_EXPORT const char *
974 libinput_device_get_output_name(struct libinput_device *device)
975 {
976         return evdev_device_get_output((struct evdev_device *) device);
977 }
978
979 LIBINPUT_EXPORT struct libinput_seat *
980 libinput_device_get_seat(struct libinput_device *device)
981 {
982         return device->seat;
983 }
984
985 LIBINPUT_EXPORT void
986 libinput_device_led_update(struct libinput_device *device,
987                            enum libinput_led leds)
988 {
989         evdev_device_led_update((struct evdev_device *) device, leds);
990 }
991
992 LIBINPUT_EXPORT int
993 libinput_device_get_keys(struct libinput_device *device,
994                          char *keys, size_t size)
995 {
996         return evdev_device_get_keys((struct evdev_device *) device,
997                                      keys,
998                                      size);
999 }
1000
1001 LIBINPUT_EXPORT void
1002 libinput_device_calibrate(struct libinput_device *device,
1003                           float calibration[6])
1004 {
1005         evdev_device_calibrate((struct evdev_device *) device, calibration);
1006 }
1007
1008 LIBINPUT_EXPORT int
1009 libinput_device_has_capability(struct libinput_device *device,
1010                                enum libinput_device_capability capability)
1011 {
1012         return evdev_device_has_capability((struct evdev_device *) device,
1013                                            capability);
1014 }