Изменение захвата в активном окне (для Linux) - PullRequest
7 голосов
/ 06 ноября 2010

Есть ли способ узнать, когда пользователь (linux x windows) меняет активное окно с помощью alt-tab или щелчка.Я хочу написать сценарий, который прослушивает это событие (если такое событие происходит, сценарий затем продолжает поиск текущего активного окна - которое я знаю, как решить).Я также мог бы продолжать опрос, чтобы найти текущее активное окно, но это плохой способ написать это.Надеемся получить решение, которое может «слушать», а не «опрашивать».

Спасибо!

Ответы [ 3 ]

1 голос
/ 07 марта 2011

Краткий просмотр документации для модуля Perl X11 :: Tops показывает, что существует метод monitor_property_and_structure_change.Таким образом, я бы предположил, что базовые библиотеки X11 обеспечат ту функциональность, которую вы ищете.

0 голосов
/ 02 января 2017

Мне нужно было это сделать, и мое решение состояло в том, чтобы просмотреть свойство _NET_ACTIVE_WINDOW (поддерживаемое Window Manager) в корневом окне на предмет изменений.

Вот копия реализации python-xlibЯ написал, чтобы продемонстрировать это кому-то:

import Xlib
import Xlib.display

disp = Xlib.display.Display()
root = disp.screen().root

NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW')
NET_WM_NAME = disp.intern_atom('_NET_WM_NAME')

last_seen = {'xid': None}
def get_active_window():
    window_id = root.get_full_property(NET_ACTIVE_WINDOW,
                                       Xlib.X.AnyPropertyType).value[0]

    focus_changed = (window_id != last_seen['xid'])
    last_seen['xid'] = window_id

    return window_id, focus_changed

def get_window_name(window_id):
    try:
        window_obj = disp.create_resource_object('window', window_id)
        window_name = window_obj.get_full_property(NET_WM_NAME, 0).value
    except Xlib.error.XError:
        window_name = None

    return window_name


if __name__ == '__main__':
    root.change_attributes(event_mask=Xlib.X.PropertyChangeMask)
    while True:
        win, changed = get_active_window()
        if changed:
            print(get_window_name(win))

        while True:
            event = disp.next_event()
            if (event.type == Xlib.X.PropertyNotify and
                    event.atom == NET_ACTIVE_WINDOW):
                break

Более комментируемая версия в этой сути .

0 голосов
/ 16 июня 2011

Я знаю о программе KTimeTracker KDE, которая отслеживает, сколько времени вы проводите в каждом окне.Я не знаю подробностей - отслеживает ли он события смены активных окон или просто периодически проверяет состояние всего рабочего стола.Тем не менее, источники могут быть полезны: http://www.kde.org/applications/utilities/ktimetracker/.

...