pub struct Config {
pub schema_version: u32,
pub app_settings: AppSettings,
pub selected_device: Option<String>,
pub devices: BTreeMap<String, DeviceConfig>,
}Expand description
Top-level config document.
Fields§
§schema_version: u32§app_settings: AppSettingsNon-device-scoped preferences (autostart, tray, language, …).
selected_device: Option<String>HID++ config_key of the carousel-selected device, persisted so a
restart restores the last view rather than always landing on the
first paired device. None means “fall back to the first device”.
devices: BTreeMap<String, DeviceConfig>Implementations§
Source§impl Config
impl Config
Sourcepub fn load_or_default() -> Result<Self, ConfigError>
pub fn load_or_default() -> Result<Self, ConfigError>
Loads the config from the default user path, returning
Config::default if the file does not exist yet.
Sourcepub fn load_from_path(path: &Path) -> Result<Self, ConfigError>
pub fn load_from_path(path: &Path) -> Result<Self, ConfigError>
Same as Self::load_or_default but reads from path. Used by tests
to avoid touching the real user config.
Sourcepub fn save_atomic(&self) -> Result<(), ConfigError>
pub fn save_atomic(&self) -> Result<(), ConfigError>
Writes the config atomically to the default user path: serialize to a sibling temp file, then rename over the target. On Unix the temp file is created with mode 0600.
Sourcepub fn save_to_path(&self, path: &Path) -> Result<(), ConfigError>
pub fn save_to_path(&self, path: &Path) -> Result<(), ConfigError>
Same as Self::save_atomic but writes to path. Used by tests.
Sourcepub fn bindings_for(&self, device_key: &str) -> BTreeMap<ButtonId, Binding>
pub fn bindings_for(&self, device_key: &str) -> BTreeMap<ButtonId, Binding>
Returns the bindings stored for device_key, or an empty map if the
device has no committed bindings yet.
Sourcepub fn set_binding(
&mut self,
device_key: &str,
button: ButtonId,
binding: Binding,
)
pub fn set_binding( &mut self, device_key: &str, button: ButtonId, binding: Binding, )
Records binding for button on device_key, creating the device
entry if needed. Replaces the whole binding (use
Self::set_gesture_direction to edit one direction of a gesture
binding in place).
Sourcepub fn gesture_bindings_for(
&self,
device_key: &str,
) -> BTreeMap<GestureDirection, Action>
pub fn gesture_bindings_for( &self, device_key: &str, ) -> BTreeMap<GestureDirection, Action>
Returns the gesture sub-bindings for device_key’s gesture button, or an
empty map if it isn’t in gesture mode. Derived from the unified
DeviceConfig::bindings; kept as a convenience for the agent-side
per-direction adapter.
Sourcepub fn set_gesture_direction(
&mut self,
device_key: &str,
button: ButtonId,
direction: GestureDirection,
action: Action,
)
pub fn set_gesture_direction( &mut self, device_key: &str, button: ButtonId, direction: GestureDirection, action: Action, )
Records action for one direction of button’s gesture binding,
creating the device entry if needed.
A button with no binding yet is seeded from its canonical
default_binding_for — for ButtonId::GestureButton that is the full
default direction map (including a GestureDirection::Click), so the
merged map never persists a gesture binding whose click projection is a
no-op. A prior Binding::Single is upgraded to Binding::Gesture,
preserving its action as the Click entry.
Sourcepub fn gesture_owner(&self, device_key: &str) -> Option<ButtonId>
pub fn gesture_owner(&self, device_key: &str) -> Option<ButtonId>
The button that owns device_key’s single gesture role, or None when
gestures are turned off.
Resolved from the explicit DeviceConfig::gesture_owner when present;
otherwise inferred (see Self::infer_gesture_owner) for configs
predating the field and freshly-migrated pre-v2 files. The dedicated thumb
pad (ButtonId::GestureButton) owns the role by default. At most one
button gestures per device.
Sourcepub fn set_gesture_owner(&mut self, device_key: &str, button: ButtonId)
pub fn set_gesture_owner(&mut self, device_key: &str, button: ButtonId)
Make button the device’s sole gesture button.
Records button as the explicit gesture_owner, so
the one-gesture-button-per-device lock is a data-model fact rather than a
destructive demotion of the others — every other gesture-capable button
keeps its own gesture map intact, ready to restore if re-chosen, and is
simply not dispatched while it isn’t the owner. button is given a full
Binding::Gesture map: a prior Binding::Single is kept as the
GestureDirection::Click action, any existing swipe arms are preserved,
and unbound directions are seeded from [default_gesture_binding] so every
gesture button exposes the same full five-direction set.
Sourcepub fn disable_gestures(&mut self, device_key: &str)
pub fn disable_gestures(&mut self, device_key: &str)
Turn gestures off for device_key, recording the explicit “off” choice.
Every button keeps its gesture map intact (nothing is destroyed), so
re-selecting a gesture owner later restores its directions exactly.
Sourcepub fn effective_bindings(
&self,
device_key: &str,
bundle_id: Option<&str>,
) -> BTreeMap<ButtonId, Binding>
pub fn effective_bindings( &self, device_key: &str, bundle_id: Option<&str>, ) -> BTreeMap<ButtonId, Binding>
Resolve the effective binding map for device_key, overlaying the
per-app entry for bundle_id (if any) on top of the global per-device
bindings. A per-app override replaces the whole button with a
Binding::Single; everything else falls through.
Returns an empty map when the device has no recorded bindings yet. Callers (the GUI / hook) layer their own defaults on top.
Sourcepub fn set_per_app_binding(
&mut self,
device_key: &str,
bundle_id: &str,
button: ButtonId,
action: Option<Action>,
)
pub fn set_per_app_binding( &mut self, device_key: &str, bundle_id: &str, button: ButtonId, action: Option<Action>, )
Records a per-app override. Creates the device + app entries as
needed; passing an action of None removes the override and prunes
the empty app map.
Sourcepub fn selected_device(&self) -> Option<&str>
pub fn selected_device(&self) -> Option<&str>
HID++ config key of the carousel-selected device, if any.
Sourcepub fn set_selected_device(&mut self, key: Option<String>)
pub fn set_selected_device(&mut self, key: Option<String>)
Update the carousel-selected device. Pass None to clear the
selection (e.g. when the previously-selected device disappears).
Sourcepub fn dpi_presets(&self, device_key: &str) -> Vec<u32>
pub fn dpi_presets(&self, device_key: &str) -> Vec<u32>
The ordered DPI preset list for device_key, or an empty Vec if the
device has none configured yet.
Sourcepub fn set_dpi_presets(&mut self, device_key: &str, presets: Vec<u32>)
pub fn set_dpi_presets(&mut self, device_key: &str, presets: Vec<u32>)
Replace the DPI preset list for device_key. Pass an empty Vec to
clear (the device block is kept; the field is just omitted on save
thanks to skip_serializing_if).
Sourcepub fn device_identity(&self, device_key: &str) -> Option<&DeviceIdentity>
pub fn device_identity(&self, device_key: &str) -> Option<&DeviceIdentity>
The last-known DeviceIdentity for device_key, or None if the
device has never been seen online (or was configured before identities
were recorded).
Sourcepub fn set_device_identity(
&mut self,
device_key: &str,
identity: DeviceIdentity,
)
pub fn set_device_identity( &mut self, device_key: &str, identity: DeviceIdentity, )
Record (or refresh) the identity captured for device_key while it was
online, creating the device entry if needed.
Sourcepub fn known_identities(&self) -> impl Iterator<Item = (&str, &DeviceIdentity)>
pub fn known_identities(&self) -> impl Iterator<Item = (&str, &DeviceIdentity)>
Iterate every device we’ve recorded an identity for, as
(config_key, identity). Used to seed offline placeholder cards so a
known device stays visible (with its panels) before any live probe.
Sourcepub fn lighting(&self, device_key: &str) -> Option<Lighting>
pub fn lighting(&self, device_key: &str) -> Option<Lighting>
The lighting config for device_key, or None if unset.
Sourcepub fn set_lighting(&mut self, device_key: &str, lighting: Lighting)
pub fn set_lighting(&mut self, device_key: &str, lighting: Lighting)
Replace the lighting config for device_key.
Sourcepub fn dpi(&self, device_key: &str) -> Option<u32>
pub fn dpi(&self, device_key: &str) -> Option<u32>
The committed sensor DPI for device_key, or None if never set.
Sourcepub fn set_dpi(&mut self, device_key: &str, dpi: u32)
pub fn set_dpi(&mut self, device_key: &str, dpi: u32)
Record the committed sensor DPI for device_key, so the agent can
re-apply it when the device reconnects (#189).
Sourcepub fn smartshift(&self, device_key: &str) -> Option<SmartShift>
pub fn smartshift(&self, device_key: &str) -> Option<SmartShift>
The SmartShift wheel config for device_key, or None if never set.
Sourcepub fn set_smartshift(&mut self, device_key: &str, smartshift: SmartShift)
pub fn set_smartshift(&mut self, device_key: &str, smartshift: SmartShift)
Record the SmartShift wheel config for device_key, so the agent can
re-apply it when the device reconnects (#189).
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Config
impl<'de> Deserialize<'de> for Config
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for Config
impl RefUnwindSafe for Config
impl Send for Config
impl Sync for Config
impl Unpin for Config
impl UnsafeUnpin for Config
impl UnwindSafe for Config
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.