从 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 的补丁合成器本身。