Skip to main content

running_process_platform_internal/platform/window_icon/
mod.rs

1//! Neutral window-icon mechanics and host result codes.
2
3use std::path::PathBuf;
4
5pub mod ico;
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub enum IconScope {
9    Host,
10    Child { pid: u32 },
11}
12
13#[derive(Clone, Copy, Debug, PartialEq, Eq)]
14pub enum StockIcon {
15    Application,
16    Warning,
17    Error,
18    Information,
19    Shield,
20}
21
22#[derive(Clone, Debug, PartialEq, Eq)]
23pub enum IconSource {
24    Path(PathBuf),
25    Bytes(Vec<u8>),
26    Stock(StockIcon),
27}
28
29#[derive(Clone, Copy, Debug, PartialEq, Eq)]
30pub enum IconDegradedReason {
31    WindowsTerminal,
32    NonClassicWindowsHost,
33    LinuxNameOnly,
34}
35
36#[derive(Clone, Copy, Debug, PartialEq, Eq)]
37pub enum IconUnsupportedReason {
38    ChildHasNoConsole,
39    NoConsole,
40    MacTerminalOwnsWindow,
41    Wayland,
42    NoBackend,
43    LinuxChildScope,
44    LinuxNoDisplay,
45    TargetDisappeared,
46    UnknownImageFormat,
47    StockNeedsPixels,
48    OversizedIcon,
49    UnsupportedPngColorType,
50    UnsupportedPngBitDepth,
51    UnsupportedX11VisualDepth,
52}
53
54#[derive(Clone, Copy, Debug, PartialEq, Eq)]
55pub enum IconSupport {
56    Available,
57    Degraded(IconDegradedReason),
58    Unsupported(IconUnsupportedReason),
59}
60
61#[derive(Debug, thiserror::Error)]
62pub enum IconError {
63    #[error("window-icon operation is unsupported: {0:?}")]
64    Unsupported(IconUnsupportedReason),
65    #[error("cannot load icon from {path}: {source}")]
66    Load {
67        path: PathBuf,
68        #[source]
69        source: std::io::Error,
70    },
71    #[error("the host refused the icon data: {0}")]
72    Apply(#[source] std::io::Error),
73    #[error("supplied icon data is unusable: {0}")]
74    Decode(ico::IcoError),
75}
76
77pub fn icon_support(scope: IconScope) -> IconSupport {
78    crate::window_icon_support_impl(scope)
79}
80
81pub fn set_icon(scope: IconScope, source: &IconSource) -> Result<(), IconError> {
82    crate::set_window_icon_impl(scope, source)
83}