elput: Add event which can be raised when devices get added or removed

Signed-off-by: Chris Michael <cpmichael@osg.samsung.com>
This commit is contained in:
Chris Michael 2016-04-07 09:00:18 -04:00
parent 6a7589bf78
commit 6c85fe7514
3 changed files with 61 additions and 6 deletions

View File

@ -74,10 +74,24 @@ typedef struct _Elput_Event_Modifiers_Send
unsigned int group; unsigned int group;
} Elput_Event_Modifiers_Send; } Elput_Event_Modifiers_Send;
typedef enum _Elput_Device_Change_Type
{
ELPUT_DEVICE_ADDED,
ELPUT_DEVICE_REMOVED,
} Elput_Device_Change_Type;
/* structure to represent event for device being added or removed */
typedef struct _Elput_Event_Device_Change
{
Elput_Device *device;
Elput_Device_Change_Type type;
} Elput_Event_Device_Change;
EAPI extern int ELPUT_EVENT_SEAT_CAPS; EAPI extern int ELPUT_EVENT_SEAT_CAPS;
EAPI extern int ELPUT_EVENT_SEAT_FRAME; EAPI extern int ELPUT_EVENT_SEAT_FRAME;
EAPI extern int ELPUT_EVENT_KEYMAP_SEND; EAPI extern int ELPUT_EVENT_KEYMAP_SEND;
EAPI extern int ELPUT_EVENT_MODIFIERS_SEND; EAPI extern int ELPUT_EVENT_MODIFIERS_SEND;
EAPI extern int ELPUT_EVENT_DEVICE_CHANGE;
/** /**
* @file * @file

View File

@ -10,6 +10,7 @@ EAPI int ELPUT_EVENT_SEAT_CAPS = -1;
EAPI int ELPUT_EVENT_SEAT_FRAME = -1; EAPI int ELPUT_EVENT_SEAT_FRAME = -1;
EAPI int ELPUT_EVENT_KEYMAP_SEND = -1; EAPI int ELPUT_EVENT_KEYMAP_SEND = -1;
EAPI int ELPUT_EVENT_MODIFIERS_SEND = -1; EAPI int ELPUT_EVENT_MODIFIERS_SEND = -1;
EAPI int ELPUT_EVENT_DEVICE_CHANGE = -1;
EAPI int EAPI int
elput_init(void) elput_init(void)
@ -32,6 +33,7 @@ elput_init(void)
ELPUT_EVENT_SEAT_FRAME = ecore_event_type_new(); ELPUT_EVENT_SEAT_FRAME = ecore_event_type_new();
ELPUT_EVENT_KEYMAP_SEND = ecore_event_type_new(); ELPUT_EVENT_KEYMAP_SEND = ecore_event_type_new();
ELPUT_EVENT_MODIFIERS_SEND = ecore_event_type_new(); ELPUT_EVENT_MODIFIERS_SEND = ecore_event_type_new();
ELPUT_EVENT_DEVICE_CHANGE = ecore_event_type_new();
return _elput_init_count; return _elput_init_count;
@ -57,6 +59,7 @@ elput_shutdown(void)
ELPUT_EVENT_SEAT_FRAME = -1; ELPUT_EVENT_SEAT_FRAME = -1;
ELPUT_EVENT_KEYMAP_SEND = -1; ELPUT_EVENT_KEYMAP_SEND = -1;
ELPUT_EVENT_MODIFIERS_SEND = -1; ELPUT_EVENT_MODIFIERS_SEND = -1;
ELPUT_EVENT_DEVICE_CHANGE = -1;
eina_log_domain_unregister(_elput_log_dom); eina_log_domain_unregister(_elput_log_dom);
_elput_log_dom = -1; _elput_log_dom = -1;

View File

@ -78,6 +78,41 @@ _udev_seat_get(Elput_Manager *em, struct libinput_device *device)
return _udev_seat_named_get(em, name); return _udev_seat_named_get(em, name);
} }
static void
_device_event_cb_free(void *data EINA_UNUSED, void *event)
{
Elput_Event_Device_Change *ev;
ev = event;
if (ev->type == ELPUT_DEVICE_REMOVED)
{
Elput_Seat *seat;
seat = ev->device->seat;
if (seat)
seat->devices = eina_list_remove(seat->devices, ev->device);
_evdev_device_destroy(ev->device);
}
free(ev);
}
static void
_device_event_send(Elput_Device *edev, Elput_Device_Change_Type type)
{
Elput_Event_Device_Change *ev;
ev = calloc(1, sizeof(Elput_Event_Device_Change));
if (!ev) return;
ev->device = edev;
ev->type = type;
ecore_event_add(ELPUT_EVENT_DEVICE_CHANGE, ev, _device_event_cb_free, NULL);
}
static void static void
_device_add(Elput_Manager *em, struct libinput_device *dev) _device_add(Elput_Manager *em, struct libinput_device *dev)
{ {
@ -95,22 +130,25 @@ _device_add(Elput_Manager *em, struct libinput_device *dev)
eina_stringshare_replace(&edev->output_name, oname); eina_stringshare_replace(&edev->output_name, oname);
eseat->devices = eina_list_append(eseat->devices, edev); eseat->devices = eina_list_append(eseat->devices, edev);
_device_event_send(edev, ELPUT_DEVICE_ADDED);
} }
static void static void
_device_remove(Elput_Manager *em, struct libinput_device *device) _device_remove(Elput_Manager *em EINA_UNUSED, struct libinput_device *device)
{ {
Elput_Seat *eseat; /* Elput_Seat *eseat; */
Elput_Device *edev; Elput_Device *edev;
edev = libinput_device_get_user_data(device); edev = libinput_device_get_user_data(device);
if (!edev) return; if (!edev) return;
eseat = _udev_seat_get(em, device); /* eseat = _udev_seat_get(em, device); */
if (eseat) /* if (eseat) */
eseat->devices = eina_list_remove(eseat->devices, edev); /* eseat->devices = eina_list_remove(eseat->devices, edev); */
_evdev_device_destroy(edev); _device_event_send(edev, ELPUT_DEVICE_REMOVED);
/* _evdev_device_destroy(edev); */
} }
static int static int