pub enum ButtonId {
Show 14 variants
LeftClick,
RightClick,
MiddleClick,
Back,
Forward,
DpiToggle,
Thumbwheel,
ThumbwheelScrollUp,
ThumbwheelScrollDown,
GestureButton,
HapticPanel,
WheelTiltLeft,
WheelTiltRight,
Control(Cid),
}Expand description
One of the user-rebindable controls on a Logi device: a mouse hotspot, or
a keyboard key addressed by its HID++ 0x1b04 control ID.
The mouse variants are declared in physical front-to-side order;
ButtonId::ALL is consumed by the default-binding generator and the
popover trigger list. Keyboard keys are ButtonId::Control and stay out
of that list: they seed no default and are never diverted until bound.
§Serialization
Persisted as a string — the variant name for a mouse button
("MiddleClick"), the catalog name for a known control
("KeyScreenCapture") or "control:0x0141" for any other — so a
ButtonId can key a TOML table. See FromStr.
Variants§
LeftClick
The primary button. Rebindable in the config schema, but the OS hook
never suppresses it — see ButtonId::is_os_hook_button.
RightClick
The secondary button. Like ButtonId::LeftClick, it always passes
through the OS hook.
MiddleClick
The wheel click — one of the three buttons the OS hook remaps.
Back
The thumb-side “back” button (mouse button 4), remapped by the OS hook.
Forward
The thumb-side “forward” button (mouse button 5), remapped by the OS hook.
DpiToggle
The “ModeShift” button under the wheel — typically used for SmartShift /
DPI cycle. Named DpiToggle for historical reasons.
Thumbwheel
The horizontal thumb wheel’s click. Kept in ButtonId::ALL so its
default still seeds and dispatches when the wheel is diverted, even
though the mouse model surfaces one paired rotation control instead of
the click (see mouse_model::geometry).
ThumbwheelScrollUp
Rotating the thumb wheel “up” (positive rotation). Bound, by default, to
continuous horizontal scroll; see the agent-core watchers-side dispatch.
ThumbwheelScrollDown
Rotating the thumb wheel “down” (negative rotation).
GestureButton
The HID++ gesture button on MX-line devices. The press itself fires the bound action; swipe directions are P1.5 territory.
HapticPanel
The MX Master 4 Haptic Sense Panel — the touch-sensitive thumb rest
(Logi metadata slot ASSIGNMENT_NAME_SHOW_RADIAL_MENU, HID++ CID
0x01a0). A separate physical control from ButtonId::GestureButton;
captured over HID++ like it, and eligible as the gesture owner.
WheelTiltLeft
Tilting the main wheel left — 0x1b04 CID 0x005b (“Left Scroll”),
Logi metadata slot SLOT_NAME_LEFT_SCROLL_BUTTON. A distinct control
from the thumb wheel: it is a plain divertable button, not a rotation,
and it lives on the main wheel of mice like the MX Anywhere 2S.
WheelTiltRight
Tilting the main wheel right — 0x1b04 CID 0x005d (“Right Scroll”),
Logi metadata slot SLOT_NAME_RIGHT_SCROLL_BUTTON. Counterpart to
ButtonId::WheelTiltLeft.
Control(Cid)
A keyboard key, by the HID++ 0x1b04 control it reports as. Diverted
over HID++ while bound (the OS hook never sees these keys); left on its
native firmware function otherwise.
Declared last so the derived ordering keeps every mouse button ahead of the keys; among keys the order is by control ID, so a GUI that wants physical F-row order sorts by catalog position instead.
Implementations§
Source§impl ButtonId
impl ButtonId
Sourcepub const ALL: [ButtonId; 13]
pub const ALL: [ButtonId; 13]
Every rebindable mouse button in declaration (physical front-to-side) order — the iteration source for default-binding seeding and the popover trigger list. Keyboard controls are deliberately absent: an unbound key is never diverted, so there is nothing to seed.
Sourcepub const fn cid(self) -> Option<Cid>
pub const fn cid(self) -> Option<Cid>
The 0x1b04 control this button diverts as, for a keyboard key.
Whether this button is one the OS hook (macOS CGEventTap / Linux evdev)
remaps: Middle, Back, or Forward. The primary L/R clicks always pass
through (suppressing them would brick the mouse), and the DPI / thumb /
dedicated gesture controls aren’t visible to the OS hook at all (they’re
captured over HID++). Stored gesture bindings also project through this
set so Middle Click configurations written by v0.8.0 keep working;
Self::supports_gesture_mode separately controls which buttons may be
newly promoted by the UI.
Sourcepub fn is_os_hook_gesture_source(self) -> bool
pub fn is_os_hook_gesture_source(self) -> bool
Whether this button may use the OS hook’s hold-and-swipe gesture path. Back and Forward are the only eligible controls: Middle Click belongs to the main wheel, whose controls intentionally remain single-action.
Sourcepub fn is_hidpp_gesture_source(self) -> bool
pub fn is_hidpp_gesture_source(self) -> bool
Whether this button is a HID++ gesture source — a control that is captured over HID++ raw-XY diversion (never the OS hook) and can therefore own the gesture role with swipe directions: DPI/ModeShift, the dedicated gesture button, or the MX Master 4 haptic panel. The capture layer maps each to its control ID and checks the device’s advertised raw-XY capability before arming it.
Sourcepub fn supports_gesture_mode(self) -> bool
pub fn supports_gesture_mode(self) -> bool
Whether OpenLogi offers gesture mode for this logical control. Wheel controls, the primary clicks and keyboard keys stay single-action by product policy; device-specific HID++ capability checks may further narrow this set at capture time.
Sourcepub fn config_name(self) -> Cow<'static, str>
pub fn config_name(self) -> Cow<'static, str>
The name this button is written with in config.toml.
Sourcepub fn translation_key(self) -> &'static str
pub fn translation_key(self) -> &'static str
Stable catalog key for the localized button label.
Trait Implementations§
impl Copy for ButtonId
Source§impl<'de> Deserialize<'de> for ButtonId
impl<'de> Deserialize<'de> for ButtonId
Source§fn deserialize<D>(
deserializer: D,
) -> Result<ButtonId, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D,
) -> Result<ButtonId, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
impl Eq for ButtonId
Source§impl Ord for ButtonId
impl Ord for ButtonId
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialOrd for ButtonId
impl PartialOrd for ButtonId
Source§impl Serialize for ButtonId
impl Serialize for ButtonId
Source§fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
impl StructuralPartialEq for ButtonId
Auto Trait Implementations§
impl Freeze for ButtonId
impl RefUnwindSafe for ButtonId
impl Send for ButtonId
impl Sync for ButtonId
impl Unpin for ButtonId
impl UnsafeUnpin for ButtonId
impl UnwindSafe for ButtonId
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> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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> OverflowingAs for T
impl<T> OverflowingAs for T
Source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
Source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
Source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
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> SaturatingAs for T
impl<T> SaturatingAs for T
Source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
Source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
Source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
Source§impl<T> StrictAs for T
impl<T> StrictAs for T
Source§fn strict_as<Dst>(self) -> Dstwhere
T: StrictCast<Dst>,
fn strict_as<Dst>(self) -> Dstwhere
T: StrictCast<Dst>,
Source§impl<Src, Dst> StrictCastFrom<Src> for Dstwhere
Src: StrictCast<Dst>,
impl<Src, Dst> StrictCastFrom<Src> for Dstwhere
Src: StrictCast<Dst>,
Source§fn strict_cast_from(src: Src) -> Dst
fn strict_cast_from(src: Src) -> Dst
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.