Split off AppRunner from WindowHandle on Windows and Linux
This commit is contained in:
parent
c1d04b978e
commit
35a03aff17
|
@ -207,11 +207,25 @@ pub struct Window {
|
|||
hwnd: HWND,
|
||||
}
|
||||
|
||||
pub struct WindowHandle {
|
||||
pub struct WindowHandle<H: WindowHandler> {
|
||||
// FIXME: replace this with channel sender
|
||||
phantom_data: std::marker::PhantomData<H::Message>,
|
||||
}
|
||||
|
||||
impl <H: WindowHandler>WindowHandle<H> {
|
||||
pub fn try_send_message(
|
||||
&mut self,
|
||||
message: H::Message
|
||||
) -> Result<(), H::Message> {
|
||||
Err(message)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct AppRunner {
|
||||
hwnd: HWND,
|
||||
}
|
||||
|
||||
impl WindowHandle {
|
||||
impl AppRunner {
|
||||
pub fn app_run_blocking(self) {
|
||||
unsafe {
|
||||
let mut msg: MSG = std::mem::zeroed();
|
||||
|
@ -234,7 +248,7 @@ impl Window {
|
|||
pub fn open<H, B>(
|
||||
options: WindowOpenOptions,
|
||||
build: B
|
||||
) -> crate::WindowHandle
|
||||
) -> (crate::WindowHandle<H>, Option<crate::AppRunner>)
|
||||
where H: WindowHandler,
|
||||
B: FnOnce(&mut crate::Window) -> H,
|
||||
B: Send + 'static
|
||||
|
@ -311,7 +325,17 @@ impl Window {
|
|||
SetWindowLongPtrA(hwnd, GWLP_USERDATA, Box::into_raw(window_state) as *const _ as _);
|
||||
SetTimer(hwnd, 4242, 13, None);
|
||||
|
||||
crate::WindowHandle(WindowHandle { hwnd })
|
||||
let window_handle = crate::WindowHandle(WindowHandle {
|
||||
phantom_data: std::marker::PhantomData,
|
||||
});
|
||||
|
||||
let opt_app_runner = if let crate::Parent::None = options.parent {
|
||||
Some(crate::AppRunner(AppRunner { hwnd }))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
(window_handle, opt_app_runner)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,12 +30,25 @@ pub struct Window {
|
|||
new_physical_size: Option<PhySize>
|
||||
}
|
||||
|
||||
// FIXME: move to outer crate context
|
||||
pub struct WindowHandle {
|
||||
pub struct WindowHandle<H: WindowHandler> {
|
||||
// FIXME: replace this with channel sender
|
||||
phantom_data: std::marker::PhantomData<H::Message>,
|
||||
}
|
||||
|
||||
impl <H: WindowHandler>WindowHandle<H> {
|
||||
pub fn try_send_message(
|
||||
&mut self,
|
||||
message: H::Message
|
||||
) -> Result<(), H::Message> {
|
||||
Err(message)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct AppRunner {
|
||||
thread: std::thread::JoinHandle<()>,
|
||||
}
|
||||
|
||||
impl WindowHandle {
|
||||
impl AppRunner {
|
||||
pub fn app_run_blocking(self) {
|
||||
let _ = self.thread.join();
|
||||
}
|
||||
|
@ -47,11 +60,13 @@ impl Window {
|
|||
pub fn open<H, B>(
|
||||
options: WindowOpenOptions,
|
||||
build: B
|
||||
) -> crate::WindowHandle
|
||||
) -> (crate::WindowHandle<H>, Option<crate::AppRunner>)
|
||||
where H: WindowHandler,
|
||||
B: FnOnce(&mut crate::Window) -> H,
|
||||
B: Send + 'static
|
||||
{
|
||||
let is_not_parented = matches!(options.parent, Parent::None);
|
||||
|
||||
let (tx, rx) = mpsc::sync_channel::<WindowOpenResult>(1);
|
||||
|
||||
let thread = thread::spawn(move || {
|
||||
|
@ -63,7 +78,17 @@ impl Window {
|
|||
// FIXME: placeholder types for returning errors in the future
|
||||
let _ = rx.recv();
|
||||
|
||||
crate::WindowHandle(WindowHandle { thread })
|
||||
let window_handle = crate::WindowHandle(WindowHandle {
|
||||
phantom_data: std::marker::PhantomData
|
||||
});
|
||||
|
||||
let opt_app_runner = if is_not_parented {
|
||||
Some(crate::AppRunner(AppRunner { thread }))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
(window_handle, opt_app_runner)
|
||||
}
|
||||
|
||||
fn window_thread<H, B>(options: WindowOpenOptions, build: B,
|
||||
|
|
Loading…
Reference in a new issue