Skip to main content

fui/
debug.rs

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)]
79/// # Safety
80/// `key_ptr` must be null for an empty key or point to `key_len` readable bytes.
81pub 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}