diff --git a/src/backend/input/mod.rs b/src/backend/input/mod.rs index 17c60ac6f676..01da79de5eb0 100644 --- a/src/backend/input/mod.rs +++ b/src/backend/input/mod.rs @@ -7,8 +7,9 @@ pub use xkbcommon::xkb::Keycode; mod tablet; pub use tablet::{ - ProximityState, TabletToolAxisEvent, TabletToolButtonEvent, TabletToolCapabilities, TabletToolDescriptor, - TabletToolEvent, TabletToolProximityEvent, TabletToolTipEvent, TabletToolTipState, TabletToolType, + ProximityState, TabletPadButtonEvent, TabletToolAxisEvent, TabletToolButtonEvent, TabletToolCapabilities, + TabletToolDescriptor, TabletToolEvent, TabletToolProximityEvent, TabletToolTipEvent, TabletToolTipState, + TabletToolType, }; #[cfg(feature = "wayland_frontend")] @@ -671,6 +672,8 @@ pub trait InputBackend: Sized { type TabletToolTipEvent: TabletToolTipEvent; /// Type representing button events on tablet tool devices type TabletToolButtonEvent: TabletToolButtonEvent; + /// Type representing button events on tablet pad devices + type TabletPadButtonEvent: TabletPadButtonEvent; /// Type representing switch toggle events type SwitchToggleEvent: SwitchToggleEvent; @@ -809,6 +812,12 @@ pub enum InputEvent { event: B::TabletToolButtonEvent, }, + /// A tablet pad button was pressed or released + TabletPadButton { + /// The tablet pad button event + event: B::TabletPadButtonEvent, + }, + /// A switch was toggled SwitchToggle { /// The switch toggle event diff --git a/src/backend/input/tablet.rs b/src/backend/input/tablet.rs index a281a5aa9b24..513f44d7d152 100644 --- a/src/backend/input/tablet.rs +++ b/src/backend/input/tablet.rs @@ -334,3 +334,24 @@ impl TabletToolButtonEvent for UnusedEvent { match *self {} } } + +/// Common methods tablet pad button events implement +pub trait TabletPadButtonEvent: Event { + /// Returns the numerical button code of the tablet pad button. + /// + /// Buttons on tablet pads are numbered sequentially starting from 0. + fn button(&self) -> u32; + + /// State of the button + fn state(&self) -> ButtonState; +} + +impl TabletPadButtonEvent for UnusedEvent { + fn button(&self) -> u32 { + match *self {} + } + + fn state(&self) -> ButtonState { + match *self {} + } +} diff --git a/src/backend/libinput/mod.rs b/src/backend/libinput/mod.rs index d06f9d93ece3..bc63d63df2b0 100644 --- a/src/backend/libinput/mod.rs +++ b/src/backend/libinput/mod.rs @@ -606,6 +606,7 @@ impl InputBackend for LibinputInputBackend { type TabletToolProximityEvent = event::tablet_tool::TabletToolProximityEvent; type TabletToolTipEvent = event::tablet_tool::TabletToolTipEvent; type TabletToolButtonEvent = event::tablet_tool::TabletToolButtonEvent; + type TabletPadButtonEvent = event::tablet_pad::TabletPadButtonEvent; type SwitchToggleEvent = event::switch::SwitchToggleEvent; @@ -857,6 +858,22 @@ impl EventSource for LibinputInputBackend { trace!("Unknown libinput tablet event"); } }, + libinput::Event::TabletPad(tablet_pad_event) => match tablet_pad_event { + event::TabletPadEvent::Button(event) => { + callback(InputEvent::TabletPadButton { event }, &mut ()); + } + event::TabletPadEvent::Ring(event) => { + // Handle ring events if needed + trace!("Tablet pad ring event: {:?}", event); + } + event::TabletPadEvent::Strip(event) => { + // Handle strip events if needed + trace!("Tablet pad strip event: {:?}", event); + } + _ => { + trace!("Unknown libinput tablet pad event"); + } + }, libinput::Event::Switch(switch_event) => match switch_event { event::SwitchEvent::Toggle(event) => { callback(InputEvent::SwitchToggle { event }, &mut ()); diff --git a/src/backend/libinput/tablet.rs b/src/backend/libinput/tablet.rs index 94df33af337a..7b24be5a1aba 100644 --- a/src/backend/libinput/tablet.rs +++ b/src/backend/libinput/tablet.rs @@ -192,3 +192,23 @@ impl backend::TabletToolButtonEvent for tablet_tool::Table tablet_tool::TabletToolButtonEvent::button_state(self).into() } } + +impl backend::Event for event::tablet_pad::TabletPadButtonEvent { + fn time(&self) -> u64 { + event::tablet_pad::TabletPadEventTrait::time_usec(self) + } + + fn device(&self) -> libinput::Device { + event::EventTrait::device(self) + } +} + +impl backend::TabletPadButtonEvent for event::tablet_pad::TabletPadButtonEvent { + fn button(&self) -> u32 { + self.button_number() + } + + fn state(&self) -> backend::ButtonState { + self.button_state().into() + } +} diff --git a/src/backend/winit/input.rs b/src/backend/winit/input.rs index b08da9067f57..bccc2883f416 100644 --- a/src/backend/winit/input.rs +++ b/src/backend/winit/input.rs @@ -407,6 +407,7 @@ impl InputBackend for WinitInput { type TabletToolProximityEvent = UnusedEvent; type TabletToolTipEvent = UnusedEvent; type TabletToolButtonEvent = UnusedEvent; + type TabletPadButtonEvent = UnusedEvent; type SwitchToggleEvent = UnusedEvent; diff --git a/src/backend/x11/input.rs b/src/backend/x11/input.rs index 48b7beccc895..5fde1b5fc5f5 100644 --- a/src/backend/x11/input.rs +++ b/src/backend/x11/input.rs @@ -255,6 +255,7 @@ impl InputBackend for X11Input { type TabletToolProximityEvent = UnusedEvent; type TabletToolTipEvent = UnusedEvent; type TabletToolButtonEvent = UnusedEvent; + type TabletPadButtonEvent = UnusedEvent; type SwitchToggleEvent = UnusedEvent;