From 880c239657bc81d244ae8fd3371b7b8a21bc8f07 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Wed, 16 Aug 2017 08:48:03 +0200 Subject: [PATCH] libinput: fail if no input found on init This runs through events pending at init on initialization so we can tell if some devices are available. Note that with the way wlr_device_lists is managed, this checks that there is at least one device we handle - it doesn't have to be a keyboard, but there is at least a mouse or tablet_pad or something that we care about. Instead of failing inconditionally it might be better to leave the decision to the user, e.g. add a "backend_has_devices" function to call later. (Tested by moving /dev/input off) Fixes #24. --- backend/libinput/backend.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c index a8f43fbc..7dc1cc01 100644 --- a/backend/libinput/backend.c +++ b/backend/libinput/backend.c @@ -63,14 +63,22 @@ static bool wlr_libinput_backend_start(struct wlr_backend *_backend) { libinput_log_set_handler(backend->libinput_context, wlr_libinput_log); libinput_log_set_priority(backend->libinput_context, LIBINPUT_LOG_PRIORITY_ERROR); + int libinput_fd = libinput_get_fd(backend->libinput_context); + if (backend->wlr_device_lists->length == 0) { + wlr_libinput_readable(libinput_fd, WL_EVENT_READABLE, backend); + if (backend->wlr_device_lists->length == 0) { + wlr_log(L_ERROR, "No input device found, failing initialization"); + return false; + } + } + struct wl_event_loop *event_loop = wl_display_get_event_loop(backend->display); if (backend->input_event) { wl_event_source_remove(backend->input_event); } - backend->input_event = wl_event_loop_add_fd(event_loop, - libinput_get_fd(backend->libinput_context), WL_EVENT_READABLE, - wlr_libinput_readable, backend); + backend->input_event = wl_event_loop_add_fd(event_loop, libinput_fd, + WL_EVENT_READABLE, wlr_libinput_readable, backend); if (!backend->input_event) { wlr_log(L_ERROR, "Failed to create input event on event loop"); return false;