X11 - Как повысить окно другого приложения с помощью Python

Я хотел бы смочь повысить Окно другого приложения с помощью Python.

Я действительно видел это, которое я предполагаю, что мог попробовать:

X11: повысить существующее окно через командную строку?

Однако я предпочел бы делать это в Python если вообще возможный.

8
задан Community 23 May 2017 в 12:01
поделиться

2 ответа

Чтобы активировать другое окно, правильное действие на уровне протокола Xlib - это отправить сообщение _NET_ACTIVE_WINDOW, как описано в спецификации EWMH http://standards.freedesktop.org/wm- spec / wm-spec-1.3.html

Это может быть сделано с помощью python-xlib (предположительно) или с помощью gdk_window_focus () на чужом GdkWindow с использованием GDK через pygtk

_NET_ACTIVE_WINDOW превосходит XRaiseWindow () и был в все важные WM на долгие годы.

Вам следует избегать использования XSetInputFocus (), поскольку это вызовет проблемы (особенно если вы укажете неверную метку времени). Проблема в том, что WM не может перехватить SetInputFocus (), поэтому он вызывает странные условия гонки и несоответствия пользовательского интерфейса.

На самом деле только _NET_ACTIVE_WINDOW работает должным образом, поэтому он был изобретен, потому что предыдущие хаки были плохими.

Существует библиотека под названием libwnck, которая позволяет вам активировать окна (среди прочего), но, к сожалению, она добавляет довольно много накладных расходов, поскольку всегда отслеживает все открытые окна из любого приложения, даже если вам это не нужно. . Однако, если вы все равно хотите отслеживать окна из других приложений , то в libwnck есть функция для активации этих окон, которая делает правильные вещи и будет хорошим выбором.

Строго правильный подход - проверить наличие поддержки EWMH _NET_ACTIVE_WINDOW (EWMH документирует, как это сделать) и вернуться к XRaiseWindow, если WM не имеет _NET_ACTIVE_WINDOW. Однако, поскольку любая WM, над которой активно работали в течение последних многих лет, имеет EWMH, многие люди ленивы по поводу замены устаревших WM.

7
ответ дан 5 December 2019 в 10:01
поделиться

Вам необходимо использовать python-xlib и вызвать .circulate (Xlib.X.RaiseLowest) в объекте окна (который может быть идентифицирован многими, многими различными способами - не могу угадать, какой из них подходит для вас, из нулевого количества информации об этом в вашем В ;-). Чтобы увидеть отличный пример использования python-xlib , посмотрите оконный менеджер tinywm - после версии C автор дает версию Python, которая занимает около 30 непустых, непустых -строки комментариев (для полезного, если крошечный, оконный менеджер ...! -).

5
ответ дан 5 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: