Windowsプロパティを処理するために、バックグラウンドで起動されたGUIプログラムのX IDを取得したいと思います。これまで私はこの回避策を使用してきました。
myprogram &
sleep 1
winID=$(wmctrl -l | awk '/./{line=$0} END{print $1;}')
しかし、これは3つの重要な仮定に依存します。
- プログラムがウィンドウを開くのに1秒未満かかります(もちろん1秒未満は長すぎるかもしれません)。
wmctrl
ウィンドウがリストの最後に追加されます。- 同時に他のウィンドウは開きません。
myprogram
ウィンドウが開くと、どの信号が送信されますか?どのようにブロックできますか?
答え1
私のプログラムからウィンドウIDを取得するには、プログラムのタイトルを一意に設定し、プログラムを起動してwmctrl
出力を解析し(プログラムを起動するシェルスクリプトの代わりに)ウィンドウIDを報告します(ほとんどの場合は次のように)。ファイル) 。
ウィンドウが開くまでプログラムが続行されないため、長時間待つ必要はありません。
もちろん、これを行うには変更できる必要がありますmyprogram
(ソースからコンパイルするなど)。
答え2
Python giライブラリの使用(最近最近起動したプログラムがウィンドウスタックの一番上にあると仮定)
import gi
gi.require_version('Wnck', '3.0')
from gi.repository import Wnck , Gtk
screen=Wnck.Screen.get_default()
while Gtk.events_pending() :
Gtk.main_iteration()
all_windows=screen.get_windows_stacked()
print(all_windows[0].get_xid())
PS。未検証