dioxus_desktop/
trayicon.rs

1//! tray icon
2
3use dioxus_core::{
4    prelude::{provide_context, try_consume_context},
5    use_hook,
6};
7
8#[cfg(not(any(target_os = "ios", target_os = "android")))]
9pub use tray_icon::*;
10
11/// tray icon menu type trait
12#[cfg(not(any(target_os = "ios", target_os = "android")))]
13pub type DioxusTrayMenu = tray_icon::menu::Menu;
14#[cfg(any(target_os = "ios", target_os = "android"))]
15pub type DioxusTrayMenu = ();
16
17/// tray icon icon type trait
18#[cfg(not(any(target_os = "ios", target_os = "android")))]
19pub type DioxusTrayIcon = tray_icon::Icon;
20#[cfg(any(target_os = "ios", target_os = "android"))]
21pub type DioxusTrayIcon = ();
22
23/// tray icon type trait
24#[cfg(not(any(target_os = "ios", target_os = "android")))]
25pub type DioxusTray = tray_icon::TrayIcon;
26#[cfg(any(target_os = "ios", target_os = "android"))]
27pub type DioxusTray = ();
28
29/// initializes a tray icon
30#[allow(unused)]
31pub fn init_tray_icon(menu: DioxusTrayMenu, icon: Option<DioxusTrayIcon>) -> DioxusTray {
32    #[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
33    {
34        let builder = tray_icon::TrayIconBuilder::new()
35            .with_menu(Box::new(menu))
36            .with_menu_on_left_click(false)
37            .with_icon(match icon {
38                Some(value) => value,
39                None => tray_icon::Icon::from_rgba(
40                    include_bytes!("./assets/default_icon.bin").to_vec(),
41                    460,
42                    460,
43                )
44                .expect("image parse failed"),
45            });
46
47        provide_context(builder.build().expect("tray icon builder failed"))
48    }
49}
50
51/// Returns a default tray icon menu
52pub fn default_tray_icon() -> DioxusTrayMenu {
53    #[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
54    {
55        use tray_icon::menu::{Menu, PredefinedMenuItem};
56        let tray_menu = Menu::new();
57        tray_menu
58            .append_items(&[&PredefinedMenuItem::quit(None)])
59            .unwrap();
60        tray_menu
61    }
62}
63
64/// Provides a hook to the tray icon
65#[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
66pub fn use_tray_icon() -> Option<tray_icon::TrayIcon> {
67    use_hook(try_consume_context)
68}