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));
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)
{
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