mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-27 08:14:33 +08:00
7b667f7a44
Add the window-state plugin and explicitly save size and position across app exit, restart, and lightweight-mode transitions.
101 lines
2.8 KiB
Rust
101 lines
2.8 KiB
Rust
use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
use tauri::Manager;
|
|
|
|
static LIGHTWEIGHT_MODE: AtomicBool = AtomicBool::new(false);
|
|
|
|
pub fn enter_lightweight_mode(app: &tauri::AppHandle) -> Result<(), String> {
|
|
#[cfg(target_os = "windows")]
|
|
{
|
|
if let Some(window) = app.get_webview_window("main") {
|
|
let _ = window.set_skip_taskbar(true);
|
|
}
|
|
}
|
|
#[cfg(target_os = "macos")]
|
|
{
|
|
crate::tray::apply_tray_policy(app, false);
|
|
}
|
|
|
|
if let Some(window) = app.get_webview_window("main") {
|
|
crate::save_window_state_before_exit(app);
|
|
window
|
|
.destroy()
|
|
.map_err(|e| format!("销毁主窗口失败: {e}"))?;
|
|
}
|
|
// else: already in lightweight mode or window not found, just set the flag
|
|
|
|
LIGHTWEIGHT_MODE.store(true, Ordering::Release);
|
|
crate::tray::refresh_tray_menu(app);
|
|
log::info!("进入轻量模式");
|
|
Ok(())
|
|
}
|
|
|
|
pub fn exit_lightweight_mode(app: &tauri::AppHandle) -> Result<(), String> {
|
|
use tauri::WebviewWindowBuilder;
|
|
|
|
if let Some(window) = app.get_webview_window("main") {
|
|
let _ = window.unminimize();
|
|
let _ = window.show();
|
|
let _ = window.set_focus();
|
|
#[cfg(target_os = "linux")]
|
|
{
|
|
crate::linux_fix::nudge_main_window(window.clone());
|
|
}
|
|
#[cfg(target_os = "windows")]
|
|
{
|
|
let _ = window.set_skip_taskbar(false);
|
|
}
|
|
#[cfg(target_os = "macos")]
|
|
{
|
|
crate::tray::apply_tray_policy(app, true);
|
|
}
|
|
LIGHTWEIGHT_MODE.store(false, Ordering::Release);
|
|
crate::tray::refresh_tray_menu(app);
|
|
log::info!("退出轻量模式");
|
|
return Ok(());
|
|
}
|
|
|
|
let window_config = app
|
|
.config()
|
|
.app
|
|
.windows
|
|
.iter()
|
|
.find(|w| w.label == "main")
|
|
.ok_or("主窗口配置未找到")?;
|
|
|
|
WebviewWindowBuilder::from_config(app, window_config)
|
|
.map_err(|e| format!("加载主窗口配置失败: {e}"))?
|
|
.build()
|
|
.map_err(|e| format!("创建主窗口失败: {e}"))?;
|
|
|
|
if let Some(window) = app.get_webview_window("main") {
|
|
let _ = window.unminimize();
|
|
let _ = window.show();
|
|
let _ = window.set_focus();
|
|
#[cfg(target_os = "linux")]
|
|
{
|
|
crate::linux_fix::nudge_main_window(window.clone());
|
|
}
|
|
}
|
|
|
|
#[cfg(target_os = "windows")]
|
|
{
|
|
if let Some(window) = app.get_webview_window("main") {
|
|
let _ = window.set_skip_taskbar(false);
|
|
}
|
|
}
|
|
#[cfg(target_os = "macos")]
|
|
{
|
|
crate::tray::apply_tray_policy(app, true);
|
|
}
|
|
|
|
LIGHTWEIGHT_MODE.store(false, Ordering::Release);
|
|
crate::tray::refresh_tray_menu(app);
|
|
log::info!("退出轻量模式");
|
|
Ok(())
|
|
}
|
|
|
|
pub fn is_lightweight_mode() -> bool {
|
|
LIGHTWEIGHT_MODE.load(Ordering::Acquire)
|
|
}
|