1
0
Fork 0

Merge branch 'master' of https://github.com/RustAudio/baseview into master

This commit is contained in:
Billy Messenger 2020-10-20 15:56:54 -05:00
commit 61ef63409b
5 changed files with 28 additions and 19 deletions

View file

@ -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();
} }

View file

@ -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);

View file

@ -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);

View file

@ -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,

View file

@ -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));