comfy_core/
input.rs

1use winit::keyboard::PhysicalKey;
2
3use crate::*;
4
5pub fn mouse_wheel() -> (f32, f32) {
6    GLOBAL_STATE.borrow().mouse_wheel
7}
8
9pub fn is_mouse_button_down(button: MouseButton) -> bool {
10    GLOBAL_STATE.borrow().mouse_pressed.contains(&button)
11}
12
13pub fn is_mouse_button_pressed(button: MouseButton) -> bool {
14    GLOBAL_STATE.borrow().mouse_just_pressed.contains(&button)
15}
16
17pub fn is_mouse_button_released(button: MouseButton) -> bool {
18    GLOBAL_STATE.borrow().mouse_just_released.contains(&button)
19}
20
21pub fn set_cursor_hidden(hidden: bool) {
22    GLOBAL_STATE.borrow_mut().cursor_hidden = hidden;
23}
24
25pub fn set_mouse_locked(locked: bool) {
26    GLOBAL_STATE.borrow_mut().mouse_locked = locked;
27}
28
29pub fn is_key_pressed(keycode: KeyCode) -> bool {
30    GLOBAL_STATE.borrow().just_pressed.contains(&keycode)
31}
32
33pub fn is_key_released(keycode: KeyCode) -> bool {
34    GLOBAL_STATE.borrow().just_released.contains(&keycode)
35}
36
37pub fn is_key_down(keycode: KeyCode) -> bool {
38    GLOBAL_STATE.borrow().pressed.contains(&keycode)
39}
40
41#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
42pub enum MouseButton {
43    Left,
44    Right,
45    Middle,
46    Back,
47    Forward,
48    Other(u16),
49}
50
51#[allow(dead_code)]
52#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
53pub enum KeyCode {
54    Backspace,
55    Tab,
56    Return,
57    Escape,
58    Space,
59    Exclaim,
60    Quotedbl,
61    Hash,
62    Dollar,
63    Percent,
64    Ampersand,
65    Quote,
66    LeftParen,
67    RightParen,
68    Asterisk,
69    Plus,
70    Comma,
71    Minus,
72    Period,
73    Slash,
74    Num0,
75    Num1,
76    Num2,
77    Num3,
78    Num4,
79    Num5,
80    Num6,
81    Num7,
82    Num8,
83    Num9,
84    Colon,
85    Semicolon,
86    Less,
87    Equals,
88    Greater,
89    Question,
90    At,
91    LeftBracket,
92    Backslash,
93    RightBracket,
94    Caret,
95    Underscore,
96    Backquote,
97    A,
98    B,
99    C,
100    D,
101    E,
102    F,
103    G,
104    H,
105    I,
106    J,
107    K,
108    L,
109    M,
110    N,
111    O,
112    P,
113    Q,
114    R,
115    S,
116    T,
117    U,
118    V,
119    W,
120    X,
121    Y,
122    Z,
123    Delete,
124    CapsLock,
125    F1,
126    F2,
127    F3,
128    F4,
129    F5,
130    F6,
131    F7,
132    F8,
133    F9,
134    F10,
135    F11,
136    F12,
137    PrintScreen,
138    ScrollLock,
139    Pause,
140    Insert,
141    Home,
142    PageUp,
143    End,
144    PageDown,
145    Right,
146    Left,
147    Down,
148    Up,
149    NumLockClear,
150    KpDivide,
151    KpMultiply,
152    KpMinus,
153    KpPlus,
154    KpEnter,
155    Kp1,
156    Kp2,
157    Kp3,
158    Kp4,
159    Kp5,
160    Kp6,
161    Kp7,
162    Kp8,
163    Kp9,
164    Kp0,
165    KpPeriod,
166    Application,
167    Power,
168    KpEquals,
169    F13,
170    F14,
171    F15,
172    F16,
173    F17,
174    F18,
175    F19,
176    F20,
177    F21,
178    F22,
179    F23,
180    F24,
181    Execute,
182    Help,
183    Menu,
184    Select,
185    Stop,
186    Again,
187    Undo,
188    Cut,
189    Copy,
190    Paste,
191    Find,
192    Mute,
193    VolumeUp,
194    VolumeDown,
195    KpComma,
196    KpEqualsAS400,
197    AltErase,
198    Sysreq,
199    Cancel,
200    Clear,
201    Prior,
202    Return2,
203    Separator,
204    Out,
205    Oper,
206    ClearAgain,
207    CrSel,
208    ExSel,
209    Kp00,
210    Kp000,
211    ThousandsSeparator,
212    DecimalSeparator,
213    CurrencyUnit,
214    CurrencySubUnit,
215    KpLeftParen,
216    KpRightParen,
217    KpLeftBrace,
218    KpRightBrace,
219    KpTab,
220    KpBackspace,
221    KpA,
222    KpB,
223    KpC,
224    KpD,
225    KpE,
226    KpF,
227    KpXor,
228    KpPower,
229    KpPercent,
230    KpLess,
231    KpGreater,
232    KpAmpersand,
233    KpDblAmpersand,
234    KpVerticalBar,
235    KpDblVerticalBar,
236    KpColon,
237    KpHash,
238    KpSpace,
239    KpAt,
240    KpExclam,
241    KpMemStore,
242    KpMemRecall,
243    KpMemClear,
244    KpMemAdd,
245    KpMemSubtract,
246    KpMemMultiply,
247    KpMemDivide,
248    KpPlusMinus,
249    KpClear,
250    KpClearEntry,
251    KpBinary,
252    KpOctal,
253    KpDecimal,
254    KpHexadecimal,
255    LCtrl,
256    LShift,
257    LAlt,
258    LGui,
259    RCtrl,
260    RShift,
261    RAlt,
262    RGui,
263    Mode,
264    AudioNext,
265    AudioPrev,
266    AudioStop,
267    AudioPlay,
268    AudioMute,
269    MediaSelect,
270    Www,
271    Mail,
272    Calculator,
273    Computer,
274    AcSearch,
275    AcHome,
276    AcBack,
277    AcForward,
278    AcStop,
279    AcRefresh,
280    AcBookmarks,
281    BrightnessDown,
282    BrightnessUp,
283    DisplaySwitch,
284    KbdIllumToggle,
285    KbdIllumDown,
286    KbdIllumUp,
287    Eject,
288    Sleep,
289}
290
291#[rustfmt::skip]
292impl KeyCode {
293    pub fn try_from_winit(code: PhysicalKey) -> Option<KeyCode> {
294        match code {
295            PhysicalKey::Code(known_code) => match known_code {
296                winit::keyboard::KeyCode::KeyA => Some(KeyCode::A),
297                winit::keyboard::KeyCode::KeyB => Some(KeyCode::B),
298                winit::keyboard::KeyCode::KeyC => Some(KeyCode::C),
299                winit::keyboard::KeyCode::KeyD => Some(KeyCode::D),
300                winit::keyboard::KeyCode::KeyE => Some(KeyCode::E),
301                winit::keyboard::KeyCode::KeyF => Some(KeyCode::F),
302                winit::keyboard::KeyCode::KeyG => Some(KeyCode::G),
303                winit::keyboard::KeyCode::KeyH => Some(KeyCode::H),
304                winit::keyboard::KeyCode::KeyI => Some(KeyCode::I),
305                winit::keyboard::KeyCode::KeyJ => Some(KeyCode::J),
306                winit::keyboard::KeyCode::KeyK => Some(KeyCode::K),
307                winit::keyboard::KeyCode::KeyL => Some(KeyCode::L),
308                winit::keyboard::KeyCode::KeyM => Some(KeyCode::M),
309                winit::keyboard::KeyCode::KeyN => Some(KeyCode::N),
310                winit::keyboard::KeyCode::KeyO => Some(KeyCode::O),
311                winit::keyboard::KeyCode::KeyP => Some(KeyCode::P),
312                winit::keyboard::KeyCode::KeyQ => Some(KeyCode::Q),
313                winit::keyboard::KeyCode::KeyR => Some(KeyCode::R),
314                winit::keyboard::KeyCode::KeyS => Some(KeyCode::S),
315                winit::keyboard::KeyCode::KeyT => Some(KeyCode::T),
316                winit::keyboard::KeyCode::KeyU => Some(KeyCode::U),
317                winit::keyboard::KeyCode::KeyV => Some(KeyCode::V),
318                winit::keyboard::KeyCode::KeyW => Some(KeyCode::W),
319                winit::keyboard::KeyCode::KeyX => Some(KeyCode::X),
320                winit::keyboard::KeyCode::KeyY => Some(KeyCode::Y),
321                winit::keyboard::KeyCode::KeyZ => Some(KeyCode::Z),
322                winit::keyboard::KeyCode::Backquote => Some(KeyCode::Backquote),
323                winit::keyboard::KeyCode::Tab => Some(KeyCode::Tab),
324                winit::keyboard::KeyCode::Enter => Some(KeyCode::Return),
325                winit::keyboard::KeyCode::Escape => Some(KeyCode::Escape),
326                winit::keyboard::KeyCode::Space => Some(KeyCode::Space),
327                winit::keyboard::KeyCode::Comma => Some(KeyCode::Comma),
328                winit::keyboard::KeyCode::Minus => Some(KeyCode::Minus),
329                winit::keyboard::KeyCode::Period => Some(KeyCode::Period),
330                winit::keyboard::KeyCode::Slash => Some(KeyCode::Slash),
331                winit::keyboard::KeyCode::NumpadAdd => Some(KeyCode::KpPlus),
332                winit::keyboard::KeyCode::Numpad0 => Some(KeyCode::Kp0),
333                winit::keyboard::KeyCode::Numpad1 => Some(KeyCode::Kp1),
334                winit::keyboard::KeyCode::Numpad2 => Some(KeyCode::Kp2),
335                winit::keyboard::KeyCode::Numpad3 => Some(KeyCode::Kp3),
336                winit::keyboard::KeyCode::Numpad4 => Some(KeyCode::Kp4),
337                winit::keyboard::KeyCode::Numpad5 => Some(KeyCode::Kp5),
338                winit::keyboard::KeyCode::Numpad6 => Some(KeyCode::Kp6),
339                winit::keyboard::KeyCode::Numpad7 => Some(KeyCode::Kp7),
340                winit::keyboard::KeyCode::Numpad8 => Some(KeyCode::Kp8),
341                winit::keyboard::KeyCode::Numpad9 => Some(KeyCode::Kp9),
342                winit::keyboard::KeyCode::Semicolon => Some(KeyCode::Semicolon),
343                winit::keyboard::KeyCode::Equal => Some(KeyCode::Equals),
344                winit::keyboard::KeyCode::Backslash => Some(KeyCode::Backslash),
345                winit::keyboard::KeyCode::Delete => Some(KeyCode::Delete),
346                winit::keyboard::KeyCode::F1 => Some(KeyCode::F1),
347                winit::keyboard::KeyCode::F2 => Some(KeyCode::F2),
348                winit::keyboard::KeyCode::F3 => Some(KeyCode::F3),
349                winit::keyboard::KeyCode::F4 => Some(KeyCode::F4),
350                winit::keyboard::KeyCode::F5 => Some(KeyCode::F5),
351                winit::keyboard::KeyCode::F6 => Some(KeyCode::F6),
352                winit::keyboard::KeyCode::F7 => Some(KeyCode::F7),
353                winit::keyboard::KeyCode::F8 => Some(KeyCode::F8),
354                winit::keyboard::KeyCode::F9 => Some(KeyCode::F9),
355                winit::keyboard::KeyCode::F10 => Some(KeyCode::F10),
356                winit::keyboard::KeyCode::F11 => Some(KeyCode::F11),
357                winit::keyboard::KeyCode::F12 => Some(KeyCode::F12),
358                winit::keyboard::KeyCode::Pause => Some(KeyCode::Pause),
359                winit::keyboard::KeyCode::Insert => Some(KeyCode::Insert),
360                winit::keyboard::KeyCode::Home => Some(KeyCode::Home),
361                winit::keyboard::KeyCode::PageUp => Some(KeyCode::PageUp),
362                winit::keyboard::KeyCode::End => Some(KeyCode::End),
363                winit::keyboard::KeyCode::PageDown => Some(KeyCode::PageDown),
364                winit::keyboard::KeyCode::ArrowRight => Some(KeyCode::Right),
365                winit::keyboard::KeyCode::ArrowLeft => Some(KeyCode::Left),
366                winit::keyboard::KeyCode::ArrowDown => Some(KeyCode::Down),
367                winit::keyboard::KeyCode::ArrowUp => Some(KeyCode::Up),
368                winit::keyboard::KeyCode::Power => Some(KeyCode::Power),
369                winit::keyboard::KeyCode::F13 => Some(KeyCode::F13),
370                winit::keyboard::KeyCode::F14 => Some(KeyCode::F14),
371                winit::keyboard::KeyCode::F15 => Some(KeyCode::F15),
372                winit::keyboard::KeyCode::F16 => Some(KeyCode::F16),
373                winit::keyboard::KeyCode::F17 => Some(KeyCode::F17),
374                winit::keyboard::KeyCode::F18 => Some(KeyCode::F18),
375                winit::keyboard::KeyCode::F19 => Some(KeyCode::F19),
376                winit::keyboard::KeyCode::F20 => Some(KeyCode::F20),
377                winit::keyboard::KeyCode::F21 => Some(KeyCode::F21),
378                winit::keyboard::KeyCode::F22 => Some(KeyCode::F22),
379                winit::keyboard::KeyCode::F23 => Some(KeyCode::F23),
380                winit::keyboard::KeyCode::F24 => Some(KeyCode::F24),
381                winit::keyboard::KeyCode::MediaStop => Some(KeyCode::Stop),
382                winit::keyboard::KeyCode::Cut => Some(KeyCode::Cut),
383                winit::keyboard::KeyCode::Copy => Some(KeyCode::Copy),
384                winit::keyboard::KeyCode::Paste => Some(KeyCode::Paste),
385                winit::keyboard::KeyCode::AudioVolumeMute => Some(KeyCode::Mute),
386                winit::keyboard::KeyCode::AudioVolumeUp => Some(KeyCode::VolumeUp),
387                winit::keyboard::KeyCode::AudioVolumeDown => Some(KeyCode::VolumeDown),
388                winit::keyboard::KeyCode::ControlLeft => Some(KeyCode::LCtrl),
389                winit::keyboard::KeyCode::ShiftLeft => Some(KeyCode::LShift),
390                winit::keyboard::KeyCode::AltLeft => Some(KeyCode::LAlt),
391                winit::keyboard::KeyCode::SuperLeft => Some(KeyCode::LGui),
392                winit::keyboard::KeyCode::ControlRight => Some(KeyCode::RCtrl),
393                winit::keyboard::KeyCode::ShiftRight => Some(KeyCode::RShift),
394                winit::keyboard::KeyCode::AltRight => Some(KeyCode::RAlt),
395                winit::keyboard::KeyCode::SuperRight => Some(KeyCode::RGui),
396                winit::keyboard::KeyCode::BracketLeft => Some(KeyCode::LeftBracket),
397                winit::keyboard::KeyCode::BracketRight => Some(KeyCode::RightBracket),
398                winit::keyboard::KeyCode::Digit0 => Some(KeyCode::Num0),
399                winit::keyboard::KeyCode::Digit1 => Some(KeyCode::Num1),
400                winit::keyboard::KeyCode::Digit2 => Some(KeyCode::Num2),
401                winit::keyboard::KeyCode::Digit3 => Some(KeyCode::Num3),
402                winit::keyboard::KeyCode::Digit4 => Some(KeyCode::Num4),
403                winit::keyboard::KeyCode::Digit5 => Some(KeyCode::Num5),
404                winit::keyboard::KeyCode::Digit6 => Some(KeyCode::Num6),
405                winit::keyboard::KeyCode::Digit7 => Some(KeyCode::Num7),
406                winit::keyboard::KeyCode::Digit8 => Some(KeyCode::Num8),
407                winit::keyboard::KeyCode::Digit9 => Some(KeyCode::Num9),
408                winit::keyboard::KeyCode::Quote => Some(KeyCode::Quote),
409                winit::keyboard::KeyCode::Backspace => Some(KeyCode::Backspace),
410                winit::keyboard::KeyCode::CapsLock => Some(KeyCode::CapsLock),
411                winit::keyboard::KeyCode::ContextMenu => Some(KeyCode::Menu),
412                winit::keyboard::KeyCode::Help => Some(KeyCode::Help),
413                winit::keyboard::KeyCode::NumLock => Some(KeyCode::NumLockClear),
414                winit::keyboard::KeyCode::NumpadBackspace => Some(KeyCode::KpBackspace),
415                winit::keyboard::KeyCode::NumpadClear => Some(KeyCode::KpClear),
416                winit::keyboard::KeyCode::NumpadClearEntry => Some(KeyCode::KpClearEntry),
417                winit::keyboard::KeyCode::NumpadComma => Some(KeyCode::KpComma),
418                winit::keyboard::KeyCode::NumpadDecimal => Some(KeyCode::KpDecimal),
419                winit::keyboard::KeyCode::NumpadDivide => Some(KeyCode::KpDivide),
420                winit::keyboard::KeyCode::NumpadEnter => Some(KeyCode::KpEnter),
421                winit::keyboard::KeyCode::NumpadEqual => Some(KeyCode::KpEquals),
422                winit::keyboard::KeyCode::NumpadHash => Some(KeyCode::KpHash),
423                winit::keyboard::KeyCode::NumpadMemoryClear => Some(KeyCode::KpMemClear),
424                winit::keyboard::KeyCode::NumpadMemoryRecall => Some(KeyCode::KpMemRecall),
425                winit::keyboard::KeyCode::NumpadMemoryStore => Some(KeyCode::KpMemStore),
426                winit::keyboard::KeyCode::NumpadMemorySubtract => Some(KeyCode::KpMemSubtract),
427                winit::keyboard::KeyCode::NumpadMultiply => Some(KeyCode::KpMultiply),
428                winit::keyboard::KeyCode::NumpadParenLeft => Some(KeyCode::KpLeftParen),
429                winit::keyboard::KeyCode::NumpadParenRight => Some(KeyCode::KpRightParen),
430                winit::keyboard::KeyCode::NumpadSubtract => Some(KeyCode::KpMinus),
431                winit::keyboard::KeyCode::PrintScreen => Some(KeyCode::PrintScreen),
432                winit::keyboard::KeyCode::ScrollLock => Some(KeyCode::ScrollLock),
433                winit::keyboard::KeyCode::Eject => Some(KeyCode::Eject),
434                winit::keyboard::KeyCode::LaunchMail => Some(KeyCode::Mail),
435                winit::keyboard::KeyCode::MediaSelect => Some(KeyCode::Select),
436                winit::keyboard::KeyCode::MediaTrackNext => Some(KeyCode::AudioNext),
437                winit::keyboard::KeyCode::MediaTrackPrevious => Some(KeyCode::AudioPrev),
438                winit::keyboard::KeyCode::Sleep => Some(KeyCode::Sleep),
439                winit::keyboard::KeyCode::Find => Some(KeyCode::Find),
440                winit::keyboard::KeyCode::Select => Some(KeyCode::Select),
441                winit::keyboard::KeyCode::Undo => Some(KeyCode::Undo),
442
443                // nokola: 2024-03-02: these don't seem to have matching KeyCode
444                // winit::keyboard::KeyCode::IntlBackslash => todo!(),
445                // winit::keyboard::KeyCode::IntlRo => todo!(),
446                // winit::keyboard::KeyCode::IntlYen => todo!(),
447                // winit::keyboard::KeyCode::Convert => todo!(),
448                // winit::keyboard::KeyCode::KanaMode => todo!(),
449                // winit::keyboard::KeyCode::Lang1 => todo!(),
450                // winit::keyboard::KeyCode::Lang2 => todo!(),
451                // winit::keyboard::KeyCode::Lang3 => todo!(),
452                // winit::keyboard::KeyCode::Lang4 => todo!(),
453                // winit::keyboard::KeyCode::Lang5 => todo!(),
454                // winit::keyboard::KeyCode::NonConvert => todo!(),
455                // winit::keyboard::KeyCode::NumpadMemoryAdd => todo!(),
456                // winit::keyboard::KeyCode::NumpadStar => todo!(),
457                // winit::keyboard::KeyCode::Fn => todo!(),
458                // winit::keyboard::KeyCode::FnLock => todo!(),
459                // winit::keyboard::KeyCode::BrowserBack => todo!(),
460                // winit::keyboard::KeyCode::BrowserFavorites => todo!(),
461                // winit::keyboard::KeyCode::BrowserForward => todo!(),
462                // winit::keyboard::KeyCode::BrowserHome => todo!(),
463                // winit::keyboard::KeyCode::BrowserRefresh => todo!(),
464                // winit::keyboard::KeyCode::BrowserSearch => todo!(),
465                // winit::keyboard::KeyCode::BrowserStop => todo!(),
466                // winit::keyboard::KeyCode::LaunchApp1 => todo!(),
467                // winit::keyboard::KeyCode::LaunchApp2 => todo!(),
468                // winit::keyboard::KeyCode::MediaPlayPause => todo!(),
469                // winit::keyboard::KeyCode::WakeUp => todo!(),
470                // winit::keyboard::KeyCode::Meta => todo!(),
471                // winit::keyboard::KeyCode::Hyper => todo!(),
472                // winit::keyboard::KeyCode::Turbo => todo!(),
473                // winit::keyboard::KeyCode::Abort => todo!(),
474                // winit::keyboard::KeyCode::Resume => todo!(),
475                // winit::keyboard::KeyCode::Suspend => todo!(),
476                // winit::keyboard::KeyCode::Again => todo!(),
477                // winit::keyboard::KeyCode::Open => todo!(),
478                // winit::keyboard::KeyCode::Props => todo!(),
479                // winit::keyboard::KeyCode::Hiragana => todo!(),
480                // winit::keyboard::KeyCode::Katakana => todo!(),
481                // winit::keyboard::KeyCode::F25 => todo!(),
482                // winit::keyboard::KeyCode::F26 => todo!(),
483                // winit::keyboard::KeyCode::F27 => todo!(),
484                // winit::keyboard::KeyCode::F28 => todo!(),
485                // winit::keyboard::KeyCode::F29 => todo!(),
486                // winit::keyboard::KeyCode::F30 => todo!(),
487                // winit::keyboard::KeyCode::F31 => todo!(),
488                // winit::keyboard::KeyCode::F32 => todo!(),
489                // winit::keyboard::KeyCode::F33 => todo!(),
490                // winit::keyboard::KeyCode::F34 => todo!(),
491                // winit::keyboard::KeyCode::F35 => todo!(),
492                k => {
493                    info!("Unrecognized key {:?}", k);
494                    None
495                },
496            },
497            PhysicalKey::Unidentified(_) => None,
498        }
499    }
500}