diff --git a/lact-daemon/src/server/handler.rs b/lact-daemon/src/server/handler.rs index 477ee96..6d54cc0 100644 --- a/lact-daemon/src/server/handler.rs +++ b/lact-daemon/src/server/handler.rs @@ -565,7 +565,11 @@ impl<'a> Handler { enabled_states: Vec, ) -> anyhow::Result { self.edit_gpu_config(id.to_owned(), |gpu| { - gpu.power_states.insert(kind, enabled_states); + if enabled_states.is_empty() { + gpu.power_states.shift_remove(&kind); + } else { + gpu.power_states.insert(kind, enabled_states); + } }) .await .context("Failed to edit GPU config and set enabled power states") diff --git a/lact-gui/src/app.rs b/lact-gui/src/app.rs index ac2095c..91cfb8d 100644 --- a/lact-gui/src/app.rs +++ b/lact-gui/src/app.rs @@ -649,17 +649,15 @@ impl AppModel { let enabled_power_states = self.oc_page.model().get_enabled_power_states(); for (kind, states) in enabled_power_states { - if !states.is_empty() { - self.daemon_client - .set_enabled_power_states(&gpu_id, kind, states) - .await - .context("Could not set power states")?; + self.daemon_client + .set_enabled_power_states(&gpu_id, kind, states) + .await + .context("Could not set power states")?; - self.daemon_client - .confirm_pending_config(ConfirmCommand::Confirm) - .await - .context("Could not commit config")?; - } + self.daemon_client + .confirm_pending_config(ConfirmCommand::Confirm) + .await + .context("Could not commit config")?; } if !clocks_commands.is_empty() { diff --git a/lact-gui/src/app/pages/oc_page.rs b/lact-gui/src/app/pages/oc_page.rs index 1782188..640a139 100644 --- a/lact-gui/src/app/pages/oc_page.rs +++ b/lact-gui/src/app/pages/oc_page.rs @@ -43,6 +43,7 @@ pub enum OcPageMsg { ClocksTable(Option), ProfileModesTable(Option), PowerStates(PowerStates), + PerformanceLevelChanged, } #[relm4::component(pub)] @@ -156,6 +157,7 @@ impl relm4::Component for OcPage { } None => self.performance_frame.hide(), } + sender.input(OcPageMsg::PerformanceLevelChanged); } } PageUpdate::Info(info) => { @@ -177,6 +179,14 @@ impl relm4::Component for OcPage { OcPageMsg::PowerStates(states) => { self.power_states_frame.set_power_states(states); } + OcPageMsg::PerformanceLevelChanged => { + if let Some(PerformanceLevel::Manual) = self.get_performance_level() { + self.power_states_frame.set_toggleable(true); + } else { + self.power_states_frame.set_toggleable(false); + self.power_states_frame.set_configurable(false); + } + } } self.signals_blocked.set(false); @@ -191,7 +201,17 @@ impl relm4::Component for OcPage { } }; self.performance_frame.connect_settings_changed(f.clone()); - self.power_states_frame.connect_values_changed(f); + + self.power_states_frame.connect_values_changed(f.clone()); + + { + let sender = sender.clone(); + self.performance_frame.connect_settings_changed(move || { + sender.input(OcPageMsg::PerformanceLevelChanged); + }); + } + self.power_states_frame + .connect_configurable_notify(move |_| f()); self.update_view(widgets, sender); } @@ -216,10 +236,6 @@ impl OcPage { } pub fn get_enabled_power_states(&self) -> HashMap> { - if self.performance_frame.get_selected_performance_level() == PerformanceLevel::Manual { - self.power_states_frame.get_enabled_power_states() - } else { - HashMap::new() - } + self.power_states_frame.get_enabled_power_states() } } diff --git a/lact-gui/src/app/pages/oc_page/power_states/power_states_frame.rs b/lact-gui/src/app/pages/oc_page/power_states/power_states_frame.rs index 8a787e7..14b281b 100644 --- a/lact-gui/src/app/pages/oc_page/power_states/power_states_frame.rs +++ b/lact-gui/src/app/pages/oc_page/power_states/power_states_frame.rs @@ -26,6 +26,15 @@ impl PowerStatesFrame { imp.expander.set_expanded(false); } + if states + .core + .iter() + .chain(states.vram.iter()) + .any(|state| !state.enabled) + { + self.set_configurable(true); + } + imp.core_states_list .set_power_states(states.core, "MHz", 1.0); imp.vram_states_list @@ -48,9 +57,17 @@ impl PowerStatesFrame { } pub fn get_enabled_power_states(&self) -> HashMap> { - let imp = self.imp(); - let core_states = imp.core_states_list.get_enabled_power_states(); - let vram_states = imp.vram_states_list.get_enabled_power_states(); + let core_states; + let vram_states; + + if self.configurable() { + let imp = self.imp(); + core_states = imp.core_states_list.get_enabled_power_states(); + vram_states = imp.vram_states_list.get_enabled_power_states(); + } else { + core_states = vec![]; + vram_states = vec![]; + } [ (PowerLevelKind::CoreClock, core_states), @@ -94,6 +111,8 @@ mod imp { #[property(get, set)] configurable: AtomicBool, #[property(get, set)] + toggleable: AtomicBool, + #[property(get, set)] vram_clock_ratio: Cell, } diff --git a/lact-gui/ui/oc_page/power_states_frame.blp b/lact-gui/ui/oc_page/power_states_frame.blp index 0271aa9..c18360c 100644 --- a/lact-gui/ui/oc_page/power_states_frame.blp +++ b/lact-gui/ui/oc_page/power_states_frame.blp @@ -5,21 +5,39 @@ template $PowerStatesFrame: Box { label: "Power states"; Box { + orientation: vertical; margin-start: 10; margin-end: 10; margin-top: 10; margin-bottom: 10; - spacing: 10; - orientation: horizontal; + spacing: 5; - $PowerStatesList core_states_list { - title: "GPU power states"; - sensitive: bind template.configurable; + Label { + label: "Note: performance level must be set to 'manual' to toggle power states"; + margin-start: 10; + margin-end: 10; + halign: start; } - $PowerStatesList vram_states_list { - title: "VRAM power states"; - sensitive: bind template.configurable; + CheckButton { + label: "Enable power state configuration"; + sensitive: bind template.toggleable bidirectional; + active: bind template.configurable bidirectional; + } + + Box { + spacing: 10; + orientation: horizontal; + + $PowerStatesList core_states_list { + title: "GPU power states"; + sensitive: bind template.configurable; + } + + $PowerStatesList vram_states_list { + title: "VRAM power states"; + sensitive: bind template.configurable; + } } } }