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.
This commit is contained in:
Yaroslav de la Peña Smirnov 2022-10-23 03:09:38 +03:00 committed by Simon Ser
parent 5e514e6474
commit 9d99bb956f
3 changed files with 13 additions and 8 deletions

View file

@ -2,7 +2,7 @@
#define _SWAY_INPUT_LIBINPUT_H #define _SWAY_INPUT_LIBINPUT_H
#include "sway/input/input-manager.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); void sway_input_reset_libinput_device(struct sway_input_device *device);

View file

@ -236,7 +236,7 @@ static void handle_new_input(struct wl_listener *listener, void *data) {
apply_input_type_config(input_device); 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); wl_signal_add(&device->events.destroy, &input_device->device_destroy);
input_device->device_destroy.notify = handle_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); 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) { 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( static void input_manager_configure_input(
struct sway_input_device *input_device) { 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; struct sway_seat *seat = NULL;
wl_list_for_each(seat, &server.input->seats, link) { wl_list_for_each(seat, &server.input->seats, link) {
seat_configure_device(seat, input_device); seat_configure_device(seat, input_device);
} }
if (config_changed) {
ipc_event_input("libinput_config", input_device);
}
} }
void input_manager_configure_all_inputs(void) { void input_manager_configure_all_inputs(void) {

View file

@ -187,10 +187,10 @@ static bool set_calibration_matrix(struct libinput_device *dev, float mat[6]) {
return changed; 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); struct input_config *ic = input_device_get_config(input_device);
if (!ic || !wlr_input_device_is_libinput(input_device->wlr_device)) { if (!ic || !wlr_input_device_is_libinput(input_device->wlr_device)) {
return; return false;
} }
struct libinput_device *device = 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); changed |= set_calibration_matrix(device, ic->calibration_matrix.matrix);
} }
if (changed) { return changed;
ipc_event_input("libinput_config", input_device);
}
} }
void sway_input_reset_libinput_device(struct sway_input_device *input_device) { void sway_input_reset_libinput_device(struct sway_input_device *input_device) {