diff options
Diffstat (limited to 'sway/input')
-rw-r--r-- | sway/input/input-manager.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 89146d5b..055f6752 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -82,11 +82,12 @@ static struct sway_input_device *input_sway_device_from_wlr( return NULL; } -static bool input_has_seat_configuration(void) { +static bool input_has_seat_fallback_configuration(void) { struct sway_seat *seat = NULL; wl_list_for_each(seat, &server.input->seats, link) { struct seat_config *seat_config = seat_get_config(seat); - if (seat_config) { + if (seat_config && strcmp(seat_config->name, "*") != 0 + && seat_config->fallback != -1) { return true; } } @@ -296,11 +297,12 @@ static void handle_new_input(struct wl_listener *listener, void *data) { input_device->device_destroy.notify = handle_device_destroy; struct sway_seat *seat = NULL; - if (!input_has_seat_configuration()) { - wlr_log(WLR_DEBUG, "no seat configuration, using default seat"); + if (!input_has_seat_fallback_configuration()) { + wlr_log(WLR_DEBUG, "no seat config - creating default seat config"); seat = input_manager_get_default_seat(); - seat_add_device(seat, input_device); - return; + struct seat_config *sc = new_seat_config(seat->wlr_seat->name); + sc->fallback = true; + store_seat_config(sc); } bool added = false; @@ -459,15 +461,26 @@ void input_manager_apply_input_config(struct input_config *input_config) { } void input_manager_apply_seat_config(struct seat_config *seat_config) { - wlr_log(WLR_DEBUG, "applying new seat config for seat %s", - seat_config->name); - struct sway_seat *seat = input_manager_get_seat(seat_config->name); - if (!seat) { - return; + wlr_log(WLR_DEBUG, "applying seat config for seat %s", seat_config->name); + if (strcmp(seat_config->name, "*") == 0) { + struct sway_seat *seat = NULL; + wl_list_for_each(seat, &server.input->seats, link) { + // Only apply the wildcard config directly if there is no seat + // specific config + struct seat_config *sc = seat_get_config(seat); + if (!sc) { + sc = seat_config; + } + seat_apply_config(seat, sc); + } + } else { + struct sway_seat *seat = input_manager_get_seat(seat_config->name); + if (!seat) { + return; + } + seat_apply_config(seat, seat_config); } - seat_apply_config(seat, seat_config); - // for every device, try to add it to a seat and if no seat has it // attached, add it to the fallback seats. struct sway_input_device *input_device = NULL; |