Add time since pointerdown to input event handling (#4443)

This commit is contained in:
Timon
2026-09-16 01:15:25 +02:00
committed by Dennis Kobert
parent 8ae2df47fb
commit b82d9de927
3 changed files with 14 additions and 0 deletions
+3
View File
@@ -6,6 +6,7 @@ use crate::ui::{MULTICLICK_ALLOWED_TRAVEL, MULTICLICK_TIMEOUT, PINCH_ZOOM_SPEED,
use crate::wrapper::messages::{DesktopWrapperMessage, InputMessage, ModifierKeys, MouseKeys, PointerState, ScrollDelta}; use crate::wrapper::messages::{DesktopWrapperMessage, InputMessage, ModifierKeys, MouseKeys, PointerState, ScrollDelta};
pub(crate) struct InputState { pub(crate) struct InputState {
start: Instant,
viewport_info: Option<ViewportInfo>, viewport_info: Option<ViewportInfo>,
pointer_lock_position: Option<PhysicalPosition<f64>>, pointer_lock_position: Option<PhysicalPosition<f64>>,
modifier_keys: ModifierKeys, modifier_keys: ModifierKeys,
@@ -29,6 +30,7 @@ impl InputAction {
impl InputState { impl InputState {
pub(crate) fn new() -> Self { pub(crate) fn new() -> Self {
Self { Self {
start: Instant::now(),
viewport_info: None, viewport_info: None,
pointer_lock_position: None, pointer_lock_position: None,
modifier_keys: ModifierKeys::empty(), modifier_keys: ModifierKeys::empty(),
@@ -193,6 +195,7 @@ impl InputState {
PointerState { PointerState {
editor_position: (self.pointer_position.x / self.scale(), self.pointer_position.y / self.scale()).into(), editor_position: (self.pointer_position.x / self.scale(), self.pointer_position.y / self.scale()).into(),
mouse_keys: self.pointer_keys, mouse_keys: self.pointer_keys,
time: Some(self.start.elapsed().as_secs_f64() * 1000.),
..Default::default() ..Default::default()
} }
} }
@@ -56,6 +56,7 @@ pub struct PointerState {
pub position: ViewportPosition, pub position: ViewportPosition,
pub mouse_keys: MouseKeys, pub mouse_keys: MouseKeys,
pub scroll_delta: ScrollDelta, pub scroll_delta: ScrollDelta,
pub time: Option<f64>,
pub pressure: Option<f64>, pub pressure: Option<f64>,
pub tilt: Option<DVec2>, pub tilt: Option<DVec2>,
pub twist: Option<f64>, pub twist: Option<f64>,
@@ -77,6 +78,7 @@ pub struct EditorPointerState {
pub editor_position: EditorPosition, pub editor_position: EditorPosition,
pub mouse_keys: MouseKeys, pub mouse_keys: MouseKeys,
pub scroll_delta: ScrollDelta, pub scroll_delta: ScrollDelta,
pub time: Option<f64>,
pub pressure: Option<f64>, pub pressure: Option<f64>,
pub tilt: Option<DVec2>, pub tilt: Option<DVec2>,
pub twist: Option<f64>, pub twist: Option<f64>,
@@ -101,6 +103,7 @@ impl EditorPointerState {
position: (viewport.logical(self.editor_position) - viewport.offset()).into(), position: (viewport.logical(self.editor_position) - viewport.offset()).into(),
mouse_keys: self.mouse_keys, mouse_keys: self.mouse_keys,
scroll_delta: self.scroll_delta, scroll_delta: self.scroll_delta,
time: self.time,
pressure: self.pressure, pressure: self.pressure,
tilt: self.tilt, tilt: self.tilt,
twist: self.twist, twist: self.twist,
@@ -16,6 +16,7 @@ pub struct InputPreprocessorMessageHandler {
pub time: u64, pub time: u64,
pub keyboard: KeyStates, pub keyboard: KeyStates,
pub mouse: PointerState, pub mouse: PointerState,
pointer_down_time: f64,
} }
#[message_handler_data] #[message_handler_data]
@@ -144,6 +145,13 @@ impl InputPreprocessorMessageHandler {
} }
} }
let raw_time = new_state.time.unwrap_or(self.time as f64);
if self.mouse.mouse_keys == MouseKeys::empty() {
self.pointer_down_time = raw_time;
}
let interacting = (self.mouse.mouse_keys | new_state.mouse_keys) != MouseKeys::empty();
new_state.time = interacting.then_some(raw_time - self.pointer_down_time);
self.mouse = new_state; self.mouse = new_state;
} }