use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
mod button_map;
mod device;
#[cfg(feature = "fs")]
mod file;
mod function_key;
mod gestures;
mod identity;
mod key_trigger;
mod migrate;
mod per_app;
mod per_device;
mod settings;
#[cfg(test)]
#[cfg(feature = "fs")]
mod tests;
pub use device::{DeviceConfig, DeviceIdentity, LinkConfig, LinkOverrides};
#[cfg(all(test, feature = "fs", unix))]
use file::resolve_symlinks;
#[cfg(feature = "fs")]
pub use file::{ConfigError, ConfigFile};
#[cfg(all(test, feature = "fs"))]
use file::{backup_existing_config, config_backup_path};
pub use function_key::FunctionKey;
pub use identity::canonical_device_key;
pub use key_trigger::{KeyModifiers, KeyTrigger, KeyboardConfig, ParseTriggerError};
pub use settings::LightSettings;
pub use settings::{
AppIcon, AppSettings, Appearance, AssetSourcePreference, CameraControls, DeviceViewMode,
Lighting, MouseProfileTarget, SMARTSHIFT_AUTO_DISENGAGE_DEFAULT, SMARTSHIFT_MIN_AUTO_DISENGAGE,
ScrollResolution, SmartShift, ThumbwheelSensitivity, UiScale, VerticalScrollSensitivity,
WheelMode,
};
use crate::binding::Action;
#[cfg(all(test, feature = "fs"))]
use crate::binding::{Binding, ButtonId, GestureDirection};
pub const SCHEMA_VERSION: u32 = 7;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Config {
pub schema_version: u32,
#[serde(default, skip_serializing_if = "AppSettings::is_default")]
pub app_settings: AppSettings,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub selected_device: Option<String>,
#[serde(skip)]
#[cfg_attr(
not(feature = "fs"),
expect(clippy::allow_attributes, reason = "see above"),
allow(dead_code, reason = "only the `fs` half suppresses a save")
)]
ephemeral: bool,
#[serde(default)]
pub devices: BTreeMap<String, DeviceConfig>,
#[serde(default)]
pub keyboard: KeyboardConfig,
}
impl Default for Config {
fn default() -> Self {
Self {
schema_version: SCHEMA_VERSION,
app_settings: AppSettings::default(),
selected_device: None,
devices: BTreeMap::new(),
ephemeral: false,
keyboard: KeyboardConfig::default(),
}
}
}
impl Config {
#[must_use]
pub fn ephemeral() -> Self {
Self {
ephemeral: true,
..Self::default()
}
}
pub fn set_keyboard_binding(&mut self, trigger: KeyTrigger, action: Option<Action>) {
match action {
Some(a) => {
self.keyboard.bindings.insert(trigger, a);
}
None => {
self.keyboard.bindings.remove(&trigger);
}
}
}
#[must_use]
pub fn keyboard_bindings(&self) -> &BTreeMap<KeyTrigger, Action> {
&self.keyboard.bindings
}
#[must_use]
pub fn selected_device(&self) -> Option<&str> {
self.selected_device.as_deref()
}
pub fn set_selected_device(&mut self, key: Option<String>) {
self.selected_device = key;
}
}