mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-04-13 21:40:33 +08:00
53 lines
1.5 KiB
Rust
53 lines
1.5 KiB
Rust
use super::CmdResult;
|
|
use crate::core::tray::Tray;
|
|
use crate::process::AsyncHandler;
|
|
use clash_verge_logging::{Type, logging};
|
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
static TRAY_SYNC_RUNNING: AtomicBool = AtomicBool::new(false);
|
|
static TRAY_SYNC_PENDING: AtomicBool = AtomicBool::new(false);
|
|
|
|
/// 同步托盘和GUI的代理选择状态
|
|
#[tauri::command]
|
|
pub async fn sync_tray_proxy_selection() -> CmdResult<()> {
|
|
if TRAY_SYNC_RUNNING
|
|
.compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire)
|
|
.is_ok()
|
|
{
|
|
AsyncHandler::spawn(move || async move {
|
|
run_tray_sync_loop().await;
|
|
});
|
|
} else {
|
|
TRAY_SYNC_PENDING.store(true, Ordering::Release);
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
async fn run_tray_sync_loop() {
|
|
loop {
|
|
match Tray::global().update_menu().await {
|
|
Ok(_) => {
|
|
logging!(info, Type::Cmd, "Tray proxy selection synced successfully");
|
|
}
|
|
Err(e) => {
|
|
logging!(error, Type::Cmd, "Failed to sync tray proxy selection: {e}");
|
|
}
|
|
}
|
|
|
|
if !TRAY_SYNC_PENDING.swap(false, Ordering::AcqRel) {
|
|
TRAY_SYNC_RUNNING.store(false, Ordering::Release);
|
|
|
|
if TRAY_SYNC_PENDING.swap(false, Ordering::AcqRel)
|
|
&& TRAY_SYNC_RUNNING
|
|
.compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire)
|
|
.is_ok()
|
|
{
|
|
continue;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|