...アンケート調査はありません。
私のシステムのカスタムGUIを更新できるように、現在フォーカスされたウィンドウが変更された時期を検出したいと思います。
見どころ:
- リアルタイム通知。 0.2秒の遅延は大丈夫で、1秒の遅延は何もなく、5秒の遅延はまったく許容できません。
- リソースアフィニティ:したがってポーリングを避けたいです。
xdotool getactivewindow getwindowname
0.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で生成されたイベントを同期的に受信します。これがまさに私が求めているものです。