pub enum ButtonId {
Show 22 variants
LeftClick,
RightClick,
MiddleClick,
Back,
Forward,
DpiToggle,
Thumbwheel,
ThumbwheelScrollUp,
ThumbwheelScrollDown,
GestureButton,
KeySearch,
KeyDictation,
KeyEmoji,
KeyScreenCapture,
KeyMicMute,
KeyPlayPause,
KeyMute,
KeyVolumeDown,
KeyVolumeUp,
HapticPanel,
WheelTiltLeft,
WheelTiltRight,
}Expand description
One of the user-rebindable hotspots on a Logi mouse. The order matches the
physical layout from front to side; ButtonId::ALL is consumed by the
default-binding generator and the popover trigger list.
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.
KeySearch
Keyboard F-row “Search” control (0x1b04 CID 0x00d4,
MultiPlatform_Search) — F4 on the Signature series.
KeyDictation
Keyboard “Dictation” control (CID 0x0103) — F5 on the Signature series.
KeyEmoji
Keyboard “Emoji” control (CID 0x0108) — F6 on the Signature series.
KeyScreenCapture
Keyboard “Screen Capture” control (CID 0x010a) — F7 on the Signature
series.
KeyMicMute
Keyboard “Mute Microphone” control (CID 0x011c) — F8 on the Signature
series.
KeyPlayPause
Keyboard “Play/Pause” control (CID 0x00e5) — F9 on the Signature series.
KeyMute
Keyboard “Mute” control (CID 0x00e7) — F10 on the Signature series.
KeyVolumeDown
Keyboard “Volume Down” control (CID 0x00e8) — F11 on the Signature
series.
KeyVolumeUp
Keyboard “Volume Up” control (CID 0x00e9) — F12 on the Signature
series.
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.
Declared last: the TOML config and any serialized form encode the variant identifier / index, so new buttons are append-only.
Implementations§
Source§impl ButtonId
impl ButtonId
Sourcepub const ALL: [ButtonId; 13]
pub const ALL: [ButtonId; 13]
Every rebindable button in declaration (physical front-to-side) order — the iteration source for default-binding seeding and the popover trigger list.
Sourcepub const KEYBOARD_KEYS: [ButtonId; 9]
pub const KEYBOARD_KEYS: [ButtonId; 9]
The divertable keyboard F-row controls, in F-row order. Kept out of
ButtonId::ALL: that array seeds mouse defaults and the mouse
popover trigger list, while keyboard keys stay native unless the user
binds them (an unbound key is never diverted).
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 and the primary clicks stay single-action by product policy; device-specific HID++ capability checks may further narrow this set at capture time.
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.