diff --git a/include/sway/config.h b/include/sway/config.h index 0a010c6d..6892c946 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -108,6 +108,12 @@ struct calibration_matrix { float matrix[6]; }; +enum input_config_mapped_to { + MAPPED_TO_DEFAULT, + MAPPED_TO_OUTPUT, + MAPPED_TO_REGION +}; + /** * options for input devices */ @@ -147,6 +153,8 @@ struct input_config { int xkb_capslock; struct input_config_mapped_from_region *mapped_from_region; + + enum input_config_mapped_to mapped_to; char *mapped_to_output; struct wlr_box *mapped_to_region; diff --git a/sway/commands/input/map_to_output.c b/sway/commands/input/map_to_output.c index 6d623186..f60fb7d5 100644 --- a/sway/commands/input/map_to_output.c +++ b/sway/commands/input/map_to_output.c @@ -16,6 +16,7 @@ struct cmd_results *input_cmd_map_to_output(int argc, char **argv) { return cmd_results_new(CMD_FAILURE, "No input device defined."); } + ic->mapped_to = MAPPED_TO_OUTPUT; ic->mapped_to_output = strdup(argv[0]); return cmd_results_new(CMD_SUCCESS, NULL); diff --git a/sway/commands/input/map_to_region.c b/sway/commands/input/map_to_region.c index e0b69ed5..e85495e5 100644 --- a/sway/commands/input/map_to_region.c +++ b/sway/commands/input/map_to_region.c @@ -15,9 +15,7 @@ struct cmd_results *input_cmd_map_to_region(int argc, char **argv) { return cmd_results_new(CMD_FAILURE, "No input device defined"); } - // This is used to clear the current output mapping. - ic->mapped_to_output = strdup(""); - + ic->mapped_to = MAPPED_TO_REGION; ic->mapped_to_region = calloc(1, sizeof(struct wlr_box)); const char *errstr; diff --git a/sway/config/input.c b/sway/config/input.c index 294ed08f..0993e9ab 100644 --- a/sway/config/input.c +++ b/sway/config/input.c @@ -134,6 +134,9 @@ void merge_input_config(struct input_config *dst, struct input_config *src) { memcpy(dst->mapped_from_region, src->mapped_from_region, sizeof(struct input_config_mapped_from_region)); } + if (src->mapped_to) { + dst->mapped_to = src->mapped_to; + } if (src->mapped_to_output) { free(dst->mapped_to_output); dst->mapped_to_output = strdup(src->mapped_to_output); diff --git a/sway/input/seat.c b/sway/input/seat.c index 5fc23a19..f486d5e7 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -575,62 +575,57 @@ 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); - if (ic != NULL) { - 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; + struct input_config *ic = + input_device_get_config(sway_device->input_device); + if (ic == NULL) { + return; } - if (mapped_to_output == NULL && mapped_to_region == NULL) { + sway_log(SWAY_DEBUG, "Applying input config to %s", + sway_device->input_device->identifier); + + const char *mapped_to_output = ic->mapped_to_output; + struct wlr_box *mapped_to_region = ic->mapped_to_region; + + switch (ic->mapped_to) { + case MAPPED_TO_DEFAULT: mapped_to_output = sway_device->input_device->wlr_device->output_name; - } - - if (mapped_to_output != NULL) { + if (mapped_to_output == NULL) { + return; + } + /* fallthrough */ + case MAPPED_TO_OUTPUT: sway_log(SWAY_DEBUG, "Mapping input device %s to output %s", sway_device->input_device->identifier, mapped_to_output); if (strcmp("*", mapped_to_output) == 0) { wlr_cursor_map_input_to_output(seat->cursor->cursor, sway_device->input_device->wlr_device, NULL); + wlr_cursor_map_input_to_region(seat->cursor->cursor, + sway_device->input_device->wlr_device, NULL); sway_log(SWAY_DEBUG, "Reset output mapping"); return; } struct sway_output *output = output_by_name_or_id(mapped_to_output); - if (output) { - wlr_cursor_map_input_to_output(seat->cursor->cursor, - sway_device->input_device->wlr_device, output->wlr_output); - sway_log(SWAY_DEBUG, "Mapped to output %s", output->wlr_output->name); + if (!output) { + return; } - } else if (mapped_to_region != NULL) { + wlr_cursor_map_input_to_output(seat->cursor->cursor, + sway_device->input_device->wlr_device, output->wlr_output); + wlr_cursor_map_input_to_region(seat->cursor->cursor, + sway_device->input_device->wlr_device, NULL); + sway_log(SWAY_DEBUG, + "Mapped to output %s", output->wlr_output->name); + return; + case MAPPED_TO_REGION: 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_output(seat->cursor->cursor, + sway_device->input_device->wlr_device, NULL); wlr_cursor_map_input_to_region(seat->cursor->cursor, sway_device->input_device->wlr_device, mapped_to_region); + return; } }