从 xid 获取 GDK Window,在 Wayland 下
Get GDK Window from xid, under Wayland
简而言之:这是 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 的地方。
作为一般答案,根据您的 "for example. From wmctrl" 评论判断,没有解决方案。
根据设计,出于安全原因,Wayland 不允许应用程序干涉或检查彼此的 windows。
像 wmctrl 运行 这样的 X11 应用程序位于名为 XWayland 的兼容层中,并且无权干预本机 Wayland 应用程序。
您收到该错误是因为您尝试在作为本机 Wayland 应用程序启动的应用程序中使用 GdkX11
,并且它与您尝试调用时遇到的错误没有根本区别运行在 Linux.
上本地运行的 C# 应用程序中的 Win32 API
使其工作的唯一方法是查找如何强制任何相关应用程序通过 XWayland 回退到 运行ning 或将您想要完成的任何内容编写为 Wayland 的补丁合成器本身。
简而言之:这是 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 的地方。
作为一般答案,根据您的 "for example. From wmctrl" 评论判断,没有解决方案。
根据设计,出于安全原因,Wayland 不允许应用程序干涉或检查彼此的 windows。
像 wmctrl 运行 这样的 X11 应用程序位于名为 XWayland 的兼容层中,并且无权干预本机 Wayland 应用程序。
您收到该错误是因为您尝试在作为本机 Wayland 应用程序启动的应用程序中使用 GdkX11
,并且它与您尝试调用时遇到的错误没有根本区别运行在 Linux.
使其工作的唯一方法是查找如何强制任何相关应用程序通过 XWayland 回退到 运行ning 或将您想要完成的任何内容编写为 Wayland 的补丁合成器本身。