aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/seat.c
diff options
context:
space:
mode:
authorLibravatar Simon Ser <contact@emersion.fr>2021-02-08 19:24:20 +0100
committerLibravatar Tudor Brindus <me@tbrindus.ca>2021-02-25 09:38:00 -0500
commiteea9c6331f01729d5feb8f86a4c0bbb53012d292 (patch)
tree087cd3b7341c8ddddca3425613858a6a4281ee49 /sway/input/seat.c
parentman: document `input XXX map_to_output *` (diff)
downloadsway-eea9c6331f01729d5feb8f86a4c0bbb53012d292.tar.gz
sway-eea9c6331f01729d5feb8f86a4c0bbb53012d292.tar.zst
sway-eea9c6331f01729d5feb8f86a4c0bbb53012d292.zip
Automatically map built-in touchscreens/tablets to built-in panels
Detect whether an output is built-in via its type. Detect whether a touchscreen or tablet tool is built-in via its ID_PATH property.
Diffstat (limited to 'sway/input/seat.c')
-rw-r--r--sway/input/seat.c49
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
670static 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 */
678static 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
694static 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
669static void seat_apply_input_config(struct sway_seat *seat, 704static 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 }