main.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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 data;
  9. mod enhance;
  10. mod feat;
  11. mod utils;
  12. use crate::utils::{init, resolve, server};
  13. use tauri::{api, Manager, SystemTray};
  14. fn main() -> std::io::Result<()> {
  15. // 单例检测
  16. if server::check_singleton().is_err() {
  17. println!("app exists");
  18. return Ok(());
  19. }
  20. #[cfg(target_os = "windows")]
  21. unsafe {
  22. use crate::utils::dirs;
  23. dirs::init_portable_flag();
  24. }
  25. crate::log_if_err!(init::init_config());
  26. #[allow(unused_mut)]
  27. let mut builder = tauri::Builder::default()
  28. .system_tray(SystemTray::new())
  29. .setup(|app| Ok(resolve::resolve_setup(app)))
  30. .on_system_tray_event(core::tray::Tray::on_system_tray_event)
  31. .invoke_handler(tauri::generate_handler![
  32. // common
  33. cmds::get_sys_proxy,
  34. cmds::open_app_dir,
  35. cmds::open_logs_dir,
  36. cmds::open_web_url,
  37. // cmds::kill_sidecar,
  38. cmds::restart_sidecar,
  39. // clash
  40. cmds::get_clash_info,
  41. cmds::get_clash_logs,
  42. cmds::patch_clash_config,
  43. cmds::change_clash_core,
  44. cmds::get_runtime_config,
  45. cmds::get_runtime_yaml,
  46. cmds::get_runtime_exists,
  47. cmds::get_runtime_logs,
  48. // verge
  49. cmds::get_verge_config,
  50. cmds::patch_verge_config,
  51. // cmds::update_hotkeys,
  52. // profile
  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::select_profile,
  60. cmds::get_profiles,
  61. cmds::enhance_profiles,
  62. cmds::change_profile_chain,
  63. cmds::change_profile_valid,
  64. cmds::read_profile_file,
  65. cmds::save_profile_file,
  66. // service mode
  67. cmds::service::start_service,
  68. cmds::service::stop_service,
  69. cmds::service::check_service,
  70. cmds::service::install_service,
  71. cmds::service::uninstall_service,
  72. ]);
  73. #[cfg(target_os = "macos")]
  74. {
  75. use tauri::{Menu, MenuItem, Submenu};
  76. builder = builder.menu(
  77. Menu::new().add_submenu(Submenu::new(
  78. "Edit",
  79. Menu::new()
  80. .add_native_item(MenuItem::Undo)
  81. .add_native_item(MenuItem::Redo)
  82. .add_native_item(MenuItem::Copy)
  83. .add_native_item(MenuItem::Paste)
  84. .add_native_item(MenuItem::Cut)
  85. .add_native_item(MenuItem::SelectAll)
  86. .add_native_item(MenuItem::CloseWindow)
  87. .add_native_item(MenuItem::Quit),
  88. )),
  89. );
  90. }
  91. let app = builder
  92. .build(tauri::generate_context!())
  93. .expect("error while running tauri application");
  94. // let app_handle = app.app_handle();
  95. // ctrlc::set_handler(move || {
  96. // resolve::resolve_reset();
  97. // app_handle.exit(0);
  98. // })
  99. // .expect("error while exiting.");
  100. app.run(|app_handle, e| match e {
  101. tauri::RunEvent::ExitRequested { api, .. } => {
  102. api.prevent_exit();
  103. }
  104. tauri::RunEvent::Exit => {
  105. resolve::resolve_reset();
  106. api::process::kill_children();
  107. app_handle.exit(0);
  108. }
  109. #[cfg(target_os = "macos")]
  110. tauri::RunEvent::WindowEvent { label, event, .. } => {
  111. if label == "main" {
  112. match event {
  113. tauri::WindowEvent::CloseRequested { api, .. } => {
  114. api.prevent_close();
  115. app_handle.get_window("main").map(|win| {
  116. let _ = win.hide();
  117. });
  118. }
  119. _ => {}
  120. }
  121. }
  122. }
  123. _ => {}
  124. });
  125. Ok(())
  126. }