2017-08-18 100 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