diff --git a/src/event_loop/driver.rs b/src/event_loop/driver.rs index e300cc66..4fb57ff0 100644 --- a/src/event_loop/driver.rs +++ b/src/event_loop/driver.rs @@ -122,74 +122,7 @@ where let now = Instant::now(); thread::sleep(when - now); sender.send(S::Event::new_timeout_reached(when)) - .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't wake visibility manager"); + .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't wake manager"); }); } } - -/// For calling in only -mod c { - use super::*; - - use crate::main; - use crate::state::{Event, Presence}; - use crate::state::LayoutChoice; - use crate::state::visibility; - use crate::util; - use crate::util::c::Wrapped; - use std::os::raw::c_char; - - #[no_mangle] - pub extern "C" - fn squeek_state_send_force_visible(mgr: Wrapped) { - let sender = mgr.clone_ref(); - let sender = sender.borrow(); - sender.send(Event::Visibility(visibility::Event::ForceVisible)) - .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't send to state manager"); - } - - #[no_mangle] - pub extern "C" - fn squeek_state_send_force_hidden(sender: Wrapped) { - let sender = sender.clone_ref(); - let sender = sender.borrow(); - sender.send(Event::Visibility(visibility::Event::ForceHidden)) - .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't send to state manager"); - } - - #[no_mangle] - pub extern "C" - fn squeek_state_send_keyboard_present(sender: Wrapped, present: u32) { - let sender = sender.clone_ref(); - let sender = sender.borrow(); - let state = - if present == 0 { Presence::Missing } - else { Presence::Present }; - sender.send(Event::PhysicalKeyboard(state)) - .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't send to state manager"); - } - - #[no_mangle] - pub extern "C" - fn squeek_state_send_layout_set( - sender: Wrapped, - name: *const c_char, - source: *const c_char, - // TODO: use when synthetic events are needed - _timestamp: u32, - ) { - let sender = sender.clone_ref(); - let sender = sender.borrow(); - let string_or_empty = |v| String::from( - util::c::as_str(v) - .unwrap_or(Some("")) - .unwrap_or("") - ); - sender - .send(Event::LayoutChoice(LayoutChoice { - name: string_or_empty(&name), - source: string_or_empty(&source).into(), - })) - .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't send to state manager"); - } -} diff --git a/src/main.rs b/src/main.rs index eb2af09a..c56b1053 100644 --- a/src/main.rs +++ b/src/main.rs @@ -91,6 +91,8 @@ mod c { // given that dbus handler is using glib. fn dbus_handler_set_visible(dbus: *const DBusHandler, visible: u8); } + + // INITIALIZATION /// Creates what's possible in Rust to eliminate as many FFI calls as possible, /// because types aren't getting checked across their boundaries, @@ -204,6 +206,70 @@ mod c { } } } + + // EVENT PASSING + + use crate::logging; + use crate::state::{Event, Presence}; + use crate::state::LayoutChoice; + use crate::state::visibility; + use crate::util; + + use logging::Warn; + + #[no_mangle] + pub extern "C" + fn squeek_state_send_force_visible(mgr: Wrapped) { + let sender = mgr.clone_ref(); + let sender = sender.borrow(); + sender.send(Event::Visibility(visibility::Event::ForceVisible)) + .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't send to state manager"); + } + + #[no_mangle] + pub extern "C" + fn squeek_state_send_force_hidden(sender: Wrapped) { + let sender = sender.clone_ref(); + let sender = sender.borrow(); + sender.send(Event::Visibility(visibility::Event::ForceHidden)) + .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't send to state manager"); + } + + #[no_mangle] + pub extern "C" + fn squeek_state_send_keyboard_present(sender: Wrapped, present: u32) { + let sender = sender.clone_ref(); + let sender = sender.borrow(); + let state = + if present == 0 { Presence::Missing } + else { Presence::Present }; + sender.send(Event::PhysicalKeyboard(state)) + .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't send to state manager"); + } + + #[no_mangle] + pub extern "C" + fn squeek_state_send_layout_set( + sender: Wrapped, + name: *const c_char, + source: *const c_char, + // TODO: use when synthetic events are needed + _timestamp: u32, + ) { + let sender = sender.clone_ref(); + let sender = sender.borrow(); + let string_or_empty = |v| String::from( + util::c::as_str(v) + .unwrap_or(Some("")) + .unwrap_or("") + ); + sender + .send(Event::LayoutChoice(LayoutChoice { + name: string_or_empty(&name), + source: string_or_empty(&source).into(), + })) + .or_warn(&mut logging::Print, logging::Problem::Warning, "Can't send to state manager"); + } }