use super::EventTrait;
use crate::{ffi, AsRaw, Context, FromRaw, Libinput};
pub trait GestureEventTrait: AsRaw<ffi::libinput_event_gesture> + Context {
ffi_func!(
fn time, ffi::libinput_event_gesture_get_time, u32);
ffi_func!(
fn time_usec, ffi::libinput_event_gesture_get_time_usec, u64);
ffi_func!(
fn finger_count, ffi::libinput_event_gesture_get_finger_count, i32);
fn into_gesture_event(self) -> GestureEvent
where
Self: Sized,
{
unsafe { GestureEvent::from_raw(self.as_raw_mut(), self.context()) }
}
}
impl<T: AsRaw<ffi::libinput_event_gesture> + Context> GestureEventTrait for T {}
#[derive(Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum GestureEvent {
Swipe(GestureSwipeEvent),
Pinch(GesturePinchEvent),
#[cfg(feature = "libinput_1_19")]
Hold(GestureHoldEvent),
}
impl EventTrait for GestureEvent {
#[doc(hidden)]
fn as_raw_event(&self) -> *mut ffi::libinput_event {
match self {
GestureEvent::Swipe(event) => event.as_raw_event(),
GestureEvent::Pinch(event) => event.as_raw_event(),
#[cfg(feature = "libinput_1_19")]
GestureEvent::Hold(event) => event.as_raw_event(),
}
}
}
impl FromRaw<ffi::libinput_event_gesture> for GestureEvent {
unsafe fn try_from_raw(
event: *mut ffi::libinput_event_gesture,
context: &Libinput,
) -> Option<Self> {
let base = ffi::libinput_event_gesture_get_base_event(event);
match ffi::libinput_event_get_type(base) {
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_END => Some(
GestureEvent::Swipe(GestureSwipeEvent::try_from_raw(event, context)?),
),
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_BEGIN
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_UPDATE
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_END => Some(
GestureEvent::Pinch(GesturePinchEvent::try_from_raw(event, context)?),
),
#[cfg(feature = "libinput_1_19")]
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_HOLD_BEGIN
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_HOLD_END => Some(GestureEvent::Hold(
GestureHoldEvent::try_from_raw(event, context)?,
)),
_ => None,
}
}
unsafe fn from_raw(event: *mut ffi::libinput_event_gesture, context: &Libinput) -> Self {
Self::try_from_raw(event, context).expect("Unknown gesture event type")
}
}
impl AsRaw<ffi::libinput_event_gesture> for GestureEvent {
fn as_raw(&self) -> *const ffi::libinput_event_gesture {
match self {
GestureEvent::Swipe(event) => event.as_raw(),
GestureEvent::Pinch(event) => event.as_raw(),
#[cfg(feature = "libinput_1_19")]
GestureEvent::Hold(event) => event.as_raw(),
}
}
}
impl Context for GestureEvent {
fn context(&self) -> &Libinput {
match self {
GestureEvent::Swipe(event) => event.context(),
GestureEvent::Pinch(event) => event.context(),
#[cfg(feature = "libinput_1_19")]
GestureEvent::Hold(event) => event.context(),
}
}
}
pub trait GestureEventCoordinates: AsRaw<ffi::libinput_event_gesture> {
ffi_func!(
fn dx, ffi::libinput_event_gesture_get_dx, f64);
ffi_func!(
fn dx_unaccelerated, ffi::libinput_event_gesture_get_dx_unaccelerated, f64);
ffi_func!(
fn dy, ffi::libinput_event_gesture_get_dy, f64);
ffi_func!(
fn dy_unaccelerated, ffi::libinput_event_gesture_get_dy_unaccelerated, f64);
}
pub trait GestureEndEvent: AsRaw<ffi::libinput_event_gesture> {
ffi_func!(
fn cancelled, ffi::libinput_event_gesture_get_cancelled, bool);
}
#[derive(Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum GestureSwipeEvent {
Begin(GestureSwipeBeginEvent),
Update(GestureSwipeUpdateEvent),
End(GestureSwipeEndEvent),
}
pub trait GestureSwipeEventTrait: AsRaw<ffi::libinput_event_gesture> + Context {
fn into_gesture_swipe_event(self) -> GestureSwipeEvent
where
Self: Sized,
{
unsafe { GestureSwipeEvent::from_raw(self.as_raw_mut(), self.context()) }
}
}
impl GestureSwipeEventTrait for GestureSwipeEvent {}
impl EventTrait for GestureSwipeEvent {
#[doc(hidden)]
fn as_raw_event(&self) -> *mut ffi::libinput_event {
match self {
GestureSwipeEvent::Begin(event) => event.as_raw_event(),
GestureSwipeEvent::Update(event) => event.as_raw_event(),
GestureSwipeEvent::End(event) => event.as_raw_event(),
}
}
}
impl FromRaw<ffi::libinput_event_gesture> for GestureSwipeEvent {
unsafe fn try_from_raw(
event: *mut ffi::libinput_event_gesture,
context: &Libinput,
) -> Option<Self> {
let base = ffi::libinput_event_gesture_get_base_event(event);
match ffi::libinput_event_get_type(base) {
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN => Some(
GestureSwipeEvent::Begin(GestureSwipeBeginEvent::try_from_raw(event, context)?),
),
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE => Some(
GestureSwipeEvent::Update(GestureSwipeUpdateEvent::try_from_raw(event, context)?),
),
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_END => Some(
GestureSwipeEvent::End(GestureSwipeEndEvent::try_from_raw(event, context)?),
),
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_BEGIN
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_UPDATE
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_END => {
panic!("Tried to make GestureSwipeEvent from Pinch event")
}
#[cfg(feature = "libinput_1_19")]
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_HOLD_BEGIN
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_HOLD_END => {
panic!("Tried to make GestureSwipeEvent from Hold event")
}
_ => None,
}
}
unsafe fn from_raw(event: *mut ffi::libinput_event_gesture, context: &Libinput) -> Self {
Self::try_from_raw(event, context).expect("Unknown gesture event type")
}
}
impl AsRaw<ffi::libinput_event_gesture> for GestureSwipeEvent {
fn as_raw(&self) -> *const ffi::libinput_event_gesture {
match self {
GestureSwipeEvent::Begin(event) => event.as_raw(),
GestureSwipeEvent::Update(event) => event.as_raw(),
GestureSwipeEvent::End(event) => event.as_raw(),
}
}
}
impl Context for GestureSwipeEvent {
fn context(&self) -> &Libinput {
match self {
GestureSwipeEvent::Begin(event) => event.context(),
GestureSwipeEvent::Update(event) => event.context(),
GestureSwipeEvent::End(event) => event.context(),
}
}
}
#[derive(Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum GesturePinchEvent {
Begin(GesturePinchBeginEvent),
Update(GesturePinchUpdateEvent),
End(GesturePinchEndEvent),
}
impl EventTrait for GesturePinchEvent {
#[doc(hidden)]
fn as_raw_event(&self) -> *mut ffi::libinput_event {
match self {
GesturePinchEvent::Begin(event) => event.as_raw_event(),
GesturePinchEvent::Update(event) => event.as_raw_event(),
GesturePinchEvent::End(event) => event.as_raw_event(),
}
}
}
pub trait GesturePinchEventTrait: AsRaw<ffi::libinput_event_gesture> + Context {
ffi_func!(
fn scale, ffi::libinput_event_gesture_get_scale, f64);
fn into_gesture_pinch_event(self) -> GesturePinchEvent
where
Self: Sized,
{
unsafe { GesturePinchEvent::from_raw(self.as_raw_mut(), self.context()) }
}
}
impl GesturePinchEventTrait for GesturePinchEvent {}
impl FromRaw<ffi::libinput_event_gesture> for GesturePinchEvent {
unsafe fn try_from_raw(
event: *mut ffi::libinput_event_gesture,
context: &Libinput,
) -> Option<Self> {
let base = ffi::libinput_event_gesture_get_base_event(event);
match ffi::libinput_event_get_type(base) {
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_END => {
panic!("Tried to make GesturePinchEvent from Swipe event")
}
#[cfg(feature = "libinput_1_19")]
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_HOLD_BEGIN
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_HOLD_END => {
panic!("Tried to make GestureSwipeEvent from Hold event")
}
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_BEGIN => Some(
GesturePinchEvent::Begin(GesturePinchBeginEvent::try_from_raw(event, context)?),
),
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_UPDATE => Some(
GesturePinchEvent::Update(GesturePinchUpdateEvent::try_from_raw(event, context)?),
),
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_END => Some(
GesturePinchEvent::End(GesturePinchEndEvent::try_from_raw(event, context)?),
),
_ => None,
}
}
unsafe fn from_raw(event: *mut ffi::libinput_event_gesture, context: &Libinput) -> Self {
Self::try_from_raw(event, context).expect("Unknown gesture event type")
}
}
impl AsRaw<ffi::libinput_event_gesture> for GesturePinchEvent {
fn as_raw(&self) -> *const ffi::libinput_event_gesture {
match self {
GesturePinchEvent::Begin(event) => event.as_raw(),
GesturePinchEvent::Update(event) => event.as_raw(),
GesturePinchEvent::End(event) => event.as_raw(),
}
}
}
impl Context for GesturePinchEvent {
fn context(&self) -> &Libinput {
match self {
GesturePinchEvent::Begin(event) => event.context(),
GesturePinchEvent::Update(event) => event.context(),
GesturePinchEvent::End(event) => event.context(),
}
}
}
#[cfg(feature = "libinput_1_19")]
#[derive(Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum GestureHoldEvent {
Begin(GestureHoldBeginEvent),
End(GestureHoldEndEvent),
}
#[cfg(feature = "libinput_1_19")]
impl EventTrait for GestureHoldEvent {
#[doc(hidden)]
fn as_raw_event(&self) -> *mut ffi::libinput_event {
match self {
GestureHoldEvent::Begin(event) => event.as_raw_event(),
GestureHoldEvent::End(event) => event.as_raw_event(),
}
}
}
#[cfg(feature = "libinput_1_19")]
pub trait GestureHoldEventTrait: AsRaw<ffi::libinput_event_gesture> + Context {
fn into_gesture_hold_event(self) -> GestureHoldEvent
where
Self: Sized,
{
unsafe { GestureHoldEvent::from_raw(self.as_raw_mut(), self.context()) }
}
}
#[cfg(feature = "libinput_1_19")]
impl GestureHoldEventTrait for GestureHoldEvent {}
#[cfg(feature = "libinput_1_19")]
impl FromRaw<ffi::libinput_event_gesture> for GestureHoldEvent {
unsafe fn try_from_raw(
event: *mut ffi::libinput_event_gesture,
context: &Libinput,
) -> Option<Self> {
let base = ffi::libinput_event_gesture_get_base_event(event);
match ffi::libinput_event_get_type(base) {
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_SWIPE_END => {
panic!("Tried to make GesturePinchEvent from Swipe event")
}
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_BEGIN
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_UPDATE
| ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_PINCH_END => {
panic!("Tried to make GestureSwipeEvent from Pinch event")
}
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_HOLD_BEGIN => Some(
GestureHoldEvent::Begin(GestureHoldBeginEvent::try_from_raw(event, context)?),
),
ffi::libinput_event_type_LIBINPUT_EVENT_GESTURE_HOLD_END => Some(
GestureHoldEvent::End(GestureHoldEndEvent::try_from_raw(event, context)?),
),
_ => None,
}
}
unsafe fn from_raw(event: *mut ffi::libinput_event_gesture, context: &Libinput) -> Self {
Self::try_from_raw(event, context).expect("Unknown gesture event type")
}
}
#[cfg(feature = "libinput_1_19")]
impl AsRaw<ffi::libinput_event_gesture> for GestureHoldEvent {
fn as_raw(&self) -> *const ffi::libinput_event_gesture {
match self {
GestureHoldEvent::Begin(event) => event.as_raw(),
GestureHoldEvent::End(event) => event.as_raw(),
}
}
}
#[cfg(feature = "libinput_1_19")]
impl Context for GestureHoldEvent {
fn context(&self) -> &Libinput {
match self {
GestureHoldEvent::Begin(event) => event.context(),
GestureHoldEvent::End(event) => event.context(),
}
}
}
ffi_event_struct!(
struct GestureSwipeBeginEvent, ffi::libinput_event_gesture, ffi::libinput_event_gesture_get_base_event);
impl GestureSwipeEventTrait for GestureSwipeBeginEvent {}
ffi_event_struct!(
struct GestureSwipeUpdateEvent, ffi::libinput_event_gesture, ffi::libinput_event_gesture_get_base_event);
impl GestureSwipeEventTrait for GestureSwipeUpdateEvent {}
impl GestureEventCoordinates for GestureSwipeUpdateEvent {}
ffi_event_struct!(
struct GestureSwipeEndEvent, ffi::libinput_event_gesture, ffi::libinput_event_gesture_get_base_event);
impl GestureEndEvent for GestureSwipeEndEvent {}
impl GestureSwipeEventTrait for GestureSwipeEndEvent {}
ffi_event_struct!(
struct GesturePinchBeginEvent, ffi::libinput_event_gesture, ffi::libinput_event_gesture_get_base_event);
impl GesturePinchEventTrait for GesturePinchBeginEvent {}
ffi_event_struct!(
struct GesturePinchUpdateEvent, ffi::libinput_event_gesture, ffi::libinput_event_gesture_get_base_event);
impl GesturePinchEventTrait for GesturePinchUpdateEvent {}
impl GestureEventCoordinates for GesturePinchUpdateEvent {}
impl GesturePinchUpdateEvent {
ffi_func!(
pub fn angle_delta, ffi::libinput_event_gesture_get_angle_delta, f64);
}
ffi_event_struct!(
struct GesturePinchEndEvent, ffi::libinput_event_gesture, ffi::libinput_event_gesture_get_base_event);
impl GesturePinchEventTrait for GesturePinchEndEvent {}
impl GestureEndEvent for GesturePinchEndEvent {}
#[cfg(feature = "libinput_1_19")]
ffi_event_struct!(
struct GestureHoldBeginEvent, ffi::libinput_event_gesture, ffi::libinput_event_gesture_get_base_event);
#[cfg(feature = "libinput_1_19")]
impl GestureHoldEventTrait for GestureHoldBeginEvent {}
#[cfg(feature = "libinput_1_19")]
ffi_event_struct!(
struct GestureHoldEndEvent, ffi::libinput_event_gesture, ffi::libinput_event_gesture_get_base_event);
#[cfg(feature = "libinput_1_19")]
impl GestureEndEvent for GestureHoldEndEvent {}
#[cfg(feature = "libinput_1_19")]
impl GestureHoldEventTrait for GestureHoldEndEvent {}