From aede556ceaa8a6caa2584b802bac1100e8a289a3 Mon Sep 17 00:00:00 2001 From: Marco Scardovi Date: Sun, 28 Jun 2026 16:22:15 +0200 Subject: [PATCH 1/5] gui: Add autostart toggle to settings page --- rog-control-center/ui/pages/app_settings.slint | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rog-control-center/ui/pages/app_settings.slint b/rog-control-center/ui/pages/app_settings.slint index 95919868..753a85ba 100644 --- a/rog-control-center/ui/pages/app_settings.slint +++ b/rog-control-center/ui/pages/app_settings.slint @@ -10,6 +10,8 @@ export global AppSettingsPageData { callback set_enable_tray_icon(bool); in-out property enable_dgpu_notifications; callback set_enable_dgpu_notifications(bool); + in-out property enable_autostart; + callback set_enable_autostart(bool); } export component PageAppSettings inherits VerticalLayout { @@ -51,6 +53,14 @@ export component PageAppSettings inherits VerticalLayout { } } + SystemToggle { + text: @tr("Start app on system startup"); + checked <=> AppSettingsPageData.enable_autostart; + toggled => { + AppSettingsPageData.set_enable_autostart(AppSettingsPageData.enable_autostart) + } + } + Text { color: Palette.accent-background; text: " WIP: some features like notifications are not complete"; From 9bfdc4b98ea901ab27fea7fb9c8cfe0576a69c1d Mon Sep 17 00:00:00 2001 From: Marco Scardovi Date: Sun, 28 Jun 2026 16:22:17 +0200 Subject: [PATCH 2/5] config: Add enable_autostart and update_autostart implementation --- rog-control-center/src/config.rs | 91 ++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/rog-control-center/src/config.rs b/rog-control-center/src/config.rs index ef8207f2..0810bea5 100644 --- a/rog-control-center/src/config.rs +++ b/rog-control-center/src/config.rs @@ -13,6 +13,8 @@ pub struct Config { pub run_in_background: bool, pub startup_in_background: bool, pub enable_tray_icon: bool, + #[serde(default)] + pub enable_autostart: bool, pub ac_command: String, pub bat_command: String, pub dark_mode: bool, @@ -30,6 +32,7 @@ impl Default for Config { run_in_background: true, startup_in_background: false, enable_tray_icon: true, + enable_autostart: false, dark_mode: true, start_fullscreen: false, fullscreen_width: 1920, @@ -86,6 +89,7 @@ impl From for Config { run_in_background: c.run_in_background, startup_in_background: c.startup_in_background, enable_tray_icon: true, + enable_autostart: false, ac_command: c.ac_command, bat_command: c.bat_command, dark_mode: true, @@ -96,3 +100,90 @@ impl From for Config { } } } + +pub fn update_autostart(enable: bool) { + let autostart_dir = match dirs::config_dir() { + Some(mut p) => { + p.push("autostart"); + p + } + None => { + log::error!("Could not find config directory for autostart"); + return; + } + }; + + let desktop_file = autostart_dir.join("rog-control-center.desktop"); + + if enable { + if !autostart_dir.exists() { + if let Err(e) = std::fs::create_dir_all(&autostart_dir) { + log::error!("Failed to create autostart directory: {e}"); + return; + } + } + + let content = "[Desktop Entry]\n\ + Version=1.0\n\ + Type=Application\n\ + Name=ROG Control Center\n\ + Comment=Make your ASUS ROG Laptop go Brrrrr!\n\ + Categories=Settings;\n\ + Icon=rog-control-center\n\ + Exec=rog-control-center\n\ + Terminal=false\n"; + + if let Err(e) = std::fs::write(&desktop_file, content) { + log::error!("Failed to write autostart desktop file: {e}"); + } else { + log::info!("Created autostart entry at {:?}", desktop_file); + } + } else { + if desktop_file.exists() { + if let Err(e) = std::fs::remove_file(&desktop_file) { + log::error!("Failed to remove autostart desktop file: {e}"); + } else { + log::info!("Removed autostart entry at {:?}", desktop_file); + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_update_autostart() { + let path = dirs::config_dir().map(|mut p| { + p.push("autostart"); + p.push("rog-control-center.desktop"); + p + }); + + if let Some(path) = path { + // Backup existing file if any + let backup = if path.exists() { + Some(std::fs::read_to_string(&path).unwrap()) + } else { + None + }; + + // Test enabling + update_autostart(true); + assert!(path.exists()); + let content = std::fs::read_to_string(&path).unwrap(); + assert!(content.contains("Name=ROG Control Center")); + assert!(content.contains("Exec=rog-control-center")); + + // Test disabling + update_autostart(false); + assert!(!path.exists()); + + // Restore backup if any + if let Some(ref backup_content) = backup { + std::fs::write(&path, backup_content).ok(); + } + } + } +} From a334e7c557d41156d1d2f4bed4892f65118855b2 Mon Sep 17 00:00:00 2001 From: Marco Scardovi Date: Sun, 28 Jun 2026 16:22:22 +0200 Subject: [PATCH 3/5] ui: Bind enable_autostart UI settings callbacks --- rog-control-center/src/ui/mod.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/rog-control-center/src/ui/mod.rs b/rog-control-center/src/ui/mod.rs index b0d0b10c..eb90a537 100644 --- a/rog-control-center/src/ui/mod.rs +++ b/rog-control-center/src/ui/mod.rs @@ -211,11 +211,20 @@ pub fn setup_app_settings_page(ui: &MainWindow, config: Arc>) { lock.write(); } }); + let config_copy = config.clone(); + global.on_set_enable_autostart(move |enable| { + if let Ok(mut lock) = config_copy.try_lock() { + lock.enable_autostart = enable; + lock.write(); + super::config::update_autostart(enable); + } + }); if let Ok(lock) = config.try_lock() { global.set_run_in_background(lock.run_in_background); global.set_startup_in_background(lock.startup_in_background); global.set_enable_tray_icon(lock.enable_tray_icon); global.set_enable_dgpu_notifications(lock.notifications.enabled); + global.set_enable_autostart(lock.enable_autostart); } } From c8f6897279b6cd359bea5729430496de16e6142a Mon Sep 17 00:00:00 2001 From: Marco Scardovi Date: Sun, 28 Jun 2026 16:22:23 +0200 Subject: [PATCH 4/5] main: Sync autostart status on application startup --- rog-control-center/src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rog-control-center/src/main.rs b/rog-control-center/src/main.rs index 2e72d48a..3fefb20f 100644 --- a/rog-control-center/src/main.rs +++ b/rog-control-center/src/main.rs @@ -161,9 +161,11 @@ async fn main() -> Result<()> { config.run_in_background = false; config.startup_in_background = false; config.start_fullscreen = true; + config.enable_autostart = false; } config.write(); + rog_control_center::config::update_autostart(config.enable_autostart); let enable_tray_icon = config.enable_tray_icon; let startup_in_background = config.startup_in_background; From 891efd0ebec8007cc1d8ed5b34508553184afa81 Mon Sep 17 00:00:00 2001 From: Marco Scardovi Date: Mon, 29 Jun 2026 12:28:39 +0200 Subject: [PATCH 5/5] Allow configuring autostart to optionally start in background --- rog-control-center/src/cli_options.rs | 2 ++ rog-control-center/src/config.rs | 24 +++++++++++++------ rog-control-center/src/main.rs | 4 ++-- rog-control-center/src/ui/mod.rs | 13 +++++++++- .../ui/pages/app_settings.slint | 13 ++++++++++ 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/rog-control-center/src/cli_options.rs b/rog-control-center/src/cli_options.rs index d7bde2d4..b3fc9b4f 100644 --- a/rog-control-center/src/cli_options.rs +++ b/rog-control-center/src/cli_options.rs @@ -14,6 +14,8 @@ pub struct CliStart { pub windowed: bool, #[options(help = "show program version number")] pub version: bool, + #[options(help = "start in background (UI closed)")] + pub background: bool, #[options( meta = "", help = "set board name for testing, this will make ROGCC show only the keyboard page" diff --git a/rog-control-center/src/config.rs b/rog-control-center/src/config.rs index 0810bea5..24a090d2 100644 --- a/rog-control-center/src/config.rs +++ b/rog-control-center/src/config.rs @@ -15,6 +15,8 @@ pub struct Config { pub enable_tray_icon: bool, #[serde(default)] pub enable_autostart: bool, + #[serde(default)] + pub autostart_in_background: bool, pub ac_command: String, pub bat_command: String, pub dark_mode: bool, @@ -33,6 +35,7 @@ impl Default for Config { startup_in_background: false, enable_tray_icon: true, enable_autostart: false, + autostart_in_background: false, dark_mode: true, start_fullscreen: false, fullscreen_width: 1920, @@ -90,6 +93,7 @@ impl From for Config { startup_in_background: c.startup_in_background, enable_tray_icon: true, enable_autostart: false, + autostart_in_background: false, ac_command: c.ac_command, bat_command: c.bat_command, dark_mode: true, @@ -101,7 +105,7 @@ impl From for Config { } } -pub fn update_autostart(enable: bool) { +pub fn update_autostart(enable: bool, in_background: bool) { let autostart_dir = match dirs::config_dir() { Some(mut p) => { p.push("autostart"); @@ -123,15 +127,21 @@ pub fn update_autostart(enable: bool) { } } - let content = "[Desktop Entry]\n\ + let exec_cmd = if in_background { + "rog-control-center --background" + } else { + "rog-control-center" + }; + + let content = format!("[Desktop Entry]\n\ Version=1.0\n\ Type=Application\n\ Name=ROG Control Center\n\ Comment=Make your ASUS ROG Laptop go Brrrrr!\n\ Categories=Settings;\n\ Icon=rog-control-center\n\ - Exec=rog-control-center\n\ - Terminal=false\n"; + Exec={}\n\ + Terminal=false\n", exec_cmd); if let Err(e) = std::fs::write(&desktop_file, content) { log::error!("Failed to write autostart desktop file: {e}"); @@ -170,14 +180,14 @@ mod tests { }; // Test enabling - update_autostart(true); + update_autostart(true, true); assert!(path.exists()); let content = std::fs::read_to_string(&path).unwrap(); assert!(content.contains("Name=ROG Control Center")); - assert!(content.contains("Exec=rog-control-center")); + assert!(content.contains("Exec=rog-control-center --background")); // Test disabling - update_autostart(false); + update_autostart(false, false); assert!(!path.exists()); // Restore backup if any diff --git a/rog-control-center/src/main.rs b/rog-control-center/src/main.rs index 3fefb20f..2a0cacaf 100644 --- a/rog-control-center/src/main.rs +++ b/rog-control-center/src/main.rs @@ -165,10 +165,10 @@ async fn main() -> Result<()> { } config.write(); - rog_control_center::config::update_autostart(config.enable_autostart); + rog_control_center::config::update_autostart(config.enable_autostart, config.autostart_in_background); let enable_tray_icon = config.enable_tray_icon; - let startup_in_background = config.startup_in_background; + let startup_in_background = cli_parsed.background || config.startup_in_background; let config = Arc::new(Mutex::new(config)); start_notifications(config.clone(), &rt)?; diff --git a/rog-control-center/src/ui/mod.rs b/rog-control-center/src/ui/mod.rs index eb90a537..0228439b 100644 --- a/rog-control-center/src/ui/mod.rs +++ b/rog-control-center/src/ui/mod.rs @@ -215,8 +215,18 @@ pub fn setup_app_settings_page(ui: &MainWindow, config: Arc>) { global.on_set_enable_autostart(move |enable| { if let Ok(mut lock) = config_copy.try_lock() { lock.enable_autostart = enable; + let in_bg = lock.autostart_in_background; lock.write(); - super::config::update_autostart(enable); + super::config::update_autostart(enable, in_bg); + } + }); + let config_copy = config.clone(); + global.on_set_autostart_in_background(move |enable| { + if let Ok(mut lock) = config_copy.try_lock() { + lock.autostart_in_background = enable; + let autostart = lock.enable_autostart; + lock.write(); + super::config::update_autostart(autostart, enable); } }); @@ -226,5 +236,6 @@ pub fn setup_app_settings_page(ui: &MainWindow, config: Arc>) { global.set_enable_tray_icon(lock.enable_tray_icon); global.set_enable_dgpu_notifications(lock.notifications.enabled); global.set_enable_autostart(lock.enable_autostart); + global.set_autostart_in_background(lock.autostart_in_background); } } diff --git a/rog-control-center/ui/pages/app_settings.slint b/rog-control-center/ui/pages/app_settings.slint index 753a85ba..aec89e9f 100644 --- a/rog-control-center/ui/pages/app_settings.slint +++ b/rog-control-center/ui/pages/app_settings.slint @@ -12,6 +12,8 @@ export global AppSettingsPageData { callback set_enable_dgpu_notifications(bool); in-out property enable_autostart; callback set_enable_autostart(bool); + in-out property autostart_in_background; + callback set_autostart_in_background(bool); } export component PageAppSettings inherits VerticalLayout { @@ -61,6 +63,17 @@ export component PageAppSettings inherits VerticalLayout { } } + if AppSettingsPageData.enable_autostart : HorizontalLayout { + padding-left: 20px; + SystemToggle { + text: @tr("Start in background on startup"); + checked <=> AppSettingsPageData.autostart_in_background; + toggled => { + AppSettingsPageData.set_autostart_in_background(AppSettingsPageData.autostart_in_background) + } + } + } + Text { color: Palette.accent-background; text: " WIP: some features like notifications are not complete";