#![warn(missing_docs)]
use crate::input::{MouseEvent, MouseEventType};
#[no_mangle]
pub extern "C" fn sixtyfps_mock_elapsed_time(time_in_ms: u64) {
crate::animations::CURRENT_ANIMATION_DRIVER.with(|driver| {
let mut tick = driver.current_tick();
tick += instant::Duration::from_millis(time_in_ms);
driver.update_animations(tick)
})
}
#[no_mangle]
pub extern "C" fn sixtyfps_send_mouse_click(
component: &crate::component::ComponentRc,
x: f32,
y: f32,
window: &crate::eventloop::ComponentWindow,
) {
let mut state = crate::input::MouseInputState::default();
vtable::VRc::borrow_pin(component).as_ref().apply_layout(window.0.get_geometry());
let pos = euclid::point2(x, y);
state = crate::input::process_mouse_input(
component.clone(),
MouseEvent { pos, what: MouseEventType::MouseMoved },
window,
state,
);
state = crate::input::process_mouse_input(
component.clone(),
MouseEvent { pos, what: MouseEventType::MousePressed },
window,
state,
);
sixtyfps_mock_elapsed_time(50);
crate::input::process_mouse_input(
component.clone(),
MouseEvent { pos, what: MouseEventType::MouseReleased },
window,
state,
);
}
#[no_mangle]
pub extern "C" fn sixtyfps_set_keyboard_modifiers(
window: &crate::eventloop::ComponentWindow,
modifiers: crate::input::KeyboardModifiers,
) {
window.set_current_keyboard_modifiers(modifiers)
}
#[no_mangle]
pub extern "C" fn sixtyfps_send_key_clicks(
key_codes: &crate::slice::Slice<crate::input::KeyCode>,
window: &crate::eventloop::ComponentWindow,
) {
for key_code in key_codes.iter() {
window.process_key_input(&crate::input::KeyEvent::KeyPressed {
code: *key_code,
modifiers: window.current_keyboard_modifiers(),
});
window.process_key_input(&crate::input::KeyEvent::KeyReleased {
code: *key_code,
modifiers: window.current_keyboard_modifiers(),
});
}
}
#[no_mangle]
pub extern "C" fn send_keyboard_string_sequence(
sequence: &crate::SharedString,
window: &crate::eventloop::ComponentWindow,
) {
use std::convert::TryInto;
let key_down = |maybe_code: &Option<crate::input::KeyCode>| {
maybe_code.clone().map(|code| {
window.process_key_input(&crate::input::KeyEvent::KeyPressed {
code: code,
modifiers: window.current_keyboard_modifiers(),
});
});
};
let key_up = |maybe_code: &Option<crate::input::KeyCode>| {
maybe_code.clone().map(|code| {
window.process_key_input(&crate::input::KeyEvent::KeyReleased {
code: code,
modifiers: window.current_keyboard_modifiers(),
});
});
};
for ch in sequence.chars() {
let maybe_key_code = if ch.is_ascii_uppercase() {
window.set_current_keyboard_modifiers(crate::input::SHIFT_MODIFIER.into());
ch.to_ascii_lowercase().try_into()
} else {
ch.try_into()
}
.ok();
key_down(&maybe_key_code);
window.process_key_input(&crate::input::KeyEvent::CharacterInput {
unicode_scalar: ch.into(),
modifiers: window.current_keyboard_modifiers(),
});
key_up(&maybe_key_code);
window.set_current_keyboard_modifiers(crate::input::NO_MODIFIER.into());
}
}