From 0a94da96119910940e5d6105858dfb0a377f3334 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Mon, 2 Aug 2021 17:46:37 +0900 Subject: [PATCH] examples: playback-test: Fix for UI resize scenario on Windows Application needs to notify videosink element of video widget resize via gst_video_overlay_set_render_rectangle() since WM_SIZE event wouldn't be notified. Part-of: --- .../tests/examples/playback/playback-test.c | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/subprojects/gst-plugins-base/tests/examples/playback/playback-test.c b/subprojects/gst-plugins-base/tests/examples/playback/playback-test.c index cbaed94a22..c3aa3c11e8 100644 --- a/subprojects/gst-plugins-base/tests/examples/playback/playback-test.c +++ b/subprojects/gst-plugins-base/tests/examples/playback/playback-test.c @@ -2227,6 +2227,13 @@ draw_cb (GtkWidget * widget, cairo_t * cr, PlaybackApp * app) return TRUE; } + /* "prepare-window-handle" message might not be posted yet depending on + * videosink implementation */ + if (!app->overlay_element) { + app->overlay_element = gst_bin_get_by_interface (GST_BIN (app->pipeline), + GST_TYPE_VIDEO_OVERLAY); + } + if (app->overlay_element) gst_video_overlay_expose (GST_VIDEO_OVERLAY (app->overlay_element)); @@ -2311,6 +2318,39 @@ motion_notify_cb (GtkWidget * widget, GdkEventMotion * event, PlaybackApp * app) return FALSE; } +#ifdef G_OS_WIN32 +/* On Windows, videosink elements expect full-size overlay window handle. + * And an expectation for window resize scenario is that WM_SIZE event of + * parent HWND is forwarded to child window. + * But some GUI applications like GTK might handle WM_SIZE event by themselves + * and therefore child HWND wouldn't be able to understand any resize event. + * + * In this example, we will watch "configure-event" of GTK widget and + * GstVideoOverlay::set_render_rectangle() will be used to notify videosink + * elements of resized render area. + */ +static gboolean +configure_event_cb (GtkWidget * widget, GdkEventConfigure * event, + PlaybackApp * app) +{ + /* GdkEventConfigure::x and GdkEventConfigure::y are positions of this + * video widget relative to parent. So, we should not forward it to videosink. + * From videosink point of view, its parent window is this video widget */ + + if (!app->overlay_element) { + app->overlay_element = gst_bin_get_by_interface (GST_BIN (app->pipeline), + GST_TYPE_VIDEO_OVERLAY); + } + + if (app->overlay_element) { + gst_video_overlay_set_render_rectangle (GST_VIDEO_OVERLAY + (app->overlay_element), 0, 0, event->width, event->height); + } + + return FALSE; +} +#endif + static void msg_eos (GstBus * bus, GstMessage * message, PlaybackApp * app) { @@ -2682,6 +2722,10 @@ create_ui (PlaybackApp * app) G_CALLBACK (key_release_cb), app); g_signal_connect (app->video_window, "motion-notify-event", G_CALLBACK (motion_notify_cb), app); +#ifdef G_OS_WIN32 + g_signal_connect (app->video_window, "configure-event", + G_CALLBACK (configure_event_cb), app); +#endif gtk_widget_set_can_focus (app->video_window, TRUE); gtk_widget_add_events (app->video_window, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK