From 01b32ce1437dfaee7043cbea7640201c00621062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 30 Apr 2024 11:51:41 +0300 Subject: [PATCH] video: Add double click mouse event Part-of: --- gstreamer-video/src/video_event.rs | 73 +++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/gstreamer-video/src/video_event.rs b/gstreamer-video/src/video_event.rs index fb12ea8bb..d4dd58a6a 100644 --- a/gstreamer-video/src/video_event.rs +++ b/gstreamer-video/src/video_event.rs @@ -541,6 +541,11 @@ pub enum MouseEventType { delta_x: f64, delta_y: f64, }, + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + DoubleClick { + button: i32, + }, } nav_event_builder!( @@ -583,6 +588,14 @@ nav_event_builder!( #[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))] modifier_state: s.modifier_state, }, + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + MouseEventType::DoubleClick { button } => NavigationEvent::MouseDoubleClick { + button, + x: s.x, + y: s.y, + modifier_state: s.modifier_state, + }, }; gst::ffi::gst_event_new_navigation(event.structure().into_glib_ptr()) } @@ -793,6 +806,14 @@ pub enum NavigationEvent { TouchCancel { modifier_state: NavigationModifierType, }, + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + MouseDoubleClick { + button: i32, + x: f64, + y: f64, + modifier_state: NavigationModifierType, + }, } impl NavigationEvent { @@ -954,6 +975,18 @@ impl NavigationEvent { } } + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + #[doc(alias = "gst_navigation_event_new_mouse_double_click")] + pub fn new_mouse_double_click(button: i32, x: f64, y: f64) -> NavigationEvent { + assert_initialized_main_thread!(); + Self::MouseDoubleClick { + button, + x, + y, + modifier_state: NavigationModifierType::empty(), + } + } pub fn key_press_builder(key: &str) -> KeyEventBuilder { assert_initialized_main_thread!(); KeyEventBuilder::new(KeyEventType::Press { key }) @@ -1056,6 +1089,15 @@ impl NavigationEvent { TouchMetaEventBuilder::new(TouchMetaEventType::Cancel) } + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + pub fn mouse_double_click_builder(button: i32, x: f64, y: f64) -> MouseEventBuilder<'static> { + assert_initialized_main_thread!(); + MouseEventBuilder::new(MouseEventType::DoubleClick { button }) + .x(x) + .y(y) + } + #[doc(alias = "gst_navigation_event_get_type")] pub fn type_(event: &gst::EventRef) -> NavigationEventType { skip_assert_initialized!(); @@ -1224,6 +1266,21 @@ impl NavigationEvent { #[cfg(feature = "v1_22")] #[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))] NavigationEventType::TouchCancel => NavigationEvent::TouchCancel { modifier_state }, + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + NavigationEventType::MouseDoubleClick => NavigationEvent::MouseDoubleClick { + button: structure + .get("button") + .map_err(|_| glib::bool_error!("Invalid mouse event"))?, + x: structure + .get("pointer_x") + .map_err(|_| glib::bool_error!("Invalid mouse event"))?, + y: structure + .get("pointer_y") + .map_err(|_| glib::bool_error!("Invalid mouse event"))?, + modifier_state, + }, + NavigationEventType::Invalid | NavigationEventType::__Unknown(_) => { return Err(glib::bool_error!("Invalid navigation event")) } @@ -1323,10 +1380,19 @@ impl NavigationEvent { Self::TouchCancel { .. } => { gst::Structure::builder(NAVIGATION_EVENT_NAME).field("event", "touch-cancel") } + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + Self::MouseDoubleClick { button, x, y, .. } => { + gst::Structure::builder(NAVIGATION_EVENT_NAME) + .field("event", "mouse-double-click") + .field("button", button) + .field("pointer_x", x) + .field("pointer_y", y) + } }; #[cfg(feature = "v1_22")] - if true { + { structure = match self { Self::MouseMove { modifier_state, .. } => structure.field("state", modifier_state), Self::MouseButtonPress { modifier_state, .. } => { @@ -1350,6 +1416,11 @@ impl NavigationEvent { Self::TouchCancel { modifier_state, .. } => { structure.field("state", modifier_state) } + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + Self::MouseDoubleClick { modifier_state, .. } => { + structure.field("state", modifier_state) + } }; }