fix two tray icon on macos
This commit is contained in:
parent
d093fdc256
commit
c02b4f994a
41
src/tray.rs
41
src/tray.rs
@ -18,7 +18,7 @@ pub fn make_tray() -> hbb_common::ResultType<()> {
|
|||||||
use tao::event_loop::{ControlFlow, EventLoopBuilder};
|
use tao::event_loop::{ControlFlow, EventLoopBuilder};
|
||||||
use tray_icon::{
|
use tray_icon::{
|
||||||
menu::{Menu, MenuEvent, MenuItem},
|
menu::{Menu, MenuEvent, MenuItem},
|
||||||
TrayIconBuilder, TrayIconEvent as TrayEvent,
|
TrayIcon, TrayIconBuilder, TrayIconEvent as TrayEvent,
|
||||||
};
|
};
|
||||||
let icon;
|
let icon;
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
@ -63,15 +63,7 @@ pub fn make_tray() -> hbb_common::ResultType<()> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let _tray_icon = Some(
|
let mut _tray_icon: Arc<Mutex<Option<TrayIcon>>> = Default::default();
|
||||||
TrayIconBuilder::new()
|
|
||||||
.with_menu(Box::new(tray_menu))
|
|
||||||
.with_tooltip(tooltip(0))
|
|
||||||
.with_icon(icon)
|
|
||||||
.with_icon_as_template(true) // mac only
|
|
||||||
.build()?,
|
|
||||||
);
|
|
||||||
let _tray_icon = Arc::new(Mutex::new(_tray_icon));
|
|
||||||
|
|
||||||
let menu_channel = MenuEvent::receiver();
|
let menu_channel = MenuEvent::receiver();
|
||||||
let tray_channel = TrayEvent::receiver();
|
let tray_channel = TrayEvent::receiver();
|
||||||
@ -114,11 +106,38 @@ pub fn make_tray() -> hbb_common::ResultType<()> {
|
|||||||
use tao::platform::macos::EventLoopExtMacOS;
|
use tao::platform::macos::EventLoopExtMacOS;
|
||||||
event_loop.set_activation_policy(tao::platform::macos::ActivationPolicy::Accessory);
|
event_loop.set_activation_policy(tao::platform::macos::ActivationPolicy::Accessory);
|
||||||
}
|
}
|
||||||
event_loop.run(move |_event, _, control_flow| {
|
event_loop.run(move |event, _, control_flow| {
|
||||||
*control_flow = ControlFlow::WaitUntil(
|
*control_flow = ControlFlow::WaitUntil(
|
||||||
std::time::Instant::now() + std::time::Duration::from_millis(100),
|
std::time::Instant::now() + std::time::Duration::from_millis(100),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if let tao::event::Event::NewEvents(tao::event::StartCause::Init) = event {
|
||||||
|
// We create the icon once the event loop is actually running
|
||||||
|
// to prevent issues like https://github.com/tauri-apps/tray-icon/issues/90
|
||||||
|
let tray = TrayIconBuilder::new()
|
||||||
|
.with_menu(Box::new(tray_menu.clone()))
|
||||||
|
.with_tooltip(tooltip(0))
|
||||||
|
.with_icon(icon.clone())
|
||||||
|
.with_icon_as_template(true) // mac only
|
||||||
|
.build();
|
||||||
|
match tray {
|
||||||
|
Ok(tray) => _tray_icon = Arc::new(Mutex::new(Some(tray))),
|
||||||
|
Err(err) => {
|
||||||
|
log::error!("Failed to create tray icon: {}", err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// We have to request a redraw here to have the icon actually show up.
|
||||||
|
// Tao only exposes a redraw method on the Window so we use core-foundation directly.
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
unsafe {
|
||||||
|
use core_foundation::runloop::{CFRunLoopGetMain, CFRunLoopWakeUp};
|
||||||
|
|
||||||
|
let rl = CFRunLoopGetMain();
|
||||||
|
CFRunLoopWakeUp(rl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Ok(event) = menu_channel.try_recv() {
|
if let Ok(event) = menu_channel.try_recv() {
|
||||||
if event.id == quit_i.id() {
|
if event.id == quit_i.id() {
|
||||||
/* failed in windows, seems no permission to check system process
|
/* failed in windows, seems no permission to check system process
|
||||||
|
Loading…
x
Reference in New Issue
Block a user