4

Xlib を使用して、アクティブなウィンドウがいつ変更されたかを追跡するプログラムを作成しようとしています。これを行う最善の方法を見つけるのに苦労しています。これらはこれまでの私の考えです:

  • 毎秒 _NET_ACTIVE_WINDOW を使用してアクティブなウィンドウを取得し、変更された場合はイベントに関連するコードを実行します。
  • すべてのウィンドウのリストを取得し、イベントでのフォーカスをリッスンします。ただし、開いているウィンドウの最新のリストを維持する方法を理解する必要があります。

彼らはより簡単でより良い方法ですか?Xlib を使ったプログラミングは初めてです。

4

3 に答える 3

7

これは、@alanc が提案したものを Python で実装したものです。

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

誰かの例として私が書いた、より完全にコメントされたバージョンは、この要点にあります。

于 2017-01-02T11:50:33.240 に答える
3

PropertyChangeルート ウィンドウを選択して、PropertyNotifyプロパティが更新されたときに送信されたイベントを取得し、各イベントをチェックして、それが_NET_ACTIVE_WINDOW.

于 2011-06-16T21:28:22.973 に答える
0

「アクティブウィンドウズチェンジイベントグラバー」も探していました。私がその間に使用するのは(そしてあなたにとって役立つかもしれませんが)xdotoolxwininfoの組み合わせです。

xwininfo -id "$(xdotool getactivewindow)"
于 2011-06-16T11:54:47.270 に答える