aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-09-02 15:09:07 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-09-02 15:09:07 +0400
commit2c1d2ce0d33401990734d07d5910def97dc82998 (patch)
treed9074960e5a7b994f9e4b6ff3fac3c59648b148c /src
parentf7041156eb8e3fed3efc7b1333e13bce6ef5e6c4 (diff)
downloadniri-2c1d2ce0d33401990734d07d5910def97dc82998.tar.gz
niri-2c1d2ce0d33401990734d07d5910def97dc82998.tar.bz2
niri-2c1d2ce0d33401990734d07d5910def97dc82998.zip
Add touchpad gesture support
Diffstat (limited to 'src')
-rw-r--r--src/handlers/mod.rs5
-rw-r--r--src/input.rs116
-rw-r--r--src/niri.rs4
3 files changed, 118 insertions, 7 deletions
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<Self>,
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::<Self>(&display_handle);
let mut seat_state = SeatState::new();
let tablet_state = TabletManagerState::new::<Self>(&display_handle);
+ let pointer_gestures_state = PointerGesturesState::new::<Self>(&display_handle);
let data_device_state = DataDeviceState::new::<Self>(&display_handle);
let presentation_state =
PresentationState::new::<Self>(&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,