main.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
  2. mod api;
  3. mod app_state;
  4. mod commands;
  5. mod config;
  6. mod locomotion;
  7. mod poller;
  8. mod settings;
  9. mod state;
  10. mod token;
  11. mod tray;
  12. use app_state::AppState;
  13. use std::sync::Arc;
  14. use tauri::Manager;
  15. fn main() {
  16. tauri::Builder::default()
  17. // 单实例插件必须最先注册
  18. .plugin(tauri_plugin_single_instance::init(|app, _argv, _cwd| {
  19. if let Some(win) = app.get_webview_window("main") {
  20. let _ = win.show();
  21. let _ = win.set_focus();
  22. }
  23. }))
  24. .setup(|app| {
  25. let config_dir = app.path().app_config_dir().map_err(|e| e.to_string())?;
  26. let settings = settings::SettingsStore::new(config_dir);
  27. let cfg = settings.load();
  28. let token = token::TokenStore::new().load().ok().flatten().unwrap_or_else(|| "dev-token".into());
  29. let api = Arc::new(api::ApiClient::new(cfg.base_url.clone(), token));
  30. let handle = poller::spawn(app.handle().clone(), api.clone());
  31. app.manage(settings);
  32. app.manage(AppState {
  33. passthrough: std::sync::Mutex::new(false),
  34. poll_handle: std::sync::Mutex::new(Some(handle)),
  35. pending_task: std::sync::Mutex::new(None),
  36. follow_cursor: std::sync::atomic::AtomicBool::new(false),
  37. api,
  38. });
  39. // 精细化动作运动控制:轮询全局光标 + 移动窗口(走/跳/飞/站手跟随)
  40. locomotion::spawn(app.handle().clone());
  41. tray::setup_tray(app)?;
  42. Ok(())
  43. })
  44. .invoke_handler(tauri::generate_handler![
  45. commands::on_interact,
  46. commands::drag_start,
  47. commands::drag_end,
  48. commands::start_perch,
  49. commands::stop_perch,
  50. commands::get_settings,
  51. commands::save_settings,
  52. commands::open_settings,
  53. commands::quit_app,
  54. commands::upload_mascot,
  55. commands::clear_custom_mascot,
  56. commands::data_url_from_url,
  57. commands::start_wechat_login,
  58. ])
  59. .run(tauri::generate_context!())
  60. .expect("error while running tauri application");
  61. }