diff --git a/pages/settings/index.vue b/pages/settings/index.vue
index 27e0f69..241c840 100644
--- a/pages/settings/index.vue
+++ b/pages/settings/index.vue
@@ -1,3 +1,60 @@
-
-
\ No newline at end of file
+
+
+
General
+
+ Configure basic application settings
+
+
+
+
+
+
Start with system
+
+ Drop will automatically start when you log into your computer
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index ff38943..68f58d2 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -261,6 +261,17 @@ version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+[[package]]
+name = "auto-launch"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471"
+dependencies = [
+ "dirs 4.0.0",
+ "thiserror 1.0.69",
+ "winreg 0.10.1",
+]
+
[[package]]
name = "autocfg"
version = "1.4.0"
@@ -870,7 +881,16 @@ version = "5.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35"
dependencies = [
- "dirs-sys",
+ "dirs-sys 0.4.1",
+]
+
+[[package]]
+name = "dirs"
+version = "4.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+dependencies = [
+ "dirs-sys 0.3.7",
]
[[package]]
@@ -879,7 +899,18 @@ version = "5.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
dependencies = [
- "dirs-sys",
+ "dirs-sys 0.4.1",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
]
[[package]]
@@ -990,6 +1021,7 @@ dependencies = [
"shared_child",
"tauri",
"tauri-build",
+ "tauri-plugin-autostart",
"tauri-plugin-deep-link",
"tauri-plugin-dialog",
"tauri-plugin-os",
@@ -1047,7 +1079,7 @@ dependencies = [
"rustc_version",
"toml 0.8.2",
"vswhom",
- "winreg",
+ "winreg 0.52.0",
]
[[package]]
@@ -4245,7 +4277,7 @@ checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c"
dependencies = [
"anyhow",
"bytes",
- "dirs",
+ "dirs 5.0.1",
"dunce",
"embed_plist",
"futures-util",
@@ -4295,7 +4327,7 @@ checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01"
dependencies = [
"anyhow",
"cargo_toml",
- "dirs",
+ "dirs 5.0.1",
"glob",
"heck 0.5.0",
"json-patch",
@@ -4367,6 +4399,20 @@ dependencies = [
"walkdir",
]
+[[package]]
+name = "tauri-plugin-autostart"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c13f843e5e5df3eed270fc42b02923cc1a6b5c7e56b0f3ac1d858ab2c8b5fb"
+dependencies = [
+ "auto-launch",
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-plugin",
+ "thiserror 2.0.9",
+]
+
[[package]]
name = "tauri-plugin-deep-link"
version = "2.2.0"
@@ -4871,7 +4917,7 @@ checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b"
dependencies = [
"core-graphics",
"crossbeam-channel",
- "dirs",
+ "dirs 5.0.1",
"libappindicator",
"muda",
"objc2",
@@ -5777,6 +5823,15 @@ dependencies = [
"memchr",
]
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
+
[[package]]
name = "winreg"
version = "0.52.0"
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index e8bc070..8c266b8 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -44,6 +44,7 @@ chrono = "0.4.38"
tauri-plugin-os = "2"
boxcar = "0.2.7"
umu-wrapper-lib = "0.1.0"
+tauri-plugin-autostart = "2.0.0"
shared_child = "1.0.1"
[dependencies.tauri]
diff --git a/src-tauri/src/autostart.rs b/src-tauri/src/autostart.rs
new file mode 100644
index 0000000..bd526be
--- /dev/null
+++ b/src-tauri/src/autostart.rs
@@ -0,0 +1,69 @@
+use log::info;
+use tauri::AppHandle;
+use tauri_plugin_autostart::ManagerExt;
+use crate::DB;
+
+#[tauri::command]
+pub async fn toggle_autostart(app: AppHandle, enabled: bool) -> Result<(), String> {
+ let manager = app.autolaunch();
+ if enabled {
+ manager.enable().map_err(|e| e.to_string())?;
+ info!("Enabled autostart");
+ } else {
+ manager.disable().map_err(|e| e.to_string())?;
+ info!("Disabled autostart");
+ }
+
+ // Store the state in DB
+ let mut db_handle = DB.borrow_data_mut().map_err(|e| e.to_string())?;
+ db_handle.settings.autostart = enabled;
+ drop(db_handle);
+ DB.save().map_err(|e| e.to_string())?;
+
+ Ok(())
+}
+
+#[tauri::command]
+pub async fn get_autostart_enabled(app: AppHandle) -> Result {
+ // First check DB state
+ let db_handle = DB.borrow_data().map_err(|e| e.to_string())?;
+ let db_state = db_handle.settings.autostart;
+ drop(db_handle);
+
+ // Get actual system state
+ let manager = app.autolaunch();
+ let system_state = manager.is_enabled().map_err(|e| e.to_string())?;
+
+ // If they don't match, sync to DB state
+ if db_state != system_state {
+ if db_state {
+ manager.enable().map_err(|e| e.to_string())?;
+ } else {
+ manager.disable().map_err(|e| e.to_string())?;
+ }
+ }
+
+ Ok(db_state)
+}
+
+// New function to sync state on startup
+pub fn sync_autostart_on_startup(app: &AppHandle) -> Result<(), String> {
+ let db_handle = DB.borrow_data().map_err(|e| e.to_string())?;
+ let should_be_enabled = db_handle.settings.autostart;
+ drop(db_handle);
+
+ let manager = app.autolaunch();
+ let current_state = manager.is_enabled().map_err(|e| e.to_string())?;
+
+ if current_state != should_be_enabled {
+ if should_be_enabled {
+ manager.enable().map_err(|e| e.to_string())?;
+ info!("Synced autostart: enabled");
+ } else {
+ manager.disable().map_err(|e| e.to_string())?;
+ info!("Synced autostart: disabled");
+ }
+ }
+
+ Ok(())
+}
diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs
index 662d943..0ab464f 100644
--- a/src-tauri/src/db.rs
+++ b/src-tauri/src/db.rs
@@ -72,9 +72,24 @@ pub struct DatabaseGames {
pub transient_statuses: HashMap,
}
-#[derive(Serialize, Clone, Deserialize)]
-#[serde(rename_all = "camelCase")]
+#[derive(Serialize, Deserialize, Clone)]
+pub struct Settings {
+ pub autostart: bool,
+ // ... other settings ...
+}
+
+impl Default for Settings {
+ fn default() -> Self {
+ Self {
+ autostart: false,
+ // ... other settings defaults ...
+ }
+ }
+}
+
+#[derive(Serialize, Deserialize, Clone)]
pub struct Database {
+ pub settings: Settings,
pub auth: Option,
pub base_url: String,
pub games: DatabaseGames,
@@ -118,13 +133,14 @@ impl DatabaseImpls for DatabaseInterface {
debug!("Creating logs directory");
create_dir_all(logs_root_dir.clone()).unwrap();
- #[allow(clippy::let_and_return)]
let exists = fs::exists(db_path.clone()).unwrap();
match exists {
- true => PathDatabase::load_from_path(db_path).expect("Database loading failed"),
+ true => PathDatabase::load_from_path(db_path)
+ .expect("Database loading failed"),
false => {
let default = Database {
+ settings: Settings::default(),
auth: None,
base_url: "".to_string(),
games: DatabaseGames {
diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs
index 57937b7..be6101c 100644
--- a/src-tauri/src/lib.rs
+++ b/src-tauri/src/lib.rs
@@ -9,6 +9,7 @@ mod remote;
mod state;
#[cfg(test)]
mod tests;
+mod autostart;
use crate::db::DatabaseImpls;
use auth::{auth_initiate, generate_authorization_header, manual_recieve_handshake, recieve_handshake, retry_connect};
@@ -46,6 +47,7 @@ use tauri::menu::{Menu, MenuItem, PredefinedMenuItem};
use tauri::tray::TrayIconBuilder;
use tauri::{AppHandle, Manager, RunEvent, WindowEvent};
use tauri_plugin_deep_link::DeepLinkExt;
+use crate::autostart::{get_autostart_enabled, toggle_autostart};
#[derive(Clone, Copy, Serialize)]
pub enum AppStatus {
@@ -178,6 +180,11 @@ fn setup(handle: AppHandle) -> AppState<'static> {
drop(db_handle);
info!("finished setup!");
+ // Sync autostart state
+ if let Err(e) = autostart::sync_autostart_on_startup(&handle) {
+ warn!("Failed to sync autostart state: {}", e);
+ }
+
AppState {
status: app_status,
user,
@@ -234,10 +241,16 @@ pub fn run() {
uninstall_game,
// Processes
launch_game,
- kill_game
+ kill_game,
+ toggle_autostart,
+ get_autostart_enabled,
])
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_dialog::init())
+ .plugin(tauri_plugin_autostart::init(
+ tauri_plugin_autostart::MacosLauncher::LaunchAgent,
+ Some(vec!["--minimize"])
+ ))
.setup(|app| {
let handle = app.handle().clone();
let state = setup(handle);