在Wayland下从xid获取GDK窗口

时间:2017-08-18 18:00:07

标签: python wayland gobject-introspection

简而言之:这是How to get Gdk window from xid?的重复,但在Wayland下。

以下代码工作正常,直到我将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现在是__gi__.GdkWaylandDisplay,因此GdkX11.X11Window.foreign_new_for_display会抛出

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

那我现在如何获得gdkWindow? (我根本无法在线查看必要的文档,因此也可以指出当时的指示。)

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

1 个答案:

答案 0 :(得分:2)

作为一般答案,例如,根据您的"来判断。来自wmctrl"评论,没有解决方案。

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

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

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

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