1
0
Fork 0

x11: closure for building WindowHandler

This commit is contained in:
William Light 2020-10-20 21:31:44 +02:00
parent d5c3ba0bb0
commit 43cdc39335
3 changed files with 16 additions and 15 deletions

View file

@ -1,14 +1,10 @@
use baseview::{Event, Window, WindowHandler};
struct MyProgram {}
struct OpenWindowExample;
impl WindowHandler for MyProgram {
impl WindowHandler for OpenWindowExample {
type Message = ();
fn build(_window: &mut Window) -> Self {
Self {}
}
fn on_frame(&mut self) {}
fn on_event(&mut self, _window: &mut Window, event: Event) {
@ -30,6 +26,6 @@ fn main() {
parent: baseview::Parent::None,
};
let handle = Window::open::<MyProgram>(window_open_options);
let handle = Window::open(window_open_options, |_| OpenWindowExample);
handle.app_run_blocking();
}

View file

@ -42,8 +42,6 @@ pub struct WindowOpenOptions {
pub trait WindowHandler {
type Message;
fn build(window: &mut Window) -> Self;
fn on_frame(&mut self);
fn on_event(&mut self, window: &mut Window, event: Event);
fn on_message(&mut self, window: &mut Window, message: Self::Message);

View file

@ -41,11 +41,15 @@ impl WindowHandle {
type WindowOpenResult = Result<(), ()>;
impl Window {
pub fn open<H: WindowHandler>(options: WindowOpenOptions) -> WindowHandle {
pub fn open<H, B>(options: WindowOpenOptions, build: B) -> WindowHandle
where H: WindowHandler,
B: FnOnce(&mut Window) -> H,
B: Send + 'static
{
let (tx, rx) = mpsc::sync_channel::<WindowOpenResult>(1);
let thread = thread::spawn(move || {
if let Err(e) = Self::window_thread::<H>(options, tx.clone()) {
if let Err(e) = Self::window_thread::<H, B>(options, build, tx.clone()) {
let _ = tx.send(Err(e));
}
});
@ -56,9 +60,12 @@ impl Window {
WindowHandle { thread }
}
fn window_thread<H: WindowHandler>(
options: WindowOpenOptions, tx: mpsc::SyncSender<WindowOpenResult>,
) -> WindowOpenResult {
fn window_thread<H, B>(options: WindowOpenOptions, build: B,
tx: mpsc::SyncSender<WindowOpenResult>) -> WindowOpenResult
where H: WindowHandler,
B: FnOnce(&mut Window) -> H,
B: Send + 'static
{
// Connect to the X server
// FIXME: baseview error type instead of unwrap()
let xcb_connection = XcbConnection::new().unwrap();
@ -164,7 +171,7 @@ impl Window {
new_size: None
};
let mut handler = H::build(&mut window);
let mut handler = build(&mut window);
let _ = tx.send(Ok(()));