main.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. if server::check_singleton().is_err() {
  16. println!("app exists");
  17. return Ok(());
  18. }
  19. crate::log_err!(init::init_config());
  20. #[allow(unused_mut)]
  21. let mut builder = tauri::Builder::default()
  22. .system_tray(SystemTray::new())
  23. .setup(|app| Ok(resolve::resolve_setup(app)))
  24. .on_system_tray_event(core::tray::Tray::on_system_tray_event)
  25. .invoke_handler(tauri::generate_handler![
  26. // common
  27. cmds::get_sys_proxy,
  28. cmds::open_app_dir,
  29. cmds::open_logs_dir,
  30. cmds::open_web_url,
  31. cmds::open_core_dir,
  32. // cmds::kill_sidecar,
  33. cmds::restart_sidecar,
  34. cmds::grant_permission,
  35. // clash
  36. cmds::get_clash_info,
  37. cmds::get_clash_logs,
  38. cmds::patch_clash_config,
  39. cmds::change_clash_core,
  40. cmds::get_runtime_config,
  41. cmds::get_runtime_yaml,
  42. cmds::get_runtime_exists,
  43. cmds::get_runtime_logs,
  44. cmds::uwp::invoke_uwp_tool,
  45. // verge
  46. cmds::get_verge_config,
  47. cmds::patch_verge_config,
  48. // cmds::update_hotkeys,
  49. // profile
  50. cmds::get_profiles,
  51. cmds::enhance_profiles,
  52. cmds::patch_profiles_config,
  53. cmds::view_profile,
  54. cmds::patch_profile,
  55. cmds::create_profile,
  56. cmds::import_profile,
  57. cmds::update_profile,
  58. cmds::delete_profile,
  59. cmds::read_profile_file,
  60. cmds::save_profile_file,
  61. // service mode
  62. cmds::service::check_service,
  63. cmds::service::install_service,
  64. cmds::service::uninstall_service,
  65. // clash api
  66. cmds::clash_api_get_proxy_delay
  67. ]);
  68. #[cfg(target_os = "macos")]
  69. {
  70. use tauri::{Menu, MenuItem, Submenu};
  71. builder = builder.menu(
  72. Menu::new().add_submenu(Submenu::new(
  73. "Edit",
  74. Menu::new()
  75. .add_native_item(MenuItem::Undo)
  76. .add_native_item(MenuItem::Redo)
  77. .add_native_item(MenuItem::Copy)
  78. .add_native_item(MenuItem::Paste)
  79. .add_native_item(MenuItem::Cut)
  80. .add_native_item(MenuItem::SelectAll)
  81. .add_native_item(MenuItem::CloseWindow)
  82. .add_native_item(MenuItem::Quit),
  83. )),
  84. );
  85. }
  86. let app = builder
  87. .build(tauri::generate_context!())
  88. .expect("error while running tauri application");
  89. app.run(|app_handle, e| match e {
  90. tauri::RunEvent::ExitRequested { api, .. } => {
  91. api.prevent_exit();
  92. }
  93. tauri::RunEvent::Exit => {
  94. resolve::resolve_reset();
  95. api::process::kill_children();
  96. app_handle.exit(0);
  97. }
  98. #[cfg(target_os = "macos")]
  99. tauri::RunEvent::WindowEvent { label, event, .. } => {
  100. use tauri::Manager;
  101. if label == "main" {
  102. match event {
  103. tauri::WindowEvent::CloseRequested { api, .. } => {
  104. api.prevent_close();
  105. let _ = resolve::save_window_size_position(&app_handle, true);
  106. app_handle.get_window("main").map(|win| {
  107. let _ = win.hide();
  108. });
  109. }
  110. _ => {}
  111. }
  112. }
  113. }
  114. #[cfg(not(target_os = "macos"))]
  115. tauri::RunEvent::WindowEvent { label, event, .. } => {
  116. if label == "main" {
  117. match event {
  118. tauri::WindowEvent::CloseRequested { .. } => {
  119. let _ = resolve::save_window_size_position(&app_handle, true);
  120. }
  121. tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => {
  122. let _ = resolve::save_window_size_position(&app_handle, false);
  123. }
  124. _ => {}
  125. }
  126. }
  127. }
  128. _ => {}
  129. });
  130. Ok(())
  131. }