Skip to main content

DesktopIconData

Struct DesktopIconData 

Source
pub struct DesktopIconData { /* private fields */ }
Expand description

The desktop app’s identity and native-integration vocabulary, re-exported from the desktop core so app code never names a shell crate: DesktopConfig (the whole declaration — app name, reverse-DNS id, window icon, menu bar, last-window-close policy — handed to App::desktop, run_desktop_config or app!’s desktop = { .. } argument), MenuSpec/MenuItemSpec/MenuRole (the platform-independent native menu tree a per-OS shell translates into an NSApp menu bar or an HMENU), DesktopIconData (decoded, tightly-packed RGBA8 — decoding a PNG/ICO/ICNS is the caller’s job), and DEFAULT_APP_NAME (the window title a config that names nothing still gets).

frust-shell-desktop‘s IconData is re-exported renamed: the facade already carries frust-widgets’ IconData, an in-UI vector icon, and the two are unrelated (one is a BezPath a widget paints, the other is the window/taskbar bitmap the OS shows). The Desktop prefix matches DesktopConfig, whose with_window_icon is its only consumer.

use frust::{DesktopConfig, MenuItemSpec, MenuRole, MenuSpec};

let file = MenuSpec::new()
    .with_item(MenuItemSpec::item("file.open", "Open…").with_accelerator("CmdOrCtrl+O"))
    .with_item(MenuItemSpec::separator())
    .with_item(MenuItemSpec::role(MenuRole::Quit));

let config = DesktopConfig::new()
    .with_app_name("Huddle")
    .with_app_id("dev.frust.huddle")
    .with_menu_spec(MenuSpec::new().with_item(MenuItemSpec::submenu("File", file)));

Desktop-only, unlike the menu_events read side: these types are defined in frust-shell-desktop, which is not in a mobile build’s or a wasm32 build’s dependency graph at all (see this crate’s Cargo.toml). Code shared with a mobile or wasm32 target keeps a DesktopConfig behind its own #[cfg(not(any(target_os = "android", target_os = "ios", target_arch = "wasm32")))] — or, more simply, writes it inline in app!’s desktop = { .. } argument, which the macro already emits only on the targets that have it. A decoded window/app icon: tightly-packed, non-premultiplied RGBA8 rows, top-to-bottom — the one representation every desktop platform can be fed from (winit’s Icon::from_rgba, an NSImage bitmap rep, an HICON DIB).

Decoding a PNG/ICNS/ICO into this is the caller’s job: this crate carries no image decoder, and the tooling tier already owns the icon pipeline.

The rgba/width/height triple is an invariant, not three independent fields (rgba.len() == width * height * 4), so the fields are private and IconData::from_rgba is the only way in — an inconsistent icon reaches a platform API as a buffer overrun, not a wrong picture.

Debug is hand-written rather than derived (see the manual impl below): a derived one would dump the whole pixel buffer, drowning a log line in thousands of byte values for even a small icon.

Implementations§

Source§

impl IconData

Source

pub fn from_rgba(rgba: Vec<u8>, width: u32, height: u32) -> Option<IconData>

Wrap decoded RGBA8 pixels, or None when they do not describe a width × height image: either dimension is zero or exceeds MAX_ICON_SIDE, or rgba.len() != width * height * 4.

Option rather than a <Type>Error enum because there is exactly one failure mode and nothing to match on — and this crate carries no thiserror dependency to add one with (version pins are law). The caller that decoded the image is the one holding the context worth reporting.

Check order matters. The dimension cap runs before the size arithmetic below it, so a hostile width/height is rejected on a cheap comparison rather than reaching the multiply (or, on a caller that already allocated rgba to match, whatever cost that allocation carried) at all.

Source

pub fn rgba(&self) -> &[u8] ⓘ

The tightly-packed RGBA8 pixels (width * height * 4 bytes).

Source

pub fn width(&self) -> u32

The image width in pixels (never zero, never above MAX_ICON_SIDE).

Source

pub fn height(&self) -> u32

The image height in pixels (never zero, never above MAX_ICON_SIDE).

Trait Implementations§

Source§

impl Clone for IconData

Source§

fn clone(&self) -> IconData

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for IconData

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Prints rgba.len() rather than the buffer itself (see the type’s doc comment) — the pixel count is all a log line needs to say.

Source§

impl Eq for IconData

Source§

impl PartialEq for IconData

Source§

fn eq(&self, other: &IconData) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for IconData

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &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
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more