diff options
Diffstat (limited to 'sway/input/seat.c')
-rw-r--r-- | sway/input/seat.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c index e6e1d4fb..d23525a8 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include "sway/input/cursor.h" | 20 | #include "sway/input/cursor.h" |
21 | #include "sway/input/input-manager.h" | 21 | #include "sway/input/input-manager.h" |
22 | #include "sway/input/keyboard.h" | 22 | #include "sway/input/keyboard.h" |
23 | #include "sway/input/libinput.h" | ||
23 | #include "sway/input/seat.h" | 24 | #include "sway/input/seat.h" |
24 | #include "sway/input/switch.h" | 25 | #include "sway/input/switch.h" |
25 | #include "sway/input/tablet.h" | 26 | #include "sway/input/tablet.h" |
@@ -666,6 +667,40 @@ static void seat_reset_input_config(struct sway_seat *seat, | |||
666 | sway_device->input_device->wlr_device, NULL); | 667 | sway_device->input_device->wlr_device, NULL); |
667 | } | 668 | } |
668 | 669 | ||
670 | static bool has_prefix(const char *str, const char *prefix) { | ||
671 | return strncmp(str, prefix, strlen(prefix)) == 0; | ||
672 | } | ||
673 | |||
674 | /** | ||
675 | * Get the name of the built-in output, if any. Returns NULL if there isn't | ||
676 | * exactly one built-in output. | ||
677 | */ | ||
678 | static const char *get_builtin_output_name(void) { | ||
679 | const char *match = NULL; | ||
680 | for (int i = 0; i < root->outputs->length; ++i) { | ||
681 | struct sway_output *output = root->outputs->items[i]; | ||
682 | const char *name = output->wlr_output->name; | ||
683 | if (has_prefix(name, "eDP-") || has_prefix(name, "LVDS-") || | ||
684 | has_prefix(name, "DSI-")) { | ||
685 | if (match != NULL) { | ||
686 | return NULL; | ||
687 | } | ||
688 | match = name; | ||
689 | } | ||
690 | } | ||
691 | return match; | ||
692 | } | ||
693 | |||
694 | static bool is_touch_or_tablet_tool(struct sway_seat_device *seat_device) { | ||
695 | switch (seat_device->input_device->wlr_device->type) { | ||
696 | case WLR_INPUT_DEVICE_TOUCH: | ||
697 | case WLR_INPUT_DEVICE_TABLET_TOOL: | ||
698 | return true; | ||
699 | default: | ||
700 | return false; | ||
701 | } | ||
702 | } | ||
703 | |||
669 | static void seat_apply_input_config(struct sway_seat *seat, | 704 | static void seat_apply_input_config(struct sway_seat *seat, |
670 | struct sway_seat_device *sway_device) { | 705 | struct sway_seat_device *sway_device) { |
671 | struct input_config *ic = | 706 | struct input_config *ic = |
@@ -681,7 +716,21 @@ static void seat_apply_input_config(struct sway_seat *seat, | |||
681 | 716 | ||
682 | switch (mapped_to) { | 717 | switch (mapped_to) { |
683 | case MAPPED_TO_DEFAULT: | 718 | case MAPPED_TO_DEFAULT: |
719 | /* | ||
720 | * If the wlroots backend provides an output name, use that. | ||
721 | * | ||
722 | * Otherwise, try to map built-in touch and tablet tool devices to the | ||
723 | * built-in output. | ||
724 | */ | ||
684 | mapped_to_output = sway_device->input_device->wlr_device->output_name; | 725 | mapped_to_output = sway_device->input_device->wlr_device->output_name; |
726 | if (mapped_to_output == NULL && is_touch_or_tablet_tool(sway_device) && | ||
727 | sway_libinput_device_is_builtin(sway_device->input_device)) { | ||
728 | mapped_to_output = get_builtin_output_name(); | ||
729 | if (mapped_to_output) { | ||
730 | sway_log(SWAY_DEBUG, "Auto-detected output '%s' for device '%s'", | ||
731 | mapped_to_output, sway_device->input_device->identifier); | ||
732 | } | ||
733 | } | ||
685 | if (mapped_to_output == NULL) { | 734 | if (mapped_to_output == NULL) { |
686 | return; | 735 | return; |
687 | } | 736 | } |