glvideomixer, compositor: fix mouse event handling to properly return success

Fix mouse event handling in both glvideomixer and compositor to
check if upstream handled navigation events themselves.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9139>
This commit is contained in:
Thibault Saunier 2025-05-29 19:16:02 +02:00 committed by GStreamer Marge Bot
parent c0d8d1b942
commit ad7c9ce478
4 changed files with 40 additions and 14 deletions

View File

@ -1721,6 +1721,12 @@ is_point_contained (const GstVideoRectangle rect, const gint px, const gint py)
return FALSE;
}
typedef struct
{
GstEvent *event;
gboolean res;
} SrcPadMouseEventData;
static gboolean
src_pad_mouse_event (GstElement * element, GstPad * pad, gpointer user_data)
{
@ -1728,6 +1734,7 @@ src_pad_mouse_event (GstElement * element, GstPad * pad, gpointer user_data)
GstGLVideoMixerPad *mix_pad = GST_GL_VIDEO_MIXER_PAD (pad);
GstVideoAggregatorPad *vagg_pad = GST_VIDEO_AGGREGATOR_PAD (mix_pad);
GstStructure *event_st;
SrcPadMouseEventData *data = user_data;
gdouble event_x, event_y;
GstVideoRectangle rect;
@ -1737,8 +1744,7 @@ src_pad_mouse_event (GstElement * element, GstPad * pad, gpointer user_data)
return TRUE;
}
event_st =
gst_structure_copy (gst_event_get_structure (GST_EVENT_CAST (user_data)));
event_st = gst_structure_copy (gst_event_get_structure (data->event));
gst_structure_get (event_st, "pointer_x", G_TYPE_DOUBLE, &event_x,
"pointer_y", G_TYPE_DOUBLE, &event_y, NULL);
@ -1760,7 +1766,7 @@ src_pad_mouse_event (GstElement * element, GstPad * pad, gpointer user_data)
gst_structure_set (event_st, "pointer_x", G_TYPE_DOUBLE, x,
"pointer_y", G_TYPE_DOUBLE, y, NULL);
gst_pad_push_event (pad, gst_event_new_navigation (event_st));
data->res |= gst_pad_push_event (pad, gst_event_new_navigation (event_st));
} else {
gst_structure_free (event_st);
}
@ -1782,11 +1788,17 @@ gst_gl_video_mixer_src_event (GstAggregator * agg, GstEvent * event)
case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE:
case GST_NAVIGATION_EVENT_MOUSE_MOVE:
case GST_NAVIGATION_EVENT_MOUSE_SCROLL:
gst_element_foreach_sink_pad (GST_ELEMENT_CAST (agg),
src_pad_mouse_event, event);
gst_event_unref (event);
return FALSE;
{
SrcPadMouseEventData d = {
.event = event,
.res = FALSE
};
gst_element_foreach_sink_pad (GST_ELEMENT_CAST (agg),
src_pad_mouse_event, &d);
gst_event_unref (event);
return d.res;
}
default:
break;
}

View File

@ -1815,14 +1815,20 @@ gst_compositor_release_pad (GstElement * element, GstPad * pad)
GST_ELEMENT_CLASS (parent_class)->release_pad (element, pad);
}
typedef struct
{
GstEvent *event;
gboolean res;
} SrcPadMouseEventData;
static gboolean
src_pad_mouse_event (GstElement * element, GstPad * pad, gpointer user_data)
{
GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR_CAST (element);
GstCompositor *comp = GST_COMPOSITOR (element);
GstCompositorPad *cpad = GST_COMPOSITOR_PAD (pad);
GstStructure *st =
gst_structure_copy (gst_event_get_structure (GST_EVENT_CAST (user_data)));
SrcPadMouseEventData *data = user_data;
GstStructure *st = gst_structure_copy (gst_event_get_structure (data->event));
gdouble event_x, event_y;
gint offset_x, offset_y;
GstVideoRectangle rect;
@ -1850,7 +1856,7 @@ src_pad_mouse_event (GstElement * element, GstPad * pad, gpointer user_data)
gst_structure_set_static_str (st, "pointer_x", G_TYPE_DOUBLE, x,
"pointer_y", G_TYPE_DOUBLE, y, NULL);
gst_pad_push_event (pad, gst_event_new_navigation (st));
data->res |= gst_pad_push_event (pad, gst_event_new_navigation (st));
} else {
gst_structure_free (st);
}
@ -1872,10 +1878,18 @@ _src_event (GstAggregator * agg, GstEvent * event)
case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE:
case GST_NAVIGATION_EVENT_MOUSE_MOVE:
case GST_NAVIGATION_EVENT_MOUSE_SCROLL:
{
SrcPadMouseEventData d = {
.event = event,
.res = FALSE
};
gst_element_foreach_sink_pad (GST_ELEMENT_CAST (agg),
src_pad_mouse_event, event);
src_pad_mouse_event, &d);
gst_event_unref (event);
return TRUE;
return d.res;
}
default:
break;

View File

@ -399,7 +399,7 @@ GST_START_TEST (test_navigation_events)
/* send event and validate */
res = gst_element_send_event (sink, event);
fail_unless (res == TRUE, NULL);
fail_unless (res == FALSE, NULL);
/* check received events */
ck_assert_msg (probe_events[0].received);

View File

@ -148,7 +148,7 @@ GST_START_TEST (test_navigation_events)
/* send event and validate */
res = gst_element_send_event (sink, event);
fail_unless (res == TRUE, NULL);
fail_unless (res == FALSE, NULL);
/* check received events */
ck_assert_msg (probe_events[0].received);