diff options
Diffstat (limited to 'sway/input')
-rw-r--r-- | sway/input/seat.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c index dc21ce61..5fc23a19 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -576,6 +576,7 @@ static void seat_reset_input_config(struct sway_seat *seat, static void seat_apply_input_config(struct sway_seat *seat, struct sway_seat_device *sway_device) { const char *mapped_to_output = NULL; + struct wlr_box *mapped_to_region = NULL; struct input_config *ic = input_device_get_config( sway_device->input_device); @@ -583,12 +584,31 @@ static void seat_apply_input_config(struct sway_seat *seat, sway_log(SWAY_DEBUG, "Applying input config to %s", sway_device->input_device->identifier); + // We use an empty string as a marker to clear the mapped_to_output + // property, because a NULL set in a handler_context isn't preserved. + if (ic->mapped_to_output != NULL && ic->mapped_to_output[0] == '\0') { + free(ic->mapped_to_output); + ic->mapped_to_output = NULL; + wlr_cursor_map_input_to_output(seat->cursor->cursor, + sway_device->input_device->wlr_device, NULL); + } + mapped_to_output = ic->mapped_to_output; + if (mapped_to_output != NULL) { + // Output has just been set, clear region setting. + free(ic->mapped_to_region); + ic->mapped_to_region = NULL; + wlr_cursor_map_input_to_region(seat->cursor->cursor, + sway_device->input_device->wlr_device, NULL); + } + + mapped_to_region = ic->mapped_to_region; } - if (mapped_to_output == NULL) { + if (mapped_to_output == NULL && mapped_to_region == NULL) { mapped_to_output = sway_device->input_device->wlr_device->output_name; } + if (mapped_to_output != NULL) { sway_log(SWAY_DEBUG, "Mapping input device %s to output %s", sway_device->input_device->identifier, mapped_to_output); @@ -604,6 +624,13 @@ static void seat_apply_input_config(struct sway_seat *seat, sway_device->input_device->wlr_device, output->wlr_output); sway_log(SWAY_DEBUG, "Mapped to output %s", output->wlr_output->name); } + } else if (mapped_to_region != NULL) { + sway_log(SWAY_DEBUG, "Mapping input device %s to %d,%d %dx%d", + sway_device->input_device->identifier, + mapped_to_region->x, mapped_to_region->y, + mapped_to_region->width, mapped_to_region->height); + wlr_cursor_map_input_to_region(seat->cursor->cursor, + sway_device->input_device->wlr_device, mapped_to_region); } } |