aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Michael <cp.michael@samsung.com>2014-09-23 15:11:43 -0400
committerChris Michael <cp.michael@samsung.com>2014-09-23 15:31:12 -0400
commita0395b07c5b51fff61ec4b2e62bbe12fd2badd8f (patch)
treea721a04ac61d930bc6e4e376c8b482d88eb01ece
parentecore-drm: Remove udev from private header and add an Eeze_Udev_Watch (diff)
downloadefl-a0395b07c5b51fff61ec4b2e62bbe12fd2badd8f.tar.gz
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>
-rw-r--r--src/lib/ecore_drm/ecore_drm_inputs.c202
1 files changed, 82 insertions, 120 deletions
diff --git a/src/lib/ecore_drm/ecore_drm_inputs.c b/src/lib/ecore_drm/ecore_drm_inputs.c
index 0774b8fc34..cec69135c2 100644
--- a/src/lib/ecore_drm/ecore_drm_inputs.c
+++ b/src/lib/ecore_drm/ecore_drm_inputs.c
@@ -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 (!(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 (!(input = data)) return;
- if (!strcmp(act, "add"))
- _device_add(input, udevice);
- else if (!strcmp(act, "remove"))
+ switch (event)
{
- const char *node;
-
- node = udev_device_get_devnode(udevice);
+ case EEZE_UDEV_EVENT_ADD:
+ _device_add(input, device);
+ break;
+ case EEZE_UDEV_EVENT_REMOVE:
+ {
+ const char *node;
- _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;
-
- 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))
+ const char *device;
+
+ /* 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)
- {
- udev_device_unref(udevice);
- continue;
- }
-
- if (!_device_add(input, udevice))
+ 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;
}
- 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)
- {
- ERR("Could not create udev monitor: %m");
- return EINA_FALSE;
- }
-
- /* 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)
+ if (!input->watch)
{
- 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;
+ int events = 0;
+
+ 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);
}