X11 - Как поднять окно другого приложения, используя Python - PullRequest
8 голосов
/ 20 апреля 2010

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

Я видел это, и я думаю, что я мог бы попробовать:

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

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

Ответы [ 3 ]

6 голосов
/ 04 мая 2010

Чтобы активировать другое окно, правильное действие на уровне протокола 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.

5 голосов
/ 08 декабря 2014

Вы можете взглянуть на пакет python ewmh . Документация содержит примеры, но вот как вы можете достичь того, что вы хотите:

from ewmh import EWMH
import random
ewmh = EWMH()

# get every displayed windows
wins = ewmh.getClientList()

# let's active one window randomly
ewmh.setActiveWindow(random.choice(wins))

# flush requests - that's actually do the real job
ewmh.display.flush()
4 голосов
/ 21 апреля 2010

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

...