main.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #![cfg_attr(
  2. all(not(debug_assertions), target_os = "windows"),
  3. windows_subsystem = "windows"
  4. )]
  5. mod cmds;
  6. mod config;
  7. mod core;
  8. mod enhance;
  9. mod feat;
  10. mod utils;
  11. use crate::utils::{init, resolve, server};
  12. use tauri::{api, SystemTray};
  13. fn main() -> std::io::Result<()> {
  14. // 单例检测
  15. let app_exists: bool = tauri::async_runtime::block_on(async move {
  16. if server::check_singleton().await.is_err() {
  17. println!("app exists");
  18. true
  19. } else {
  20. false
  21. }
  22. });
  23. if app_exists {
  24. return Ok(());
  25. }
  26. #[cfg(target_os = "linux")]
  27. std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1");
  28. crate::log_err!(init::init_config());
  29. #[allow(unused_mut)]
  30. let mut builder = tauri::Builder::default()
  31. .system_tray(SystemTray::new())
  32. .setup(|app| {
  33. tauri::async_runtime::block_on(async move {
  34. resolve::resolve_setup(app).await;
  35. });
  36. Ok(())
  37. })
  38. .on_system_tray_event(core::tray::Tray::on_system_tray_event)
  39. .invoke_handler(tauri::generate_handler![
  40. // common
  41. cmds::get_sys_proxy,
  42. cmds::get_auto_proxy,
  43. cmds::open_app_dir,
  44. cmds::open_logs_dir,
  45. cmds::open_web_url,
  46. cmds::open_core_dir,
  47. cmds::get_portable_flag,
  48. cmds::get_network_interfaces,
  49. // cmds::kill_sidecar,
  50. cmds::restart_sidecar,
  51. // clash
  52. cmds::get_clash_info,
  53. cmds::get_clash_logs,
  54. cmds::patch_clash_config,
  55. cmds::change_clash_core,
  56. cmds::get_runtime_config,
  57. cmds::get_runtime_yaml,
  58. cmds::get_runtime_exists,
  59. cmds::get_runtime_logs,
  60. cmds::uwp::invoke_uwp_tool,
  61. cmds::copy_clash_env,
  62. // verge
  63. cmds::get_verge_config,
  64. cmds::patch_verge_config,
  65. cmds::test_delay,
  66. cmds::get_app_dir,
  67. cmds::copy_icon_file,
  68. cmds::download_icon_cache,
  69. cmds::open_devtools,
  70. cmds::exit_app,
  71. // cmds::update_hotkeys,
  72. // profile
  73. cmds::get_profiles,
  74. cmds::enhance_profiles,
  75. cmds::patch_profiles_config,
  76. cmds::view_profile,
  77. cmds::patch_profile,
  78. cmds::create_profile,
  79. cmds::import_profile,
  80. cmds::reorder_profile,
  81. cmds::update_profile,
  82. cmds::delete_profile,
  83. cmds::read_profile_file,
  84. cmds::save_profile_file,
  85. // service mode
  86. cmds::service::check_service,
  87. cmds::service::install_service,
  88. cmds::service::uninstall_service,
  89. // clash api
  90. cmds::clash_api_get_proxy_delay
  91. ]);
  92. #[cfg(target_os = "macos")]
  93. {
  94. use tauri::{Menu, MenuItem, Submenu};
  95. builder = builder.menu(
  96. Menu::new().add_submenu(Submenu::new(
  97. "Edit",
  98. Menu::new()
  99. .add_native_item(MenuItem::Undo)
  100. .add_native_item(MenuItem::Redo)
  101. .add_native_item(MenuItem::Copy)
  102. .add_native_item(MenuItem::Paste)
  103. .add_native_item(MenuItem::Cut)
  104. .add_native_item(MenuItem::SelectAll)
  105. .add_native_item(MenuItem::CloseWindow)
  106. .add_native_item(MenuItem::Quit),
  107. )),
  108. );
  109. }
  110. let app = builder
  111. .build(tauri::generate_context!())
  112. .expect("error while running tauri application");
  113. app.run(|app_handle, e| match e {
  114. tauri::RunEvent::ExitRequested { api, .. } => {
  115. api.prevent_exit();
  116. }
  117. tauri::RunEvent::Updater(tauri::UpdaterEvent::Downloaded) => {
  118. resolve::resolve_reset();
  119. api::process::kill_children();
  120. }
  121. tauri::RunEvent::WindowEvent { label, event, .. } => {
  122. if label == "main" {
  123. match event {
  124. tauri::WindowEvent::Destroyed => {
  125. let _ = resolve::save_window_size_position(app_handle, true);
  126. }
  127. tauri::WindowEvent::CloseRequested { .. } => {
  128. let _ = resolve::save_window_size_position(app_handle, true);
  129. }
  130. tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => {
  131. let _ = resolve::save_window_size_position(app_handle, false);
  132. }
  133. _ => {}
  134. }
  135. }
  136. }
  137. _ => {}
  138. });
  139. Ok(())
  140. }