From 43712aceef920d6bd52a7b408aaf612b080e082d Mon Sep 17 00:00:00 2001 From: Timon Date: Sun, 19 Jul 2026 19:16:58 +0000 Subject: [PATCH 1/8] Rename the editor mouse state types to Pointer* and the input_ modules --- desktop/src/app.rs | 4 +- desktop/wrapper/src/messages.rs | 4 +- desktop/wrapper/src/utils.rs | 2 +- .../input_mapper/input_mapper_message.rs | 4 +- .../input_mapper_message_handler.rs | 6 +-- .../messages/input_mapper/input_mappings.rs | 4 +- .../key_mapping_message_handler.rs | 2 +- .../{input_keyboard.rs => keyboard.rs} | 0 .../input_mapper/utility_types/macros.rs | 2 +- .../input_mapper/utility_types/misc.rs | 6 +-- .../input_mapper/utility_types/mod.rs | 5 +- .../{input_mouse.rs => pointer.rs} | 16 +++--- .../input_preprocessor_message.rs | 16 +++--- .../input_preprocessor_message_handler.rs | 52 +++++++++---------- .../messages/layout/layout_message_handler.rs | 2 +- .../layout/utility_types/layout_widget.rs | 2 +- .../portfolio/document/document_message.rs | 2 +- .../document/navigation/navigation_message.rs | 2 +- .../navigation/navigation_message_handler.rs | 4 +- .../document/node_graph/node_graph_message.rs | 2 +- .../document/utility_types/transformation.rs | 2 +- .../portfolio/portfolio_message_handler.rs | 2 +- .../tool/common_functionality/resize.rs | 2 +- .../tool/tool_messages/freehand_tool.rs | 14 ++--- .../tool/tool_messages/gradient_tool.rs | 16 +++--- editor/src/messages/tool/tool_messages/mod.rs | 2 +- .../messages/tool/tool_messages/pen_tool.rs | 2 +- .../tool/tool_messages/select_tool.rs | 2 +- .../tool/tool_messages/spline_tool.rs | 2 +- .../transform_layer_message.rs | 2 +- .../transform_layer_message_handler.rs | 2 +- editor/src/messages/tool/utility_types.rs | 2 +- editor/src/test_utils.rs | 30 +++++------ frontend/wrapper/src/editor_commands.rs | 16 +++--- frontend/wrapper/src/helpers.rs | 2 +- 35 files changed, 118 insertions(+), 117 deletions(-) rename editor/src/messages/input_mapper/utility_types/{input_keyboard.rs => keyboard.rs} (100%) rename editor/src/messages/input_mapper/utility_types/{input_mouse.rs => pointer.rs} (90%) diff --git a/desktop/src/app.rs b/desktop/src/app.rs index cc20d3abcd..e11f5f4bc0 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -21,7 +21,7 @@ use crate::preferences; use crate::render::{RenderError, RenderState}; use crate::ui::{UiCommand, UiInstance}; use crate::window::Window; -use crate::wrapper::messages::{DesktopFrontendMessage, DesktopWrapperMessage, InputMessage, MouseKeys, MouseState, Preferences}; +use crate::wrapper::messages::{DesktopFrontendMessage, DesktopWrapperMessage, InputMessage, MouseKeys, PointerState, Preferences}; use crate::wrapper::{DesktopWrapper, MmapResourceStorage, NodeGraphExecutionResult, WgpuContext, serialize_frontend_messages}; pub(crate) struct App { @@ -624,7 +624,7 @@ impl ApplicationHandler for App { }; if let Some(mouse_keys) = mouse_keys { let message = DesktopWrapperMessage::Input(InputMessage::PointerDown { - editor_mouse_state: MouseState { mouse_keys, ..Default::default() }, + editor_mouse_state: PointerState { mouse_keys, ..Default::default() }, modifier_keys: Default::default(), }); self.app_event_scheduler.schedule(AppEvent::DesktopWrapperMessage(message)); diff --git a/desktop/wrapper/src/messages.rs b/desktop/wrapper/src/messages.rs index 031a1cc207..90f62cc007 100644 --- a/desktop/wrapper/src/messages.rs +++ b/desktop/wrapper/src/messages.rs @@ -4,8 +4,8 @@ use std::path::PathBuf; pub(crate) use graphite_editor::messages::prelude::Message as EditorMessage; pub use graphite_editor::messages::frontend::utility_types::{DocumentInfo, PersistedState}; -pub use graphite_editor::messages::input_mapper::utility_types::input_keyboard::{Key, ModifierKeys}; -pub use graphite_editor::messages::input_mapper::utility_types::input_mouse::{EditorMouseState as MouseState, EditorPosition as Position, MouseKeys}; +pub use graphite_editor::messages::input_mapper::utility_types::keyboard::{Key, ModifierKeys}; +pub use graphite_editor::messages::input_mapper::utility_types::pointer::{EditorPointerState as PointerState, EditorPosition as Position, MouseKeys}; pub use graphite_editor::messages::prelude::DocumentId; pub use graphite_editor::messages::prelude::InputPreprocessorMessage as InputMessage; pub use graphite_editor::messages::prelude::PreferencesMessageHandler as Preferences; diff --git a/desktop/wrapper/src/utils.rs b/desktop/wrapper/src/utils.rs index 5b60cceeaf..433ae4d3c6 100644 --- a/desktop/wrapper/src/utils.rs +++ b/desktop/wrapper/src/utils.rs @@ -3,7 +3,7 @@ pub(crate) mod menu { use base64::engine::Engine; use base64::engine::general_purpose::STANDARD as BASE64; - use graphite_editor::messages::input_mapper::utility_types::input_keyboard::{Key, LabeledKeyOrMouseMotion, LabeledShortcut}; + use graphite_editor::messages::input_mapper::utility_types::keyboard::{Key, LabeledKeyOrMouseMotion, LabeledShortcut}; use graphite_editor::messages::input_mapper::utility_types::misc::ActionShortcut; use graphite_editor::messages::layout::LayoutMessage; use graphite_editor::messages::tool::tool_messages::tool_prelude::{Layout, LayoutGroup, LayoutTarget, MenuListEntry, Widget, WidgetId, WidgetRow}; diff --git a/editor/src/messages/input_mapper/input_mapper_message.rs b/editor/src/messages/input_mapper/input_mapper_message.rs index bfcda26c73..ffa8337d20 100644 --- a/editor/src/messages/input_mapper/input_mapper_message.rs +++ b/editor/src/messages/input_mapper/input_mapper_message.rs @@ -1,5 +1,5 @@ -use crate::messages::input_mapper::utility_types::input_keyboard::Key; -use crate::messages::input_mapper::utility_types::input_mouse::MouseButton; +use crate::messages::input_mapper::utility_types::keyboard::Key; +use crate::messages::input_mapper::utility_types::pointer::MouseButton; use crate::messages::prelude::*; #[impl_message(Message, KeyMappingMessage, Lookup)] diff --git a/editor/src/messages/input_mapper/input_mapper_message_handler.rs b/editor/src/messages/input_mapper/input_mapper_message_handler.rs index d38845c6d9..4797384142 100644 --- a/editor/src/messages/input_mapper/input_mapper_message_handler.rs +++ b/editor/src/messages/input_mapper/input_mapper_message_handler.rs @@ -1,7 +1,7 @@ -use super::utility_types::input_keyboard::KeysGroup; +use super::utility_types::keyboard::KeysGroup; use super::utility_types::misc::Mapping; use crate::application::Editor; -use crate::messages::input_mapper::utility_types::input_keyboard::{self, Key}; +use crate::messages::input_mapper::utility_types::keyboard::{self, Key}; use crate::messages::input_mapper::utility_types::misc::MappingEntry; use crate::messages::prelude::*; @@ -58,7 +58,7 @@ impl InputMapperMessageHandler { .map(|i| { // TODO: Use a safe solution eventually assert!( - i < input_keyboard::NUMBER_OF_KEYS, + i < keyboard::NUMBER_OF_KEYS, "Attempting to convert a Key with enum index {i}, which is larger than the number of Key enums", ); (i as u8).try_into().unwrap() diff --git a/editor/src/messages/input_mapper/input_mappings.rs b/editor/src/messages/input_mapper/input_mappings.rs index 8023d0f926..c1b4309649 100644 --- a/editor/src/messages/input_mapper/input_mappings.rs +++ b/editor/src/messages/input_mapper/input_mappings.rs @@ -1,11 +1,11 @@ use crate::application::Editor; use crate::consts::{BIG_NUDGE_AMOUNT, BRUSH_SIZE_CHANGE_KEYBOARD, NUDGE_AMOUNT}; use crate::messages::input_mapper::key_mapping::MappingVariant; -use crate::messages::input_mapper::utility_types::input_keyboard::{Key, KeyStates}; -use crate::messages::input_mapper::utility_types::input_mouse::MouseButton; +use crate::messages::input_mapper::utility_types::keyboard::{Key, KeyStates}; use crate::messages::input_mapper::utility_types::macros::*; use crate::messages::input_mapper::utility_types::misc::MappingEntry; use crate::messages::input_mapper::utility_types::misc::{KeyMappingEntries, Mapping}; +use crate::messages::input_mapper::utility_types::pointer::MouseButton; use crate::messages::portfolio::document::node_graph::utility_types::Direction; use crate::messages::portfolio::document::utility_types::misc::GroupFolderType; use crate::messages::prelude::*; diff --git a/editor/src/messages/input_mapper/key_mapping/key_mapping_message_handler.rs b/editor/src/messages/input_mapper/key_mapping/key_mapping_message_handler.rs index 4d40a9ebbe..5f70b8df7d 100644 --- a/editor/src/messages/input_mapper/key_mapping/key_mapping_message_handler.rs +++ b/editor/src/messages/input_mapper/key_mapping/key_mapping_message_handler.rs @@ -1,5 +1,5 @@ use crate::messages::input_mapper::input_mapper_message_handler::InputMapperMessageContext; -use crate::messages::input_mapper::utility_types::input_keyboard::KeysGroup; +use crate::messages::input_mapper::utility_types::keyboard::KeysGroup; use crate::messages::prelude::*; #[derive(ExtractField)] diff --git a/editor/src/messages/input_mapper/utility_types/input_keyboard.rs b/editor/src/messages/input_mapper/utility_types/keyboard.rs similarity index 100% rename from editor/src/messages/input_mapper/utility_types/input_keyboard.rs rename to editor/src/messages/input_mapper/utility_types/keyboard.rs diff --git a/editor/src/messages/input_mapper/utility_types/macros.rs b/editor/src/messages/input_mapper/utility_types/macros.rs index 9dae86c9a5..2adda8b540 100644 --- a/editor/src/messages/input_mapper/utility_types/macros.rs +++ b/editor/src/messages/input_mapper/utility_types/macros.rs @@ -162,7 +162,7 @@ macro_rules! action_shortcut { macro_rules! action_shortcut_manual { ($($keys:expr),*) => { Some(crate::messages::input_mapper::utility_types::misc::ActionShortcut::Shortcut( - crate::messages::input_mapper::utility_types::input_keyboard::LabeledShortcut(vec![$($keys.into()),*]).into(), + crate::messages::input_mapper::utility_types::keyboard::LabeledShortcut(vec![$($keys.into()),*]).into(), )) }; } diff --git a/editor/src/messages/input_mapper/utility_types/misc.rs b/editor/src/messages/input_mapper/utility_types/misc.rs index e98df2a22e..e06ed57574 100644 --- a/editor/src/messages/input_mapper/utility_types/misc.rs +++ b/editor/src/messages/input_mapper/utility_types/misc.rs @@ -1,7 +1,7 @@ -use super::input_keyboard::{KeysGroup, LabeledShortcut, all_required_modifiers_pressed}; +use super::keyboard::{KeysGroup, LabeledShortcut, all_required_modifiers_pressed}; use crate::messages::input_mapper::key_mapping::MappingVariant; -use crate::messages::input_mapper::utility_types::input_keyboard::{KeyStates, NUMBER_OF_KEYS}; -use crate::messages::input_mapper::utility_types::input_mouse::NUMBER_OF_MOUSE_BUTTONS; +use crate::messages::input_mapper::utility_types::keyboard::{KeyStates, NUMBER_OF_KEYS}; +use crate::messages::input_mapper::utility_types::pointer::NUMBER_OF_MOUSE_BUTTONS; use crate::messages::prelude::*; use core::time::Duration; diff --git a/editor/src/messages/input_mapper/utility_types/mod.rs b/editor/src/messages/input_mapper/utility_types/mod.rs index c0b5c8a21b..b7c0344c9b 100644 --- a/editor/src/messages/input_mapper/utility_types/mod.rs +++ b/editor/src/messages/input_mapper/utility_types/mod.rs @@ -1,4 +1,5 @@ -pub mod input_keyboard; -pub mod input_mouse; +pub mod keyboard; +pub mod pointer; + pub mod macros; pub mod misc; diff --git a/editor/src/messages/input_mapper/utility_types/input_mouse.rs b/editor/src/messages/input_mapper/utility_types/pointer.rs similarity index 90% rename from editor/src/messages/input_mapper/utility_types/input_mouse.rs rename to editor/src/messages/input_mapper/utility_types/pointer.rs index 420a3bdd46..8a286fb5ba 100644 --- a/editor/src/messages/input_mapper/utility_types/input_mouse.rs +++ b/editor/src/messages/input_mapper/utility_types/pointer.rs @@ -50,15 +50,15 @@ impl ScrollDelta { } } -// TODO: Document the difference between this and EditorMouseState +// TODO: Document the difference between this and EditorPointerState #[derive(Debug, Copy, Clone, Default, PartialEq, serde::Serialize, serde::Deserialize)] -pub struct MouseState { +pub struct PointerState { pub position: ViewportPosition, pub mouse_keys: MouseKeys, pub scroll_delta: ScrollDelta, } -impl MouseState { +impl PointerState { pub fn finish_transaction(&self, drag_start: DVec2, responses: &mut VecDeque) { let drag_too_small = drag_start.distance(self.position) <= DRAG_THRESHOLD; let response = if drag_too_small { DocumentMessage::AbortTransaction } else { DocumentMessage::EndTransaction }; @@ -66,15 +66,15 @@ impl MouseState { } } -// TODO: Document the difference between this and MouseState +// TODO: Document the difference between this and PointerState #[derive(Debug, Copy, Clone, Default, PartialEq, serde::Serialize, serde::Deserialize)] -pub struct EditorMouseState { +pub struct EditorPointerState { pub editor_position: EditorPosition, pub mouse_keys: MouseKeys, pub scroll_delta: ScrollDelta, } -impl EditorMouseState { +impl EditorPointerState { pub fn from_keys_and_editor_position(keys: u8, editor_position: EditorPosition) -> Self { // TODO: Some graphic tablets send key codes not mentioned in the spec. In the future we would like to support these as well. let mouse_keys = MouseKeys::from_bits_truncate(keys); @@ -86,8 +86,8 @@ impl EditorMouseState { } } - pub fn to_mouse_state(&self, viewport: &ViewportMessageHandler) -> MouseState { - MouseState { + pub fn to_pointer_state(&self, viewport: &ViewportMessageHandler) -> PointerState { + PointerState { position: (viewport.logical(self.editor_position) - viewport.offset()).into(), mouse_keys: self.mouse_keys, scroll_delta: self.scroll_delta, diff --git a/editor/src/messages/input_preprocessor/input_preprocessor_message.rs b/editor/src/messages/input_preprocessor/input_preprocessor_message.rs index db7932fdf4..91663a8548 100644 --- a/editor/src/messages/input_preprocessor/input_preprocessor_message.rs +++ b/editor/src/messages/input_preprocessor/input_preprocessor_message.rs @@ -1,17 +1,17 @@ -use crate::messages::input_mapper::utility_types::input_keyboard::{Key, ModifierKeys}; -use crate::messages::input_mapper::utility_types::input_mouse::EditorMouseState; +use crate::messages::input_mapper::utility_types::keyboard::{Key, ModifierKeys}; +use crate::messages::input_mapper::utility_types::pointer::EditorPointerState; use crate::messages::prelude::*; #[impl_message(Message, InputPreprocessor)] #[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)] pub enum InputPreprocessorMessage { - DoubleClick { editor_mouse_state: EditorMouseState, modifier_keys: ModifierKeys }, + DoubleClick { editor_mouse_state: EditorPointerState, modifier_keys: ModifierKeys }, KeyDown { key: Key, key_repeat: bool, modifier_keys: ModifierKeys }, KeyUp { key: Key, key_repeat: bool, modifier_keys: ModifierKeys }, - PointerDown { editor_mouse_state: EditorMouseState, modifier_keys: ModifierKeys }, - PointerMove { editor_mouse_state: EditorMouseState, modifier_keys: ModifierKeys }, - PointerUp { editor_mouse_state: EditorMouseState, modifier_keys: ModifierKeys }, - PointerShake { editor_mouse_state: EditorMouseState, modifier_keys: ModifierKeys }, + PointerDown { editor_mouse_state: EditorPointerState, modifier_keys: ModifierKeys }, + PointerMove { editor_mouse_state: EditorPointerState, modifier_keys: ModifierKeys }, + PointerUp { editor_mouse_state: EditorPointerState, modifier_keys: ModifierKeys }, + PointerShake { editor_mouse_state: EditorPointerState, modifier_keys: ModifierKeys }, CurrentTime { timestamp: u64 }, - WheelScroll { editor_mouse_state: EditorMouseState, modifier_keys: ModifierKeys }, + WheelScroll { editor_mouse_state: EditorPointerState, modifier_keys: ModifierKeys }, } diff --git a/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs b/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs index e9f5847b7b..6984d8c83b 100644 --- a/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs +++ b/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs @@ -1,7 +1,7 @@ use crate::application::Editor; -use crate::messages::input_mapper::utility_types::input_keyboard::{Key, KeyStates, ModifierKeys}; -use crate::messages::input_mapper::utility_types::input_mouse::{MouseButton, MouseKeys, MouseState}; +use crate::messages::input_mapper::utility_types::keyboard::{Key, KeyStates, ModifierKeys}; use crate::messages::input_mapper::utility_types::misc::FrameTimeInfo; +use crate::messages::input_mapper::utility_types::pointer::{MouseButton, MouseKeys, PointerState}; use crate::messages::prelude::*; use std::time::Duration; @@ -15,7 +15,7 @@ pub struct InputPreprocessorMessageHandler { pub frame_time: FrameTimeInfo, pub time: u64, pub keyboard: KeyStates, - pub mouse: MouseState, + pub mouse: PointerState, } #[message_handler_data] @@ -27,10 +27,10 @@ impl<'a> MessageHandler { self.update_states_of_modifier_keys(modifier_keys, responses); - let mouse_state = editor_mouse_state.to_mouse_state(viewport); - self.mouse.position = mouse_state.position; + let pointer_state = editor_mouse_state.to_pointer_state(viewport); + self.mouse.position = pointer_state.position; - for key in mouse_state.mouse_keys { + for key in pointer_state.mouse_keys { responses.add(InputMapperMessage::DoubleClick(match key { MouseKeys::LEFT => MouseButton::Left, MouseKeys::RIGHT => MouseButton::Right, @@ -60,35 +60,35 @@ impl<'a> MessageHandler { self.update_states_of_modifier_keys(modifier_keys, responses); - let mouse_state = editor_mouse_state.to_mouse_state(viewport); - self.mouse.position = mouse_state.position; + let pointer_state = editor_mouse_state.to_pointer_state(viewport); + self.mouse.position = pointer_state.position; - self.translate_mouse_event(mouse_state, true, responses); + self.translate_mouse_event(pointer_state, true, responses); } InputPreprocessorMessage::PointerMove { editor_mouse_state, modifier_keys } => { self.update_states_of_modifier_keys(modifier_keys, responses); - let mouse_state = editor_mouse_state.to_mouse_state(viewport); - self.mouse.position = mouse_state.position; + let pointer_state = editor_mouse_state.to_pointer_state(viewport); + self.mouse.position = pointer_state.position; responses.add(InputMapperMessage::PointerMove); // While any pointer button is already down, additional button down events are not reported, but they are sent as `pointermove` events - self.translate_mouse_event(mouse_state, false, responses); + self.translate_mouse_event(pointer_state, false, responses); } InputPreprocessorMessage::PointerUp { editor_mouse_state, modifier_keys } => { self.update_states_of_modifier_keys(modifier_keys, responses); - let mouse_state = editor_mouse_state.to_mouse_state(viewport); - self.mouse.position = mouse_state.position; + let pointer_state = editor_mouse_state.to_pointer_state(viewport); + self.mouse.position = pointer_state.position; - self.translate_mouse_event(mouse_state, false, responses); + self.translate_mouse_event(pointer_state, false, responses); } InputPreprocessorMessage::PointerShake { editor_mouse_state, modifier_keys } => { self.update_states_of_modifier_keys(modifier_keys, responses); - let mouse_state = editor_mouse_state.to_mouse_state(viewport); - self.mouse.position = mouse_state.position; + let pointer_state = editor_mouse_state.to_pointer_state(viewport); + self.mouse.position = pointer_state.position; responses.add(InputMapperMessage::PointerShake); } @@ -100,9 +100,9 @@ impl<'a> MessageHandler { self.update_states_of_modifier_keys(modifier_keys, responses); - let mouse_state = editor_mouse_state.to_mouse_state(viewport); - self.mouse.position = mouse_state.position; - self.mouse.scroll_delta = mouse_state.scroll_delta; + let pointer_state = editor_mouse_state.to_pointer_state(viewport); + self.mouse.position = pointer_state.position; + self.mouse.scroll_delta = pointer_state.scroll_delta; responses.add(InputMapperMessage::WheelScroll); } @@ -116,7 +116,7 @@ impl<'a> MessageHandler) { + fn translate_mouse_event(&mut self, mut new_state: PointerState, allow_first_button_down: bool, responses: &mut VecDeque) { let click_mappings = [ (MouseKeys::LEFT, Key::MouseLeft), (MouseKeys::RIGHT, Key::MouseRight), @@ -185,15 +185,15 @@ impl InputPreprocessorMessageHandler { #[cfg(test)] mod test { - use crate::messages::input_mapper::utility_types::input_keyboard::{Key, ModifierKeys}; - use crate::messages::input_mapper::utility_types::input_mouse::{EditorMouseState, MouseKeys, ScrollDelta}; + use crate::messages::input_mapper::utility_types::keyboard::{Key, ModifierKeys}; + use crate::messages::input_mapper::utility_types::pointer::{EditorPointerState, MouseKeys, ScrollDelta}; use crate::messages::prelude::*; #[test] fn process_action_mouse_move_handle_modifier_keys() { let mut input_preprocessor = InputPreprocessorMessageHandler::default(); - let editor_mouse_state = EditorMouseState { + let editor_mouse_state = EditorPointerState { editor_position: (4., 809.).into(), mouse_keys: MouseKeys::default(), scroll_delta: ScrollDelta::default(), @@ -216,7 +216,7 @@ mod test { fn process_action_mouse_down_handle_modifier_keys() { let mut input_preprocessor = InputPreprocessorMessageHandler::default(); - let editor_mouse_state = EditorMouseState::default(); + let editor_mouse_state = EditorPointerState::default(); let modifier_keys = ModifierKeys::CONTROL; let message = InputPreprocessorMessage::PointerDown { editor_mouse_state, modifier_keys }; @@ -235,7 +235,7 @@ mod test { fn process_action_mouse_up_handle_modifier_keys() { let mut input_preprocessor = InputPreprocessorMessageHandler::default(); - let editor_mouse_state = EditorMouseState::default(); + let editor_mouse_state = EditorPointerState::default(); let modifier_keys = ModifierKeys::SHIFT; let message = InputPreprocessorMessage::PointerUp { editor_mouse_state, modifier_keys }; diff --git a/editor/src/messages/layout/layout_message_handler.rs b/editor/src/messages/layout/layout_message_handler.rs index a1e395374f..0f5fae18f7 100644 --- a/editor/src/messages/layout/layout_message_handler.rs +++ b/editor/src/messages/layout/layout_message_handler.rs @@ -1,4 +1,4 @@ -use crate::messages::input_mapper::utility_types::input_keyboard::KeysGroup; +use crate::messages::input_mapper::utility_types::keyboard::KeysGroup; use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::portfolio::document::node_graph::document_node_definitions::DefinitionIdentifier; use crate::messages::prelude::*; diff --git a/editor/src/messages/layout/utility_types/layout_widget.rs b/editor/src/messages/layout/utility_types/layout_widget.rs index 76e2a18c5e..80d79c63bd 100644 --- a/editor/src/messages/layout/utility_types/layout_widget.rs +++ b/editor/src/messages/layout/utility_types/layout_widget.rs @@ -2,7 +2,7 @@ use super::widgets::button_widgets::*; use super::widgets::input_widgets::*; use super::widgets::label_widgets::*; use crate::application::generate_uuid; -use crate::messages::input_mapper::utility_types::input_keyboard::KeysGroup; +use crate::messages::input_mapper::utility_types::keyboard::KeysGroup; use crate::messages::prelude::*; use std::collections::HashMap; use std::collections::hash_map::DefaultHasher; diff --git a/editor/src/messages/portfolio/document/document_message.rs b/editor/src/messages/portfolio/document/document_message.rs index f6807909af..1f9675b399 100644 --- a/editor/src/messages/portfolio/document/document_message.rs +++ b/editor/src/messages/portfolio/document/document_message.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; use std::sync::Arc; use super::utility_types::misc::{GroupFolderType, SnappingState}; -use crate::messages::input_mapper::utility_types::input_keyboard::Key; +use crate::messages::input_mapper::utility_types::keyboard::Key; use crate::messages::portfolio::document::data_panel::DataPanelMessage; use crate::messages::portfolio::document::overlays::utility_types::{OverlayContext, OverlaysType}; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; diff --git a/editor/src/messages/portfolio/document/navigation/navigation_message.rs b/editor/src/messages/portfolio/document/navigation/navigation_message.rs index a55f8dbef4..a9e7179a0f 100644 --- a/editor/src/messages/portfolio/document/navigation/navigation_message.rs +++ b/editor/src/messages/portfolio/document/navigation/navigation_message.rs @@ -1,4 +1,4 @@ -use crate::messages::input_mapper::utility_types::input_keyboard::Key; +use crate::messages::input_mapper::utility_types::keyboard::Key; use crate::messages::prelude::*; use glam::DVec2; diff --git a/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs b/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs index a319cc0e57..5f56cde2ac 100644 --- a/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs +++ b/editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs @@ -4,8 +4,8 @@ use crate::consts::{ VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR, }; use crate::messages::frontend::utility_types::MouseCursorIcon; -use crate::messages::input_mapper::utility_types::input_keyboard::{Key, MouseMotion}; -use crate::messages::input_mapper::utility_types::input_mouse::ViewportPosition; +use crate::messages::input_mapper::utility_types::keyboard::{Key, MouseMotion}; +use crate::messages::input_mapper::utility_types::pointer::ViewportPosition; use crate::messages::portfolio::document::navigation::utility_types::NavigationOperation; use crate::messages::portfolio::document::utility_types::misc::PTZ; use crate::messages::portfolio::document::utility_types::network_interface::NodeNetworkInterface; diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message.rs index 011065fd78..b7d5ed7e06 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message.rs @@ -1,5 +1,5 @@ use super::utility_types::Direction; -use crate::messages::input_mapper::utility_types::input_keyboard::Key; +use crate::messages::input_mapper::utility_types::keyboard::Key; use crate::messages::portfolio::document::node_graph::document_node_definitions::DefinitionIdentifier; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use crate::messages::portfolio::document::utility_types::network_interface::{ImportOrExport, InputConnector, NodeTemplate, OutputConnector}; diff --git a/editor/src/messages/portfolio/document/utility_types/transformation.rs b/editor/src/messages/portfolio/document/utility_types/transformation.rs index bf6068afce..9e28e615a5 100644 --- a/editor/src/messages/portfolio/document/utility_types/transformation.rs +++ b/editor/src/messages/portfolio/document/utility_types/transformation.rs @@ -392,7 +392,7 @@ impl TransformOperation { } pub fn hints(&self, responses: &mut VecDeque, local: bool) { - use crate::messages::input_mapper::utility_types::input_keyboard::{Key, MouseMotion}; + use crate::messages::input_mapper::utility_types::keyboard::{Key, MouseMotion}; use crate::messages::tool::utility_types::{HintData, HintGroup, HintInfo}; let mut input_hints = Vec::new(); diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 5dbd6fb55c..1bab829d35 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -6,7 +6,7 @@ use crate::consts::{DEFAULT_DOCUMENT_NAME, FILE_EXTENSION, GDD_FILE_EXTENSION}; use crate::messages::animation::TimingInformation; use crate::messages::dialog::simple_dialogs; use crate::messages::frontend::utility_types::{DocumentInfo, PersistedState}; -use crate::messages::input_mapper::utility_types::input_keyboard::Key; +use crate::messages::input_mapper::utility_types::keyboard::Key; use crate::messages::input_mapper::utility_types::macros::{action_shortcut, action_shortcut_manual}; use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::portfolio::document::DocumentMessageContext; diff --git a/editor/src/messages/tool/common_functionality/resize.rs b/editor/src/messages/tool/common_functionality/resize.rs index 474d774cde..bbd9aa9ddb 100644 --- a/editor/src/messages/tool/common_functionality/resize.rs +++ b/editor/src/messages/tool/common_functionality/resize.rs @@ -1,4 +1,4 @@ -use crate::messages::input_mapper::utility_types::input_keyboard::Key; +use crate::messages::input_mapper::utility_types::keyboard::Key; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use crate::messages::prelude::*; diff --git a/editor/src/messages/tool/tool_messages/freehand_tool.rs b/editor/src/messages/tool/tool_messages/freehand_tool.rs index a58ae056f4..5beb9ac2b3 100644 --- a/editor/src/messages/tool/tool_messages/freehand_tool.rs +++ b/editor/src/messages/tool/tool_messages/freehand_tool.rs @@ -420,7 +420,7 @@ fn extend_path_with_next_segment(tool_data: &mut FreehandToolData, position: DVe #[cfg(test)] mod test_freehand { - use crate::messages::input_mapper::utility_types::input_mouse::{EditorMouseState, MouseKeys, ScrollDelta}; + use crate::messages::input_mapper::utility_types::pointer::{EditorPointerState, MouseKeys, ScrollDelta}; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::tool::common_functionality::graph_modification_utils::{NodeGraphLayer, get_stroke_width}; use crate::messages::tool::common_functionality::stroke_options::StrokeOptionsUpdate; @@ -528,7 +528,7 @@ mod test_freehand { let last_initial_point = initial_points[initial_points.len() - 1]; editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: last_initial_point, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -587,7 +587,7 @@ mod test_freehand { let last_extension_point = extension_points[extension_points.len() - 1]; editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: last_extension_point, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -641,7 +641,7 @@ mod test_freehand { let last_initial_point = initial_points[initial_points.len() - 1]; editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: last_initial_point, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -676,7 +676,7 @@ mod test_freehand { editor .mousedown( - EditorMouseState { + EditorPointerState { editor_position: first_second_point, mouse_keys: MouseKeys::LEFT, scroll_delta: ScrollDelta::default(), @@ -692,7 +692,7 @@ mod test_freehand { let last_second_point = second_path_points[second_path_points.len() - 1]; editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: last_second_point, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -765,7 +765,7 @@ mod test_freehand { let last_point = points[points.len() - 1]; editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: last_point, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index 940d7e6552..33e5b3730f 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -2002,8 +2002,8 @@ enum GradientDragHintState { #[cfg(test)] mod test_gradient { - use crate::messages::input_mapper::utility_types::input_mouse::EditorMouseState; - use crate::messages::input_mapper::utility_types::input_mouse::ScrollDelta; + use crate::messages::input_mapper::utility_types::pointer::EditorPointerState; + use crate::messages::input_mapper::utility_types::pointer::ScrollDelta; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::portfolio::document::utility_types::misc::GroupFolderType; use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, OutputConnector}; @@ -2395,7 +2395,7 @@ mod test_gradient { editor.move_mouse(end_pos.x, end_pos.y, ModifierKeys::empty(), MouseKeys::LEFT).await; editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: end_pos, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -2449,7 +2449,7 @@ mod test_gradient { let click_position = DVec2::new(25., 0.); editor .mousedown( - EditorMouseState { + EditorPointerState { editor_position: click_position, mouse_keys: MouseKeys::LEFT, scroll_delta: ScrollDelta::default(), @@ -2463,7 +2463,7 @@ mod test_gradient { editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: drag_position, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -2528,7 +2528,7 @@ mod test_gradient { editor.left_mousedown(position2.x, position2.y, ModifierKeys::empty()).await; editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: position2, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -2693,7 +2693,7 @@ mod test_gradient { editor.move_mouse(new_viewport_end.x, new_viewport_end.y, ModifierKeys::empty(), MouseKeys::LEFT).await; editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: new_viewport_end, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -2770,7 +2770,7 @@ mod test_gradient { editor.move_mouse(new_viewport_end.x, new_viewport_end.y, ModifierKeys::empty(), MouseKeys::LEFT).await; editor .mouseup( - EditorMouseState { + EditorPointerState { editor_position: new_viewport_end, mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), diff --git a/editor/src/messages/tool/tool_messages/mod.rs b/editor/src/messages/tool/tool_messages/mod.rs index 6d29ad81a9..bbe0d2adf7 100644 --- a/editor/src/messages/tool/tool_messages/mod.rs +++ b/editor/src/messages/tool/tool_messages/mod.rs @@ -14,7 +14,7 @@ pub mod text_tool; pub mod tool_prelude { pub use crate::messages::frontend::utility_types::MouseCursorIcon; - pub use crate::messages::input_mapper::utility_types::input_keyboard::{Key, MouseMotion}; + pub use crate::messages::input_mapper::utility_types::keyboard::{Key, MouseMotion}; pub use crate::messages::layout::utility_types::widget_prelude::*; pub use crate::messages::prelude::*; pub use crate::messages::tool::utility_types::{EventToMessageMap, Fsm, ToolActionMessageContext, ToolMetadata, ToolTransition, ToolType}; diff --git a/editor/src/messages/tool/tool_messages/pen_tool.rs b/editor/src/messages/tool/tool_messages/pen_tool.rs index 32810017a3..883f35089d 100644 --- a/editor/src/messages/tool/tool_messages/pen_tool.rs +++ b/editor/src/messages/tool/tool_messages/pen_tool.rs @@ -1,6 +1,6 @@ use super::tool_prelude::*; use crate::consts::{COLOR_OVERLAY_BLUE, COLOR_OVERLAY_BLUE_05, HIDE_HANDLE_DISTANCE, LINE_ROTATE_SNAP_ANGLE, SEGMENT_OVERLAY_SIZE}; -use crate::messages::input_mapper::utility_types::input_mouse::MouseKeys; +use crate::messages::input_mapper::utility_types::pointer::MouseKeys; use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_network_node_type; use crate::messages::portfolio::document::overlays::utility_functions::path_overlays; use crate::messages::portfolio::document::overlays::utility_types::{DrawHandles, OverlayContext}; diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index d559a595b2..96cf368847 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -2,7 +2,7 @@ use super::tool_prelude::*; use crate::consts::*; -use crate::messages::input_mapper::utility_types::input_mouse::ViewportPosition; +use crate::messages::input_mapper::utility_types::pointer::ViewportPosition; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; use crate::messages::portfolio::document::utility_types::document_metadata::{DocumentMetadata, LayerNodeIdentifier}; diff --git a/editor/src/messages/tool/tool_messages/spline_tool.rs b/editor/src/messages/tool/tool_messages/spline_tool.rs index 28d5c815b0..7cfe98a458 100644 --- a/editor/src/messages/tool/tool_messages/spline_tool.rs +++ b/editor/src/messages/tool/tool_messages/spline_tool.rs @@ -1,6 +1,6 @@ use super::tool_prelude::*; use crate::consts::{DRAG_THRESHOLD, PATH_JOIN_THRESHOLD, SNAP_POINT_TOLERANCE}; -use crate::messages::input_mapper::utility_types::input_mouse::MouseKeys; +use crate::messages::input_mapper::utility_types::pointer::MouseKeys; use crate::messages::portfolio::document::node_graph::document_node_definitions::{resolve_network_node_type, resolve_proto_node_type}; use crate::messages::portfolio::document::overlays::utility_functions::path_endpoint_overlays; use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; diff --git a/editor/src/messages/tool/transform_layer/transform_layer_message.rs b/editor/src/messages/tool/transform_layer/transform_layer_message.rs index 4922db713a..76f33718cf 100644 --- a/editor/src/messages/tool/transform_layer/transform_layer_message.rs +++ b/editor/src/messages/tool/transform_layer/transform_layer_message.rs @@ -1,4 +1,4 @@ -use crate::messages::input_mapper::utility_types::input_keyboard::Key; +use crate::messages::input_mapper::utility_types::keyboard::Key; use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; use crate::messages::portfolio::document::utility_types::transformation::TransformType; use crate::messages::prelude::*; diff --git a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs index d489c95377..34e7626661 100644 --- a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs +++ b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs @@ -1,5 +1,5 @@ use crate::consts::{ANGLE_MEASURE_RADIUS_FACTOR, ARC_MEASURE_RADIUS_FACTOR_RANGE, COLOR_OVERLAY_BLUE, COLOR_OVERLAY_GRAY, SLOWING_DIVISOR}; -use crate::messages::input_mapper::utility_types::input_mouse::{DocumentPosition, ViewportPosition}; +use crate::messages::input_mapper::utility_types::pointer::{DocumentPosition, ViewportPosition}; use crate::messages::portfolio::document::overlays::utility_functions::text_width; use crate::messages::portfolio::document::overlays::utility_types::{OverlayProvider, Pivot}; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; diff --git a/editor/src/messages/tool/utility_types.rs b/editor/src/messages/tool/utility_types.rs index 6fbb206d8b..668e9ae02a 100644 --- a/editor/src/messages/tool/utility_types.rs +++ b/editor/src/messages/tool/utility_types.rs @@ -4,7 +4,7 @@ use super::common_functionality::shape_editor::ShapeState; use super::tool_messages::*; use crate::messages::broadcast::BroadcastMessage; use crate::messages::broadcast::event::EventMessage; -use crate::messages::input_mapper::utility_types::input_keyboard::{Key, KeysGroup, LabeledKeyOrMouseMotion, LabeledShortcut, MouseMotion}; +use crate::messages::input_mapper::utility_types::keyboard::{Key, KeysGroup, LabeledKeyOrMouseMotion, LabeledShortcut, MouseMotion}; use crate::messages::input_mapper::utility_types::macros::action_shortcut; use crate::messages::input_mapper::utility_types::misc::ActionShortcut; use crate::messages::layout::utility_types::widget_prelude::*; diff --git a/editor/src/test_utils.rs b/editor/src/test_utils.rs index 84f67f0418..b0fd5a31fa 100644 --- a/editor/src/test_utils.rs +++ b/editor/src/test_utils.rs @@ -1,6 +1,6 @@ use crate::application::Editor; -use crate::messages::input_mapper::utility_types::input_keyboard::ModifierKeys; -use crate::messages::input_mapper::utility_types::input_mouse::{EditorMouseState, MouseKeys, ScrollDelta, ViewportPosition}; +use crate::messages::input_mapper::utility_types::keyboard::ModifierKeys; +use crate::messages::input_mapper::utility_types::pointer::{EditorPointerState, MouseKeys, ScrollDelta, ViewportPosition}; use crate::messages::portfolio::document::node_graph::document_node_definitions::DefinitionIdentifier; use crate::messages::prelude::*; use crate::messages::tool::tool_messages::tool_prelude::Key; @@ -103,7 +103,7 @@ impl EditorTestUtils { self.move_mouse(position.x, position.y, modifier_keys, MouseKeys::empty()).await; self.mousedown( - EditorMouseState { + EditorPointerState { editor_position: position, mouse_keys: button, ..Default::default() @@ -113,7 +113,7 @@ impl EditorTestUtils { .await; self.mouseup( - EditorMouseState { + EditorPointerState { editor_position: position, ..Default::default() }, @@ -132,7 +132,7 @@ impl EditorTestUtils { self.move_mouse(x2, y2, modifier_keys, MouseKeys::LEFT).await; self.mouseup( - EditorMouseState { + EditorPointerState { editor_position: (x2, y2).into(), mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -152,7 +152,7 @@ impl EditorTestUtils { self.move_mouse(100., 100., ModifierKeys::default(), MouseKeys::LEFT).await; self.mousedown( - EditorMouseState { + EditorPointerState { editor_position: (100., 100.).into(), mouse_keys: MouseKeys::LEFT | MouseKeys::RIGHT, scroll_delta: ScrollDelta::default(), @@ -180,7 +180,7 @@ impl EditorTestUtils { } pub async fn move_mouse(&mut self, x: f64, y: f64, modifier_keys: ModifierKeys, mouse_keys: MouseKeys) { - let editor_mouse_state = EditorMouseState { + let editor_mouse_state = EditorPointerState { editor_position: ViewportPosition::new(x, y), mouse_keys, ..Default::default() @@ -188,11 +188,11 @@ impl EditorTestUtils { self.input(InputPreprocessorMessage::PointerMove { editor_mouse_state, modifier_keys }).await; } - pub async fn mousedown(&mut self, editor_mouse_state: EditorMouseState, modifier_keys: ModifierKeys) { + pub async fn mousedown(&mut self, editor_mouse_state: EditorPointerState, modifier_keys: ModifierKeys) { self.input(InputPreprocessorMessage::PointerDown { editor_mouse_state, modifier_keys }).await; } - pub async fn mouseup(&mut self, editor_mouse_state: EditorMouseState, modifier_keys: ModifierKeys) { + pub async fn mouseup(&mut self, editor_mouse_state: EditorPointerState, modifier_keys: ModifierKeys) { self.handle_message(InputPreprocessorMessage::PointerUp { editor_mouse_state, modifier_keys }).await; } @@ -205,7 +205,7 @@ impl EditorTestUtils { pub async fn left_mousedown(&mut self, x: f64, y: f64, modifier_keys: ModifierKeys) { self.mousedown( - EditorMouseState { + EditorPointerState { editor_position: (x, y).into(), mouse_keys: MouseKeys::LEFT, scroll_delta: ScrollDelta::default(), @@ -217,7 +217,7 @@ impl EditorTestUtils { pub async fn left_mouseup(&mut self, x: f64, y: f64, modifier_keys: ModifierKeys) { self.mouseup( - EditorMouseState { + EditorPointerState { editor_position: (x, y).into(), mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -273,7 +273,7 @@ impl EditorTestUtils { pub async fn double_click(&mut self, position: DVec2) { self.handle_message(InputPreprocessorMessage::DoubleClick { - editor_mouse_state: EditorMouseState { + editor_mouse_state: EditorPointerState { editor_position: position, mouse_keys: MouseKeys::LEFT, scroll_delta: ScrollDelta::default(), @@ -297,7 +297,7 @@ impl EditorTestUtils { } self.mouseup( - EditorMouseState { + EditorPointerState { editor_position: points[points.len() - 1], mouse_keys: MouseKeys::empty(), scroll_delta: ScrollDelta::default(), @@ -351,8 +351,8 @@ pub mod test_prelude { pub use crate::application::Editor; pub use crate::float_eq; pub use crate::messages::clipboard::utility_types::ClipboardContentRaw; - pub use crate::messages::input_mapper::utility_types::input_keyboard::{Key, ModifierKeys}; - pub use crate::messages::input_mapper::utility_types::input_mouse::MouseKeys; + pub use crate::messages::input_mapper::utility_types::keyboard::{Key, ModifierKeys}; + pub use crate::messages::input_mapper::utility_types::pointer::MouseKeys; pub use crate::messages::portfolio::document::node_graph::document_node_definitions::DefinitionIdentifier; pub use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; pub use crate::messages::prelude::*; diff --git a/frontend/wrapper/src/editor_commands.rs b/frontend/wrapper/src/editor_commands.rs index ad923e7594..e725cbffd0 100644 --- a/frontend/wrapper/src/editor_commands.rs +++ b/frontend/wrapper/src/editor_commands.rs @@ -15,8 +15,8 @@ use wasm_bindgen::prelude::*; mod editor_commands { use crate::helpers::translate_key; use editor::messages::clipboard::utility_types::ClipboardContentRaw; - use editor::messages::input_mapper::utility_types::input_keyboard::ModifierKeys; - use editor::messages::input_mapper::utility_types::input_mouse::{EditorMouseState, ScrollDelta}; + use editor::messages::input_mapper::utility_types::keyboard::ModifierKeys; + use editor::messages::input_mapper::utility_types::pointer::{EditorPointerState, ScrollDelta}; use editor::messages::portfolio::document::node_graph::document_node_definitions::DefinitionIdentifier; use editor::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use editor::messages::portfolio::document::utility_types::network_interface::ImportOrExport; @@ -300,14 +300,14 @@ mod editor_commands { /// Mouse movement within the screenspace bounds of the viewport fn on_mouse_move(x: f64, y: f64, mouse_keys: u8, modifiers: u8) -> Message { - let editor_mouse_state = EditorMouseState::from_keys_and_editor_position(mouse_keys, (x, y).into()); + let editor_mouse_state = EditorPointerState::from_keys_and_editor_position(mouse_keys, (x, y).into()); let modifier_keys = ModifierKeys::from_bits(modifiers).expect("Invalid modifier keys"); InputPreprocessorMessage::PointerMove { editor_mouse_state, modifier_keys }.into() } /// Mouse scrolling within the screenspace bounds of the viewport fn on_wheel_scroll(x: f64, y: f64, mouse_keys: u8, wheel_delta_x: f64, wheel_delta_y: f64, wheel_delta_z: f64, modifiers: u8) -> Message { - let mut editor_mouse_state = EditorMouseState::from_keys_and_editor_position(mouse_keys, (x, y).into()); + let mut editor_mouse_state = EditorPointerState::from_keys_and_editor_position(mouse_keys, (x, y).into()); editor_mouse_state.scroll_delta = ScrollDelta::new(wheel_delta_x, wheel_delta_y, wheel_delta_z); let modifier_keys = ModifierKeys::from_bits(modifiers).expect("Invalid modifier keys"); InputPreprocessorMessage::WheelScroll { editor_mouse_state, modifier_keys }.into() @@ -315,28 +315,28 @@ mod editor_commands { /// A mouse button depressed within screenspace the bounds of the viewport fn on_mouse_down(x: f64, y: f64, mouse_keys: u8, modifiers: u8) -> Message { - let editor_mouse_state = EditorMouseState::from_keys_and_editor_position(mouse_keys, (x, y).into()); + let editor_mouse_state = EditorPointerState::from_keys_and_editor_position(mouse_keys, (x, y).into()); let modifier_keys = ModifierKeys::from_bits(modifiers).expect("Invalid modifier keys"); InputPreprocessorMessage::PointerDown { editor_mouse_state, modifier_keys }.into() } /// A mouse button released fn on_mouse_up(x: f64, y: f64, mouse_keys: u8, modifiers: u8) -> Message { - let editor_mouse_state = EditorMouseState::from_keys_and_editor_position(mouse_keys, (x, y).into()); + let editor_mouse_state = EditorPointerState::from_keys_and_editor_position(mouse_keys, (x, y).into()); let modifier_keys = ModifierKeys::from_bits(modifiers).expect("Invalid modifier keys"); InputPreprocessorMessage::PointerUp { editor_mouse_state, modifier_keys }.into() } /// Mouse shaken fn on_mouse_shake(x: f64, y: f64, mouse_keys: u8, modifiers: u8) -> Message { - let editor_mouse_state = EditorMouseState::from_keys_and_editor_position(mouse_keys, (x, y).into()); + let editor_mouse_state = EditorPointerState::from_keys_and_editor_position(mouse_keys, (x, y).into()); let modifier_keys = ModifierKeys::from_bits(modifiers).expect("Invalid modifier keys"); InputPreprocessorMessage::PointerShake { editor_mouse_state, modifier_keys }.into() } /// Mouse double clicked fn on_double_click(x: f64, y: f64, mouse_keys: u8, modifiers: u8) -> Message { - let editor_mouse_state = EditorMouseState::from_keys_and_editor_position(mouse_keys, (x, y).into()); + let editor_mouse_state = EditorPointerState::from_keys_and_editor_position(mouse_keys, (x, y).into()); let modifier_keys = ModifierKeys::from_bits(modifiers).expect("Invalid modifier keys"); InputPreprocessorMessage::DoubleClick { editor_mouse_state, modifier_keys }.into() } diff --git a/frontend/wrapper/src/helpers.rs b/frontend/wrapper/src/helpers.rs index 1296bd3934..a808874e9e 100644 --- a/frontend/wrapper/src/helpers.rs +++ b/frontend/wrapper/src/helpers.rs @@ -8,7 +8,7 @@ use crate::native_communication::RasterizedImage; #[cfg(not(feature = "native"))] use editor::application::Editor; #[cfg(feature = "editor")] -use editor::messages::input_mapper::utility_types::input_keyboard::Key; +use editor::messages::input_mapper::utility_types::keyboard::Key; #[cfg(not(feature = "native"))] use editor::messages::prelude::*; use js_sys::{Object, Reflect}; From a3708c2f651c633affc1a235f8c8ffdaebe36486 Mon Sep 17 00:00:00 2001 From: Timon Date: Sun, 19 Jul 2026 19:28:09 +0000 Subject: [PATCH 2/8] Add optional pen attributes to the editor pointer state types --- .../input_mapper/utility_types/pointer.rs | 25 ++++++++++++++++++- .../input_preprocessor_message_handler.rs | 5 ++-- .../tool/tool_messages/freehand_tool.rs | 14 +++++------ .../tool/tool_messages/gradient_tool.rs | 13 +++++----- editor/src/test_utils.rs | 14 +++++------ 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/editor/src/messages/input_mapper/utility_types/pointer.rs b/editor/src/messages/input_mapper/utility_types/pointer.rs index 8a286fb5ba..dd89c86119 100644 --- a/editor/src/messages/input_mapper/utility_types/pointer.rs +++ b/editor/src/messages/input_mapper/utility_types/pointer.rs @@ -56,6 +56,15 @@ pub struct PointerState { pub position: ViewportPosition, pub mouse_keys: MouseKeys, pub scroll_delta: ScrollDelta, + /// Force against the surface, 0 through 1. + pub pressure: Option, + /// Angle from the surface normal, in degrees per axis. + pub tilt: Option, + /// Clockwise rotation around the pen's own axis, in degrees. + pub twist: Option, + /// Barrel wheel (tangential) pressure, -1 through 1. + pub wheel: Option, + pub eraser: bool, } impl PointerState { @@ -72,6 +81,15 @@ pub struct EditorPointerState { pub editor_position: EditorPosition, pub mouse_keys: MouseKeys, pub scroll_delta: ScrollDelta, + /// Force against the surface, 0 through 1. + pub pressure: Option, + /// Angle from the surface normal, in degrees per axis. + pub tilt: Option, + /// Clockwise rotation around the pen's own axis, in degrees. + pub twist: Option, + /// Barrel wheel (tangential) pressure, -1 through 1. + pub wheel: Option, + pub eraser: bool, } impl EditorPointerState { @@ -82,7 +100,7 @@ impl EditorPointerState { Self { editor_position, mouse_keys, - scroll_delta: ScrollDelta::default(), + ..Default::default() } } @@ -91,6 +109,11 @@ impl EditorPointerState { position: (viewport.logical(self.editor_position) - viewport.offset()).into(), mouse_keys: self.mouse_keys, scroll_delta: self.scroll_delta, + pressure: self.pressure, + tilt: self.tilt, + twist: self.twist, + wheel: self.wheel, + eraser: self.eraser, } } } diff --git a/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs b/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs index 6984d8c83b..fc36023cc5 100644 --- a/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs +++ b/editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs @@ -186,7 +186,7 @@ impl InputPreprocessorMessageHandler { #[cfg(test)] mod test { use crate::messages::input_mapper::utility_types::keyboard::{Key, ModifierKeys}; - use crate::messages::input_mapper::utility_types::pointer::{EditorPointerState, MouseKeys, ScrollDelta}; + use crate::messages::input_mapper::utility_types::pointer::EditorPointerState; use crate::messages::prelude::*; #[test] @@ -195,8 +195,7 @@ mod test { let editor_mouse_state = EditorPointerState { editor_position: (4., 809.).into(), - mouse_keys: MouseKeys::default(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }; let modifier_keys = ModifierKeys::ALT; let message = InputPreprocessorMessage::PointerMove { editor_mouse_state, modifier_keys }; diff --git a/editor/src/messages/tool/tool_messages/freehand_tool.rs b/editor/src/messages/tool/tool_messages/freehand_tool.rs index 5beb9ac2b3..ef9017607e 100644 --- a/editor/src/messages/tool/tool_messages/freehand_tool.rs +++ b/editor/src/messages/tool/tool_messages/freehand_tool.rs @@ -420,7 +420,7 @@ fn extend_path_with_next_segment(tool_data: &mut FreehandToolData, position: DVe #[cfg(test)] mod test_freehand { - use crate::messages::input_mapper::utility_types::pointer::{EditorPointerState, MouseKeys, ScrollDelta}; + use crate::messages::input_mapper::utility_types::pointer::{EditorPointerState, MouseKeys}; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::tool::common_functionality::graph_modification_utils::{NodeGraphLayer, get_stroke_width}; use crate::messages::tool::common_functionality::stroke_options::StrokeOptionsUpdate; @@ -531,7 +531,7 @@ mod test_freehand { EditorPointerState { editor_position: last_initial_point, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) @@ -590,7 +590,7 @@ mod test_freehand { EditorPointerState { editor_position: last_extension_point, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) @@ -644,7 +644,7 @@ mod test_freehand { EditorPointerState { editor_position: last_initial_point, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) @@ -679,7 +679,7 @@ mod test_freehand { EditorPointerState { editor_position: first_second_point, mouse_keys: MouseKeys::LEFT, - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::SHIFT, ) @@ -695,7 +695,7 @@ mod test_freehand { EditorPointerState { editor_position: last_second_point, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::SHIFT, ) @@ -768,7 +768,7 @@ mod test_freehand { EditorPointerState { editor_position: last_point, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index 33e5b3730f..864451b364 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -2003,7 +2003,6 @@ enum GradientDragHintState { #[cfg(test)] mod test_gradient { use crate::messages::input_mapper::utility_types::pointer::EditorPointerState; - use crate::messages::input_mapper::utility_types::pointer::ScrollDelta; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::portfolio::document::utility_types::misc::GroupFolderType; use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, OutputConnector}; @@ -2398,7 +2397,7 @@ mod test_gradient { EditorPointerState { editor_position: end_pos, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) @@ -2452,7 +2451,7 @@ mod test_gradient { EditorPointerState { editor_position: click_position, mouse_keys: MouseKeys::LEFT, - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) @@ -2466,7 +2465,7 @@ mod test_gradient { EditorPointerState { editor_position: drag_position, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) @@ -2531,7 +2530,7 @@ mod test_gradient { EditorPointerState { editor_position: position2, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) @@ -2696,7 +2695,7 @@ mod test_gradient { EditorPointerState { editor_position: new_viewport_end, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) @@ -2773,7 +2772,7 @@ mod test_gradient { EditorPointerState { editor_position: new_viewport_end, mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::empty(), ) diff --git a/editor/src/test_utils.rs b/editor/src/test_utils.rs index b0fd5a31fa..d95c6351b0 100644 --- a/editor/src/test_utils.rs +++ b/editor/src/test_utils.rs @@ -1,6 +1,6 @@ use crate::application::Editor; use crate::messages::input_mapper::utility_types::keyboard::ModifierKeys; -use crate::messages::input_mapper::utility_types::pointer::{EditorPointerState, MouseKeys, ScrollDelta, ViewportPosition}; +use crate::messages::input_mapper::utility_types::pointer::{EditorPointerState, MouseKeys, ViewportPosition}; use crate::messages::portfolio::document::node_graph::document_node_definitions::DefinitionIdentifier; use crate::messages::prelude::*; use crate::messages::tool::tool_messages::tool_prelude::Key; @@ -135,7 +135,7 @@ impl EditorTestUtils { EditorPointerState { editor_position: (x2, y2).into(), mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, modifier_keys, ) @@ -155,7 +155,7 @@ impl EditorTestUtils { EditorPointerState { editor_position: (100., 100.).into(), mouse_keys: MouseKeys::LEFT | MouseKeys::RIGHT, - scroll_delta: ScrollDelta::default(), + ..Default::default() }, ModifierKeys::default(), ) @@ -208,7 +208,7 @@ impl EditorTestUtils { EditorPointerState { editor_position: (x, y).into(), mouse_keys: MouseKeys::LEFT, - scroll_delta: ScrollDelta::default(), + ..Default::default() }, modifier_keys, ) @@ -220,7 +220,7 @@ impl EditorTestUtils { EditorPointerState { editor_position: (x, y).into(), mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, modifier_keys, ) @@ -276,7 +276,7 @@ impl EditorTestUtils { editor_mouse_state: EditorPointerState { editor_position: position, mouse_keys: MouseKeys::LEFT, - scroll_delta: ScrollDelta::default(), + ..Default::default() }, modifier_keys: ModifierKeys::empty(), }) @@ -300,7 +300,7 @@ impl EditorTestUtils { EditorPointerState { editor_position: points[points.len() - 1], mouse_keys: MouseKeys::empty(), - scroll_delta: ScrollDelta::default(), + ..Default::default() }, modifier_keys, ) From bc8b59ab478abb5e982696d21e783de8b7f030c5 Mon Sep 17 00:00:00 2001 From: Timon Date: Sun, 19 Jul 2026 19:29:04 +0000 Subject: [PATCH 3/8] Desktop: Send tablet pointer clicks to CEF as mouse clicks --- desktop/ui/src/input.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/desktop/ui/src/input.rs b/desktop/ui/src/input.rs index a98b72cc48..a583ca3520 100644 --- a/desktop/ui/src/input.rs +++ b/desktop/ui/src/input.rs @@ -82,14 +82,15 @@ pub(crate) fn translate(input_state: &mut InputState, event: &WindowEvent) -> Ve } WindowEvent::PointerButton { state, button, position, .. } => { let mouse_button = match button { - ButtonSource::Mouse(mouse_button) => mouse_button, + ButtonSource::Mouse(mouse_button) => *mouse_button, + ButtonSource::TabletTool { button, .. } => (*button).into(), _ => { return Vec::new(); // TODO: Handle touch input } }; let _ = input_state.cursor_move(position); - let click_count = input_state.mouse_input(mouse_button, state).into(); + let click_count = input_state.mouse_input(&mouse_button, state).into(); let up = matches!(state, ElementState::Released); let button = match mouse_button { MouseButton::Left => MouseButtonKind::Left, From e1c91779a1e67379b983327f4ac40ef6457073fa Mon Sep 17 00:00:00 2001 From: Timon Date: Sun, 19 Jul 2026 19:30:59 +0000 Subject: [PATCH 4/8] Desktop: End pointer lock and pending window drags on any left-equivalent release --- desktop/src/app.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/desktop/src/app.rs b/desktop/src/app.rs index e11f5f4bc0..e506813a41 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -538,9 +538,10 @@ impl ApplicationHandler for App { if let Some(pointer_lock_position) = self.pointer_lock_position && let WindowEvent::PointerButton { state: ElementState::Released, - button: ButtonSource::Mouse(MouseButton::Left), + button, .. - } = event + } = &event + && button.clone().mouse_button() == MouseButton::Left { self.pointer_lock_position = None; if let Some(window) = &self.window { @@ -651,10 +652,10 @@ impl ApplicationHandler for App { } WindowEvent::PointerButton { - button: ButtonSource::Mouse(MouseButton::Left), + button, state: ElementState::Released, .. - } => { + } if button.clone().mouse_button() == MouseButton::Left => { self.window_pending_drag = false; } From 65ee0e65772dd0c782c15a342d7617e9f9dbde6b Mon Sep 17 00:00:00 2001 From: Timon Date: Sun, 19 Jul 2026 19:46:22 +0000 Subject: [PATCH 5/8] Desktop: Route pointer input carrying pen attributes directly to the editor --- desktop/src/app.rs | 62 ++++++---------- desktop/src/input.rs | 173 +++++++++++++++++++++++++++++++++++++++++++ desktop/src/lib.rs | 1 + 3 files changed, 195 insertions(+), 41 deletions(-) create mode 100644 desktop/src/input.rs diff --git a/desktop/src/app.rs b/desktop/src/app.rs index e506813a41..2936777566 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -10,18 +10,19 @@ use std::thread; use std::time::{Duration, Instant}; use winit::application::ApplicationHandler; use winit::dpi::{PhysicalPosition, PhysicalSize}; -use winit::event::{ButtonSource, ElementState, MouseButton, StartCause, WindowEvent}; +use winit::event::{ElementState, MouseButton, StartCause, WindowEvent}; use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop}; use winit::window::WindowId; use crate::dirs; use crate::event::{AppEvent, AppEventScheduler}; +use crate::input::{InputAction, InputState}; use crate::persist; use crate::preferences; use crate::render::{RenderError, RenderState}; use crate::ui::{UiCommand, UiInstance}; use crate::window::Window; -use crate::wrapper::messages::{DesktopFrontendMessage, DesktopWrapperMessage, InputMessage, MouseKeys, PointerState, Preferences}; +use crate::wrapper::messages::{DesktopFrontendMessage, DesktopWrapperMessage, Preferences}; use crate::wrapper::{DesktopWrapper, MmapResourceStorage, NodeGraphExecutionResult, WgpuContext, serialize_frontend_messages}; pub(crate) struct App { @@ -33,8 +34,8 @@ pub(crate) struct App { window_maximized: bool, window_fullscreen: bool, window_pending_drag: bool, - pointer_position: PhysicalPosition, pointer_lock_position: Option>, + input_state: InputState, ui_scale: f64, app_event_receiver: Receiver, app_event_scheduler: AppEventScheduler, @@ -106,8 +107,8 @@ impl App { window_maximized: false, window_fullscreen: false, window_pending_drag: false, - pointer_position: Default::default(), pointer_lock_position: Default::default(), + input_state: InputState::new(), ui_scale: 1., app_event_receiver, app_event_scheduler, @@ -264,6 +265,8 @@ impl App { }); } DesktopFrontendMessage::UpdateViewportPhysicalBounds { x, y, width, height } => { + self.input_state.set_viewport_info(x, y, width, height, self.window_scale); + if let Some(render_state) = &mut self.render_state && let Some(window) = &self.window { @@ -342,7 +345,8 @@ impl App { } } DesktopFrontendMessage::PointerLock => { - self.pointer_lock_position = Some(self.pointer_position); + self.pointer_lock_position = Some(self.input_state.pointer_position()); + self.input_state.set_pointer_locked(true); if let Some(window) = &self.window { window.start_pointer_lock(); } @@ -544,6 +548,7 @@ impl ApplicationHandler for App { && button.clone().mouse_button() == MouseButton::Left { self.pointer_lock_position = None; + self.input_state.set_pointer_locked(false); if let Some(window) = &self.window { window.end_pointer_lock(); } @@ -555,7 +560,12 @@ impl ApplicationHandler for App { })); } - self.ui.send(UiCommand::Input(event.clone())); + for action in self.input_state.process(&event) { + match action { + InputAction::Ui(event) => self.ui.send(UiCommand::Input(event)), + InputAction::Editor(message) => self.app_event_scheduler.schedule(AppEvent::DesktopWrapperMessage(message)), + } + } match event { WindowEvent::CloseRequested => { @@ -612,42 +622,12 @@ impl ApplicationHandler for App { } } - // Forward and Back buttons are not supported by CEF and thus need to be directly forwarded the editor - WindowEvent::PointerButton { - button: ButtonSource::Mouse(button), - state: ElementState::Pressed, - .. - } => { - let mouse_keys = match button { - MouseButton::Back => Some(MouseKeys::BACK), - MouseButton::Forward => Some(MouseKeys::FORWARD), - _ => None, - }; - if let Some(mouse_keys) = mouse_keys { - let message = DesktopWrapperMessage::Input(InputMessage::PointerDown { - editor_mouse_state: PointerState { mouse_keys, ..Default::default() }, - modifier_keys: Default::default(), - }); - self.app_event_scheduler.schedule(AppEvent::DesktopWrapperMessage(message)); - - let message = DesktopWrapperMessage::Input(InputMessage::PointerUp { - editor_mouse_state: Default::default(), - modifier_keys: Default::default(), - }); - self.app_event_scheduler.schedule(AppEvent::DesktopWrapperMessage(message)); - } - } - - WindowEvent::PointerMoved { position, .. } | WindowEvent::PointerLeft { position: Some(position), .. } | WindowEvent::PointerEntered { position, .. } - if self.pointer_lock_position.is_none() => + WindowEvent::PointerMoved { .. } | WindowEvent::PointerLeft { position: Some(_), .. } | WindowEvent::PointerEntered { .. } + if self.pointer_lock_position.is_none() && self.window_pending_drag => { - self.pointer_position = position; - - if self.window_pending_drag { - self.window_pending_drag = false; - if let Some(window) = &self.window { - window.start_drag(); - } + self.window_pending_drag = false; + if let Some(window) = &self.window { + window.start_drag(); } } diff --git a/desktop/src/input.rs b/desktop/src/input.rs new file mode 100644 index 0000000000..4455701ee2 --- /dev/null +++ b/desktop/src/input.rs @@ -0,0 +1,173 @@ +use winit::dpi::PhysicalPosition; +use winit::event::{ButtonSource, ElementState, MouseButton, PointerSource, TabletToolData, TabletToolKind, WindowEvent}; +use winit::keyboard::ModifiersState; + +use crate::wrapper::messages::{DesktopWrapperMessage, InputMessage, ModifierKeys, MouseKeys, PointerState}; + +pub(crate) struct InputState { + viewport_info: Option, + pointer_locked: bool, + modifier_keys: ModifierKeys, + pointer_position: PhysicalPosition, + pointer_keys: MouseKeys, + ui_capture: bool, +} + +pub(crate) enum InputAction { + Ui(WindowEvent), + Editor(DesktopWrapperMessage), +} + +impl InputAction { + fn editor(message: InputMessage) -> Self { + Self::Editor(DesktopWrapperMessage::Input(message)) + } +} + +impl InputState { + pub(crate) fn new() -> Self { + Self { + viewport_info: None, + pointer_locked: false, + modifier_keys: ModifierKeys::empty(), + pointer_position: PhysicalPosition::default(), + pointer_keys: MouseKeys::empty(), + ui_capture: true, + } + } + + pub(crate) fn set_viewport_info(&mut self, x: f64, y: f64, width: f64, height: f64, scale: f64) { + self.viewport_info = Some(ViewportInfo { x, y, width, height, scale }); + } + + pub(crate) fn set_pointer_locked(&mut self, locked: bool) { + self.pointer_locked = locked; + } + + pub(crate) fn pointer_position(&self) -> PhysicalPosition { + self.pointer_position + } + + pub(crate) fn process(&mut self, event: &WindowEvent) -> Vec { + match event { + WindowEvent::PointerMoved { position, source, .. } => { + self.pointer_position = *position; + + let PointerSource::TabletTool { kind, data } = source else { + return vec![InputAction::Ui(event.clone())]; + }; + let ui_capture = if self.pointer_keys.is_empty() { + self.pointer_locked || !self.in_viewport(*position) + } else { + self.ui_capture + }; + if ui_capture { + return vec![InputAction::Ui(event.clone())]; + } + + vec![InputAction::editor(InputMessage::PointerMove { + editor_mouse_state: self.tablet_pointer_state(kind, data), + modifier_keys: self.modifier_keys, + })] + } + WindowEvent::PointerEntered { position, .. } | WindowEvent::PointerLeft { position: Some(position), .. } => { + self.pointer_position = *position; + vec![InputAction::Ui(event.clone())] + } + WindowEvent::PointerButton { state, button, position, .. } => { + self.pointer_position = *position; + + let tablet = matches!(button, ButtonSource::TabletTool { .. }); + + // Stroke keeps capture decided from first button press until all buttons are released. + if state.is_pressed() && self.pointer_keys.is_empty() { + self.ui_capture = self.pointer_locked || !tablet || !self.in_viewport(*position); + } + + let mouse_button = button.clone().mouse_button(); + let keys = match mouse_button { + MouseButton::Left => MouseKeys::LEFT, + MouseButton::Right => MouseKeys::RIGHT, + MouseButton::Middle => MouseKeys::MIDDLE, + MouseButton::Back => MouseKeys::BACK, + MouseButton::Forward => MouseKeys::FORWARD, + MouseButton::Other(_) => MouseKeys::NONE, + }; + match state { + ElementState::Pressed => self.pointer_keys.insert(keys), + ElementState::Released => self.pointer_keys.remove(keys), + } + + let back_or_forward = matches!(mouse_button, MouseButton::Back | MouseButton::Forward); + if self.pointer_locked || !(back_or_forward || (tablet && !self.ui_capture)) { + return vec![InputAction::Ui(event.clone())]; + } + + let editor_mouse_state = match button { + ButtonSource::TabletTool { kind, data, .. } => self.tablet_pointer_state(kind, data), + _ => self.pointer_state(), + }; + let modifier_keys = self.modifier_keys; + vec![InputAction::editor(match state { + ElementState::Pressed => InputMessage::PointerDown { editor_mouse_state, modifier_keys }, + ElementState::Released => InputMessage::PointerUp { editor_mouse_state, modifier_keys }, + })] + } + WindowEvent::ModifiersChanged(modifiers) => { + self.modifier_keys = to_modifier_keys(modifiers.state()); + vec![InputAction::Ui(event.clone())] + } + _ => vec![InputAction::Ui(event.clone())], + } + } + + fn scale(&self) -> f64 { + self.viewport_info.as_ref().map_or(1., |info| info.scale) + } + + fn in_viewport(&self, position: PhysicalPosition) -> bool { + self.viewport_info.as_ref().is_some_and(|info| info.contains(position)) + } + + fn pointer_state(&self) -> PointerState { + PointerState { + editor_position: (self.pointer_position.x / self.scale(), self.pointer_position.y / self.scale()).into(), + mouse_keys: self.pointer_keys, + ..Default::default() + } + } + + fn tablet_pointer_state(&self, kind: &TabletToolKind, data: &TabletToolData) -> PointerState { + PointerState { + pressure: data.force.map(|force| force.normalized(None)), + tilt: data.clone().tilt().map(|tilt| (f64::from(tilt.x), f64::from(tilt.y)).into()), + twist: data.twist.map(f64::from), + wheel: data.tangential_force.map(f64::from), + eraser: matches!(kind, TabletToolKind::Eraser), + ..self.pointer_state() + } + } +} + +struct ViewportInfo { + x: f64, + y: f64, + width: f64, + height: f64, + scale: f64, +} + +impl ViewportInfo { + fn contains(&self, position: PhysicalPosition) -> bool { + position.x >= self.x && position.y >= self.y && position.x <= self.x + self.width && position.y <= self.y + self.height + } +} + +fn to_modifier_keys(modifiers: ModifiersState) -> ModifierKeys { + let mut keys = ModifierKeys::empty(); + keys.set(ModifierKeys::SHIFT, modifiers.shift_key()); + keys.set(ModifierKeys::CONTROL, modifiers.control_key()); + keys.set(ModifierKeys::ALT, modifiers.alt_key()); + keys.set(ModifierKeys::META_OR_COMMAND, modifiers.meta_key()); + keys +} diff --git a/desktop/src/lib.rs b/desktop/src/lib.rs index c87f70c19f..cfff56cd5b 100644 --- a/desktop/src/lib.rs +++ b/desktop/src/lib.rs @@ -17,6 +17,7 @@ mod cli; mod dirs; mod event; mod gpu_context; +mod input; mod persist; mod preferences; mod render; From 8661e1fb8751b74af8135e5f8c670bd7f02e1745 Mon Sep 17 00:00:00 2001 From: Timon Date: Sun, 19 Jul 2026 19:57:54 +0000 Subject: [PATCH 6/8] Desktop: Route wheel and pinch input inside the viewport directly to the editor --- desktop/src/input.rs | 34 +++++++++++++++++++++++++++++++-- desktop/ui/src/consts.rs | 30 ++++++++++++++--------------- desktop/ui/src/input.rs | 4 ++-- desktop/ui/src/lib.rs | 2 ++ desktop/wrapper/src/messages.rs | 2 +- 5 files changed, 52 insertions(+), 20 deletions(-) diff --git a/desktop/src/input.rs b/desktop/src/input.rs index 4455701ee2..806ca60aaf 100644 --- a/desktop/src/input.rs +++ b/desktop/src/input.rs @@ -1,8 +1,9 @@ use winit::dpi::PhysicalPosition; -use winit::event::{ButtonSource, ElementState, MouseButton, PointerSource, TabletToolData, TabletToolKind, WindowEvent}; +use winit::event::{ButtonSource, ElementState, MouseButton, MouseScrollDelta, PointerSource, TabletToolData, TabletToolKind, WindowEvent}; use winit::keyboard::ModifiersState; -use crate::wrapper::messages::{DesktopWrapperMessage, InputMessage, ModifierKeys, MouseKeys, PointerState}; +use crate::ui::{PINCH_ZOOM_SPEED, SCROLL_LINE_HEIGHT, SCROLL_LINE_WIDTH, SCROLL_SPEED_X, SCROLL_SPEED_Y}; +use crate::wrapper::messages::{DesktopWrapperMessage, InputMessage, ModifierKeys, MouseKeys, PointerState, ScrollDelta}; pub(crate) struct InputState { viewport_info: Option, @@ -113,6 +114,35 @@ impl InputState { ElementState::Released => InputMessage::PointerUp { editor_mouse_state, modifier_keys }, })] } + WindowEvent::MouseWheel { delta, .. } => { + if self.pointer_locked || !self.in_viewport(self.pointer_position) { + return vec![InputAction::Ui(event.clone())]; + } + + let (x, y) = match delta { + MouseScrollDelta::LineDelta(x, y) => (f64::from(*x) * SCROLL_LINE_WIDTH, f64::from(*y) * SCROLL_LINE_HEIGHT), + MouseScrollDelta::PixelDelta(position) => (position.x, position.y), + }; + + let scroll_delta = ScrollDelta::new(-x * SCROLL_SPEED_X, -y * SCROLL_SPEED_Y, 0.); + + vec![InputAction::editor(InputMessage::WheelScroll { + editor_mouse_state: PointerState { scroll_delta, ..self.pointer_state() }, + modifier_keys: self.modifier_keys, + })] + } + WindowEvent::PinchGesture { delta, .. } => { + if self.pointer_locked || !self.in_viewport(self.pointer_position) || !delta.is_normal() { + return vec![InputAction::Ui(event.clone())]; + } + + // TODO: This is a temporary solution to handle pinch gestures, we should handle pinch gestures editor-side instead. + let scroll_delta = ScrollDelta::new(0., -delta * PINCH_ZOOM_SPEED, 0.); + vec![InputAction::editor(InputMessage::WheelScroll { + editor_mouse_state: PointerState { scroll_delta, ..self.pointer_state() }, + modifier_keys: self.modifier_keys | ModifierKeys::CONTROL, + })] + } WindowEvent::ModifiersChanged(modifiers) => { self.modifier_keys = to_modifier_keys(modifiers.state()); vec![InputAction::Ui(event.clone())] diff --git a/desktop/ui/src/consts.rs b/desktop/ui/src/consts.rs index b459466748..852996c421 100644 --- a/desktop/ui/src/consts.rs +++ b/desktop/ui/src/consts.rs @@ -1,5 +1,20 @@ use std::time::Duration; +pub const SCROLL_LINE_HEIGHT: f64 = 40.; +pub const SCROLL_LINE_WIDTH: f64 = 40.; + +#[cfg(target_os = "linux")] +pub const SCROLL_SPEED_X: f64 = 3.; +#[cfg(target_os = "linux")] +pub const SCROLL_SPEED_Y: f64 = 3.; + +#[cfg(not(target_os = "linux"))] +pub const SCROLL_SPEED_X: f64 = 1.; +#[cfg(not(target_os = "linux"))] +pub const SCROLL_SPEED_Y: f64 = 1.; + +pub const PINCH_ZOOM_SPEED: f64 = 300.; + pub(crate) const RESOURCE_SCHEME: &str = "resources"; pub(crate) const RESOURCE_DOMAIN: &str = "resources"; @@ -18,20 +33,5 @@ pub(crate) const HOST_SHUTDOWN_TIMEOUT: Duration = Duration::from_secs(5); #[cfg(target_os = "macos")] pub(crate) const IPC_BOOTSTRAP_PREFIX: &str = "art.graphite.Graphite.ipc."; -pub(crate) const SCROLL_LINE_HEIGHT: usize = 40; -pub(crate) const SCROLL_LINE_WIDTH: usize = 40; - -#[cfg(target_os = "linux")] -pub(crate) const SCROLL_SPEED_X: f32 = 3.; -#[cfg(target_os = "linux")] -pub(crate) const SCROLL_SPEED_Y: f32 = 3.; - -#[cfg(not(target_os = "linux"))] -pub(crate) const SCROLL_SPEED_X: f32 = 1.; -#[cfg(not(target_os = "linux"))] -pub(crate) const SCROLL_SPEED_Y: f32 = 1.; - -pub(crate) const PINCH_ZOOM_SPEED: f64 = 300.; - pub(crate) const MULTICLICK_TIMEOUT: Duration = Duration::from_millis(500); pub(crate) const MULTICLICK_ALLOWED_TRAVEL: usize = 4; diff --git a/desktop/ui/src/input.rs b/desktop/ui/src/input.rs index a583ca3520..799ba9e7db 100644 --- a/desktop/ui/src/input.rs +++ b/desktop/ui/src/input.rs @@ -111,8 +111,8 @@ pub(crate) fn translate(input_state: &mut InputState, event: &WindowEvent) -> Ve MouseScrollDelta::LineDelta(x, y) => (x * SCROLL_LINE_WIDTH as f32, y * SCROLL_LINE_HEIGHT as f32), MouseScrollDelta::PixelDelta(physical_position) => (physical_position.x as f32, physical_position.y as f32), }; - delta_x *= SCROLL_SPEED_X; - delta_y *= SCROLL_SPEED_Y; + delta_x *= SCROLL_SPEED_X as f32; + delta_y *= SCROLL_SPEED_Y as f32; vec![InputEvent::MouseWheel { data: input_state.mouse_data(), diff --git a/desktop/ui/src/lib.rs b/desktop/ui/src/lib.rs index 5b82cd31f1..c9bca99b5f 100644 --- a/desktop/ui/src/lib.rs +++ b/desktop/ui/src/lib.rs @@ -22,6 +22,8 @@ mod resources; mod utility; mod view; +pub use consts::{PINCH_ZOOM_SPEED, SCROLL_LINE_HEIGHT, SCROLL_LINE_WIDTH, SCROLL_SPEED_X, SCROLL_SPEED_Y}; + pub struct UiContext { inner: S::ContextData, } diff --git a/desktop/wrapper/src/messages.rs b/desktop/wrapper/src/messages.rs index 90f62cc007..37abceb9ab 100644 --- a/desktop/wrapper/src/messages.rs +++ b/desktop/wrapper/src/messages.rs @@ -5,7 +5,7 @@ pub(crate) use graphite_editor::messages::prelude::Message as EditorMessage; pub use graphite_editor::messages::frontend::utility_types::{DocumentInfo, PersistedState}; pub use graphite_editor::messages::input_mapper::utility_types::keyboard::{Key, ModifierKeys}; -pub use graphite_editor::messages::input_mapper::utility_types::pointer::{EditorPointerState as PointerState, EditorPosition as Position, MouseKeys}; +pub use graphite_editor::messages::input_mapper::utility_types::pointer::{EditorPointerState as PointerState, EditorPosition as Position, MouseKeys, ScrollDelta}; pub use graphite_editor::messages::prelude::DocumentId; pub use graphite_editor::messages::prelude::InputPreprocessorMessage as InputMessage; pub use graphite_editor::messages::prelude::PreferencesMessageHandler as Preferences; From f0531dce08cef0fd6141e4f8b425a2d0de2a3cf1 Mon Sep 17 00:00:00 2001 From: Timon Date: Sun, 19 Jul 2026 20:03:37 +0000 Subject: [PATCH 7/8] Desktop: Track double clicks on the direct editor route --- desktop/src/input.rs | 43 +++++++++++++++++++++++++++++++++++----- desktop/ui/src/consts.rs | 6 +++--- desktop/ui/src/lib.rs | 2 +- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/desktop/src/input.rs b/desktop/src/input.rs index 806ca60aaf..b639232c5b 100644 --- a/desktop/src/input.rs +++ b/desktop/src/input.rs @@ -1,8 +1,9 @@ +use std::time::Instant; use winit::dpi::PhysicalPosition; use winit::event::{ButtonSource, ElementState, MouseButton, MouseScrollDelta, PointerSource, TabletToolData, TabletToolKind, WindowEvent}; use winit::keyboard::ModifiersState; -use crate::ui::{PINCH_ZOOM_SPEED, SCROLL_LINE_HEIGHT, SCROLL_LINE_WIDTH, SCROLL_SPEED_X, SCROLL_SPEED_Y}; +use crate::ui::{MULTICLICK_ALLOWED_TRAVEL, MULTICLICK_TIMEOUT, PINCH_ZOOM_SPEED, SCROLL_LINE_HEIGHT, SCROLL_LINE_WIDTH, SCROLL_SPEED_X, SCROLL_SPEED_Y}; use crate::wrapper::messages::{DesktopWrapperMessage, InputMessage, ModifierKeys, MouseKeys, PointerState, ScrollDelta}; pub(crate) struct InputState { @@ -12,6 +13,7 @@ pub(crate) struct InputState { pointer_position: PhysicalPosition, pointer_keys: MouseKeys, ui_capture: bool, + multiclick: Option, } pub(crate) enum InputAction { @@ -34,6 +36,7 @@ impl InputState { pointer_position: PhysicalPosition::default(), pointer_keys: MouseKeys::empty(), ui_capture: true, + multiclick: None, } } @@ -109,10 +112,22 @@ impl InputState { _ => self.pointer_state(), }; let modifier_keys = self.modifier_keys; - vec![InputAction::editor(match state { - ElementState::Pressed => InputMessage::PointerDown { editor_mouse_state, modifier_keys }, - ElementState::Released => InputMessage::PointerUp { editor_mouse_state, modifier_keys }, - })] + match state { + ElementState::Pressed => vec![InputAction::editor(InputMessage::PointerDown { editor_mouse_state, modifier_keys })], + ElementState::Released => { + let mut actions = vec![InputAction::editor(InputMessage::PointerUp { editor_mouse_state, modifier_keys })]; + if self.track_multiclick(mouse_button, *position) { + actions.push(InputAction::editor(InputMessage::DoubleClick { + editor_mouse_state: PointerState { + mouse_keys: keys, + ..editor_mouse_state + }, + modifier_keys, + })); + } + actions + } + } } WindowEvent::MouseWheel { delta, .. } => { if self.pointer_locked || !self.in_viewport(self.pointer_position) { @@ -151,6 +166,18 @@ impl InputState { } } + fn track_multiclick(&mut self, button: MouseButton, position: PhysicalPosition) -> bool { + let now = Instant::now(); + let travel = MULTICLICK_ALLOWED_TRAVEL as f64; + let double = self.multiclick.take().is_some_and(|click| { + click.button == button && now.duration_since(click.time) <= MULTICLICK_TIMEOUT && (position.x - click.position.x).abs() <= travel && (position.y - click.position.y).abs() <= travel + }); + if !double { + self.multiclick = Some(Multiclick { button, time: now, position }); + } + double + } + fn scale(&self) -> f64 { self.viewport_info.as_ref().map_or(1., |info| info.scale) } @@ -179,6 +206,12 @@ impl InputState { } } +struct Multiclick { + button: MouseButton, + time: Instant, + position: PhysicalPosition, +} + struct ViewportInfo { x: f64, y: f64, diff --git a/desktop/ui/src/consts.rs b/desktop/ui/src/consts.rs index 852996c421..9a04adc259 100644 --- a/desktop/ui/src/consts.rs +++ b/desktop/ui/src/consts.rs @@ -1,5 +1,8 @@ use std::time::Duration; +pub const MULTICLICK_TIMEOUT: Duration = Duration::from_millis(500); +pub const MULTICLICK_ALLOWED_TRAVEL: usize = 4; + pub const SCROLL_LINE_HEIGHT: f64 = 40.; pub const SCROLL_LINE_WIDTH: f64 = 40.; @@ -32,6 +35,3 @@ pub(crate) const HOST_SHUTDOWN_TIMEOUT: Duration = Duration::from_secs(5); #[cfg(target_os = "macos")] pub(crate) const IPC_BOOTSTRAP_PREFIX: &str = "art.graphite.Graphite.ipc."; - -pub(crate) const MULTICLICK_TIMEOUT: Duration = Duration::from_millis(500); -pub(crate) const MULTICLICK_ALLOWED_TRAVEL: usize = 4; diff --git a/desktop/ui/src/lib.rs b/desktop/ui/src/lib.rs index c9bca99b5f..cd5bf8b012 100644 --- a/desktop/ui/src/lib.rs +++ b/desktop/ui/src/lib.rs @@ -22,7 +22,7 @@ mod resources; mod utility; mod view; -pub use consts::{PINCH_ZOOM_SPEED, SCROLL_LINE_HEIGHT, SCROLL_LINE_WIDTH, SCROLL_SPEED_X, SCROLL_SPEED_Y}; +pub use consts::{MULTICLICK_ALLOWED_TRAVEL, MULTICLICK_TIMEOUT, PINCH_ZOOM_SPEED, SCROLL_LINE_HEIGHT, SCROLL_LINE_WIDTH, SCROLL_SPEED_X, SCROLL_SPEED_Y}; pub struct UiContext { inner: S::ContextData, From 469cf4853a7dd40b712e93b3db3fc0f317310254 Mon Sep 17 00:00:00 2001 From: Timon Date: Sun, 19 Jul 2026 20:51:49 +0000 Subject: [PATCH 8/8] Update winit to 0.31.0-beta.2 from crates.io --- Cargo.lock | 58 +++++++++++++++++++++++++---------------- Cargo.toml | 4 +-- desktop/src/app.rs | 9 ++++--- desktop/src/input.rs | 18 +++++++------ desktop/ui/src/input.rs | 9 ++++--- 5 files changed, 56 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ddcec9f06d..1b89dbb1e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1362,7 +1362,8 @@ dependencies = [ [[package]] name = "dpi" version = "0.1.2" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" dependencies = [ "serde", ] @@ -7659,8 +7660,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winit" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2879d2854d1a43e48f67322d4bd097afcb6eb8f8f775c8de0260a71aea1df1aa" dependencies = [ "bitflags 2.11.0", "cfg_aliases", @@ -7686,8 +7688,9 @@ dependencies = [ [[package]] name = "winit-android" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d9c0d2cd93efec3a9f9ad819cfaf0834782403af7c0d248c784ec0c61761df" dependencies = [ "android-activity", "bitflags 2.11.0", @@ -7701,8 +7704,9 @@ dependencies = [ [[package]] name = "winit-appkit" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21310ca07851a49c348e0c2cc768e36b52ca65afda2c2354d78ed4b90074d8aa" dependencies = [ "bitflags 2.11.0", "block2 0.6.2", @@ -7723,8 +7727,9 @@ dependencies = [ [[package]] name = "winit-common" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45375fbac4cbb77260d83a30b1f9d8105880dbac99a9ae97f56656694680ff69" dependencies = [ "memmap2 0.9.10", "objc2 0.6.3", @@ -7738,8 +7743,9 @@ dependencies = [ [[package]] name = "winit-core" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4f0ccd7abb43740e2c6124ac7cae7d865ecec74eec63783e8922577ac232583" dependencies = [ "bitflags 2.11.0", "cursor-icon", @@ -7753,8 +7759,9 @@ dependencies = [ [[package]] name = "winit-orbital" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ea1fb262e7209f265f12bd0cc792c399b14355675e65531e9c8a87db287d46" dependencies = [ "bitflags 2.11.0", "dpi", @@ -7768,8 +7775,9 @@ dependencies = [ [[package]] name = "winit-uikit" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680a356e798837d8eb274d4556e83bceaf81698194e31aafc5cfb8a9f2fab643" dependencies = [ "bitflags 2.11.0", "block2 0.6.2", @@ -7789,8 +7797,9 @@ dependencies = [ [[package]] name = "winit-wayland" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce5afb2ba07da603f84b722c95f9f9396d2cedae3944fb6c0cda4a6f88de545" dependencies = [ "ahash", "bitflags 2.11.0", @@ -7815,8 +7824,9 @@ dependencies = [ [[package]] name = "winit-web" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2490a953fb776fbbd5e295d54f1c3847f4f15b6c3929ec53c09acda6487a92" dependencies = [ "atomic-waker", "bitflags 2.11.0", @@ -7837,8 +7847,9 @@ dependencies = [ [[package]] name = "winit-win32" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644ea78af0e858aa3b092e5d1c67c41995a98220c81813f1353b28bc8bb91eaa" dependencies = [ "bitflags 2.11.0", "cursor-icon", @@ -7853,8 +7864,9 @@ dependencies = [ [[package]] name = "winit-x11" -version = "0.30.12" -source = "git+https://github.com/rust-windowing/winit.git#bd6fef1d80ba063cbe91e150b3fb343927cdc72b" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa5b600756534c7041aa93cd0d244d44b09fca1b89e202bd1cd80dd9f3636c46" dependencies = [ "bitflags 2.11.0", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index c0f932ceb6..d46ed2c8f8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -160,7 +160,7 @@ web-sys = { version = "=0.3.98", features = [ "HtmlImageElement", "ImageBitmapRenderingContext", ] } -winit = { git = "https://github.com/rust-windowing/winit.git" } +winit = "0.31.0-beta.2" keyboard-types = "0.8" url = "2.5" tokio = { version = "1.29", features = ["fs", "macros", "io-std", "rt", "rt-multi-thread"] } @@ -258,8 +258,6 @@ lto = "thin" debug = true [patch.crates-io] -# Force cargo to use only one version of the dpi crate (vendoring breaks without this) -dpi = { git = "https://github.com/rust-windowing/winit.git" } rfd = { git = "https://github.com/timon-schelling/rfd.git", branch = "graphite" } # TODO: Remove this once https://github.com/PolyMeilex/rfd/pull/317 is merged and released cef = { git = "https://github.com/timon-schelling/cef-rs.git", branch = "graphite-149" } cef-dll-sys = { git = "https://github.com/timon-schelling/cef-rs.git", branch = "graphite-149" } diff --git a/desktop/src/app.rs b/desktop/src/app.rs index 2936777566..028ab89e1a 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -11,6 +11,7 @@ use std::time::{Duration, Instant}; use winit::application::ApplicationHandler; use winit::dpi::{PhysicalPosition, PhysicalSize}; use winit::event::{ElementState, MouseButton, StartCause, WindowEvent}; +use winit::event_loop::run_on_demand::EventLoopExtRunOnDemand; use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop}; use winit::window::WindowId; @@ -126,8 +127,8 @@ impl App { } } - pub(crate) fn run(mut self, event_loop: EventLoop) -> ExitReason { - event_loop.run_app(&mut self).unwrap(); + pub(crate) fn run(mut self, mut event_loop: EventLoop) -> ExitReason { + event_loop.run_app_on_demand(&mut self).unwrap(); self.exit_reason } @@ -545,7 +546,7 @@ impl ApplicationHandler for App { button, .. } = &event - && button.clone().mouse_button() == MouseButton::Left + && button.clone().mouse_button() == Some(MouseButton::Left) { self.pointer_lock_position = None; self.input_state.set_pointer_locked(false); @@ -635,7 +636,7 @@ impl ApplicationHandler for App { button, state: ElementState::Released, .. - } if button.clone().mouse_button() == MouseButton::Left => { + } if button.clone().mouse_button() == Some(MouseButton::Left) => { self.window_pending_drag = false; } diff --git a/desktop/src/input.rs b/desktop/src/input.rs index b639232c5b..0ff0a639ba 100644 --- a/desktop/src/input.rs +++ b/desktop/src/input.rs @@ -90,19 +90,19 @@ impl InputState { let mouse_button = button.clone().mouse_button(); let keys = match mouse_button { - MouseButton::Left => MouseKeys::LEFT, - MouseButton::Right => MouseKeys::RIGHT, - MouseButton::Middle => MouseKeys::MIDDLE, - MouseButton::Back => MouseKeys::BACK, - MouseButton::Forward => MouseKeys::FORWARD, - MouseButton::Other(_) => MouseKeys::NONE, + Some(MouseButton::Left) => MouseKeys::LEFT, + Some(MouseButton::Right) => MouseKeys::RIGHT, + Some(MouseButton::Middle) => MouseKeys::MIDDLE, + Some(MouseButton::Back) => MouseKeys::BACK, + Some(MouseButton::Forward) => MouseKeys::FORWARD, + _ => MouseKeys::NONE, }; match state { ElementState::Pressed => self.pointer_keys.insert(keys), ElementState::Released => self.pointer_keys.remove(keys), } - let back_or_forward = matches!(mouse_button, MouseButton::Back | MouseButton::Forward); + let back_or_forward = matches!(mouse_button, Some(MouseButton::Back | MouseButton::Forward)); if self.pointer_locked || !(back_or_forward || (tablet && !self.ui_capture)) { return vec![InputAction::Ui(event.clone())]; } @@ -116,7 +116,9 @@ impl InputState { ElementState::Pressed => vec![InputAction::editor(InputMessage::PointerDown { editor_mouse_state, modifier_keys })], ElementState::Released => { let mut actions = vec![InputAction::editor(InputMessage::PointerUp { editor_mouse_state, modifier_keys })]; - if self.track_multiclick(mouse_button, *position) { + if let Some(mouse_button) = mouse_button + && self.track_multiclick(mouse_button, *position) + { actions.push(InputAction::editor(InputMessage::DoubleClick { editor_mouse_state: PointerState { mouse_keys: keys, diff --git a/desktop/ui/src/input.rs b/desktop/ui/src/input.rs index 799ba9e7db..84463b0126 100644 --- a/desktop/ui/src/input.rs +++ b/desktop/ui/src/input.rs @@ -82,11 +82,12 @@ pub(crate) fn translate(input_state: &mut InputState, event: &WindowEvent) -> Ve } WindowEvent::PointerButton { state, button, position, .. } => { let mouse_button = match button { - ButtonSource::Mouse(mouse_button) => *mouse_button, + ButtonSource::Mouse(mouse_button) => Some(*mouse_button), ButtonSource::TabletTool { button, .. } => (*button).into(), - _ => { - return Vec::new(); // TODO: Handle touch input - } + _ => None, // TODO: Handle touch input + }; + let Some(mouse_button) = mouse_button else { + return Vec::new(); }; let _ = input_state.cursor_move(position);