use super::composition_object_impls::composition_object_impls;
use super::generated::{
CompositionVisualSurfaceHooks, CompositionVisualSurfaceProps, ServerCompositionVisualSurfaceProps,
};
use super::server::{ServerCompositionVisualSurface, ServerObjectId};
use super::transport::IRegisterForSerialization;
use super::{CompositionObject, CompositionVisual, Compositor, ICompositionObject, ICompositionSurface};
use crate::Vector;
use std::cell::Cell;
use std::rc::{Rc, Weak};
pub struct CompositionVisualSurface {
this: Weak<CompositionVisualSurface>,
object: CompositionObject,
props: CompositionVisualSurfaceProps,
freeze_requested: Cell<bool>,
}
impl CompositionVisualSurface {
pub(crate) fn new(compositor: &Rc<Compositor>) -> Rc<CompositionVisualSurface> {
let server = compositor.create_server_object(|compositor, _| ServerCompositionVisualSurface::new(compositor));
let surface = Rc::new_cyclic(|this: &Weak<CompositionVisualSurface>| CompositionVisualSurface {
this: this.clone(),
object: CompositionObject::new(compositor, Some(server)),
props: CompositionVisualSurfaceProps::new(),
freeze_requested: Cell::new(false),
});
surface.props.initialize_defaults(&*surface);
surface
}
pub fn compositor(&self) -> &Rc<Compositor> {
self.object.compositor()
}
pub fn object(&self) -> &CompositionObject {
&self.object
}
pub fn server(&self) -> ServerObjectId {
self.object.required_server()
}
pub fn is_disposed(&self) -> bool {
self.object.is_disposed()
}
pub fn dispose(&self) {
self.object.dispose();
}
pub fn props(&self) -> &CompositionVisualSurfaceProps {
&self.props
}
pub fn source_visual(&self) -> Option<Rc<CompositionVisual>> {
self.props.source_visual().and_then(|visual| visual.into_any_rc().downcast::<CompositionVisual>().ok())
}
pub fn set_source_visual(&self, value: Option<Rc<CompositionVisual>>) {
self.props.set_source_visual(self, value.map(|visual| visual as Rc<dyn ICompositionObject>))
}
pub fn source_offset(&self) -> Vector {
self.props.source_offset()
}
pub fn set_source_offset(&self, value: Vector) {
self.props.set_source_offset(self, value)
}
pub fn source_size(&self) -> Vector {
self.props.source_size()
}
pub fn set_source_size(&self, value: Vector) {
self.props.set_source_size(self, value)
}
pub fn freeze(&self) {
self.freeze_requested.set(true);
self.register_for_serialization();
}
}
impl CompositionVisualSurfaceHooks for CompositionVisualSurface {}
impl ICompositionSurface for CompositionVisualSurface {}
composition_object_impls!(
CompositionVisualSurface, "CompositionVisualSurface",
serialize: |this, writer| {
writer.write(this.freeze_requested.replace(false));
this.props.serialize_changes_core(this, writer)
},
start_animation: |this, name, animation, final_value| this.props.start_animation(this, name, animation, final_value),
composition_property: |_this, name| ServerCompositionVisualSurfaceProps::get_composition_property(name),
);