1

简而言之:这是如何从 xid 获取 Gdk 窗口的重复?,但在韦兰之下。

在我将 Debian 从 Stretch 更新为 Buster 之前,如下代码运行良好:

#!/usr/bin/env python3
from gi.repository import Gdk
from gi.repository import GdkX11

Gdk.Window.process_all_updates()
xlib_window = 0x2a00005 # for example. From wmctrl; xwininfo used in the previous question.
gdk_display = GdkX11.X11Display.get_default()
gdk_window = GdkX11.X11Window.foreign_new_for_display(gdk_display, xlib_window)
print gdk_window.get_geometry()

不幸的是,gdk_display现在是 a __gi__.GdkWaylandDisplay,所以GdkX11.X11Window.foreign_new_for_display抛出

TypeError: argument display: Expected GdkX11.X11Display, but got __gi__.GdkWaylandDisplay

那么我现在如何得到我的gdkWindow呢?(我根本无法在线看到必要的文档,因此也将不胜感激。)

我很高兴也gdkWindow能从 PID 或进程名称中获得,因为这是我从中获得 XID 的地方。

4

1 回答 1

2

作为一般答案,从您的“例如。来自 wmctrl”的评论来看,没有解决方案。

根据设计,出于安全原因,Wayland 不允许应用程序干预或检查彼此的窗口。

像 wmctrl 这样的 X11 应用程序在名为 XWayland 的兼容层内运行,并且无权干预本机 Wayland 应用程序。

您收到该错误是因为您尝试在GdkX11作为本机 Wayland 应用程序启动的应用程序中使用,并且它与您尝试在本地运行的 C# 应用程序中调用 Win32 API 时遇到的错误没有根本不同Linux。

使其工作的唯一方法是查看如何强制任何相关应用程序回退到通过 XWayland 运行,或者编写您想要完成的任何内容作为 Wayland 合成器本身的补丁。

于 2017-08-26T12:45:33.777 回答