summaryrefslogtreecommitdiff
path: root/rcm-server-evdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'rcm-server-evdev.c')
-rw-r--r--rcm-server-evdev.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/rcm-server-evdev.c b/rcm-server-evdev.c
index 74cae10..afd89f7 100644
--- a/rcm-server-evdev.c
+++ b/rcm-server-evdev.c
@@ -9,6 +9,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <libevdev/libevdev.h>
#include "utils.h"
#include "shared.h"
@@ -150,6 +151,7 @@ evdev_read(sd_event_source *s, int fd, uint32_t revents, void *userdata)
static uint32_t scancode;
static bool scancode_recv = false;
unsigned i;
+ int r;
if (fd != device->evdev_fd)
fprintf(stderr, "evdev fd mismatch: %i != %i\n", device->evdev_fd, fd);
@@ -166,7 +168,16 @@ evdev_read(sd_event_source *s, int fd, uint32_t revents, void *userdata)
return 0;
}
- while (read(fd, &ev, sizeof(ev)) == sizeof(ev)) {
+ do {
+ r = libevdev_next_event(device->evdev_dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
+ if (r != LIBEVDEV_READ_STATUS_SUCCESS)
+ continue;
+
+ printf("Event: %s %s %d\n",
+ libevdev_event_type_get_name(ev.type),
+ libevdev_event_code_get_name(ev.type, ev.code),
+ ev.value);
+
switch (ev.type) {
case EV_KEY:
if (keycode)
@@ -242,13 +253,14 @@ evdev_read(sd_event_source *s, int fd, uint32_t revents, void *userdata)
default:
break;
}
- }
+
+ } while (r == LIBEVDEV_READ_STATUS_SUCCESS || r == LIBEVDEV_READ_STATUS_SYNC);
return 0;
}
int
-evdev_setup(struct manager *mgr, struct device *device, const char *path)
+evdev_setup(struct device *device, const char *path)
{
int r;
struct keymap *keymap;
@@ -262,13 +274,15 @@ evdev_setup(struct manager *mgr, struct device *device, const char *path)
}
device->evdev_fd = open(path, O_RDONLY | O_NONBLOCK);
- if (device->evdev_fd < 0) {
- printf("Failed to open evdev device %s: %s\n",
- path, strerror(errno));
- return -errno;
+ r = libevdev_new_from_fd(device->evdev_fd, &device->evdev_dev);
+ if (r < 0) {
+ printf("Failed to open evdev device %s: %s\n", path, strerror(-r));
+ close(device->evdev_fd);
+ return r;
}
- printf("Performing evdev setup for device %s\n", device->path);
+ printf("Performing evdev setup for device %s (%s)\n",
+ device->path, libevdev_get_name(device->evdev_dev));
r = evdev_clear_keymap(device);
if (r < 0)
return r;
@@ -276,7 +290,7 @@ evdev_setup(struct manager *mgr, struct device *device, const char *path)
list_for_each_entry(keymap, &device->keymaps, list)
r = evdev_set_keymap(device, keymap);
- if (sd_event_add_io(mgr->event, &device->evdev_ev,
+ if (sd_event_add_io(device->mgr->event, &device->evdev_ev,
device->evdev_fd, EPOLLIN, evdev_read, device) < 0) {
printf("Failed to add event source for evdev device %s: %s\n",
path, strerror(errno));