aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorDominique Martinet <asmadeus@codewreck.org>2017-08-16 08:48:03 +0200
committerDominique Martinet <asmadeus@codewreck.org>2017-08-16 09:18:12 +0200
commit880c239657bc81d244ae8fd3371b7b8a21bc8f07 (patch)
tree9506d3cea6374f2d8b193babf5507328957afe1b /backend
parent19d6442f52743d50d10c796d7146f58c251f67fe (diff)
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.
Diffstat (limited to 'backend')
-rw-r--r--backend/libinput/backend.c14
1 files 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;