From 45946fc75d5bf9525807e5cbc04e5c4c8da0f6e0 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Wed, 27 Dec 2023 19:17:13 -0800 Subject: [PATCH] Add `map_to_output` input option for touch devices --- cosmic-comp-config/src/input.rs | 2 ++ src/config/input_config.rs | 1 + src/config/mod.rs | 10 +++++++ src/input/mod.rs | 46 +++++++++++++++++++++++++++++---- 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/cosmic-comp-config/src/input.rs b/cosmic-comp-config/src/input.rs index 90f49c24..5ac4889e 100644 --- a/cosmic-comp-config/src/input.rs +++ b/cosmic-comp-config/src/input.rs @@ -27,6 +27,8 @@ pub struct InputConfig { pub scroll_config: Option, #[serde(skip_serializing_if = "Option::is_none", default)] pub tap_config: Option, + #[serde(skip_serializing_if = "Option::is_none", default)] + pub map_to_output: Option, } #[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)] diff --git a/src/config/input_config.rs b/src/config/input_config.rs index 063e80cf..6371a23b 100644 --- a/src/config/input_config.rs +++ b/src/config/input_config.rs @@ -79,6 +79,7 @@ pub fn for_device(device: &InputDevice) -> InputConfig { } else { None }, + map_to_output: None, } } diff --git a/src/config/mod.rs b/src/config/mod.rs index fff0340e..a81ae6fd 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -426,6 +426,16 @@ impl Config { .map_or(1.0, |x| x.0) } + pub fn map_to_output(&self, device: &InputDevice) -> Option<&str> { + let (device_config, default_config) = self.get_device_config(device); + Some( + input_config::get_config(device_config, default_config, |x| { + x.map_to_output.as_deref() + })? + .0, + ) + } + fn get_device_config(&self, device: &InputDevice) -> (Option<&InputConfig>, &InputConfig) { let default_config = if device.config_tap_finger_count() > 0 { &self.input_touchpad diff --git a/src/input/mod.rs b/src/input/mod.rs index dcec5b6c..50580d10 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -41,7 +41,12 @@ use smithay::{ Seat, SeatState, }, output::Output, - reexports::wayland_server::DisplayHandle, + reexports::{ + input::event::touch::{ + TouchDownEvent as LibinputTouchDownEvent, TouchMotionEvent as LibinputTouchMotionEvent, + }, + wayland_server::DisplayHandle, + }, utils::{Point, Serial, SERIAL_COUNTER}, wayland::{ keyboard_shortcuts_inhibit::KeyboardShortcutsInhibitorSeat, @@ -217,6 +222,8 @@ impl State { needs_key_repetition: bool, ) where ::PointerAxisEvent: 'static, + ::TouchDownEvent: 'static, + ::TouchMotionEvent: 'static, { use smithay::backend::input::Event; match event { @@ -1167,9 +1174,23 @@ impl State { } InputEvent::TouchDown { event, .. } => { if let Some(seat) = self.common.seat_with_device(&event.device()).cloned() { - // TODO: Configuration option for mapping touch device to output - // Is it possible to determine mapping for external touchscreen? - let Some(output) = self.common.shell.builtin_output().cloned() else { + // TODO Is it possible to determine mapping for external touchscreen? + let map_to_output = if let Some(event) = + ::downcast_ref::(&event) + { + self.common + .config + .map_to_output(&event.device()) + .and_then(|name| { + self.common + .shell + .outputs() + .find(|output| output.name() == name) + }) + } else { + None + }; + let Some(output) = map_to_output.or_else(|| self.common.shell.builtin_output()).cloned() else { return; }; @@ -1209,7 +1230,22 @@ impl State { } InputEvent::TouchMotion { event, .. } => { if let Some(seat) = self.common.seat_with_device(&event.device()).cloned() { - let Some(output) = self.common.shell.builtin_output().cloned() else { + let map_to_output = if let Some(event) = + ::downcast_ref::(&event) + { + self.common + .config + .map_to_output(&event.device()) + .and_then(|name| { + self.common + .shell + .outputs() + .find(|output| output.name() == name) + }) + } else { + None + }; + let Some(output) = map_to_output.or_else(|| self.common.shell.builtin_output()).cloned() else { return; };