Получить окно GDK от xid, под Wayland
В двух словах: это повторение Как получить окно GDK из XID? , но под Уэйлендом.
Код, подобный следующему, работал нормально, пока я не обновил 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
сейчас? (Я не смог увидеть необходимые документы в Интернете, поэтому ссылки на них также будут приветствоваться.)
Я счастлив также получить gdkWindow
из PID или имени процесса, поскольку именно там я получаю XID.
1 ответ
Как общий ответ, судя по вашему комментарию "например. От wmctrl", решения не существует.
По замыслу, Wayland не позволяет приложениям вмешиваться или проверять окна друг друга по соображениям безопасности.
Приложения X11, такие как wmctrl, запускаются на уровне совместимости с именем XWayland и не имеют права вмешиваться в собственные приложения Wayland.
Вы получаете эту ошибку, потому что вы пытаетесь использовать GdkX11
внутри приложения, которое запускалось как нативное приложение Wayland, и оно принципиально не отличается от ошибки, которую вы получите при попытке вызвать Win32 API в приложении C#, которое изначально работает в Linux.
Единственный способ заставить его работать - это посмотреть, как заставить любые соответствующие приложения перейти на работу через XWayland, или написать все, что вы пытаетесь сделать, как патч для самого компоновщика Wayland.