diff --git a/src/gui/modular/button.rs b/src/gui/modular/button.rs index 1eb97a6..d78ef84 100644 --- a/src/gui/modular/button.rs +++ b/src/gui/modular/button.rs @@ -17,6 +17,7 @@ use crate::{ task::{ColorChannel, SystemTask, TaskType}, }, config::{save_layout, save_settings, AStrSetExt}, + hid::VirtualKey, overlays::{ toast::{Toast, ToastTopic}, watch::WATCH_NAME, @@ -26,6 +27,12 @@ use crate::{ use super::{ExecArgs, ModularControl, ModularData}; +#[derive(Deserialize, Clone)] +pub enum PressRelease { + Release, + Press, +} + #[derive(Deserialize, Clone, Copy)] pub enum ViewAngleKind { /// The cosine of the angle at which the watch becomes fully transparent @@ -116,6 +123,10 @@ pub enum ButtonAction { command: ExecArgs, toast: Option>, }, + VirtualKey { + keycode: VirtualKey, + action: PressRelease, + }, Watch { action: WatchAction, }, @@ -316,6 +327,9 @@ fn handle_action(action: &ButtonAction, press: &mut PressData, app: &mut AppStat ButtonAction::Watch { action } => run_watch(action, app), ButtonAction::Overlay { target, action } => run_overlay(target, action, app), ButtonAction::Window { target, action } => run_window(target, action, app), + ButtonAction::VirtualKey { keycode, action } => app + .hid_provider + .send_key(*keycode, matches!(*action, PressRelease::Press)), ButtonAction::Toast { message, body, diff --git a/src/hid/mod.rs b/src/hid/mod.rs index d4d013c..0844fad 100644 --- a/src/hid/mod.rs +++ b/src/hid/mod.rs @@ -7,6 +7,7 @@ use input_linux::{ }; use libc::{input_event, timeval}; use once_cell::sync::Lazy; +use serde::Deserialize; use std::mem::transmute; use std::{fs::File, sync::atomic::AtomicBool}; use strum::{EnumIter, EnumString, IntoEnumIterator}; @@ -316,7 +317,7 @@ pub const META: KeyModifier = 0x80; #[allow(non_camel_case_types)] #[repr(u16)] -#[derive(Debug, PartialEq, Clone, Copy, IntegerId, EnumString, EnumIter)] +#[derive(Debug, Deserialize, PartialEq, Clone, Copy, IntegerId, EnumString, EnumIter)] pub enum VirtualKey { Escape = 9, N1, // number row