2017-08-18 93 views
1

简而言之:这是How to get Gdk window from xid?的重复,但在Wayland下。从韦德兰的西德获取GDK窗口

类似于下面的代码工作正常,直到我从拉伸更新Debian的巴斯特:

#!/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

你在使用什么而不是X窗口ID? –

+0

@JoshLee wmctrl -l仍然给我一个int,看起来像一个xid。 – GKFX

回答

2

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

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

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

由于您试图在作为本地Wayland应用程序启动的应用程序中尝试使用GdkX11,因此您会收到该错误,它与尝试在C#中调用Win32 API时发生的错误没有根本的区别。在Linux上本地运行的应用程序。

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

+0

谢谢。这是一种痛苦,但我认为Wayland阻止进程互相干预是有道理的。 – GKFX