Merge branch 'master' of https://github.com/RustAudio/baseview into master
This commit is contained in:
commit
61ef63409b
|
@ -1,14 +1,10 @@
|
||||||
use baseview::{Event, Window, WindowHandler, WindowSize, WindowScalePolicy};
|
use baseview::{Event, Window, WindowHandler, WindowSize, WindowScalePolicy};
|
||||||
|
|
||||||
struct MyProgram {}
|
struct OpenWindowExample;
|
||||||
|
|
||||||
impl WindowHandler for MyProgram {
|
impl WindowHandler for OpenWindowExample {
|
||||||
type Message = ();
|
type Message = ();
|
||||||
|
|
||||||
fn build(_window: &mut Window) -> Self {
|
|
||||||
Self {}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn on_frame(&mut self) {}
|
fn on_frame(&mut self) {}
|
||||||
|
|
||||||
fn on_event(&mut self, _window: &mut Window, event: Event) {
|
fn on_event(&mut self, _window: &mut Window, event: Event) {
|
||||||
|
@ -35,6 +31,6 @@ fn main() {
|
||||||
parent: baseview::Parent::None,
|
parent: baseview::Parent::None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let (handle, _window_info) = Window::open::<MyProgram>(window_open_options).unwrap();
|
let handle = Window::open(window_open_options, |_| OpenWindowExample);
|
||||||
handle.app_run_blocking();
|
handle.app_run_blocking();
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,8 +40,6 @@ type WindowOpenResult = Result<WindowInfo, ()>;
|
||||||
pub trait WindowHandler {
|
pub trait WindowHandler {
|
||||||
type Message;
|
type Message;
|
||||||
|
|
||||||
fn build(window: &mut Window) -> Self;
|
|
||||||
|
|
||||||
fn on_frame(&mut self);
|
fn on_frame(&mut self);
|
||||||
fn on_event(&mut self, window: &mut Window, event: Event);
|
fn on_event(&mut self, window: &mut Window, event: Event);
|
||||||
fn on_message(&mut self, window: &mut Window, message: Self::Message);
|
fn on_message(&mut self, window: &mut Window, message: Self::Message);
|
||||||
|
|
|
@ -33,7 +33,11 @@ impl WindowHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Window {
|
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
|
||||||
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let _pool = NSAutoreleasePool::new(nil);
|
let _pool = NSAutoreleasePool::new(nil);
|
||||||
|
|
||||||
|
@ -59,7 +63,7 @@ impl Window {
|
||||||
|
|
||||||
let mut window = Window { ns_window, ns_view };
|
let mut window = Window { ns_window, ns_view };
|
||||||
|
|
||||||
let handler = H::build(&mut window);
|
let handler = build(&mut window);
|
||||||
|
|
||||||
// FIXME: only do this in the unparented case
|
// FIXME: only do this in the unparented case
|
||||||
let current_app = NSRunningApplication::currentApplication(nil);
|
let current_app = NSRunningApplication::currentApplication(nil);
|
||||||
|
|
|
@ -173,7 +173,11 @@ impl WindowHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Window {
|
impl Window {
|
||||||
pub fn open<H: WindowHandler>(options: WindowOpenOptions) -> Result<(WindowHandle, WindowInfo), ()> {
|
pub fn open<H, B>(options: WindowOpenOptions, build: B) -> WindowHandle
|
||||||
|
where H: WindowHandler,
|
||||||
|
B: FnOnce(&mut Window) -> H,
|
||||||
|
B: Send + 'static
|
||||||
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let title = (options.title.to_owned() + "\0").as_ptr() as *const i8;
|
let title = (options.title.to_owned() + "\0").as_ptr() as *const i8;
|
||||||
|
|
||||||
|
@ -239,7 +243,7 @@ impl Window {
|
||||||
|
|
||||||
let mut window = Window { hwnd };
|
let mut window = Window { hwnd };
|
||||||
|
|
||||||
let handler = H::build(&mut window);
|
let handler = build(&mut window);
|
||||||
|
|
||||||
let window_state = Box::new(RefCell::new(WindowState {
|
let window_state = Box::new(RefCell::new(WindowState {
|
||||||
window_class,
|
window_class,
|
||||||
|
|
|
@ -40,11 +40,15 @@ impl WindowHandle {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Window {
|
impl Window {
|
||||||
pub fn open<H: WindowHandler>(options: WindowOpenOptions) -> Result<(WindowHandle, WindowInfo), ()> {
|
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 (tx, rx) = mpsc::sync_channel::<WindowOpenResult>(1);
|
||||||
|
|
||||||
let thread = thread::spawn(move || {
|
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));
|
let _ = tx.send(Err(e));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -55,9 +59,12 @@ impl Window {
|
||||||
Ok((WindowHandle { thread }, window_info))
|
Ok((WindowHandle { thread }, window_info))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn window_thread<H: WindowHandler>(
|
fn window_thread<H, B>(options: WindowOpenOptions, build: B,
|
||||||
options: WindowOpenOptions, tx: mpsc::SyncSender<WindowOpenResult>,
|
tx: mpsc::SyncSender<WindowOpenResult>) -> WindowOpenResult
|
||||||
) -> WindowOpenResult {
|
where H: WindowHandler,
|
||||||
|
B: FnOnce(&mut Window) -> H,
|
||||||
|
B: Send + 'static
|
||||||
|
{
|
||||||
// Connect to the X server
|
// Connect to the X server
|
||||||
// FIXME: baseview error type instead of unwrap()
|
// FIXME: baseview error type instead of unwrap()
|
||||||
let xcb_connection = XcbConnection::new().unwrap();
|
let xcb_connection = XcbConnection::new().unwrap();
|
||||||
|
@ -168,7 +175,7 @@ impl Window {
|
||||||
new_physical_size: None,
|
new_physical_size: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut handler = H::build(&mut window);
|
let mut handler = build(&mut window);
|
||||||
|
|
||||||
let _ = tx.send(Ok(window_info));
|
let _ = tx.send(Ok(window_info));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue