Skip to main content

cbf_chrome/data/
input.rs

1//! Chrome-specific keyboard and mouse-wheel input event types, with conversions to/from `cbf` equivalents.
2
3use cbf::data::{
4    key::{KeyEvent, KeyEventType},
5    mouse::{MouseWheelEvent, ScrollGranularity},
6};
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum ChromeKeyEventType {
10    RawKeyDown,
11    KeyDown,
12    KeyUp,
13    Char,
14}
15
16impl From<KeyEventType> for ChromeKeyEventType {
17    fn from(value: KeyEventType) -> Self {
18        match value {
19            KeyEventType::RawKeyDown => Self::RawKeyDown,
20            KeyEventType::KeyDown => Self::KeyDown,
21            KeyEventType::KeyUp => Self::KeyUp,
22            KeyEventType::Char => Self::Char,
23        }
24    }
25}
26
27impl From<ChromeKeyEventType> for KeyEventType {
28    fn from(value: ChromeKeyEventType) -> Self {
29        match value {
30            ChromeKeyEventType::RawKeyDown => Self::RawKeyDown,
31            ChromeKeyEventType::KeyDown => Self::KeyDown,
32            ChromeKeyEventType::KeyUp => Self::KeyUp,
33            ChromeKeyEventType::Char => Self::Char,
34        }
35    }
36}
37
38#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39pub enum ChromeScrollGranularity {
40    PrecisePixel,
41    Pixel,
42    Line,
43    Page,
44    Document,
45}
46
47impl From<ScrollGranularity> for ChromeScrollGranularity {
48    fn from(value: ScrollGranularity) -> Self {
49        match value {
50            ScrollGranularity::PrecisePixel => Self::PrecisePixel,
51            ScrollGranularity::Pixel => Self::Pixel,
52            ScrollGranularity::Line => Self::Line,
53            ScrollGranularity::Page => Self::Page,
54            ScrollGranularity::Document => Self::Document,
55        }
56    }
57}
58
59impl From<ChromeScrollGranularity> for ScrollGranularity {
60    fn from(value: ChromeScrollGranularity) -> Self {
61        match value {
62            ChromeScrollGranularity::PrecisePixel => Self::PrecisePixel,
63            ChromeScrollGranularity::Pixel => Self::Pixel,
64            ChromeScrollGranularity::Line => Self::Line,
65            ChromeScrollGranularity::Page => Self::Page,
66            ChromeScrollGranularity::Document => Self::Document,
67        }
68    }
69}
70
71/// Chromium-specific keyboard input payload.
72///
73/// Field names intentionally match Chromium/bridge vocabulary.
74#[derive(Debug, Clone, PartialEq, Eq)]
75pub struct ChromeKeyEvent {
76    pub type_: ChromeKeyEventType,
77    pub modifiers: u32,
78    pub windows_key_code: i32,
79    pub native_key_code: i32,
80    pub dom_code: Option<String>,
81    pub dom_key: Option<String>,
82    pub text: Option<String>,
83    pub unmodified_text: Option<String>,
84    pub auto_repeat: bool,
85    pub is_keypad: bool,
86    pub is_system_key: bool,
87    pub location: i32,
88}
89
90impl From<KeyEvent> for ChromeKeyEvent {
91    fn from(value: KeyEvent) -> Self {
92        Self {
93            type_: value.type_.into(),
94            modifiers: value.modifiers,
95            windows_key_code: value.key_code,
96            native_key_code: value.platform_key_code,
97            dom_code: value.dom_code,
98            dom_key: value.dom_key,
99            text: value.text,
100            unmodified_text: value.unmodified_text,
101            auto_repeat: value.auto_repeat,
102            is_keypad: value.is_keypad,
103            is_system_key: value.is_system_key,
104            location: value.location,
105        }
106    }
107}
108
109impl From<ChromeKeyEvent> for KeyEvent {
110    fn from(value: ChromeKeyEvent) -> Self {
111        Self {
112            type_: value.type_.into(),
113            modifiers: value.modifiers,
114            key_code: value.windows_key_code,
115            platform_key_code: value.native_key_code,
116            dom_code: value.dom_code,
117            dom_key: value.dom_key,
118            text: value.text,
119            unmodified_text: value.unmodified_text,
120            auto_repeat: value.auto_repeat,
121            is_keypad: value.is_keypad,
122            is_system_key: value.is_system_key,
123            location: value.location,
124        }
125    }
126}
127
128/// Chromium-specific mouse wheel payload.
129///
130/// Includes wheel phase fields that are omitted from generic `cbf` input.
131#[derive(Debug, Clone, PartialEq)]
132pub struct ChromeMouseWheelEvent {
133    pub modifiers: u32,
134    pub position_in_widget_x: f32,
135    pub position_in_widget_y: f32,
136    pub position_in_screen_x: f32,
137    pub position_in_screen_y: f32,
138    pub movement_x: f32,
139    pub movement_y: f32,
140    pub is_raw_movement_event: bool,
141    pub delta_x: f32,
142    pub delta_y: f32,
143    pub wheel_ticks_x: f32,
144    pub wheel_ticks_y: f32,
145    pub phase: u32,
146    pub momentum_phase: u32,
147    pub delta_units: ChromeScrollGranularity,
148}
149
150impl From<MouseWheelEvent> for ChromeMouseWheelEvent {
151    fn from(value: MouseWheelEvent) -> Self {
152        Self {
153            modifiers: value.modifiers,
154            position_in_widget_x: value.position_in_widget_x,
155            position_in_widget_y: value.position_in_widget_y,
156            position_in_screen_x: value.position_in_screen_x,
157            position_in_screen_y: value.position_in_screen_y,
158            movement_x: value.movement_x,
159            movement_y: value.movement_y,
160            is_raw_movement_event: value.is_raw_movement_event,
161            delta_x: value.delta_x,
162            delta_y: value.delta_y,
163            wheel_ticks_x: value.wheel_ticks_x,
164            wheel_ticks_y: value.wheel_ticks_y,
165            phase: 0,
166            momentum_phase: 0,
167            delta_units: value.delta_units.into(),
168        }
169    }
170}
171
172impl From<ChromeMouseWheelEvent> for MouseWheelEvent {
173    fn from(value: ChromeMouseWheelEvent) -> Self {
174        Self {
175            modifiers: value.modifiers,
176            position_in_widget_x: value.position_in_widget_x,
177            position_in_widget_y: value.position_in_widget_y,
178            position_in_screen_x: value.position_in_screen_x,
179            position_in_screen_y: value.position_in_screen_y,
180            movement_x: value.movement_x,
181            movement_y: value.movement_y,
182            is_raw_movement_event: value.is_raw_movement_event,
183            delta_x: value.delta_x,
184            delta_y: value.delta_y,
185            wheel_ticks_x: value.wheel_ticks_x,
186            wheel_ticks_y: value.wheel_ticks_y,
187            delta_units: value.delta_units.into(),
188        }
189    }
190}