From 9d99bb956fea8922f8e0196d67eabbd510c53f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yaroslav=20de=20la=20Pe=C3=B1a=20Smirnov?= Date: Sun, 23 Oct 2022 03:09:38 +0300 Subject: [PATCH] Fix keymap being NULL and segfaulting on dev add Moved `libinput_config` to the callers of `sway_input_configure_libinput_device` so that we send the event after the added event. --- include/sway/input/libinput.h | 2 +- sway/input/input-manager.c | 11 +++++++++-- sway/input/libinput.c | 8 +++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/include/sway/input/libinput.h b/include/sway/input/libinput.h index 890d632e..e4b1acc3 100644 --- a/include/sway/input/libinput.h +++ b/include/sway/input/libinput.h @@ -2,7 +2,7 @@ #define _SWAY_INPUT_LIBINPUT_H #include "sway/input/input-manager.h" -void sway_input_configure_libinput_device(struct sway_input_device *device); +bool sway_input_configure_libinput_device(struct sway_input_device *device); void sway_input_reset_libinput_device(struct sway_input_device *device); diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 4a0bce0e..26eefc8a 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -236,7 +236,7 @@ static void handle_new_input(struct wl_listener *listener, void *data) { apply_input_type_config(input_device); - sway_input_configure_libinput_device(input_device); + bool config_changed = sway_input_configure_libinput_device(input_device); wl_signal_add(&device->events.destroy, &input_device->device_destroy); input_device->device_destroy.notify = handle_device_destroy; @@ -274,6 +274,10 @@ static void handle_new_input(struct wl_listener *listener, void *data) { } ipc_event_input("added", input_device); + + if (config_changed) { + ipc_event_input("libinput_config", input_device); + } } static void handle_inhibit_activate(struct wl_listener *listener, void *data) { @@ -528,11 +532,14 @@ static void retranslate_keysyms(struct input_config *input_config) { static void input_manager_configure_input( struct sway_input_device *input_device) { - sway_input_configure_libinput_device(input_device); + bool config_changed = sway_input_configure_libinput_device(input_device); struct sway_seat *seat = NULL; wl_list_for_each(seat, &server.input->seats, link) { seat_configure_device(seat, input_device); } + if (config_changed) { + ipc_event_input("libinput_config", input_device); + } } void input_manager_configure_all_inputs(void) { diff --git a/sway/input/libinput.c b/sway/input/libinput.c index 3c0f359d..1bac72c9 100644 --- a/sway/input/libinput.c +++ b/sway/input/libinput.c @@ -187,10 +187,10 @@ static bool set_calibration_matrix(struct libinput_device *dev, float mat[6]) { return changed; } -void sway_input_configure_libinput_device(struct sway_input_device *input_device) { +bool sway_input_configure_libinput_device(struct sway_input_device *input_device) { struct input_config *ic = input_device_get_config(input_device); if (!ic || !wlr_input_device_is_libinput(input_device->wlr_device)) { - return; + return false; } struct libinput_device *device = @@ -259,9 +259,7 @@ void sway_input_configure_libinput_device(struct sway_input_device *input_device changed |= set_calibration_matrix(device, ic->calibration_matrix.matrix); } - if (changed) { - ipc_event_input("libinput_config", input_device); - } + return changed; } void sway_input_reset_libinput_device(struct sway_input_device *input_device) {