From d4eca0c93e862d3b24b4c3ada8fe7a61f5e5d762 Mon Sep 17 00:00:00 2001 From: Mykola Shevchenko Date: Mon, 19 Jan 2026 00:15:02 +0200 Subject: [PATCH 1/4] feat: improve toast message for rogcc --- rog-control-center/ui/main_window.slint | 54 +++++++++++++------------ 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/rog-control-center/ui/main_window.slint b/rog-control-center/ui/main_window.slint index 0623c1dc..01b635df 100644 --- a/rog-control-center/ui/main_window.slint +++ b/rog-control-center/ui/main_window.slint @@ -110,6 +110,33 @@ export component MainWindow inherits Window { if(side-bar.current-item == 5): PageAbout { width: root.width - side-bar.width; } + + if toast: Rectangle { + x: 0px; + y: root.height - self.height; + width: root.width - side-bar.width; + height: 40px; + opacity: 1.0; + background: Palette.selection-background; + clip: true; + TouchArea { + height: 100%; + width: 100%; + clicked => { + toast = false; + } + } + + Rectangle { + height: 100%; + width: 100%; + background: Palette.control-background; + Text { + color: Palette.control-foreground; + text: root.toast_text; + } + } + } } } @@ -133,31 +160,6 @@ export component MainWindow inherits Window { } } - if toast: Rectangle { - x: 0px; - y: 0px; - width: root.width; - height: 32px; - opacity: 1.0; - background: Colors.grey; - TouchArea { - height: 100%; - width: 100%; - clicked => { - toast = false; - } - } - - Rectangle { - height: 100%; - width: 100%; - background: Palette.control-background; - Text { - color: Palette.control-foreground; - text: root.toast_text; - } - } - } // // TODO: or use Dialogue if show_notif: Rectangle { @@ -190,7 +192,7 @@ export component MainWindow inherits Window { y: 0px; width: root.width; height: root.height; - + //padding only has effect on layout elements //padding: 10px; From 0311cfb1f992b54742874d084c5f54143d6cdce2 Mon Sep 17 00:00:00 2001 From: Denis Benato Date: Sun, 18 Jan 2026 23:38:37 +0100 Subject: [PATCH 2/4] fix: improve handling of different attribute types --- asusd/src/asus_armoury.rs | 237 ++++++++++++++----------------- asusd/src/ctrl_platform.rs | 6 +- rog-platform/src/asus_armoury.rs | 79 +++++++---- 3 files changed, 167 insertions(+), 155 deletions(-) diff --git a/asusd/src/asus_armoury.rs b/asusd/src/asus_armoury.rs index 5e017531..54bba44b 100644 --- a/asusd/src/asus_armoury.rs +++ b/asusd/src/asus_armoury.rs @@ -2,7 +2,9 @@ use std::sync::Arc; use config_traits::StdConfig; use log::{debug, error, info, warn}; -use rog_platform::asus_armoury::{AttrValue, Attribute, FirmwareAttribute, FirmwareAttributes}; +use rog_platform::asus_armoury::{ + AttrValue, Attribute, FirmwareAttribute, FirmwareAttributeType, FirmwareAttributes, +}; use rog_platform::platform::{PlatformProfile, RogPlatform}; use rog_platform::power::AsusPower; use serde::{Deserialize, Serialize}; @@ -168,82 +170,64 @@ impl ArmouryAttributeRegistry { impl crate::Reloadable for AsusArmouryAttribute { async fn reload(&mut self) -> Result<(), RogError> { info!("Reloading {}", self.attr.name()); - let name: FirmwareAttribute = self.attr.name().into(); + let attribute: FirmwareAttribute = self.attr.name().into(); + let name = self.attr.name(); - // Treat dGPU attributes the same as PPT attributes for power-profile - // behaviour so they follow AC/DC tuning groups. - if name.is_ppt() || name.is_dgpu() { - let profile: PlatformProfile = self.platform.get_platform_profile()?.into(); - let power_plugged = self - .power - .get_online() - .map_err(|e| { - error!("Could not get power status: {e:?}"); - e - }) - .unwrap_or_default() - == 1; - - let apply_value = { - let config = self.config.lock().await; - config - .select_tunings_ref(power_plugged, profile) - .and_then(|tuning| { - if tuning.enabled { - tuning.group.get(&self.name()).copied() - } else { - None - } + let config = self.config.lock().await; + let apply_value = match attribute.property_type() { + FirmwareAttributeType::Ppt => { + let profile: PlatformProfile = self.platform.get_platform_profile()?.into(); + let power_plugged = self + .power + .get_online() + .map_err(|e| { + error!("Could not get power status: {e:?}"); + e }) - }; + .unwrap_or_default() + == 1; - if let Some(tune) = apply_value { - self.attr - .set_current_value(&AttrValue::Integer(tune)) - .map_err(|e| { - error!("Could not set {} value: {e:?}", self.attr.name()); - self.attr.base_path_exists(); - e - })?; - info!( - "Restored PPT armoury setting {} to {:?}", - self.attr.name(), - tune - ); - } else { - info!("Ignored restoring PPT armoury setting {} as tuning group is disabled or no saved value", self.attr.name()); + let apply_value = { + config.select_tunings_ref(power_plugged, profile).and_then( + |tuning| match tuning.enabled { + true => tuning.group.get(&self.name()).copied(), + false => None, + }, + ) + }; + + apply_value.map_or(AttrValue::None, |tune| AttrValue::Integer(tune)) } - } else { - // Handle non-PPT attributes (boolean and other settings) - if let Some(saved_value) = self.config.lock().await.armoury_settings.get(&name) { - self.attr - .set_current_value(&AttrValue::Integer(*saved_value)) - .map_err(|e| { - error!( - "Error restoring armoury setting {}: {e:?}", - self.attr.name() - ); - self.attr.base_path_exists(); - e - })?; - info!( - "Restored armoury setting {} to {:?}", - self.attr.name(), - saved_value - ); - } else { - info!( - "No saved armoury setting for {}: skipping restore", - self.attr.name() - ); + FirmwareAttributeType::Gpu => { + info!("Reload called on GPU attribute {name}: doing nothing"); + AttrValue::None } - } + _ => { + info!("Reload called on firmware attribute {name}"); + match config.armoury_settings.get(&attribute) { + Some(saved_value) => AttrValue::Integer(*saved_value), + None => AttrValue::None, + } + } + }; + + self.attr.set_current_value(&apply_value).map_err(|e| { + error!("Could not set {} value: {e:?}", self.attr.name()); + self.attr.base_path_exists(); + e + })?; + + info!( + "Restored asus-armoury setting {} to {:?}", + self.attr.name(), + apply_value + ); Ok(()) } } -/// If return is `-1` on a property then there is avilable value for that +/// If return is `-1` on a property then there is available value for that /// property #[interface(name = "xyz.ljones.AsusArmoury")] impl AsusArmouryAttribute { @@ -293,7 +277,7 @@ impl AsusArmouryAttribute { async fn restore_default(&self) -> fdo::Result<()> { self.attr.restore_default()?; - if self.name().is_ppt() || self.name().is_dgpu() { + if self.name().property_type() == FirmwareAttributeType::Ppt { let profile: PlatformProfile = self.platform.get_platform_profile()?.into(); let power_plugged = self .power @@ -352,7 +336,7 @@ impl AsusArmouryAttribute { #[zbus(property)] async fn current_value(&self) -> fdo::Result { - if self.name().is_ppt() || self.name().is_dgpu() { + if self.name().property_type() == FirmwareAttributeType::Ppt { let profile: PlatformProfile = self.platform.get_platform_profile()?.into(); let power_plugged = self .power @@ -387,70 +371,65 @@ impl AsusArmouryAttribute { #[zbus(property)] async fn set_current_value(&mut self, value: i32) -> fdo::Result<()> { - if self.name().is_ppt() || self.name().is_dgpu() { - let profile: PlatformProfile = self.platform.get_platform_profile()?.into(); - let power_plugged = self - .power - .get_online() - .map_err(|e| { - error!("Could not get power status: {e:?}"); - e - }) - .unwrap_or_default(); - - let mut config = self.config.lock().await; - let tuning = config.select_tunings(power_plugged == 1, profile); - - if let Some(tune) = tuning.group.get_mut(&self.name()) { - *tune = value; - } else { - tuning.group.insert(self.name(), value); - debug!("Store tuning config for {} = {:?}", self.attr.name(), value); - } - if tuning.enabled { - self.attr - .set_current_value(&AttrValue::Integer(value)) + let name = self.attr.name(); + let apply_value = match self.name().property_type() { + FirmwareAttributeType::Ppt => { + let profile: PlatformProfile = self.platform.get_platform_profile()?.into(); + let power_plugged = self + .power + .get_online() .map_err(|e| { - error!( - "Could not set value to PPT property {}: {e:?}", - self.attr.name() - ); + error!("Could not get power status: {e:?}"); e - })?; - } else { - warn!( - "Tuning group is disabled: skipping setting value to PPT property {}", - self.attr.name() - ); - } - } else { - self.attr - .set_current_value(&AttrValue::Integer(value)) - .map_err(|e| { - error!( - "Could not set value {value} to attribute {}: {e:?}", - self.attr.name() - ); - e - })?; + }) + .unwrap_or_default(); - let mut settings = self.config.lock().await; - settings - .armoury_settings - .entry(self.name()) - .and_modify(|setting| { - debug!("Set config for {} = {value}", self.attr.name()); - *setting = value; - }) - .or_insert_with(|| { - debug!("Adding config for {} = {value}", self.attr.name()); - value - }); - } + let mut config = self.config.lock().await; + let tuning = config.select_tunings(power_plugged == 1, profile); + + if let Some(tune) = tuning.group.get_mut(&self.name()) { + *tune = value; + } else { + tuning.group.insert(self.name(), value); + debug!("Store tuning config for {name} = {:?}", value); + } + + match tuning.enabled { + true => { + debug!("Tuning is enabled: setting value to PPT property {name} = {value}"); + AttrValue::Integer(value) + } + false => { + warn!("Tuning is disabled: skipping setting value to PPT property {name}"); + AttrValue::None + } + } + } + _ => { + let mut settings = self.config.lock().await; + settings + .armoury_settings + .entry(self.name()) + .and_modify(|setting| { + debug!("Set config for {name} = {value}"); + *setting = value; + }) + .or_insert_with(|| { + debug!("Adding config for {name} = {value}"); + value + }); + + AttrValue::Integer(value) + } + }; + + self.attr.set_current_value(&apply_value).map_err(|e| { + error!("Could not set value {value} to attribute {name}: {e:?}"); + e + })?; // write config after setting value - self.config.lock().await.write(); - Ok(()) + Ok(self.config.lock().await.write()) } } @@ -515,7 +494,7 @@ pub async fn set_config_or_default( ) { for attr in attrs.attributes().iter() { let name: FirmwareAttribute = attr.name().into(); - if name.is_ppt() || name.is_dgpu() { + if name.property_type() == FirmwareAttributeType::Ppt { let tuning = config.select_tunings(power_plugged, profile); if !tuning.enabled { debug!("Tuning group is not enabled, skipping"); diff --git a/asusd/src/ctrl_platform.rs b/asusd/src/ctrl_platform.rs index 51103bed..242a5170 100644 --- a/asusd/src/ctrl_platform.rs +++ b/asusd/src/ctrl_platform.rs @@ -4,7 +4,9 @@ use std::sync::Arc; use config_traits::StdConfig; use log::{debug, error, info, warn}; -use rog_platform::asus_armoury::{AttrValue, FirmwareAttribute, FirmwareAttributes}; +use rog_platform::asus_armoury::{ + AttrValue, FirmwareAttribute, FirmwareAttributeType, FirmwareAttributes, +}; use rog_platform::cpu::{CPUControl, CPUGovernor, CPUEPP}; use rog_platform::platform::{PlatformProfile, Properties, RogPlatform}; use rog_platform::power::AsusPower; @@ -617,7 +619,7 @@ impl CtrlPlatform { for attr in self.attributes.attributes() { let name: FirmwareAttribute = attr.name().into(); - if name.is_ppt() { + if name.property_type() == FirmwareAttributeType::Ppt { // reset stored value if let Some(tune) = self .config diff --git a/rog-platform/src/asus_armoury.rs b/rog-platform/src/asus_armoury.rs index a7453822..f7a387af 100644 --- a/rog-platform/src/asus_armoury.rs +++ b/rog-platform/src/asus_armoury.rs @@ -253,8 +253,19 @@ impl FirmwareAttributes { } } +#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] +pub enum FirmwareAttributeType { + #[default] + Immediate, + TUFKeyboard, + Ppt, + Gpu, + Bios, +} + macro_rules! define_attribute_getters { - ($($attr:ident),*) => { + // Accept a list of attribute idents and an optional `types { .. }` block + ( $( $attr:ident ),* $(,)? $( ; types { $( $tattr:ident : $ptype:ident ),* $(,)? } )? ) => { impl FirmwareAttributes { $( pub fn $attr(&self) -> Option<&Attribute> { @@ -268,6 +279,17 @@ macro_rules! define_attribute_getters { }); )* } + + impl FirmwareAttribute { + pub fn property_type(&self) -> FirmwareAttributeType { + match <&str>::from(*self) { + $( + $( stringify!($tattr) => FirmwareAttributeType::$ptype, )* + )? + _ => FirmwareAttributeType::Immediate, + } + } + } } } @@ -299,6 +321,38 @@ define_attribute_getters!( gpu_mux_mode, mini_led_mode, screen_auto_brightness + ; types { + ppt_pl1_spl: Ppt, + ppt_pl2_sppt: Ppt, + ppt_apu_sppt: Ppt, + ppt_platform_sppt: Ppt, + ppt_fppt: Ppt, + nv_dynamic_boost: Ppt, + nv_temp_target: Ppt, + dgpu_base_tgp: Ppt, + dgpu_tgp: Ppt, + + gpu_mux_mode: Gpu, + egpu_connected: Gpu, + egpu_enable: Gpu, + dgpu_disable: Gpu, + + boot_sound: Bios, + + mcu_powersave: Immediate, + + screen_auto_brightness: Immediate, + mini_led_mode: Immediate, + panel_hd_mode: Immediate, + panel_od: Immediate, + + kbd_leds_awake: TUFKeyboard, + kbd_leds_sleep: TUFKeyboard, + kbd_leds_boot: TUFKeyboard, + kbd_leds_shutdown: TUFKeyboard, + + charge_mode: Immediate, + } ); /// CamelCase names of the properties. Intended for use with DBUS @@ -352,29 +406,6 @@ pub enum FirmwareAttribute { KbdLedsShutdown = 30, } -impl FirmwareAttribute { - pub fn is_ppt(&self) -> bool { - matches!( - self, - FirmwareAttribute::PptPl1Spl - | FirmwareAttribute::PptPl2Sppt - | FirmwareAttribute::PptPl3Fppt - | FirmwareAttribute::PptFppt - | FirmwareAttribute::PptApuSppt - | FirmwareAttribute::PptPlatformSppt - ) - } - - pub fn is_dgpu(&self) -> bool { - matches!( - self, - FirmwareAttribute::NvDynamicBoost - | FirmwareAttribute::NvTempTarget - | FirmwareAttribute::DgpuTgp - ) - } -} - impl From<&str> for FirmwareAttribute { fn from(s: &str) -> Self { match s { From 737ffa522c5947a86bdbfa4db980861437c1dc7e Mon Sep 17 00:00:00 2001 From: Denis Benato Date: Sun, 18 Jan 2026 23:41:26 +0100 Subject: [PATCH 3/4] chore: update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f928869..1d44523f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [6.3.2] + +### Changes +- Improve the notification area, @shevchenko0013 strikes again! +- Improve firmware attributes handling + ## [6.3.1] ### Changes From 7edb77b41fee120204f8aff3c0263b0bd9616d9f Mon Sep 17 00:00:00 2001 From: Denis Benato Date: Sun, 18 Jan 2026 23:42:32 +0100 Subject: [PATCH 4/4] fix: make the linter happy again --- asusd/src/asus_armoury.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/asusd/src/asus_armoury.rs b/asusd/src/asus_armoury.rs index 54bba44b..ca2b15b9 100644 --- a/asusd/src/asus_armoury.rs +++ b/asusd/src/asus_armoury.rs @@ -196,7 +196,7 @@ impl crate::Reloadable for AsusArmouryAttribute { ) }; - apply_value.map_or(AttrValue::None, |tune| AttrValue::Integer(tune)) + apply_value.map_or(AttrValue::None, AttrValue::Integer) } FirmwareAttributeType::Gpu => { info!("Reload called on GPU attribute {name}: doing nothing"); @@ -429,7 +429,8 @@ impl AsusArmouryAttribute { })?; // write config after setting value - Ok(self.config.lock().await.write()) + self.config.lock().await.write(); + Ok(()) } }