mirror of
https://github.com/arabianq/pipewire-soundpad.git
synced 2026-04-28 06:21:23 +00:00
fix: hotkeys setting from pwsp-gui (#56)
* refactor: do not overwrite incorrect hotkeys config * fix: hotkeys not saved via pwsp-gui
This commit is contained in:
committed by
GitHub
parent
cb56cb3a04
commit
42c0170044
+66
-20
@@ -99,22 +99,28 @@ pub struct SetHotkeyCommand {
|
||||
pub file_path: Option<PathBuf>,
|
||||
}
|
||||
|
||||
pub struct SetHotkeyActionCommand {
|
||||
pub slot: Option<String>,
|
||||
pub action: Option<Request>,
|
||||
}
|
||||
|
||||
pub struct SetHotkeyKeyCommand {
|
||||
pub slot: Option<String>,
|
||||
pub key_chord: Option<String>,
|
||||
}
|
||||
|
||||
pub struct ClearHotkeyCommand {
|
||||
pub struct SetHotkeyActionAndKeyCommand {
|
||||
pub slot: Option<String>,
|
||||
pub action: Option<Request>,
|
||||
pub key_chord: Option<String>,
|
||||
}
|
||||
|
||||
pub struct PlayHotkeyCommand {
|
||||
pub slot: Option<String>,
|
||||
}
|
||||
|
||||
pub struct SetHotkeyActionCommand {
|
||||
pub struct ClearHotkeyCommand {
|
||||
pub slot: Option<String>,
|
||||
pub action: Option<Request>,
|
||||
}
|
||||
|
||||
pub struct ClearHotkeyKeyCommand {
|
||||
@@ -553,6 +559,30 @@ impl Executable for SetHotkeyCommand {
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Executable for SetHotkeyActionCommand {
|
||||
async fn execute(&self) -> Response {
|
||||
let Some(slot) = &self.slot else {
|
||||
return Response::new(false, "Missing slot name");
|
||||
};
|
||||
let Some(action) = &self.action else {
|
||||
return Response::new(false, "Missing or invalid action");
|
||||
};
|
||||
|
||||
let mut config = match HotkeyConfig::load() {
|
||||
Ok(c) => c,
|
||||
Err(err) => return Response::new(false, format!("Failed to load hotkeys: {}", err)),
|
||||
};
|
||||
|
||||
config.set_slot(slot.clone(), action.clone());
|
||||
|
||||
match config.save() {
|
||||
Ok(_) => Response::new(true, format!("Hotkey slot '{}' set", slot)),
|
||||
Err(err) => Response::new(false, format!("Failed to save hotkeys: {}", err)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Executable for SetHotkeyKeyCommand {
|
||||
async fn execute(&self) -> Response {
|
||||
@@ -583,24 +613,41 @@ impl Executable for SetHotkeyKeyCommand {
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Executable for ClearHotkeyCommand {
|
||||
impl Executable for SetHotkeyActionAndKeyCommand {
|
||||
async fn execute(&self) -> Response {
|
||||
let Some(slot) = &self.slot else {
|
||||
return Response::new(false, "Missing slot name");
|
||||
};
|
||||
let Some(action) = &self.action else {
|
||||
return Response::new(false, "Missing or invalid action");
|
||||
};
|
||||
let Some(key_chord) = &self.key_chord else {
|
||||
return Response::new(false, "Missing key chord");
|
||||
};
|
||||
|
||||
let mut config = match HotkeyConfig::load() {
|
||||
Ok(c) => c,
|
||||
Err(err) => return Response::new(false, format!("Failed to load hotkeys: {}", err)),
|
||||
};
|
||||
|
||||
if config.remove_slot(slot) {
|
||||
match config.save() {
|
||||
Ok(_) => Response::new(true, format!("Hotkey slot '{}' cleared", slot)),
|
||||
Err(err) => Response::new(false, format!("Failed to save hotkeys: {}", err)),
|
||||
}
|
||||
} else {
|
||||
Response::new(false, format!("Slot '{}' not found", slot))
|
||||
// Set the action and then the key chord
|
||||
config.set_slot(slot.clone(), action.clone());
|
||||
if !config.set_key_chord(slot, Some(key_chord.clone())) {
|
||||
return Response::new(
|
||||
false,
|
||||
format!("Slot '{}' not found after setting action", slot),
|
||||
);
|
||||
}
|
||||
|
||||
match config.save() {
|
||||
Ok(_) => Response::new(
|
||||
true,
|
||||
format!(
|
||||
"Hotkey slot '{}' set with action and key chord '{}'",
|
||||
slot, key_chord
|
||||
),
|
||||
),
|
||||
Err(err) => Response::new(false, format!("Failed to save hotkeys: {}", err)),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -632,25 +679,24 @@ impl Executable for PlayHotkeyCommand {
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Executable for SetHotkeyActionCommand {
|
||||
impl Executable for ClearHotkeyCommand {
|
||||
async fn execute(&self) -> Response {
|
||||
let Some(slot) = &self.slot else {
|
||||
return Response::new(false, "Missing slot name");
|
||||
};
|
||||
let Some(action) = &self.action else {
|
||||
return Response::new(false, "Missing or invalid action");
|
||||
};
|
||||
|
||||
let mut config = match HotkeyConfig::load() {
|
||||
Ok(c) => c,
|
||||
Err(err) => return Response::new(false, format!("Failed to load hotkeys: {}", err)),
|
||||
};
|
||||
|
||||
config.set_slot(slot.clone(), action.clone());
|
||||
|
||||
match config.save() {
|
||||
Ok(_) => Response::new(true, format!("Hotkey slot '{}' set", slot)),
|
||||
Err(err) => Response::new(false, format!("Failed to save hotkeys: {}", err)),
|
||||
if config.remove_slot(slot) {
|
||||
match config.save() {
|
||||
Ok(_) => Response::new(true, format!("Hotkey slot '{}' cleared", slot)),
|
||||
Err(err) => Response::new(false, format!("Failed to save hotkeys: {}", err)),
|
||||
}
|
||||
} else {
|
||||
Response::new(false, format!("Slot '{}' not found", slot))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -98,7 +98,6 @@ impl GuiConfig {
|
||||
pub struct HotkeySlot {
|
||||
pub slot: String,
|
||||
pub action: Request,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub key_chord: Option<String>,
|
||||
}
|
||||
|
||||
@@ -121,7 +120,7 @@ impl HotkeyConfig {
|
||||
let bytes = fs::read(&path)?;
|
||||
match serde_json::from_slice::<HotkeyConfig>(&bytes) {
|
||||
Ok(config) => Ok(config),
|
||||
Err(_) => Ok(HotkeyConfig::default()),
|
||||
Err(e) => Err(e.into()),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -208,6 +208,18 @@ impl Request {
|
||||
pub fn clear_hotkey_key(slot: &str) -> Self {
|
||||
Request::new("clear_hotkey_key", vec![("slot", slot)])
|
||||
}
|
||||
|
||||
pub fn set_hotkey_action_and_key(slot: &str, action: &Request, key_chord: &str) -> Self {
|
||||
let action_json = serde_json::to_string(action).unwrap_or_default();
|
||||
Request::new(
|
||||
"set_hotkey_action_and_key",
|
||||
vec![
|
||||
("slot", slot),
|
||||
("action", &action_json),
|
||||
("key_chord", key_chord),
|
||||
],
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
|
||||
|
||||
Reference in New Issue
Block a user