use browser_window_ffi::*;
use std::marker::PhantomData;
use std::ops::Deref;
use std::rc::Rc;
use std::sync::Arc;
use super::common::*;
#[derive(Clone)]
pub struct Application {
pub(in super) inner: Arc<ApplicationInner>,
_not_send: PhantomData<Rc<u8>>
}
#[derive(Clone)]
pub struct ApplicationAsync {
pub(in super) inner: Arc<ApplicationInner>
}
#[derive(Clone)]
pub struct ApplicationHandle {
pub(in super) _ffi_handle: *mut bw_Application
}
unsafe impl Send for ApplicationHandle {}
unsafe impl Sync for ApplicationHandle {}
pub type ApplicationDispatchFuture<'a,R> = DispatchFuture<'a, ApplicationHandle, R>;
pub struct ApplicationInner {
pub(in super) handle: ApplicationHandle
}
impl Application {
pub fn exit( &self, exit_code: i32 ) {
unsafe { bw_Application_exit( self._ffi_handle, exit_code as _ ); }
}
pub fn into_async( self ) -> ApplicationAsync {
ApplicationAsync {
inner: self.inner
}
}
pub fn run( &self ) -> i32 {
unsafe { bw_Application_run( self._ffi_handle ) }
}
pub fn start() -> Self {
let ffi_handle = unsafe { bw_Application_start() };
Self {
inner: Arc::new( ApplicationInner{
handle: ApplicationHandle::from_ptr( ffi_handle )
} ),
_not_send: PhantomData
}
}
}
impl Deref for Application {
type Target = ApplicationHandle;
fn deref( &self ) -> &Self::Target {
&**self.inner
}
}
impl ApplicationAsync {
pub fn dispatch<'a,F,R>( &self, func: F ) -> ApplicationDispatchFuture<'a,R> where
F: FnOnce( ApplicationHandle ) -> R + Send + 'a,
R: Send
{
ApplicationDispatchFuture::<'a,R>::new( (**self).clone(), func )
}
pub fn exit( &self, exit_code: i32 ) {
unsafe { bw_Application_exitAsync( self.inner.handle._ffi_handle, exit_code as _ ); }
}
}
impl Deref for ApplicationAsync {
type Target = ApplicationHandle;
fn deref( &self ) -> &Self::Target {
&self.inner.handle
}
}
impl From<Application> for ApplicationAsync {
fn from( app: Application ) -> ApplicationAsync {
app.into_async()
}
}
impl ApplicationHandle {
fn from_ptr( ptr: *mut bw_Application ) -> ApplicationHandle {
ApplicationHandle {
_ffi_handle: ptr
}
}
}
impl HasAppHandle for ApplicationHandle {
fn app_handle( &self ) -> ApplicationHandle {
self.clone()
}
}
impl Deref for ApplicationInner {
type Target = ApplicationHandle;
fn deref( &self ) -> &Self::Target {
&self.handle
}
}
impl Drop for ApplicationInner {
fn drop( &mut self ) {
unsafe { bw_Application_free( self.handle._ffi_handle ); }
}
}