pub enum ResolvedSurfaceMode {
Unknown,
Opaque,
Translucent,
RefusedTranslucent,
}Expand description
App-facing resolved surface mode — the read-only outward half of the Mode B seam whose setter is deliberately absent (see the comment above): what the platform actually gave this process, not what the host asked for.
resolved_surface_mode answers ResolvedSurfaceMode::Unknown until a
shell publishes (no surface yet, or the desktop preview, which has no Mode
B host seam), then Opaque/Translucent — or
ResolvedSurfaceMode::RefusedTranslucent, the case this exists for: the
host declared Mode B and the platform resolved the surface opaque anyway
(no matching CompositeAlphaMode; see docs/NATIVE_WIDGETS_ARCHITECTURE.md’s
Mode-B paragraph). frust’s paint side degrades to
the Mode A contract on its own, but the host’s native-sibling z-order was
fixed at build time, so a sibling arranged behind the surface is
invisible and untappable. Branch on
ResolvedSurfaceMode::translucency_refused to render a deliberate
fallback instead of a dead rect.
This is a poll, not a subscription — the same contract as
set_app_theme’s slot: reading it subscribes to nothing and a change
never wakes a frame by itself. Read it during a rebuild (or paint/an event
handler) on the UI thread, exactly where you’d read any other
process-global shell state, and if the answer must change your UI’s shape,
write it into your own state so the normal dirty path runs.
use frust::{ResolvedSurfaceMode, resolved_surface_mode};
// A native-widget slot deciding whether its platform sibling can actually
// be seen this frame.
let native_sibling_visible = match resolved_surface_mode() {
ResolvedSurfaceMode::RefusedTranslucent => false,
ResolvedSurfaceMode::Unknown
| ResolvedSurfaceMode::Opaque
| ResolvedSurfaceMode::Translucent => true,
};What the platform actually gave us, as opposed to what the host
declared (SurfaceMode) — see the module docs’ The RESOLVED slot.
Read via resolved_surface_mode (re-exported by the frust facade);
published only by the two mobile shells, once per frame, from the same
value that drives RenderRoot::set_surface_translucent.
Variants§
Unknown
No shell has published a resolution yet: no surface exists, or the
running shell doesn’t participate (the desktop preview shell never
publishes — it has no Mode B host seam). Not a synonym for
Opaque: app code that must distinguish “opaque” from “don’t know yet”
(e.g. deferring a fallback decision to the next frame) can.
Opaque
The live surface came up opaque, and that is what the host asked for — the ordinary Mode A contract every pre-platform-views app runs under.
Translucent
The live surface came up translucent: frust clears to a transparent
base and platform_view punches its slot rects (Mode B).
RefusedTranslucent
The refusal (translucencyRefused): the host declared Mode B, and
the platform resolved the surface opaque anyway — no matching
CompositeAlphaMode (the engine’s premultiplied output has no other
refusal case; see docs/NATIVE_WIDGETS_ARCHITECTURE.md’s Mode-B
paragraph).
frust’s own paint side degrades correctly (opaque clear, no hole punch), but the host’s native-sibling z-order was fixed at build time: a sibling arranged behind the now-opaque surface is invisible and untappable. That is what this variant exists to tell app/plugin code — so it can render its own fallback content instead of a dead rect.
Implementations§
Source§impl ResolvedSurfaceMode
impl ResolvedSurfaceMode
Sourcepub const fn resolve(
declared: SurfaceMode,
resolved_translucent: bool,
) -> ResolvedSurfaceMode
pub const fn resolve( declared: SurfaceMode, resolved_translucent: bool, ) -> ResolvedSurfaceMode
The pure mapping publish_resolved_surface_mode applies, split out so
it is testable without touching the process-global slots: a resolved
translucent surface is Translucent; a resolved
opaque one is RefusedTranslucent when the
host declared translucency and Opaque when it didn’t.
Never returns Unknown — that variant means “nobody
published”, which is the slot’s initial state, not a resolution.
Sourcepub const fn translucency_refused(self) -> bool
pub const fn translucency_refused(self) -> bool
true only for RefusedTranslucent — the
one-liner a native-widget fallback branches on
(if frust::resolved_surface_mode().translucency_refused() { ... }).
Sourcepub const fn is_translucent(self) -> bool
pub const fn is_translucent(self) -> bool
true only for Translucent, i.e. the frames
being painted right now really do follow the Mode B contract. Both
refusal and plain opacity answer false; so does
Unknown, since no surface has reported in.
Trait Implementations§
Source§impl Clone for ResolvedSurfaceMode
impl Clone for ResolvedSurfaceMode
Source§fn clone(&self) -> ResolvedSurfaceMode
fn clone(&self) -> ResolvedSurfaceMode
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for ResolvedSurfaceMode
Source§impl Debug for ResolvedSurfaceMode
impl Debug for ResolvedSurfaceMode
Source§impl Default for ResolvedSurfaceMode
impl Default for ResolvedSurfaceMode
Source§fn default() -> ResolvedSurfaceMode
fn default() -> ResolvedSurfaceMode
impl Eq for ResolvedSurfaceMode
Source§impl PartialEq for ResolvedSurfaceMode
impl PartialEq for ResolvedSurfaceMode
impl StructuralPartialEq for ResolvedSurfaceMode
Auto Trait Implementations§
impl Freeze for ResolvedSurfaceMode
impl RefUnwindSafe for ResolvedSurfaceMode
impl Send for ResolvedSurfaceMode
impl Sync for ResolvedSurfaceMode
impl Unpin for ResolvedSurfaceMode
impl UnsafeUnpin for ResolvedSurfaceMode
impl UnwindSafe for ResolvedSurfaceMode
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> Brush for T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.