resolve.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. use crate::log_err;
  2. use crate::{config::Config, core::*, utils::init, utils::server};
  3. use anyhow::Result;
  4. use tauri::{App, AppHandle, Manager};
  5. /// handle something when start app
  6. pub fn resolve_setup(app: &mut App) {
  7. #[cfg(target_os = "macos")]
  8. app.set_activation_policy(tauri::ActivationPolicy::Accessory);
  9. handle::Handle::global().init(app.app_handle());
  10. log_err!(init::init_resources(app.package_info()));
  11. // 启动核心
  12. log_err!(Config::init_config());
  13. log_err!(CoreManager::global().init());
  14. // setup a simple http server for singleton
  15. server::embed_server(app.app_handle());
  16. log_err!(tray::Tray::update_systray(&app.app_handle()));
  17. let silent_start = { Config::verge().data().enable_silent_start.clone() };
  18. if !silent_start.unwrap_or(false) {
  19. create_window(&app.app_handle());
  20. }
  21. log_err!(sysopt::Sysopt::global().init_launch());
  22. log_err!(sysopt::Sysopt::global().init_sysproxy());
  23. log_err!(handle::Handle::update_systray_part());
  24. log_err!(hotkey::Hotkey::global().init(app.app_handle()));
  25. log_err!(timer::Timer::global().init());
  26. }
  27. /// reset system proxy
  28. pub fn resolve_reset() {
  29. log_err!(sysopt::Sysopt::global().reset_sysproxy());
  30. log_err!(CoreManager::global().stop_core());
  31. }
  32. /// create main window
  33. pub fn create_window(app_handle: &AppHandle) {
  34. if let Some(window) = app_handle.get_window("main") {
  35. let _ = window.unminimize();
  36. let _ = window.show();
  37. let _ = window.set_focus();
  38. return;
  39. }
  40. let mut builder = tauri::window::WindowBuilder::new(
  41. app_handle,
  42. "main".to_string(),
  43. tauri::WindowUrl::App("index.html".into()),
  44. )
  45. .title("Clash Verge")
  46. .fullscreen(false)
  47. .min_inner_size(600.0, 520.0);
  48. match Config::verge().latest().window_size_position.clone() {
  49. Some(size_pos) if size_pos.len() == 4 => {
  50. let size = (size_pos[0], size_pos[1]);
  51. let pos = (size_pos[2], size_pos[3]);
  52. builder = builder.inner_size(size.0, size.1).position(pos.0, pos.1);
  53. }
  54. _ => {
  55. #[cfg(target_os = "windows")]
  56. {
  57. builder = builder.inner_size(800.0, 636.0).center();
  58. }
  59. #[cfg(target_os = "macos")]
  60. {
  61. builder = builder.inner_size(800.0, 642.0).center();
  62. }
  63. #[cfg(target_os = "linux")]
  64. {
  65. builder = builder.inner_size(800.0, 642.0).center();
  66. }
  67. }
  68. };
  69. #[cfg(target_os = "windows")]
  70. {
  71. use std::time::Duration;
  72. use tokio::time::sleep;
  73. use window_shadows::set_shadow;
  74. match builder
  75. .decorations(false)
  76. .transparent(true)
  77. .visible(false)
  78. .build()
  79. {
  80. Ok(_) => {
  81. let app_handle = app_handle.clone();
  82. if let Some(window) = app_handle.get_window("main") {
  83. let _ = set_shadow(&window, true);
  84. }
  85. tauri::async_runtime::spawn(async move {
  86. sleep(Duration::from_secs(1)).await;
  87. if let Some(window) = app_handle.get_window("main") {
  88. let _ = window.show();
  89. let _ = window.unminimize();
  90. let _ = window.set_focus();
  91. }
  92. });
  93. }
  94. Err(err) => log::error!(target: "app", "{err}"),
  95. }
  96. }
  97. #[cfg(target_os = "macos")]
  98. crate::log_err!(builder
  99. .decorations(true)
  100. .hidden_title(true)
  101. .title_bar_style(tauri::TitleBarStyle::Overlay)
  102. .build());
  103. #[cfg(target_os = "linux")]
  104. crate::log_err!(builder.decorations(true).transparent(false).build());
  105. }
  106. /// save window size and position
  107. pub fn save_window_size_position(app_handle: &AppHandle, save_to_file: bool) -> Result<()> {
  108. let win = app_handle
  109. .get_window("main")
  110. .ok_or(anyhow::anyhow!("failed to get window"))?;
  111. let scale = win.scale_factor()?;
  112. let size = win.inner_size()?;
  113. let size = size.to_logical::<f64>(scale);
  114. let pos = win.outer_position()?;
  115. let pos = pos.to_logical::<f64>(scale);
  116. let verge = Config::verge();
  117. let mut verge = verge.latest();
  118. verge.window_size_position = Some(vec![size.width, size.height, pos.x, pos.y]);
  119. if save_to_file {
  120. verge.save_file()?;
  121. }
  122. Ok(())
  123. }