ウィンドウタイトルの変更に関する通知を受け取る

ウィンドウタイトルの変更に関する通知を受け取る

...アンケート調査はありません。

私のシステムのカスタムGUIを更新できるように、現在フォーカスされたウィンドウが変更された時期を検出したいと思います。

見どころ:

  • リアルタイム通知。 0.2秒の遅延は大丈夫で、1秒の遅延は何もなく、5秒の遅延はまったく許容できません。
  • リソースアフィニティ:したがってポーリングを避けたいです。xdotool getactivewindow getwindowname0.5秒ごとに実行しても大丈夫ですが...私のシステムは毎秒2つのプロセスを作成するのが良いですか?

では、ウィンドウフォーカスが変更されるたびに、いくつかの(非常に)基本的な統計を含む行を印刷bspwmできます。bspc subscribeこの方法は最初は大丈夫に見えますが、この方法を聞くと、ウィンドウのタイトルが自然に変わる時期は検出されません(たとえば、Webブラウザでタブをこのように変更することには気付かない)。

それでは、Linuxで0.5秒ごとに新しいプロセスを作成しても大丈夫でしょうか?そうでなければ、どうすればもっとうまくいくでしょうか?

気に入っていることの1つは、ウィンドウマネージャが実行するアクションをエミュレートすることです。しかし、作業中のウィンドウマネージャとは別に、「ウィンドウの作成」、「タイトルの変更要求」などのイベントのフックを作成できますか?それとも、私は直接ウィンドウマネージャになるべきですか?これを行うにはrootが必要ですか?

(私が考えたもう1つは、コードを見て、xdotool私が興味のあるものだけをシミュレートして定型句を生成するすべてのプロセスを避けますが、まだポーリングすることです)。

ベストアンサー1

@Basileのコメントのおかげで、私は多くを学び、次の実際の例を考えました。

#!/usr/bin/python3
import Xlib
import Xlib.display

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

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

root.change_attributes(event_mask=Xlib.X.FocusChangeMask)
while True:
    try:
        window_id = root.get_full_property(NET_ACTIVE_WINDOW, Xlib.X.AnyPropertyType).value[0]
        window = disp.create_resource_object('window', window_id)
        window.change_attributes(event_mask=Xlib.X.PropertyChangeMask)
        window_name = window.get_full_property(NET_WM_NAME, 0).value
    except Xlib.error.XError:
        window_name = None
    print(window_name)
    event = disp.next_event()

xdotool単に実行するのではなく、Xで生成されたイベントを同期的に受信します。これがまさに私が求めているものです。

おすすめ記事