event loop: Move event handlers from event loop driver to main loop
This commit is contained in:
@ -122,74 +122,7 @@ where
|
|||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
thread::sleep(when - now);
|
thread::sleep(when - now);
|
||||||
sender.send(S::Event::new_timeout_reached(when))
|
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<main::EventLoop>) {
|
|
||||||
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<main::EventLoop>) {
|
|
||||||
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<main::EventLoop>, 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<main::EventLoop>,
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
66
src/main.rs
66
src/main.rs
@ -92,6 +92,8 @@ mod c {
|
|||||||
fn dbus_handler_set_visible(dbus: *const DBusHandler, visible: u8);
|
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,
|
/// Creates what's possible in Rust to eliminate as many FFI calls as possible,
|
||||||
/// because types aren't getting checked across their boundaries,
|
/// because types aren't getting checked across their boundaries,
|
||||||
/// and that leads to suffering.
|
/// and that leads to suffering.
|
||||||
@ -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<EventLoop>) {
|
||||||
|
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<EventLoop>) {
|
||||||
|
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<EventLoop>, 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<EventLoop>,
|
||||||
|
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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user