Add basic event commands
This commit is contained in:
parent
f8ea999604
commit
8c77630fb4
7 changed files with 81 additions and 1 deletions
|
@ -290,6 +290,16 @@ impl ApiMessageHandler {
|
|||
let settings_clone = settings.json();
|
||||
let save_json: SettingsJson = settings_clone.into();
|
||||
unwrap_maybe_fatal(save_json.save(&save_path), "Failed to save settings");
|
||||
if let Some(event) = &settings.general.on_event().on_save {
|
||||
if !event.is_empty() {
|
||||
unwrap_maybe_fatal(
|
||||
std::process::Command::new("/bin/bash")
|
||||
.args(&["-c", event])
|
||||
.spawn(),
|
||||
"Failed to start on_save event command",
|
||||
);
|
||||
}
|
||||
}
|
||||
log::debug!("Saved settings to {}", save_path.display());
|
||||
if let Err(e) = crate::utility::chown_settings_dir() {
|
||||
log::error!("Failed to change config dir permissions: {}", e);
|
||||
|
|
|
@ -5,6 +5,25 @@ use serde::{Deserialize, Serialize};
|
|||
use super::JsonError;
|
||||
use super::{BatteryJson, CpuJson, DriverJson, GpuJson};
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct OnEventJson {
|
||||
pub on_save: Option<String>,
|
||||
pub on_load: Option<String>,
|
||||
pub on_set: Option<String>,
|
||||
pub on_resume: Option<String>,
|
||||
}
|
||||
|
||||
impl Default for OnEventJson {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
on_save: None,
|
||||
on_load: None,
|
||||
on_set: None,
|
||||
on_resume: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct SettingsJson {
|
||||
pub version: u64,
|
||||
|
@ -14,6 +33,7 @@ pub struct SettingsJson {
|
|||
pub gpu: GpuJson,
|
||||
pub battery: BatteryJson,
|
||||
pub provider: Option<DriverJson>,
|
||||
pub events: Option<OnEventJson>,
|
||||
}
|
||||
|
||||
impl Default for SettingsJson {
|
||||
|
@ -26,6 +46,7 @@ impl Default for SettingsJson {
|
|||
gpu: GpuJson::default(),
|
||||
battery: BatteryJson::default(),
|
||||
provider: None,
|
||||
events: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ mod gpu;
|
|||
pub use battery::{BatteryEventJson, BatteryJson};
|
||||
pub use cpu::CpuJson;
|
||||
pub use driver::DriverJson;
|
||||
pub use general::{MinMaxJson, SettingsJson};
|
||||
pub use general::{MinMaxJson, OnEventJson, SettingsJson};
|
||||
pub use gpu::GpuJson;
|
||||
|
||||
pub use error::JsonError;
|
||||
|
|
|
@ -303,6 +303,7 @@ impl DriverBuilder {
|
|||
path: json_path,
|
||||
name: profile_name,
|
||||
driver: DriverJson::AutoDetect,
|
||||
events: Default::default(),
|
||||
}),
|
||||
cpus: None,
|
||||
gpu: None,
|
||||
|
|
|
@ -21,6 +21,7 @@ impl Driver {
|
|||
path: json_path,
|
||||
name: settings.name,
|
||||
driver: DriverJson::SteamDeck,
|
||||
events: settings.events.unwrap_or_default(),
|
||||
}),
|
||||
cpus: Box::new(super::steam_deck::Cpus::from_json(
|
||||
settings.cpus,
|
||||
|
@ -51,6 +52,7 @@ impl Driver {
|
|||
path: json_path,
|
||||
name: settings.name,
|
||||
driver: DriverJson::SteamDeck,
|
||||
events: settings.events.unwrap_or_default(),
|
||||
}),
|
||||
cpus: Box::new(super::steam_deck::Cpus::from_json(
|
||||
settings.cpus,
|
||||
|
@ -72,6 +74,7 @@ impl Driver {
|
|||
path: json_path,
|
||||
name: settings.name,
|
||||
driver: DriverJson::SteamDeckAdvance,
|
||||
events: settings.events.unwrap_or_default(),
|
||||
}),
|
||||
cpus: Box::new(super::steam_deck::Cpus::from_json(
|
||||
settings.cpus,
|
||||
|
|
|
@ -34,16 +34,43 @@ pub struct General {
|
|||
pub path: PathBuf,
|
||||
pub name: String,
|
||||
pub driver: crate::persist::DriverJson,
|
||||
pub events: crate::persist::OnEventJson,
|
||||
}
|
||||
|
||||
impl OnSet for General {
|
||||
fn on_set(&mut self) -> Result<(), Vec<SettingError>> {
|
||||
if let Some(event) = &self.events.on_set {
|
||||
if !event.is_empty() {
|
||||
std::process::Command::new("/bin/bash")
|
||||
.args(&["-c", event])
|
||||
.spawn()
|
||||
.map_err(|e| {
|
||||
vec![SettingError {
|
||||
msg: format!("on_set event command error: {}", e),
|
||||
setting: SettingVariant::General,
|
||||
}]
|
||||
})?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl OnResume for General {
|
||||
fn on_resume(&self) -> Result<(), Vec<SettingError>> {
|
||||
if let Some(event) = &self.events.on_resume {
|
||||
if !event.is_empty() {
|
||||
std::process::Command::new("/bin/bash")
|
||||
.args(&["-c", event])
|
||||
.spawn()
|
||||
.map_err(|e| {
|
||||
vec![SettingError {
|
||||
msg: format!("on_resume event command error: {}", e),
|
||||
setting: SettingVariant::General,
|
||||
}]
|
||||
})?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
@ -82,6 +109,10 @@ impl TGeneral for General {
|
|||
fn provider(&self) -> crate::persist::DriverJson {
|
||||
self.driver.clone()
|
||||
}
|
||||
|
||||
fn on_event(&self) -> &crate::persist::OnEventJson {
|
||||
&self.events
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
@ -214,6 +245,17 @@ impl Settings {
|
|||
*self.general.persistent() = false;
|
||||
}
|
||||
self.general.path(filename);
|
||||
if let Some(event) = &self.general.on_event().on_load {
|
||||
if !event.is_empty() {
|
||||
std::process::Command::new("/bin/bash")
|
||||
.args(&["-c", event])
|
||||
.spawn()
|
||||
.map_err(|e| SettingError {
|
||||
msg: format!("on_save event command error: {}", e),
|
||||
setting: SettingVariant::General,
|
||||
})?;
|
||||
}
|
||||
}
|
||||
Ok(*self.general.persistent())
|
||||
}
|
||||
|
||||
|
@ -257,6 +299,7 @@ impl Settings {
|
|||
gpu: self.gpu.json(),
|
||||
battery: self.battery.json(),
|
||||
provider: Some(self.general.provider()),
|
||||
events: Some(self.general.on_event().clone()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -104,6 +104,8 @@ pub trait TGeneral: OnSet + OnResume + OnPowerEvent + Debug + Send {
|
|||
fn name(&mut self, name: String);
|
||||
|
||||
fn provider(&self) -> crate::persist::DriverJson;
|
||||
|
||||
fn on_event(&self) -> &'_ crate::persist::OnEventJson;
|
||||
}
|
||||
|
||||
pub trait TBattery: OnSet + OnResume + OnPowerEvent + Debug + Send {
|
||||
|
|
Loading…
Reference in a new issue