gpt4 book ai didi

linux - 基于 GTK 的窗口的 X 客户端请求失败

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:02 24 4
gpt4 key购买 nike

我创建了一个简单的基于 gstreamer+gtk 的应用程序来播放视频文件。 “filesrc”、“decodebin”、“autovideosink”、“autoaudiosink”gstreamer 元素用于此目的。

主窗口使用 gtk_window_new(GTK_WINDOW_TOPLEVEL) 创建,绘图区域使用 gtk_drawing_area_new() 创建。绘图窗口嵌入在主窗口中。

要在 gtk 绘图窗口上呈现,它的句柄使用 gstreamer api gst_video_overlay_set_window_handle() 作为覆盖传递给 gstreamer 视频插件通过这样做,不会呈现视频,只会播放音频。

如果我将 XCreateWindow() 句柄作为覆盖传递给 gstreamer 视频插件,而不是 GTK 窗口,则一切正常。但我必须创建基于 GTK 的播放器。

现在,当我开始调试问题时,我发现了以下详细信息。

  1. “autovideosink”插件在主循环线程内的 XNextEvent 上被阻止(幸运的是我有源代码并使用日志验证)
  2. 然后使用 xtrace 实用程序发现大多数 X 请求都失败了(见下文),而在 XCreateWindow 的情况下,所有此类请求都会获得成功的响应。

002:<:000f: 52: Request(1): CreateWindow depth=0x18 window=0x01600001 parent=0x01400007 x=0 y=0 width=640 height=368 border-width=0 class=InputOutput(0x0001) visual=0x00000021 value-list={background-pixel=0x00000000 border-pixel=0x00000000 backing-store=NotUseful(0x00) override-redirect=false(0x00) colormap=CopyFromParent(0x00000000)}

002:<:0010: 24: Request(16): InternAtom only-if-exists=true(0x01) name='_NET_WM_STATE'

002:>:000f:Error 8=Match: major=1, minor=0, bad=20971527

002:<:001d: 8: Request(3): GetWindowAttributes window=0x01600001

002:<:001e: 8: Request(14): GetGeometry drawable=0x01600001

002:>:001d:Error 3=Window: major=3, minor=0, bad=23068673

002:>:001e:Error 9=Drawable: major=14, minor=0, bad=23068673

我不知道为什么这些请求对于 GTK 窗口会失败。而在我的旧系统(ubuntu 14.04)中,我可以很好地运行同一个播放器。当前系统为ubuntu 16.04

任何与 X Server 相关的配置设置?请提出一些解决方案或任何想法如何进一步调试它以找出真正的原因。

最佳答案

原型(prototype):

XCreateWindow(display, parent, x, y, width, height, border_width, depth, class, visual, valuemask, attributes)

问题中提到的autovideosink其实就是imxeglvivsink。 imxeglvivsink 使用 gtk-window 作为父窗口创建子窗口(检查 XCreateWindow api 的第二个参数)。

现在用于父 Windodw(GTK) 的 GDK 默认视觉与 X 默认视觉不同,这就是 X CreateWindow 请求失败的原因。

我用 2 个解决方案解决了这个问题。

解决方案 1:在 imxeglvivsink 中,在创建子窗口时,我将“CopyFromParent”标志用于 XCreateWindow api 的“visual”参数。通过这样做,Visual for Parent 和 Child 匹配并且 X 请求 CreateWindow 获得成功。

我不喜欢这个解决方案,因为我必须用我的新库替换原来的 imxeglvivsink 库。

解决方案 2:我的最终目标还是一样的。我必须为父窗口和子窗口保持相同的视觉效果。在此解决方案中,我将父窗口 (GTK) 的视觉更改为 X 默认视觉。我在应用程序级别进行了此更改,并且我对 imxeglvivsink 没有任何依赖性。更改 GDK 视觉效果的代码片段如下:

static int change_visual(GtkWidget *widget)
{
int nitems_return;
Display *x_display = XOpenDisplay(NULL);
Visual *x_visual = XDefaultVisual(x_display, DefaultScreen(x_display));

GdkScreen *gdk_screen = gdk_screen_get_default();
GList *gdk_visual_list = gdk_screen_list_visuals(gdk_screen);
GList *l;
for (l = gdk_visual_list; l != NULL; l = l->next)
{
Visual *temp = gdk_x11_visual_get_xvisual((GdkVisual *)l->data);
if(temp->visualid == x_visual->visualid) break;
}
//l is pointing the visual which is similar to system x visual. Lets change it.
gtk_widget_set_visual (widget, (GdkVisual *)l->data);
return 0;
}

我知道如果 visualid 在 for 循环中不匹配,我不会在意。对我来说,我总是发现 GDK 视觉与 X 默认视觉相同。

关于linux - 基于 GTK 的窗口的 X 客户端请求失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49611297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com