diff --git a/src/bridge/ui_commands.rs b/src/bridge/ui_commands.rs index 8f0a159..191432a 100644 --- a/src/bridge/ui_commands.rs +++ b/src/bridge/ui_commands.rs @@ -30,6 +30,7 @@ pub enum UiCommand { direction: String, grid_id: u64, position: (u32, u32), + modifier_string: String, }, Drag { grid_id: u64, @@ -79,11 +80,12 @@ impl UiCommand { direction, grid_id, position: (grid_x, grid_y), + modifier_string, } => { nvim.input_mouse( "wheel", &direction, - "", + &modifier_string, grid_id as i64, grid_y as i64, grid_x as i64, diff --git a/src/window/window_wrapper/keyboard_manager.rs b/src/window/window_wrapper/keyboard_manager.rs index 6c5825f..cbdaa03 100644 --- a/src/window/window_wrapper/keyboard_manager.rs +++ b/src/window/window_wrapper/keyboard_manager.rs @@ -129,13 +129,19 @@ impl KeyboardManager { let special = special || self.ctrl || use_alt(self.alt) || self.logo; let open = or_empty(special, "<"); + let modifiers = self.format_modifier_string(use_shift); + let close = or_empty(special, ">"); + + open.to_owned() + &modifiers + text + close + } + + pub fn format_modifier_string(&self, use_shift: bool) -> String { let shift = or_empty(self.shift && use_shift, "S-"); let ctrl = or_empty(self.ctrl, "C-"); let alt = or_empty(use_alt(self.alt), "M-"); let logo = or_empty(self.logo, "D-"); - let close = or_empty(special, ">"); - format!("{}{}{}{}{}{}{}", open, shift, ctrl, alt, logo, text, close) + shift.to_owned() + ctrl + alt + logo } } diff --git a/src/window/window_wrapper/mod.rs b/src/window/window_wrapper/mod.rs index 937987e..8ece69a 100644 --- a/src/window/window_wrapper/mod.rs +++ b/src/window/window_wrapper/mod.rs @@ -120,8 +120,8 @@ impl GlutinWindowWrapper { pub fn handle_event(&mut self, event: Event<()>, running: &Arc) { self.keyboard_manager.handle_event(&event); - self.mouse_manager - .handle_event(&event, &self.renderer, &self.windowed_context); + self.mouse_manager.handle_event( + &event, &self.keyboard_manager, &self.renderer, &self.windowed_context); match event { Event::LoopDestroyed => { self.handle_quit(running); diff --git a/src/window/window_wrapper/mouse_manager.rs b/src/window/window_wrapper/mouse_manager.rs index 729b579..99b0846 100644 --- a/src/window/window_wrapper/mouse_manager.rs +++ b/src/window/window_wrapper/mouse_manager.rs @@ -11,6 +11,7 @@ use skia_safe::Rect; use crate::bridge::UiCommand; use crate::channel_utils::LoggingTx; use crate::renderer::{Renderer, WindowDrawDetails}; +use super::keyboard_manager::KeyboardManager; fn clamp_position( position: PhysicalPosition, @@ -210,7 +211,7 @@ impl MouseManager { } } - fn handle_line_scroll(&mut self, x: f32, y: f32) { + fn handle_line_scroll(&mut self, x: f32, y: f32, keyboard_manager: &KeyboardManager) { if !self.enabled { return; } @@ -234,6 +235,7 @@ impl MouseManager { .map(|details| details.id) .unwrap_or(0), position: self.drag_position.into(), + modifier_string: keyboard_manager.format_modifier_string(true), }; for _ in 0..(new_y - previous_y).abs() { self.command_sender.send(scroll_command.clone()).ok(); @@ -259,6 +261,7 @@ impl MouseManager { .map(|details| details.id) .unwrap_or(0), position: self.drag_position.into(), + modifier_string: keyboard_manager.format_modifier_string(true), }; for _ in 0..(new_x - previous_x).abs() { self.command_sender.send(scroll_command.clone()).ok(); @@ -270,13 +273,18 @@ impl MouseManager { &mut self, (font_width, font_height): (u64, u64), (pixel_x, pixel_y): (f32, f32), + keyboard_manager: &KeyboardManager, ) { - self.handle_line_scroll(pixel_x / font_width as f32, pixel_y / font_height as f32); + self.handle_line_scroll( + pixel_x / font_width as f32, + pixel_y / font_height as f32, + keyboard_manager); } pub fn handle_event( &mut self, event: &Event<()>, + keyboard_manager: &KeyboardManager, renderer: &Renderer, windowed_context: &WindowedContext, ) { @@ -297,7 +305,7 @@ impl MouseManager { .. }, .. - } => self.handle_line_scroll(*x, *y), + } => self.handle_line_scroll(*x, *y, keyboard_manager), Event::WindowEvent { event: WindowEvent::MouseWheel { @@ -308,6 +316,7 @@ impl MouseManager { } => self.handle_pixel_scroll( renderer.grid_renderer.font_dimensions.into(), (delta.x as f32, delta.y as f32), + keyboard_manager, ), Event::WindowEvent { event: WindowEvent::MouseInput { button, state, .. },