wxpython на Wayland не может взаимодействовать с координатами экрана (перемещение окна, GetScreenPosition и т. д.)

Я нашел это трудным путем. Я погрузился в исходный код wx.lib.agw.aui.framemanager и попытался выяснить, почему подсказки по стыковке не работают должным образом. Я проверял каждый шаг, пока в самом конце вычисления места для рисования подсказки не появился метод ClientToScreen(self,x,y), который должен возвращать x,y со смещением self: wx.Window, но каждый раз возвращает x,y с одним и тем же смещением. Затем я попытался указать начальную позицию в конструкторе моего основного фрейма, что никак не повлияло на положение фрейма. Затем я проверил вывод из GetScreenPosition при обработке EVT_MOVE, и оказалось, что EVT_MOVE даже не излучается на Wayland, за исключением случаев, когда вы используете Move или максимизируете/минимизируете кадр (возможно, в некоторых других случаях, но я нашел только упомянутые случаи).

Внутри EVT_MOVE обработчик GetScreenPosition возвращает:

  • (0,0) когда вы максимизируете окно,
  • координаты, которые вы указываете в Move при его срабатывании (но сам Move не работает)
  • (26, 23) в других случаях (в том числе вызывая его в других местах)

Это известная ошибка? Может быть, я единственный, кто это испытывает. Если нет, я добавлю проблему в wxWidgets/Phoenix.

изменить: Python 3.6.9, wxPython 4.0.7, Ubuntu 18.04.1, Gnome 3.28.4


person yar    schedule 10.01.2020    source источник
comment
Я не думаю, что для этих проблем возникнут какие-либо специфичные для Python проблемы, проверьте, есть ли уже тикет для этого на trac.wxwidgets.org   -  person RobinDunn    schedule 11.01.2020
comment
@RobinDunn Я сделал этот пост перед тем, как оформить билет, потому что это кажется очевидным. Я даже не могу указать начальную позицию окна, но я не видел ни одной темы/сообщения/тикета/вопроса, даже упоминающего об этом. И я не нашел для него билет с тегом wayland (с x он работает как положено), поэтому я подумал, что это известная проблема или она как-то связана с моей системой (возможно, обновление gnome или установка определенного пакета поправил бы).   -  person yar    schedule 11.01.2020
comment
@RobinDunn Учитывая объяснение и ссылку в ответе ниже, было бы полезно добавить некоторую информацию об этой нефункциональности в документы wxPython. Я очень старался заставить wx.Frame.CentreOnScreen() работать уже несколько недель. Если бы документы сказали, что это не работает на Wayland, я бы не был так лишен сна, как сейчас.   -  person mbrennwa    schedule 29.09.2020


Ответы (1)


https://lists.freedesktop.org/archives/wayland-devel/2015-September/024410.html

Дизайнерское решение Wayland/desktop состоит в том, чтобы вообще не показывать абсолютные позиции окна клиентам. Это означает, что вы просто не можете знать, где именно находится окно верхнего уровня, вы можете только знать, с какими выходами оно перекрывается.

Вы можете установить переменную среды GDK_BACKEND=x11 для принудительного запуска Xwayland, и проблема будет решена. Это не кажется долгосрочным решением, но оно работает.

person yar    schedule 11.01.2020