From c93e5a62ff599528c3bf2a8656825403aaebe093 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Wed, 27 Aug 2014 18:31:34 +0200 Subject: terminal: add evdev elements to idev The evdev-element provides linux evdev interfaces as idev-elements. This way, all real input hardware devices on linux can be used with the idev interface. We use libevdev to interface with the kernel. It's a simple wrapper library around the kernel evdev API that takes care to resync devices after kernel-queue overflows, which is a rather non-trivial task. Furthermore, it's a well tested interface used by all other major input users (Xorg, weston, libinput, ...). Last but not least, it provides nice keycode to keyname lookup tables (and vice versa), which is really nice for debugging input problems. --- src/libsystemd-terminal/idev.c | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/libsystemd-terminal/idev.c') diff --git a/src/libsystemd-terminal/idev.c b/src/libsystemd-terminal/idev.c index 5e3080797..2316a6652 100644 --- a/src/libsystemd-terminal/idev.c +++ b/src/libsystemd-terminal/idev.c @@ -20,6 +20,8 @@ ***/ #include +#include +#include #include #include #include @@ -31,6 +33,7 @@ #include "login-shared.h" #include "macro.h" #include "set.h" +#include "udev-util.h" #include "util.h" static void element_open(idev_element *e); @@ -522,6 +525,51 @@ void idev_session_disable(idev_session *s) { } } +int idev_session_add_evdev(idev_session *s, struct udev_device *ud) { + idev_element *e; + dev_t devnum; + int r; + + assert_return(s, -EINVAL); + assert_return(ud, -EINVAL); + + devnum = udev_device_get_devnum(ud); + if (devnum == 0) + return 0; + + e = idev_find_evdev(s, devnum); + if (e) + return 0; + + r = idev_evdev_new(&e, s, ud); + if (r < 0) + return r; + + r = session_add_element(s, e); + if (r != 0) + return r; + + return 0; +} + +int idev_session_remove_evdev(idev_session *s, struct udev_device *ud) { + idev_element *e; + dev_t devnum; + + assert(s); + assert(ud); + + devnum = udev_device_get_devnum(ud); + if (devnum == 0) + return 0; + + e = idev_find_evdev(s, devnum); + if (!e) + return 0; + + return session_remove_element(s, e); +} + /* * Contexts */ -- cgit v1.2.3