如何在gtk4中获取属于GtkDrawingArea的X窗口?

tpn*_*rma 5 gtk gstreamer cairo gtk4

我试图将 gstreamer 的 GUI 集成教程(https://gstreamer.freedesktop.org/documentation/tutorials/basic/toolkit-integration.html?gi-language=c)从 gtk3 移植到 gtk4。我在获取属于 GtkDrawingArea 的 X 窗口时遇到了问题。在 gtk3 中,要获取 XID 并将其传递给 GstVideoOverlay,使用以下方法:

static void realize_cb (GtkWidget *widget, CustomData *data) {
  GdkWindow *window = gtk_widget_get_window (widget);
  guintptr window_handle;

  if (!gdk_window_ensure_native (window))
    g_error ("Couldn't create native window needed for GstVideoOverlay!");

  /* Retrieve window handler from GDK */
  window_handle = GDK_WINDOW_XID (window);

  /* Pass it to playbin, which implements VideoOverlay and will forward it to the video sink */
  gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (data->playbin), window_handle);
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何在 Gtk4 中做同样的事情。由于 Gtk4 使用 Wayland 术语,因此 gdk 中获取 XID 的函数是以GDK_SURFACE_XID()GdkSurface* 作为参数,而 GtkWidget 中没有直接函数来获取指向 GdkSurface 的指针,类似于gtk_widget_get_windowGtk3 中的那样。

我尝试使用gtk_widget_get_nativeGtkDrawingArea 获取 GtkNative 并将 GdkSurface 附加到它,但这会返回 GtkWindow 的表面。

我正在寻找一种方法来传递 XIDgst_video_overlay_set_window_handle以便能够在小部件中播放视频。

我对 Gtk 和 Gstreamer 都很陌生,所以对于我的理解上的差距表示歉意。

pan*_*oku 0

据我发现,这种在 GTK4 GUI 中嵌入 GStreamer 视频的方式不再正确。

您的选择是:

  1. gst-plugin-gtk4
    但这是一个额外的依赖项

  2. GtkVideo
    我见过有人抱怨性能