fix store dir + feat launch option switch in tray

This commit is contained in:
2025-11-06 03:07:38 +08:00
parent ce410f7a26
commit 8550887bfb
7 changed files with 225 additions and 142 deletions

View File

@@ -6,6 +6,7 @@ use tauri::{AppHandle, Emitter};
// 全局 watcher 存储,用于管理文件监听器的生命周期
static WATCHER: OnceLock<Mutex<Option<RecommendedWatcher>>> = OnceLock::new();
static CS2_VIDEO_WATCHER: OnceLock<Mutex<Option<RecommendedWatcher>>> = OnceLock::new();
/// 启动监听 loginusers.vdf 文件的变化
pub fn start_watch_loginusers(app: AppHandle, steam_dir: String) -> Result<()> {
@@ -74,3 +75,74 @@ pub fn stop_watch_loginusers() {
}
}
/// 启动监听 cs2_video.txt 文件的变化
pub fn start_watch_cs2_video(app: AppHandle, steam_dir: String, steam_id32: u32) -> Result<()> {
// 停止之前的监听
stop_watch_cs2_video();
let cfg_dir = Path::new(&steam_dir)
.join("userdata")
.join(steam_id32.to_string())
.join("730")
.join("local")
.join("cfg");
// 如果 cfg 目录不存在,不进行监听
if !cfg_dir.exists() {
log::warn!("cs2_video.txt 配置目录不存在,跳过监听: {:?}", cfg_dir);
return Ok(());
}
let app_clone = app.clone();
let mut watcher = RecommendedWatcher::new(
move |result: Result<Event, notify::Error>| {
match result {
Ok(event) => {
// 检查是否是 cs2_video.txt 文件的变化
if let EventKind::Modify(_) | EventKind::Create(_) = event.kind {
for path in &event.paths {
if path.ends_with("cs2_video.txt") {
log::info!("检测到 cs2_video.txt 文件变化: {:?}", path);
// 延迟一小段时间,确保文件写入完成
std::thread::sleep(std::time::Duration::from_millis(200));
// 发送事件到前端
if let Err(e) = app_clone.emit("steam://cs2_video_changed", ()) {
log::error!("发送 cs2_video 变化事件失败: {}", e);
}
break;
}
}
}
}
Err(e) => {
log::error!("文件监听错误: {}", e);
}
}
},
Config::default(),
)?;
// 监听 cfg 目录(而不是单个文件),因为某些文件系统可能不会直接监听单个文件
watcher.watch(&cfg_dir, RecursiveMode::NonRecursive)?;
log::info!("开始监听 cs2_video.txt 文件: {:?}", cfg_dir.join("cs2_video.txt"));
// 保存 watcher 到全局变量
let watcher_store = CS2_VIDEO_WATCHER.get_or_init(|| Mutex::new(None));
*watcher_store.lock().unwrap() = Some(watcher);
Ok(())
}
/// 停止监听 cs2_video.txt 文件
pub fn stop_watch_cs2_video() {
if let Some(watcher_store) = CS2_VIDEO_WATCHER.get() {
if let Ok(mut watcher_guard) = watcher_store.lock() {
if let Some(watcher) = watcher_guard.take() {
drop(watcher);
log::info!("已停止监听 cs2_video.txt 文件");
}
}
}
}