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:
parent
c0d8d1b942
commit
ad7c9ce478
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user