Port udev-seat to be used in libinput
authorJonas Ådahl <jadahl@gmail.com>
Sat, 23 Nov 2013 12:04:32 +0000 (13:04 +0100)
committerJonas Ådahl <jadahl@gmail.com>
Sun, 24 Nov 2013 20:19:18 +0000 (21:19 +0100)
commit56f7ddec82547a78010786b1d20ec00853028469
tree6b0d841f6b905a0a61ec6a77c70119d121a7ae0d
parentc0af815eaec66fa340dbb491606efc23e9f661b3
Port udev-seat to be used in libinput

This patch ports udev-seat from weston to libinput, including adapting
libinput internals and API to provide seat and device discovery.

The public API is extended with device discovery, object reference, a
seat object. As libinput takes care of creating and destroying its
objects user data getter/setter is added in order to make it possible
for the client to directly associate an object application side with an
object library side.

Device discovery API is made up of the 'seat added', 'seat removed',
'device added' and 'device removed' events. The seat added/removed
events contains a pointer to a libinput_seat struct, while the device
added/removed events contains a pointer to a libinput_device event.

The objects are reference counted with libinput holding one reference by
default. The application can increase the reference count with
libinput_seat_ref() and libinput_device_ref() and decrease the reference
count with libinput_seat_unref() and libinput_device_unref().

The basic event struct is changed to have a 'target' union parameter
that can be either a libinput, libinput_seat or libinput_device struct
pointer.

There is one known problem with the current API that is the potentially
racy initialization.

The problem is when a device is both discovered and lost during initial
dispatchig, causing libinput to first queue a 'added' message, creating
the device with default reference count 1, then before going back to the
application queuing a 'removed' message, while at same time decreasing
reference count of the device to 0, causing it o be destroyed. The queue
will at this state contain two messages with pointers to free:ed memory.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
src/Makefile.am
src/evdev-touchpad.c
src/evdev.c
src/evdev.h
src/libinput-private.h
src/libinput.c
src/libinput.h
src/udev-seat.c
src/udev-seat.h