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