diff --git a/desktop/src/app.rs b/desktop/src/app.rs index 8fcb4077..fd95ddf5 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -1,17 +1,13 @@ use rfd::AsyncFileDialog; use std::fs; use std::path::PathBuf; -use std::sync::mpsc::Receiver; -use std::sync::mpsc::Sender; -use std::sync::mpsc::SyncSender; +use std::sync::mpsc::{Receiver, Sender, SyncSender}; use std::thread; -use std::time::Duration; -use std::time::Instant; +use std::time::{Duration, Instant}; use winit::application::ApplicationHandler; use winit::dpi::PhysicalSize; -use winit::event::WindowEvent; -use winit::event_loop::ActiveEventLoop; -use winit::event_loop::ControlFlow; +use winit::event::{ButtonSource, ElementState, MouseButton, WindowEvent}; +use winit::event_loop::{ActiveEventLoop, ControlFlow}; use winit::window::WindowId; use crate::cef; @@ -20,7 +16,7 @@ use crate::event::{AppEvent, AppEventScheduler}; use crate::persist::PersistentData; use crate::render::{RenderError, RenderState}; use crate::window::Window; -use crate::wrapper::messages::{DesktopFrontendMessage, DesktopWrapperMessage, Platform}; +use crate::wrapper::messages::{DesktopFrontendMessage, DesktopWrapperMessage, InputMessage, MouseKeys, MouseState, Platform}; use crate::wrapper::{DesktopWrapper, NodeGraphExecutionResult, WgpuContext, serialize_frontend_messages}; pub(crate) struct App { @@ -520,6 +516,32 @@ 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: MouseState { 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)); + } + } _ => {} } diff --git a/desktop/src/cef/input.rs b/desktop/src/cef/input.rs index d70550d0..a764db91 100644 --- a/desktop/src/cef/input.rs +++ b/desktop/src/cef/input.rs @@ -45,7 +45,7 @@ pub(crate) fn handle_window_event(browser: &Browser, input_state: &mut InputStat MouseButton::Left => cef::MouseButtonType::from(cef_mouse_button_type_t::MBT_LEFT), MouseButton::Right => cef::MouseButtonType::from(cef_mouse_button_type_t::MBT_RIGHT), MouseButton::Middle => cef::MouseButtonType::from(cef_mouse_button_type_t::MBT_MIDDLE), - _ => return, //TODO: Handle Forward and Back button + _ => return, }; let Some(host) = browser.host() else { return }; diff --git a/desktop/wrapper/src/handle_desktop_wrapper_message.rs b/desktop/wrapper/src/handle_desktop_wrapper_message.rs index 01daee63..b1857e9f 100644 --- a/desktop/wrapper/src/handle_desktop_wrapper_message.rs +++ b/desktop/wrapper/src/handle_desktop_wrapper_message.rs @@ -12,6 +12,9 @@ pub(super) fn handle_desktop_wrapper_message(dispatcher: &mut DesktopWrapperMess DesktopWrapperMessage::FromWeb(message) => { dispatcher.queue_editor_message(*message); } + DesktopWrapperMessage::Input(message) => { + dispatcher.queue_editor_message(EditorMessage::InputPreprocessor(message)); + } DesktopWrapperMessage::OpenFileDialogResult { path, content, context } => match context { OpenFileDialogContext::Document => { dispatcher.queue_desktop_wrapper_message(DesktopWrapperMessage::OpenDocument { path, content }); diff --git a/desktop/wrapper/src/messages.rs b/desktop/wrapper/src/messages.rs index 350bf5e7..78a0faca 100644 --- a/desktop/wrapper/src/messages.rs +++ b/desktop/wrapper/src/messages.rs @@ -3,6 +3,10 @@ use std::path::PathBuf; pub(crate) use graphite_editor::messages::prelude::Message as EditorMessage; +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::prelude::InputPreprocessorMessage as InputMessage; + pub use graphite_editor::messages::prelude::DocumentId; pub use graphite_editor::messages::prelude::PreferencesMessageHandler as Preferences; pub enum DesktopFrontendMessage { @@ -69,6 +73,7 @@ pub enum DesktopFrontendMessage { pub enum DesktopWrapperMessage { FromWeb(Box), + Input(InputMessage), OpenFileDialogResult { path: PathBuf, content: Vec,