From 2c1d2ce0d33401990734d07d5910def97dc82998 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Sat, 2 Sep 2023 15:09:07 +0400 Subject: Add touchpad gesture support --- src/handlers/mod.rs | 5 ++- src/input.rs | 116 +++++++++++++++++++++++++++++++++++++++++++++++++--- src/niri.rs | 4 ++ 3 files changed, 118 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index a496b341..782b7b37 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -12,8 +12,8 @@ use smithay::wayland::data_device::{ ServerDndGrabHandler, }; use smithay::{ - delegate_data_device, delegate_output, delegate_presentation, delegate_seat, - delegate_tablet_manager, + delegate_data_device, delegate_output, delegate_pointer_gestures, delegate_presentation, + delegate_seat, delegate_tablet_manager, }; use crate::Niri; @@ -40,6 +40,7 @@ impl SeatHandler for Niri { } delegate_seat!(Niri); delegate_tablet_manager!(Niri); +delegate_pointer_gestures!(Niri); impl DataDeviceHandler for Niri { type SelectionUserData = (); diff --git a/src/input.rs b/src/input.rs index 21b57e4a..05a7d0f1 100644 --- a/src/input.rs +++ b/src/input.rs @@ -2,13 +2,18 @@ use std::process::Command; use smithay::backend::input::{ AbsolutePositionEvent, Axis, AxisSource, ButtonState, Device, DeviceCapability, Event, - InputBackend, InputEvent, KeyState, KeyboardKeyEvent, PointerAxisEvent, PointerButtonEvent, - PointerMotionEvent, ProximityState, TabletToolButtonEvent, TabletToolEvent, - TabletToolProximityEvent, TabletToolTipEvent, TabletToolTipState, + GestureBeginEvent, GestureEndEvent, InputBackend, InputEvent, KeyState, KeyboardKeyEvent, + PointerAxisEvent, PointerButtonEvent, PointerMotionEvent, ProximityState, + TabletToolButtonEvent, TabletToolEvent, TabletToolProximityEvent, TabletToolTipEvent, + TabletToolTipState, }; use smithay::backend::libinput::LibinputInputBackend; use smithay::input::keyboard::{keysyms, FilterResult, KeysymHandle, ModifiersState}; -use smithay::input::pointer::{AxisFrame, ButtonEvent, MotionEvent, RelativeMotionEvent}; +use smithay::input::pointer::{ + AxisFrame, ButtonEvent, GestureHoldBeginEvent, GestureHoldEndEvent, GesturePinchBeginEvent, + GesturePinchEndEvent, GesturePinchUpdateEvent, GestureSwipeBeginEvent, GestureSwipeEndEvent, + GestureSwipeUpdateEvent, MotionEvent, RelativeMotionEvent, +}; use smithay::utils::SERIAL_COUNTER; use smithay::wayland::tablet_manager::{TabletDescriptor, TabletSeatTrait}; @@ -610,7 +615,108 @@ impl Niri { } } } - _ => {} + InputEvent::GestureSwipeBegin { event } => { + let serial = SERIAL_COUNTER.next_serial(); + let pointer = self.seat.get_pointer().unwrap(); + pointer.gesture_swipe_begin( + self, + &GestureSwipeBeginEvent { + serial, + time: event.time_msec(), + fingers: event.fingers(), + }, + ); + } + InputEvent::GestureSwipeUpdate { event } => { + let pointer = self.seat.get_pointer().unwrap(); + pointer.gesture_swipe_update( + self, + &GestureSwipeUpdateEvent { + time: event.time_msec(), + delta: smithay::backend::input::GestureSwipeUpdateEvent::delta(&event), + }, + ); + } + InputEvent::GestureSwipeEnd { event } => { + let serial = SERIAL_COUNTER.next_serial(); + let pointer = self.seat.get_pointer().unwrap(); + pointer.gesture_swipe_end( + self, + &GestureSwipeEndEvent { + serial, + time: event.time_msec(), + cancelled: event.cancelled(), + }, + ); + } + InputEvent::GesturePinchBegin { event } => { + let serial = SERIAL_COUNTER.next_serial(); + let pointer = self.seat.get_pointer().unwrap(); + pointer.gesture_pinch_begin( + self, + &GesturePinchBeginEvent { + serial, + time: event.time_msec(), + fingers: event.fingers(), + }, + ); + } + InputEvent::GesturePinchUpdate { event } => { + let pointer = self.seat.get_pointer().unwrap(); + pointer.gesture_pinch_update( + self, + &GesturePinchUpdateEvent { + time: event.time_msec(), + delta: smithay::backend::input::GesturePinchUpdateEvent::delta(&event), + scale: smithay::backend::input::GesturePinchUpdateEvent::scale(&event), + rotation: smithay::backend::input::GesturePinchUpdateEvent::rotation( + &event, + ), + }, + ); + } + InputEvent::GesturePinchEnd { event } => { + let serial = SERIAL_COUNTER.next_serial(); + let pointer = self.seat.get_pointer().unwrap(); + pointer.gesture_pinch_end( + self, + &GesturePinchEndEvent { + serial, + time: event.time_msec(), + cancelled: event.cancelled(), + }, + ); + } + InputEvent::GestureHoldBegin { event } => { + let serial = SERIAL_COUNTER.next_serial(); + let pointer = self.seat.get_pointer().unwrap(); + pointer.gesture_hold_begin( + self, + &GestureHoldBeginEvent { + serial, + time: event.time_msec(), + fingers: event.fingers(), + }, + ); + } + InputEvent::GestureHoldEnd { event } => { + let serial = SERIAL_COUNTER.next_serial(); + let pointer = self.seat.get_pointer().unwrap(); + pointer.gesture_hold_end( + self, + &GestureHoldEndEvent { + serial, + time: event.time_msec(), + cancelled: event.cancelled(), + }, + ); + } + InputEvent::TouchDown { .. } => (), + InputEvent::TouchMotion { .. } => (), + InputEvent::TouchUp { .. } => (), + InputEvent::TouchCancel { .. } => (), + InputEvent::TouchFrame { .. } => (), + InputEvent::Special(_) => (), } BackendAction::None diff --git a/src/niri.rs b/src/niri.rs index b7361e64..97195f8c 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -44,6 +44,7 @@ use smithay::utils::{ use smithay::wayland::compositor::{with_states, CompositorClientState, CompositorState}; use smithay::wayland::data_device::DataDeviceState; use smithay::wayland::output::OutputManagerState; +use smithay::wayland::pointer_gestures::PointerGesturesState; use smithay::wayland::presentation::PresentationState; use smithay::wayland::shell::wlr_layer::{Layer, WlrLayerShellState}; use smithay::wayland::shell::xdg::XdgShellState; @@ -86,6 +87,7 @@ pub struct Niri { pub output_manager_state: OutputManagerState, pub seat_state: SeatState, pub tablet_state: TabletManagerState, + pub pointer_gestures_state: PointerGesturesState, pub data_device_state: DataDeviceState, pub popups: PopupManager, pub presentation_state: PresentationState, @@ -131,6 +133,7 @@ impl Niri { let output_manager_state = OutputManagerState::new_with_xdg_output::(&display_handle); let mut seat_state = SeatState::new(); let tablet_state = TabletManagerState::new::(&display_handle); + let pointer_gestures_state = PointerGesturesState::new::(&display_handle); let data_device_state = DataDeviceState::new::(&display_handle); let presentation_state = PresentationState::new::(&display_handle, CLOCK_MONOTONIC as u32); @@ -243,6 +246,7 @@ impl Niri { output_manager_state, seat_state, tablet_state, + pointer_gestures_state, data_device_state, popups: PopupManager::default(), presentation_state, -- cgit