Есть ли у xlib активное оконное событие? - PullRequest
4 голосов
/ 10 марта 2011

Я пытаюсь написать программу, которая отслеживает изменения активного окна, используя Xlib. У меня проблемы с поиском лучшего способа сделать это. Это мои идеи до сих пор:

  • Каждую секунду используйте _NET_ACTIVE_WINDOW, чтобы получить активное окно и, если оно изменилось, запустить соответствующий код для события.
  • Получить список всех окон и прослушать их фокус в событии. Я должен был бы выяснить, как сохранить обновленный список открытых окон, хотя.

Это легче / лучше? Я новичок в программировании с Xlib.

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Разве вы не можете просто выбрать PropertyChange в корневом окне, чтобы получать отправленные PropertyNotify события при обновлении какого-либо свойства, а затем проверить каждое событие, чтобы узнать, было ли оно для _NET_ACTIVE_WINDOW?

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

Вот Python-реализация того, что предложил @alanc.

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

Я также искал "активный захват событий изменения окон".В то же время я использую комбинацию xdotool и xwininfo .

xwininfo -id "$(xdotool getactivewindow)"
.
...