[PATCH xf86-input-evdev] evdev: Add support for server managed fds

Hans de Goede hdegoede at redhat.com
Sat Mar 8 01:28:00 PST 2014


Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 src/evdev.c | 49 ++++++++++++++++++++++++++++---------------------
 1 file changed, 28 insertions(+), 21 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index d1ed9ee..ed84f0f 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -97,6 +97,10 @@
 #define ABS_MT_TRACKING_ID 0x39
 #endif
 
+#ifndef XI86_SERVER_FD
+#define XI86_SERVER_FD 0x20
+#endif
+
 static const char *evdevDefaults[] = {
     "XkbRules",     "evdev",
     "XkbModel",     "pc104", /* the right model for 'us' */
@@ -2478,32 +2482,32 @@ EvdevOpenDevice(InputInfoPtr pInfo)
         xf86IDrvMsg(pInfo, X_CONFIG, "Device: \"%s\"\n", device);
     }
 
-    if (pInfo->fd < 0)
+    if (!(pInfo->flags & XI86_SERVER_FD) && pInfo->fd < 0)
     {
         do {
             pInfo->fd = open(device, O_RDWR | O_NONBLOCK, 0);
         } while (pInfo->fd < 0 && errno == EINTR);
+    }
 
-        if (pInfo->fd < 0) {
-            xf86IDrvMsg(pInfo, X_ERROR, "Unable to open evdev device \"%s\".\n", device);
-            return BadValue;
-        }
+    if (pInfo->fd < 0) {
+        xf86IDrvMsg(pInfo, X_ERROR, "Unable to open evdev device \"%s\".\n", device);
+        return BadValue;
+    }
 
-        if (libevdev_get_fd(pEvdev->dev) != -1) {
-            struct input_event ev;
+    if (libevdev_get_fd(pEvdev->dev) != -1) {
+        struct input_event ev;
 
-            libevdev_change_fd(pEvdev->dev, pInfo->fd);
-            /* re-sync libevdev's view of the device, but
-               we don't care about the actual events here */
-            libevdev_next_event(pEvdev->dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
-            while (libevdev_next_event(pEvdev->dev, LIBEVDEV_READ_FLAG_SYNC, &ev) == LIBEVDEV_READ_STATUS_SYNC)
-                ;
-        } else {
-            int rc = libevdev_set_fd(pEvdev->dev, pInfo->fd);
-            if (rc < 0) {
-                xf86IDrvMsg(pInfo, X_ERROR, "Unable to query fd: %s\n", strerror(-rc));
-                return BadValue;
-            }
+        libevdev_change_fd(pEvdev->dev, pInfo->fd);
+        /* re-sync libevdev's view of the device, but
+           we don't care about the actual events here */
+        libevdev_next_event(pEvdev->dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
+        while (libevdev_next_event(pEvdev->dev, LIBEVDEV_READ_FLAG_SYNC, &ev) == LIBEVDEV_READ_STATUS_SYNC)
+            ;
+    } else {
+        int rc = libevdev_set_fd(pEvdev->dev, pInfo->fd);
+        if (rc < 0) {
+            xf86IDrvMsg(pInfo, X_ERROR, "Unable to query fd: %s\n", strerror(-rc));
+            return BadValue;
         }
     }
 
@@ -2531,7 +2535,7 @@ static void
 EvdevCloseDevice(InputInfoPtr pInfo)
 {
     EvdevPtr pEvdev = pInfo->private;
-    if (pInfo->fd >= 0)
+    if (!(pInfo->flags & XI86_SERVER_FD) && pInfo->fd >= 0)
     {
         close(pInfo->fd);
         pInfo->fd = -1;
@@ -2679,7 +2683,10 @@ _X_EXPORT InputDriverRec EVDEV = {
     EvdevPreInit,
     EvdevUnInit,
     NULL,
-    evdevDefaults
+    evdevDefaults,
+#ifdef XI86_DRV_CAP_SERVER_FD
+    XI86_DRV_CAP_SERVER_FD
+#endif
 };
 
 static void
-- 
1.8.4.2



More information about the xorg-devel mailing list