diff options
Diffstat (limited to 'rcm-server-main.c')
-rw-r--r-- | rcm-server-main.c | 133 |
1 files changed, 4 insertions, 129 deletions
diff --git a/rcm-server-main.c b/rcm-server-main.c index f44c0ac..7fc6e85 100644 --- a/rcm-server-main.c +++ b/rcm-server-main.c @@ -675,113 +675,6 @@ remove_device(struct manager *mgr, struct udev_device *udev) } } -static int -evdev_read(sd_event_source *s, int fd, uint32_t revents, void *userdata) -{ - struct device *device = userdata; - struct input_event ev; - static struct linux_input_keycode *keycode = NULL; - static bool pressed = false; - static uint32_t scancode; - static bool scancode_recv = false; - unsigned i; - - if (fd != device->evdev_fd) - fprintf(stderr, "evdev fd mismatch: %i != %i\n", device->evdev_fd, fd); - - if (revents & EPOLLHUP) { - fprintf(stderr, "evdev connection closed!\n"); - close(fd); - device->evdev_fd = -1; - return 0; - } - - if (!(revents & EPOLLIN)) { - fprintf(stderr, "unexpected evdev event: %" PRIu32 "\n", revents); - return 0; - } - - while (read(fd, &ev, sizeof(ev)) == sizeof(ev)) { - switch (ev.type) { - case EV_KEY: - if (keycode) - printf("Reading from evdev - multiple keycodes?\n"); - - for (i = 0; linux_input_keycodes[i].name; i++) { - if (linux_input_keycodes[i].value == ev.code) - break; - } - - if (!linux_input_keycodes[i].name) { - printf("evdev - unknown keycode (%u)\n", ev.code); - break; - } - - keycode = &linux_input_keycodes[i]; - if (ev.value) - pressed = true; - break; - - case EV_MSC: - if (ev.code == MSC_SCAN) { - if (scancode_recv) - printf("Reading from evdev - multiple scancodes?\n"); - scancode_recv = true; - scancode = ev.value; - } - break; - - case EV_SYN: - if (keycode || scancode_recv) { - const char *protocol; - - /* FIXME: protocol reporting needs kernel support */ - if (scancode_recv) - protocol = evdev_guess_protocol(device, scancode, keycode ? keycode->value : KEY_RESERVED); - - printf("evdev -"); - - if (scancode_recv) { - printf(" protocol %s (guessed)", protocol); - printf(" scancode 0x%08x", scancode); - } - - if (keycode) { - printf(" keycode %s (%u)", keycode->name, keycode->value); - printf(" %s", pressed ? "pressed" : "released"); - } - - printf("\n"); - - if (scancode_recv) - sd_bus_emit_signal(device->mgr->bus, - device->path, - "org.gnome.RemoteControlManager.Device", - "KeyPressed", - "sts", protocol, scancode, - keycode ? keycode->name : "KEY_RESERVED"); - - else if (keycode && !pressed) - sd_bus_emit_signal(device->mgr->bus, - device->path, - "org.gnome.RemoteControlManager.Device", - "KeyReleased", - "s", keycode->name); - } - - scancode_recv = false; - pressed = false; - keycode = NULL; - break; - - default: - break; - } - } - - return 0; -} - static void add_device(struct manager *mgr, struct udev_device *udev) { @@ -792,6 +685,7 @@ add_device(struct manager *mgr, struct udev_device *udev) struct udev_enumerate *enumerate; struct udev_list_entry *devices, *dev_list_entry; struct udev_device *evdev; + int r; name = udev_device_get_sysname(udev); if (asprintf(&path, "/org/gnome/RemoteControlManager/%s", name) < 0) { @@ -848,28 +742,9 @@ add_device(struct manager *mgr, struct udev_device *udev) continue; } - if (device->evdev_fd >= 0) { - printf("Multiple evdev devices!?\n"); - udev_device_unref(evdev); - continue; - } - - device->evdev_fd = open(devnode, O_RDONLY | O_NONBLOCK); - if (device->evdev_fd < 0) { - printf("Failed to open evdev device %s: %s\n", - devnode, strerror(errno)); - udev_device_unref(evdev); - continue; - } - - evdev_setup(device); - - if (sd_event_add_io(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", - devnode, strerror(errno)); - close(device->evdev_fd); - device->evdev_fd = -1; + r = evdev_setup(mgr, device, devnode); + if (r < 0) { + printf("Failed to setup evdev: %s\n", devnode); udev_device_unref(evdev); continue; } |