From 69769c6774dea3aa149837b6bf4f3b2ddb5bbafa Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sun, 5 Jul 2026 02:35:51 -0700 Subject: [PATCH] fix: monitor touch works again --- .../src/compositor/input.rs | 37 +++++++++++++++++-- .../src/compositor/output.rs | 4 ++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/crates/hearthspace-compositor/src/compositor/input.rs b/crates/hearthspace-compositor/src/compositor/input.rs index 2e24085..df143fd 100644 --- a/crates/hearthspace-compositor/src/compositor/input.rs +++ b/crates/hearthspace-compositor/src/compositor/input.rs @@ -9,7 +9,7 @@ use smithay::{ keyboard::FilterResult, pointer::{AxisFrame, ButtonEvent}, }, - utils::SERIAL_COUNTER, + utils::{Logical, Point, Rectangle, SERIAL_COUNTER}, }; use tracing::{debug, trace}; @@ -219,7 +219,11 @@ pub(in crate::compositor) fn handle_input_event( return; } - let location = event.position_transformed(state.output_logical_size()); + let primary_output = state.primary_output_logical_rect(); + let location = touch_location_in_primary_output( + event.position_transformed(primary_output.size), + primary_output, + ); trace!(?slot, ?location, time, "single-touch down input"); state.active_touch_slot = Some(slot); state.apply_pointer_motion(location, time); @@ -233,7 +237,11 @@ pub(in crate::compositor) fn handle_input_event( return; } - let location = event.position_transformed(state.output_logical_size()); + let primary_output = state.primary_output_logical_rect(); + let location = touch_location_in_primary_output( + event.position_transformed(primary_output.size), + primary_output, + ); trace!(?slot, ?location, time, "single-touch motion input"); state.apply_pointer_motion(location, time); } @@ -266,6 +274,13 @@ pub(in crate::compositor) fn handle_input_event( } } +fn touch_location_in_primary_output( + local_location: Point, + primary_output: Rectangle, +) -> Point { + local_location + primary_output.loc.to_f64() +} + fn axis_frame_from_event( event: &impl PointerAxisEvent, time: u32, @@ -309,3 +324,19 @@ fn scroll_amount_for_axis( .map(|amount| amount / 120.0 * WHEEL_SCROLL_PIXEL_EQUIVALENT) }) } + +#[cfg(test)] +mod tests { + use smithay::utils::{Logical, Point, Rectangle}; + + use super::touch_location_in_primary_output; + + #[test] + fn touch_location_is_relative_to_primary_output_not_combined_desktop() { + let primary = Rectangle::::new((2560, 400).into(), (2560, 1600).into()); + + let location = touch_location_in_primary_output(Point::from((1280.0, 800.0)), primary); + + assert_eq!(location, Point::from((3840.0, 1200.0))); + } +} diff --git a/crates/hearthspace-compositor/src/compositor/output.rs b/crates/hearthspace-compositor/src/compositor/output.rs index c71f5d0..fa43739 100644 --- a/crates/hearthspace-compositor/src/compositor/output.rs +++ b/crates/hearthspace-compositor/src/compositor/output.rs @@ -232,6 +232,10 @@ impl App { self.outputs.logical_rects() } + pub(super) fn primary_output_logical_rect(&self) -> Rectangle { + self.outputs.primary.logical_rect() + } + pub(super) fn minimum_output_client_logical_width(&self) -> i32 { self.outputs.minimum_client_logical_width() } -- 2.51.2