Add touchpad gesture support

This commit is contained in:
Ivan Molodetskikh
2023-09-02 15:09:07 +04:00
parent f7041156eb
commit 2c1d2ce0d3
5 changed files with 122 additions and 9 deletions
Generated
+1 -1
View File
@@ -1847,7 +1847,7 @@ checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
[[package]]
name = "smithay"
version = "0.3.0"
source = "git+https://github.com/Smithay/smithay#e241ccbbc4dfc6ce38e33856d9d159e436db3b5e"
source = "git+https://github.com/YaLTeR/smithay.git?branch=pointer-gestures#07b89166679ae280acff8aff93d0ecbbbbbcef5c"
dependencies = [
"appendlist",
"bitflags 2.4.0",
+3 -1
View File
@@ -24,7 +24,8 @@ xcursor = "0.3.4"
zbus = { version = "3.14.1" }
[dependencies.smithay]
git = "https://github.com/Smithay/smithay"
git = "https://github.com/YaLTeR/smithay.git"
branch = "pointer-gestures"
default-features = false
features = [
"backend_drm",
@@ -35,6 +36,7 @@ features = [
"backend_udev",
"backend_winit",
"desktop",
"libinput_1_19",
"renderer_gl",
"renderer_multi",
"use_system_lib",
+3 -2
View File
@@ -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 = ();
+111 -5
View File
@@ -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
+4
View File
@@ -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,