From 03d2aac56e4e563c76fe553c044f37d8318d4394 Mon Sep 17 00:00:00 2001 From: Federico Terzi Date: Fri, 23 Apr 2021 20:41:41 +0200 Subject: [PATCH] feat(core): wire up mouse event --- .../src/cli/worker/engine/source/detect.rs | 34 +++++++++++++++---- espanso/src/engine/event/input.rs | 19 +++++++++-- espanso/src/engine/event/mod.rs | 2 ++ .../src/engine/process/middleware/cause.rs | 2 -- .../engine/process/middleware/cursor_hint.rs | 2 +- .../src/engine/process/middleware/matcher.rs | 4 +-- 6 files changed, 48 insertions(+), 15 deletions(-) diff --git a/espanso/src/cli/worker/engine/source/detect.rs b/espanso/src/cli/worker/engine/source/detect.rs index 60c8e57..ce056e9 100644 --- a/espanso/src/cli/worker/engine/source/detect.rs +++ b/espanso/src/cli/worker/engine/source/detect.rs @@ -24,7 +24,7 @@ use log::{error, trace}; use crate::engine::{ event::{ - input::{Key, KeyboardEvent, Status, Variant}, + input::{Key, KeyboardEvent, MouseButton, MouseEvent, Status, Variant}, Event, }, funnel, process, @@ -51,7 +51,10 @@ impl<'a> funnel::Source<'a> for DetectSource { status: keyboard_event.status.into(), variant: keyboard_event.variant.map(|variant| variant.into()), }), - InputEvent::Mouse(mouse_event) => todo!(), // TODO + InputEvent::Mouse(mouse_event) => Event::Mouse(MouseEvent { + status: mouse_event.status.into(), + button: mouse_event.button.into(), + }), InputEvent::HotKey(_) => todo!(), // TODO } } @@ -76,11 +79,13 @@ pub fn init_and_spawn() -> Result { .send(true) .expect("unable to send to the init_tx channel"); - source.eventloop(Box::new(move |event| { - sender - .send(event) - .expect("unable to send to the source channel"); - })).expect("detect eventloop crashed"); + source + .eventloop(Box::new(move |event| { + sender + .send(event) + .expect("unable to send to the source channel"); + })) + .expect("detect eventloop crashed"); } } Err(error) => { @@ -180,3 +185,18 @@ impl From for Status { } } } + +impl From for MouseButton { + fn from(button: espanso_detect::event::MouseButton) -> Self { + match button { + espanso_detect::event::MouseButton::Left => MouseButton::Left, + espanso_detect::event::MouseButton::Right => MouseButton::Right, + espanso_detect::event::MouseButton::Middle => MouseButton::Middle, + espanso_detect::event::MouseButton::Button1 => MouseButton::Button1, + espanso_detect::event::MouseButton::Button2 => MouseButton::Button2, + espanso_detect::event::MouseButton::Button3 => MouseButton::Button3, + espanso_detect::event::MouseButton::Button4 => MouseButton::Button4, + espanso_detect::event::MouseButton::Button5 => MouseButton::Button5, + } + } +} diff --git a/espanso/src/engine/event/input.rs b/espanso/src/engine/event/input.rs index 8791afa..190c126 100644 --- a/espanso/src/engine/event/input.rs +++ b/espanso/src/engine/event/input.rs @@ -37,9 +37,22 @@ pub struct KeyboardEvent { pub variant: Option, } -#[derive(Debug, Clone)] -pub struct KeySequenceInjectRequest { - pub keys: Vec, +#[derive(Debug, Clone, PartialEq)] +pub enum MouseButton { + Left, + Right, + Middle, + Button1, + Button2, + Button3, + Button4, + Button5, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct MouseEvent { + pub button: MouseButton, + pub status: Status, } #[derive(Debug, Clone, PartialEq)] diff --git a/espanso/src/engine/event/mod.rs b/espanso/src/engine/event/mod.rs index 55956c1..5fe08dd 100644 --- a/espanso/src/engine/event/mod.rs +++ b/espanso/src/engine/event/mod.rs @@ -28,6 +28,8 @@ pub enum Event { // Inputs Keyboard(input::KeyboardEvent), + Mouse(input::MouseEvent), + // TODO: hotkeys // Internal MatchesDetected(internal::MatchesDetectedEvent), diff --git a/espanso/src/engine/process/middleware/cause.rs b/espanso/src/engine/process/middleware/cause.rs index 1f1f007..88305e3 100644 --- a/espanso/src/engine/process/middleware/cause.rs +++ b/espanso/src/engine/process/middleware/cause.rs @@ -19,10 +19,8 @@ use super::super::Middleware; use crate::engine::{ - dispatch::Mode, event::{ effect::TriggerCompensationEvent, - input::{Key, KeySequenceInjectRequest}, internal::CauseCompensatedMatchEvent, Event, }, diff --git a/espanso/src/engine/process/middleware/cursor_hint.rs b/espanso/src/engine/process/middleware/cursor_hint.rs index bda1544..eb5ed34 100644 --- a/espanso/src/engine/process/middleware/cursor_hint.rs +++ b/espanso/src/engine/process/middleware/cursor_hint.rs @@ -18,7 +18,7 @@ */ use super::super::Middleware; -use crate::engine::{dispatch::Mode, event::{Event, effect::CursorHintCompensationEvent, input::{Key}, internal::RenderedEvent}}; +use crate::engine::{event::{Event, effect::CursorHintCompensationEvent, internal::RenderedEvent}}; pub struct CursorHintMiddleware {} diff --git a/espanso/src/engine/process/middleware/matcher.rs b/espanso/src/engine/process/middleware/matcher.rs index 02efcb3..2b8a7dd 100644 --- a/espanso/src/engine/process/middleware/matcher.rs +++ b/espanso/src/engine/process/middleware/matcher.rs @@ -137,7 +137,7 @@ fn is_event_of_interest(event: &Event) -> bool { } } }, - // TODO: handle mouse + Event::Mouse(mouse_event) => mouse_event.status == Status::Pressed, Event::MatchInjected => true, _ => false, } @@ -149,8 +149,8 @@ fn convert_to_matcher_event(event: &Event) -> Option { key: keyboard_event.key.clone(), chars: keyboard_event.value.clone(), }), + Event::Mouse(_) => Some(MatcherEvent::VirtualSeparator), Event::MatchInjected => Some(MatcherEvent::VirtualSeparator), - // TODO: mouse event should act as separator _ => None, } }