use super::*;
use std::cell::Cell;
use std::rc::Rc;
pub(crate) type Slot<T> = Rc<Cell<Option<Result<T>>>>;
pub(crate) fn slot<T>() -> Slot<T> {
Rc::new(Cell::new(None))
}
pub(crate) fn slot_handler<T: 'static>(slot: &Slot<T>) -> impl FnOnce(Result<T>) + 'static {
let slot = slot.clone();
move |result| slot.set(Some(result))
}
pub(crate) fn wait<T>(slot: &Slot<T>) -> Result<T> {
let mut message = MSG::default();
loop {
if let Some(value) = slot.take() {
return value;
}
unsafe {
match GetMessageW(&mut message, std::ptr::null_mut(), 0, 0).0 {
-1 => return Err(Error::from_thread()),
0 => return Err(Error::empty()),
_ => {
let _ = TranslateMessage(&message);
DispatchMessageW(&message);
}
}
}
}
}