Получить окно 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.

Другие вопросы по тегам