use std::sync::{Arc, Mutex};
use super::{From, Registry, Region, WSurface};
use ffi::interfaces::compositor::{wl_compositor, wl_compositor_destroy};
use ffi::{FFI, Bind, abi};
struct CompositorInternal {
_registry: Registry,
ptr: *mut wl_compositor
}
unsafe impl Send for CompositorInternal {}
#[derive(Clone)]
pub struct Compositor {
internal: Arc<Mutex<CompositorInternal>>
}
impl Compositor {
pub fn create_surface(&self) -> WSurface {
From::from(self.clone())
}
pub fn create_region(&self) -> Region {
From::from(self.clone())
}
}
impl Bind<Registry> for Compositor {
fn interface() -> &'static abi::wl_interface {
abi::WAYLAND_CLIENT_HANDLE.wl_compositor_interface
}
unsafe fn wrap(ptr: *mut wl_compositor, registry: Registry) -> Compositor {
Compositor {
internal: Arc::new(Mutex::new(CompositorInternal {
_registry: registry,
ptr: ptr
}))
}
}
}
impl Drop for CompositorInternal {
fn drop(&mut self) {
unsafe { wl_compositor_destroy(self.ptr) };
}
}
impl FFI for Compositor {
type Ptr = wl_compositor;
fn ptr(&self) -> *const wl_compositor {
self.internal.lock().unwrap().ptr as *const wl_compositor
}
unsafe fn ptr_mut(&self) -> *mut wl_compositor {
self.internal.lock().unwrap().ptr
}
}