ai_agent/utils/
modifiers.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum ModifierKey {
8 Shift,
9 Command,
10 Control,
11 Option,
12}
13
14impl ModifierKey {
15 fn as_str(&self) -> &'static str {
16 match self {
17 Self::Shift => "shift",
18 Self::Command => "command",
19 Self::Control => "control",
20 Self::Option => "option",
21 }
22 }
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
27pub enum Modifier {
28 Shift,
29 Ctrl,
30 Alt,
31 Meta,
32}
33
34impl Modifier {
35 pub fn as_str(&self) -> &'static str {
36 match self {
37 Self::Shift => "shift",
38 Self::Ctrl => "ctrl",
39 Self::Alt => "alt",
40 Self::Meta => "meta",
41 }
42 }
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize)]
47pub struct Shortcut {
48 pub modifiers: Vec<Modifier>,
49 pub key: String,
50}
51
52impl Shortcut {
53 pub fn new(key: impl Into<String>, modifiers: Vec<Modifier>) -> Self {
54 Self {
55 modifiers,
56 key: key.into(),
57 }
58 }
59
60 pub fn display(&self) -> String {
61 let mut parts = Vec::new();
62 for m in &self.modifiers {
63 parts.push(match m {
64 Modifier::Shift => "⇧",
65 Modifier::Ctrl => "⌃",
66 Modifier::Alt => "⌥",
67 Modifier::Meta => "⌘",
68 });
69 }
70 parts.push(&self.key);
71 parts.join("")
72 }
73}
74
75static PREWARMED: std::sync::atomic::AtomicBool = std::sync::atomic::AtomicBool::new(false);
76
77pub fn prewarm_modifiers() {
81 if PREWARMED.load(std::sync::atomic::Ordering::SeqCst) {
82 return;
83 }
84
85 if !cfg!(target_os = "macos") {
87 return;
88 }
89
90 PREWARMED.store(true, std::sync::atomic::Ordering::SeqCst);
91
92 }
95
96pub fn is_modifier_pressed(_modifier: ModifierKey) -> bool {
99 if !cfg!(target_os = "macos") {
101 return false;
102 }
103
104 false
107}
108
109#[cfg(test)]
110mod tests {
111 use super::*;
112
113 #[test]
114 fn test_prewarm_does_not_panic() {
115 prewarm_modifiers();
116 prewarm_modifiers(); }
118
119 #[test]
120 fn test_is_modifier_pressed() {
121 let _ = is_modifier_pressed(ModifierKey::Shift);
124 }
125}