ecore-drm: Port ecore_drm_inputs code to use Eeze instead of udev

Summary: This changes all of our internal ecore-drm input code to use
Eeze library instead of udev directly.

@feature

Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
Chris Michael 2014-09-23 15:11:43 -04:00
parent 777e64fea5
commit a0395b07c5
1 changed files with 80 additions and 118 deletions

View File

@ -87,7 +87,7 @@ _cb_device_opened(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending
if (!(d = data)) return;
DBG("Device Opened: %s", d->node);
/* DBG("Input Device Opened: %s", d->node); */
/* DBUS_TYPE_UNIX_FD == 'h' */
if (!eldbus_message_arguments_get(msg, "hb", &fd, &b))
@ -142,37 +142,43 @@ _seat_get(Ecore_Drm_Input *input, const char *seat)
}
static Eina_Bool
_device_add(Ecore_Drm_Input *input, struct udev_device *device)
_device_add(Ecore_Drm_Input *input, const char *device)
{
Ecore_Drm_Device_Open_Data *data;
Ecore_Drm_Seat *seat;
const char *dev_seat, *wl_seat;
const char *node;
char n[PATH_MAX];
Ecore_Drm_Device_Open_Data *data;
const char *devseat, *wlseat;
if (!(dev_seat = udev_device_get_property_value(device, "ID_SEAT")))
dev_seat = "seat0";
DBG("Add Input Device: %s", device);
if (strcmp(dev_seat, input->seat)) return EINA_FALSE;
if (!(devseat = eeze_udev_syspath_get_property(device, "ID_SEAT")))
devseat = eina_stringshare_add("seat0");
if (!(wl_seat = udev_device_get_property_value(device, "WL_SEAT")))
wl_seat = "seat0";
if (strcmp(devseat, input->seat)) goto seat_err;
if (!(seat = _seat_get(input, wl_seat)))
return EINA_FALSE;
if (!(wlseat = eeze_udev_syspath_get_property(device, "WL_SEAT")))
wlseat = eina_stringshare_add("seat0");
node = udev_device_get_devnode(device);
strcpy(n, node);
if (!(seat = _seat_get(input, wlseat)))
{
ERR("\tCould not get matching seat");
goto seat_get_err;
}
if (!(data = calloc(1, sizeof(Ecore_Drm_Device_Open_Data))))
return EINA_FALSE;
goto seat_get_err;
data->seat = seat;
data->node = eina_stringshare_add(n);
data->node = eeze_udev_syspath_get_devpath(device);
_ecore_drm_dbus_device_open(n, _cb_device_opened, data);
_ecore_drm_dbus_device_open(data->node, _cb_device_opened, data);
return EINA_TRUE;
seat_get_err:
eina_stringshare_del(wlseat);
seat_err:
eina_stringshare_del(devseat);
return EINA_FALSE;
}
static void
@ -200,79 +206,61 @@ _device_remove(Ecore_Drm_Input *input, const char *device)
}
}
static Eina_Bool
_cb_input_event(void *data, Ecore_Fd_Handler *hdlr EINA_UNUSED)
static void
_cb_input_event(const char *device, Eeze_Udev_Event event, void *data, Eeze_Udev_Watch *watch EINA_UNUSED)
{
Ecore_Drm_Input *input;
struct udev_device *udevice;
const char *act;
if (!(input = data)) return EINA_FALSE;
if (!(input = data)) return;
if (!(udevice = udev_monitor_receive_device(input->monitor)))
return EINA_TRUE;
if (!(act = udev_device_get_action(udevice))) return EINA_TRUE;
if (strncmp("event", udev_device_get_sysname(udevice), 5) != 0)
goto err;
if (!strcmp(act, "add"))
_device_add(input, udevice);
else if (!strcmp(act, "remove"))
switch (event)
{
const char *node;
case EEZE_UDEV_EVENT_ADD:
_device_add(input, device);
break;
case EEZE_UDEV_EVENT_REMOVE:
{
const char *node;
node = udev_device_get_devnode(udevice);
_device_remove(input, node);
node = eeze_udev_syspath_get_devpath(device);
_device_remove(input, node);
eina_stringshare_del(node);
}
break;
default:
break;
}
return EINA_TRUE;
err:
if (udevice) udev_device_unref(udevice);
return EINA_TRUE;
}
static Eina_Bool
_devices_add(Ecore_Drm_Input *input)
{
struct udev_enumerate *uenum;
struct udev_list_entry *uentry;
struct udev_device *udevice;
const char *path, *name;
Eina_List *devices;
Eina_Bool found = EINA_FALSE;
const char *device;
uenum = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(uenum, "input");
udev_enumerate_scan_devices(uenum);
udev_list_entry_foreach(uentry, udev_enumerate_get_list_entry(uenum))
/* NB: This really sucks !! We cannot 'OR' diferent device types
* together for eeze_udev_find_by_type
*
* For now, just find by 'NONE" and we'll filter for input devices by
* running tests */
devices = eeze_udev_find_by_type(EEZE_UDEV_TYPE_NONE, NULL);
EINA_LIST_FREE(devices, device)
{
path = udev_list_entry_get_name(uentry);
udevice = udev_device_new_from_syspath(udev, path);
name = udev_device_get_sysname(udevice);
if (strncmp("event", name, 5) != 0)
if ((eeze_udev_syspath_is_mouse(device)) ||
(eeze_udev_syspath_is_kbd(device)) ||
(eeze_udev_syspath_is_touchpad(device)) ||
(eeze_udev_syspath_is_joystick(device)))
{
udev_device_unref(udevice);
continue;
if (!_device_add(input, device))
ERR("\tFailed to add device");
else
found = EINA_TRUE;
}
if (!_device_add(input, udevice))
{
udev_device_unref(udevice);
continue;
}
found = EINA_TRUE;
udev_device_unref(udevice);
eina_stringshare_del(device);
}
udev_enumerate_unref(uenum);
if (!found)
{
ERR("No Input Devices Found");
@ -289,7 +277,7 @@ ecore_drm_inputs_create(Ecore_Drm_Device *dev)
Ecore_Drm_Input *input;
/* check for valid device */
if ((!dev) || (!udev)) return EINA_FALSE;
if (!dev) return EINA_FALSE;
/* try to allocate space for input structure */
if (!(input = calloc(1, sizeof(Ecore_Drm_Input))))
@ -340,55 +328,31 @@ ecore_drm_inputs_enable(Ecore_Drm_Input *input)
/* check for valid input */
if (!input) return EINA_FALSE;
if (!input->monitor)
input->monitor = udev_monitor_new_from_netlink(udev, "udev");
if (!input->monitor)
if (!input->watch)
{
ERR("Could not create udev monitor: %m");
return EINA_FALSE;
}
int events = 0;
/* setup input filter */
udev_monitor_filter_add_match_subsystem_devtype(input->monitor,
"input", NULL);
/* try to enable receiving udev events */
if (udev_monitor_enable_receiving(input->monitor))
{
ERR("Could not bind udev monitor: %m");
udev_monitor_unref(input->monitor);
return EINA_FALSE;
}
/* save the fd */
if ((input->fd = udev_monitor_get_fd(input->monitor)) < 0)
{
ERR("Input monitor has no fd: %m");
udev_monitor_unref(input->monitor);
return EINA_FALSE;
}
/* create fd handler */
if (!input->hdlr)
{
input->hdlr =
ecore_main_fd_handler_add(input->fd, ECORE_FD_READ,
_cb_input_event, input, NULL, NULL);
}
if (!input->hdlr)
{
ERR("Failed to setup input fd handler: %m");
udev_monitor_unref(input->monitor);
return EINA_FALSE;
events = (EEZE_UDEV_EVENT_ADD | EEZE_UDEV_EVENT_REMOVE);
/* NB: This really sucks !! We cannot 'OR' diferent device types
* together for eeze_udev_watch_add :(
*
* For now, just put a 'watch' on mouse type as this (in effect) does
* what we need by internally by adding a subsystem match for 'input' */
if (!(input->watch =
eeze_udev_watch_add(EEZE_UDEV_TYPE_MOUSE, events,
_cb_input_event, input)))
{
ERR("Could not create Eeze_Udev_Watch for input");
return EINA_FALSE;
}
}
/* try to add devices */
if (!_devices_add(input))
{
ERR("Could not add input devices");
udev_monitor_unref(input->monitor);
eeze_udev_watch_del(input->watch);
input->watch = NULL;
return EINA_FALSE;
}
@ -403,13 +367,11 @@ ecore_drm_inputs_disable(Ecore_Drm_Input *input)
{
if (!input) return;
if (input->monitor) udev_monitor_unref(input->monitor);
input->monitor = NULL;
if (input->hdlr) ecore_main_fd_handler_del(input->hdlr);
input->hdlr = NULL;
if (input->watch) eeze_udev_watch_del(input->watch);
input->watch = NULL;
input->enabled = EINA_FALSE;
input->suspended = EINA_TRUE;
ecore_drm_inputs_destroy(input->dev);
}