#![allow(clippy::needless_doctest_main)]
mod api;
mod context;
mod device;
mod event;
mod geometry;
pub mod ime;
mod monitor;
mod procedure;
#[cfg(any(feature = "raw_input", doc))]
pub mod raw_input;
mod resource;
mod window;
#[macro_use]
pub mod error;
pub use context::RunType;
pub use device::*;
#[doc(inline)]
pub use error::ApiError;
pub use event::*;
pub use geometry::*;
pub use monitor::*;
pub use resource::*;
pub use window::*;
use context::*;
use std::ptr::null_mut;
use winapi::um::winuser::*;
pub const DEFAULT_DPI: i32 = 96;
pub fn run<F, T, E>(run_type: RunType, f: F) -> Result<(), E>
where
F: FnOnce() -> Result<T, E>,
T: EventHandler + 'static,
{
api::enable_dpi_awareness();
api::enable_gui_thread();
window::register_class::<T>();
context::create_context();
let handler = f();
match handler {
Ok(handler) => set_event_handler(handler),
Err(e) => return Err(e),
}
let mut msg = MSG::default();
match run_type {
RunType::Idle => unsafe {
while msg.message != WM_QUIT {
call_handler(|eh: &mut T, _| eh.begin_frame());
if PeekMessageW(&mut msg, null_mut(), 0, 0, PM_REMOVE) != 0 {
TranslateMessage(&msg);
DispatchMessageW(&msg);
} else {
call_handler(|eh: &mut T, _| eh.idle());
}
maybe_resume_unwind();
call_handler(|eh: &mut T, _| eh.end_frame());
}
},
RunType::Wait => unsafe {
loop {
let ret = GetMessageW(&mut msg, null_mut(), 0, 0);
if ret == 0 || ret == -1 {
break;
}
TranslateMessage(&msg);
DispatchMessageW(&msg);
maybe_resume_unwind();
}
},
}
destroy_context();
Ok(())
}