1use crate::event::{self, PointerType};
2use crate::ffi::{self, KeyEventType, PointerEventType};
3use crate::node::NodeHandle;
4
5#[allow(clippy::too_many_arguments)]
6pub fn pointer_event(
7 event_type: PointerEventType,
8 handle: NodeHandle,
9 x: f32,
10 y: f32,
11 modifiers: u32,
12 pointer_id: i32,
13 pointer_type: PointerType,
14 button: i32,
15 buttons: u32,
16 pressure: f32,
17 width: f32,
18 height: f32,
19 click_count: i32,
20) -> bool {
21 event::dispatch_pointer_event(
22 handle,
23 event_type,
24 x,
25 y,
26 modifiers,
27 pointer_id,
28 pointer_type,
29 button,
30 buttons,
31 pressure,
32 width,
33 height,
34 click_count,
35 )
36}
37
38pub fn focus_changed(handle: NodeHandle, focused: bool) {
39 event::dispatch_focus_changed(handle, focused);
40}
41
42pub fn key_event(event_type: KeyEventType, key: &str, modifiers: u32) -> bool {
43 event::dispatch_key_event(event_type, key.to_string(), modifiers)
44}
45
46#[cfg_attr(
47 any(not(feature = "worker-runtime"), feature = "native-runtime"),
48 no_mangle
49)]
50pub extern "C" fn __fui_debug_pointer_event(
51 event_type: u32,
52 handle: u64,
53 x: f32,
54 y: f32,
55 modifiers: u32,
56) {
57 event::dispatch_pointer_event(
58 NodeHandle::from_raw(handle),
59 match event_type {
60 1 => PointerEventType::Down,
61 2 => PointerEventType::Up,
62 3 => PointerEventType::Move,
63 4 => PointerEventType::Enter,
64 5 => PointerEventType::Leave,
65 _ => PointerEventType::Cancel,
66 },
67 x,
68 y,
69 modifiers,
70 -1,
71 PointerType::Mouse,
72 0,
73 0,
74 0.0,
75 0.0,
76 0.0,
77 0,
78 );
79}
80
81#[cfg_attr(
82 any(not(feature = "worker-runtime"), feature = "native-runtime"),
83 no_mangle
84)]
85pub unsafe extern "C" fn __fui_debug_key_event(
88 event_type: u32,
89 key_ptr: *const u8,
90 key_len: u32,
91 modifiers: u32,
92) {
93 let key = if key_ptr.is_null() || key_len == 0 {
94 String::new()
95 } else {
96 let bytes = unsafe { std::slice::from_raw_parts(key_ptr, key_len as usize) };
97 String::from_utf8_lossy(bytes).into_owned()
98 };
99 event::dispatch_key_event(
100 match event_type {
101 2 => KeyEventType::Up,
102 _ => KeyEventType::Down,
103 },
104 key,
105 modifiers,
106 );
107}
108
109#[cfg_attr(
110 any(not(feature = "worker-runtime"), feature = "native-runtime"),
111 no_mangle
112)]
113pub extern "C" fn __fui_debug_focus_changed(handle: u64, focused: bool) {
114 event::dispatch_focus_changed(NodeHandle::from_raw(handle), focused);
115}
116
117#[cfg_attr(
118 any(not(feature = "worker-runtime"), feature = "native-runtime"),
119 no_mangle
120)]
121pub extern "C" fn __fui_debug_scroll(
122 handle: u64,
123 offset_x: f32,
124 offset_y: f32,
125 content_width: f32,
126 content_height: f32,
127 viewport_width: f32,
128 viewport_height: f32,
129) {
130 event::dispatch_scroll(
131 NodeHandle::from_raw(handle),
132 offset_x,
133 offset_y,
134 content_width,
135 content_height,
136 viewport_width,
137 viewport_height,
138 );
139}
140
141pub fn debug_tree_words() -> Vec<u32> {
142 let mut len = 0u32;
143 let ptr = unsafe { ffi::ui_get_debug_tree_buffer(&mut len as *mut u32) };
144 if ptr.is_null() || len == 0 {
145 return Vec::new();
146 }
147 unsafe { std::slice::from_raw_parts(ptr, len as usize) }.to_vec()
148}
149
150#[cfg(test)]
151mod tests {
152 use super::debug_tree_words;
153 use crate::ffi;
154
155 #[test]
156 fn reads_debug_tree_words_from_host() {
157 ffi::test::reset();
158 ffi::test::set_debug_tree_words(&[1, 2, 3, 4]);
159 assert_eq!(debug_tree_words(), vec![1, 2, 3, 4]);
160 }
161}