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(not(feature = "worker-runtime"), no_mangle)]
47pub extern "C" fn __fui_debug_pointer_event(
48 event_type: u32,
49 handle: u64,
50 x: f32,
51 y: f32,
52 modifiers: u32,
53) {
54 event::dispatch_pointer_event(
55 NodeHandle::from_raw(handle),
56 match event_type {
57 1 => PointerEventType::Down,
58 2 => PointerEventType::Up,
59 3 => PointerEventType::Move,
60 4 => PointerEventType::Enter,
61 5 => PointerEventType::Leave,
62 _ => PointerEventType::Cancel,
63 },
64 x,
65 y,
66 modifiers,
67 -1,
68 PointerType::Mouse,
69 0,
70 0,
71 0.0,
72 0.0,
73 0.0,
74 0,
75 );
76}
77
78#[cfg_attr(not(feature = "worker-runtime"), no_mangle)]
79pub unsafe extern "C" fn __fui_debug_key_event(
82 event_type: u32,
83 key_ptr: *const u8,
84 key_len: u32,
85 modifiers: u32,
86) {
87 let key = if key_ptr.is_null() || key_len == 0 {
88 String::new()
89 } else {
90 let bytes = unsafe { std::slice::from_raw_parts(key_ptr, key_len as usize) };
91 String::from_utf8_lossy(bytes).into_owned()
92 };
93 event::dispatch_key_event(
94 match event_type {
95 2 => KeyEventType::Up,
96 _ => KeyEventType::Down,
97 },
98 key,
99 modifiers,
100 );
101}
102
103#[cfg_attr(not(feature = "worker-runtime"), no_mangle)]
104pub extern "C" fn __fui_debug_focus_changed(handle: u64, focused: bool) {
105 event::dispatch_focus_changed(NodeHandle::from_raw(handle), focused);
106}
107
108#[cfg_attr(not(feature = "worker-runtime"), no_mangle)]
109pub extern "C" fn __fui_debug_scroll(
110 handle: u64,
111 offset_x: f32,
112 offset_y: f32,
113 content_width: f32,
114 content_height: f32,
115 viewport_width: f32,
116 viewport_height: f32,
117) {
118 event::dispatch_scroll(
119 NodeHandle::from_raw(handle),
120 offset_x,
121 offset_y,
122 content_width,
123 content_height,
124 viewport_width,
125 viewport_height,
126 );
127}
128
129pub fn debug_tree_words() -> Vec<u32> {
130 let mut len = 0u32;
131 let ptr = unsafe { ffi::ui_get_debug_tree_buffer(&mut len as *mut u32) };
132 if ptr.is_null() || len == 0 {
133 return Vec::new();
134 }
135 unsafe { std::slice::from_raw_parts(ptr, len as usize) }.to_vec()
136}
137
138#[cfg(test)]
139mod tests {
140 use super::debug_tree_words;
141 use crate::ffi;
142
143 #[test]
144 fn reads_debug_tree_words_from_host() {
145 ffi::test::reset();
146 ffi::test::set_debug_tree_words(&[1, 2, 3, 4]);
147 assert_eq!(debug_tree_words(), vec![1, 2, 3, 4]);
148 }
149}