resolve.rs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. use crate::{config::Config, core::*, utils::init, utils::server};
  2. use crate::{log_err, trace_err};
  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::trace!("init config");
  13. log_err!(Config::init_config());
  14. log::trace!("launch core");
  15. log_err!(CoreManager::global().init());
  16. // setup a simple http server for singleton
  17. log::trace!("launch embed server");
  18. server::embed_server(app.app_handle());
  19. log::trace!("init system tray");
  20. log_err!(tray::Tray::update_systray(&app.app_handle()));
  21. let silent_start = { Config::verge().data().enable_silent_start.clone() };
  22. if !silent_start.unwrap_or(false) {
  23. create_window(&app.app_handle());
  24. }
  25. log_err!(sysopt::Sysopt::global().init_launch());
  26. log_err!(sysopt::Sysopt::global().init_sysproxy());
  27. log_err!(handle::Handle::update_systray_part());
  28. log_err!(hotkey::Hotkey::global().init(app.app_handle()));
  29. log_err!(timer::Timer::global().init());
  30. }
  31. /// reset system proxy
  32. pub fn resolve_reset() {
  33. log_err!(sysopt::Sysopt::global().reset_sysproxy());
  34. log_err!(CoreManager::global().stop_core());
  35. }
  36. /// create main window
  37. pub fn create_window(app_handle: &AppHandle) {
  38. if let Some(window) = app_handle.get_window("main") {
  39. trace_err!(window.unminimize(), "set win unminimize");
  40. trace_err!(window.show(), "set win visible");
  41. trace_err!(window.set_focus(), "set win focus");
  42. return;
  43. }
  44. let mut builder = tauri::window::WindowBuilder::new(
  45. app_handle,
  46. "main".to_string(),
  47. tauri::WindowUrl::App("index.html".into()),
  48. )
  49. .title("Clash Nyanpasu")
  50. .fullscreen(false)
  51. .min_inner_size(600.0, 520.0);
  52. match Config::verge().latest().window_size_position.clone() {
  53. Some(size_pos) if size_pos.len() == 4 => {
  54. let size = (size_pos[0], size_pos[1]);
  55. let pos = (size_pos[2], size_pos[3]);
  56. let w = size.0.clamp(600.0, f64::INFINITY);
  57. let h = size.1.clamp(520.0, f64::INFINITY);
  58. builder = builder.inner_size(w, h).position(pos.0, pos.1);
  59. }
  60. _ => {
  61. #[cfg(target_os = "windows")]
  62. {
  63. builder = builder.inner_size(800.0, 636.0).center();
  64. }
  65. #[cfg(target_os = "macos")]
  66. {
  67. builder = builder.inner_size(800.0, 642.0).center();
  68. }
  69. #[cfg(target_os = "linux")]
  70. {
  71. builder = builder.inner_size(800.0, 642.0).center();
  72. }
  73. }
  74. };
  75. #[cfg(target_os = "windows")]
  76. {
  77. use std::time::Duration;
  78. use tokio::time::sleep;
  79. use window_shadows::set_shadow;
  80. match builder
  81. .decorations(false)
  82. .transparent(true)
  83. .visible(false)
  84. .build()
  85. {
  86. Ok(win) => {
  87. log::trace!("try to calculate the monitor size");
  88. let center = (|| -> Result<bool> {
  89. let mut center = false;
  90. let monitor = win.current_monitor()?.ok_or(anyhow::anyhow!(""))?;
  91. let size = monitor.size();
  92. let pos = win.outer_position()?;
  93. if pos.x < -400
  94. || pos.x > (size.width - 200).try_into()?
  95. || pos.y < -200
  96. || pos.y > (size.height - 200).try_into()?
  97. {
  98. center = true;
  99. }
  100. Ok(center)
  101. })();
  102. if center.unwrap_or(true) {
  103. trace_err!(win.center(), "set win center");
  104. }
  105. log::trace!("try to create window");
  106. let app_handle = app_handle.clone();
  107. // 加点延迟避免界面闪一下
  108. tauri::async_runtime::spawn(async move {
  109. sleep(Duration::from_millis(888)).await;
  110. if let Some(window) = app_handle.get_window("main") {
  111. trace_err!(set_shadow(&window, true), "set win shadow");
  112. trace_err!(window.show(), "set win visible");
  113. trace_err!(window.unminimize(), "set win unminimize");
  114. trace_err!(window.set_focus(), "set win focus");
  115. } else {
  116. log::error!(target: "app", "failed to create window, get_window is None")
  117. }
  118. });
  119. }
  120. Err(err) => log::error!(target: "app", "failed to create window, {err}"),
  121. }
  122. }
  123. #[cfg(target_os = "macos")]
  124. crate::log_err!(builder
  125. .decorations(true)
  126. .hidden_title(true)
  127. .title_bar_style(tauri::TitleBarStyle::Overlay)
  128. .build());
  129. #[cfg(target_os = "linux")]
  130. crate::log_err!(builder.decorations(true).transparent(false).build());
  131. }
  132. /// save window size and position
  133. pub fn save_window_size_position(app_handle: &AppHandle, save_to_file: bool) -> Result<()> {
  134. let win = app_handle
  135. .get_window("main")
  136. .ok_or(anyhow::anyhow!("failed to get window"))?;
  137. let scale = win.scale_factor()?;
  138. let size = win.inner_size()?;
  139. let size = size.to_logical::<f64>(scale);
  140. let pos = win.outer_position()?;
  141. let pos = pos.to_logical::<f64>(scale);
  142. let verge = Config::verge();
  143. let mut verge = verge.latest();
  144. verge.window_size_position = Some(vec![size.width, size.height, pos.x, pos.y]);
  145. if save_to_file {
  146. verge.save_file()?;
  147. }
  148. Ok(())
  149. }