use super::generated::{RedirectVisualHooks, RedirectVisualProps};
use super::server::ServerRedirectVisual;
use super::visual::CompositionVisualKind;
use super::{CompositionVisual, CompositionVisualSurface, Compositor, ICompositionObject};
use std::ops::Deref;
use std::rc::Rc;
impl RedirectVisualHooks for CompositionVisual {}
#[derive(Clone)]
pub struct RedirectVisual(Rc<CompositionVisual>);
impl Deref for RedirectVisual {
type Target = Rc<CompositionVisual>;
fn deref(&self) -> &Rc<CompositionVisual> {
&self.0
}
}
impl RedirectVisual {
pub(crate) fn new(compositor: &Rc<Compositor>) -> RedirectVisual {
let visual = CompositionVisual::create(
compositor,
CompositionVisualKind::Redirect(RedirectVisualProps::new()),
|| Box::new(ServerRedirectVisual::new()),
);
visual.set_clip_to_bounds(false);
let this = RedirectVisual(visual);
let surface = CompositionVisualSurface::new(compositor);
this.props().set_source_surface(&*this.0, Some(surface as Rc<dyn ICompositionObject>));
this
}
pub(crate) fn with_source(compositor: &Rc<Compositor>, source: Option<Rc<CompositionVisual>>) -> RedirectVisual {
let visual = Self::new(compositor);
visual.set_source(source);
visual
}
pub fn from_visual(visual: &Rc<CompositionVisual>) -> Option<RedirectVisual> {
matches!(visual.kind, CompositionVisualKind::Redirect(_)).then(|| RedirectVisual(visual.clone()))
}
pub fn visual(&self) -> &Rc<CompositionVisual> {
&self.0
}
fn props(&self) -> &RedirectVisualProps {
match &self.0.kind {
CompositionVisualKind::Redirect(props) => props,
_ => unreachable!("a redirect visual handle wraps a redirect visual"),
}
}
pub(crate) fn source_surface(&self) -> Option<Rc<CompositionVisualSurface>> {
self.props()
.source_surface()
.and_then(|surface| surface.into_any_rc().downcast::<CompositionVisualSurface>().ok())
}
pub fn source(&self) -> Option<Rc<CompositionVisual>> {
self.props().source().and_then(|visual| visual.into_any_rc().downcast::<CompositionVisual>().ok())
}
pub fn set_source(&self, value: Option<Rc<CompositionVisual>>) {
if let Some(surface) = self.source_surface() {
surface.set_source_visual(value.clone());
}
self.props().set_source(&*self.0, value.map(|visual| visual as Rc<dyn ICompositionObject>))
}
}