私はこれを試しました:
xprop -id $(gedit & echo $!) -f MY_VAR1 8s -set MY_VAR1 MyCustomVar
xpropを試してgeditウィンドウをクリックします。 MY_VAR1が存在しません。
だから私はそこで寝なければならないと思いました...私は次のように努力しました。
xprop -id $(gedit & sleep 5 & echo $!) -f MY_VAR1 8s -set MY_VAR1 MyCustomVar
5秒待ってからxpropを試して新しいウィンドウをクリックしました。それでも結果はありません。
ありがとう
答え1
Jeffが指摘したように、PIDと窓口番号他のものがあり、そこに互いにマッピングするのは必ずしも簡単な方法ではありません。- 一部のプロセスにはウィンドウがなく、一部は1つのウィンドウを共有し、他のプロセスにはまだ多くのウィンドウがあります(ウィンドウが1つだけ表示されても少なくともXレベルではそうです)。
起動時に表示gedit
されるウィンドウがありましたが、xwininfo -root -tree -all
名前またはクラスが「gedit」の3つの別々のX Windows(「クライアントリーダー」と実際にユーザーインターフェイスの一部である最大20のその他の匿名「ウィンドウ」(gedit
バージョン、タブ数、GTK +によって異なります)。
調整の問題を部分的に解決するには、プロパティを使用できます。_NET_WM_PID
そしてWM_CLIENT_LEADER
、これは所有プロセスのPIDを保持し、複数のウィンドウがある場合はリーダーIDを保持する必要があります(後者は実際にはセッション管理、ここで役に立ちます)。これで_NET_WM_PID
、プロセスとウィンドウマネージャが正しく機能する必要があるいくつかの問題がある可能性がありますが、通常、最新のデスクトップでは信頼できます(たとえば、以前のプログラムを除くrxvt
)。環境変数などのプロパティを考えてみましょう。しなければならないPIDに設定されていますが、一部のWMが他のWMよりも積極的であると確信していても、それを強制することはありません。
gedit
一般に、この種の問題については、Windowsを列挙し、ループ内のプロパティをクエリして、起動したばかりのプロセスのPIDを取得し、プロパティを設定する短いスクリプトを書くことができます。_NET_WM_PID
しかし、すべてがあなたに不利に陰謀を飾る:
- ウィンドウIDを含むX属性はありません。
xprop
奇妙なことに、クエリしたウィンドウのIDは出力されません。- ウィンドウ名は
gedit
開いている内容によって変わり、xprop
ワイルドカード/パターンはサポートされず、ウィンドウのカテゴリと一致しません。 xwininfo
両方ともすべてのウィンドウではなく、一致する最初のウィンドウのみを出力しますxprop
(例:by)、出力を解析するのは簡単ではありません。-name
- X「ウィンドウ」の数は以下を超えることがあります。見えるウィンドウ50倍拡張
gedit
デフォルトでは単一プロセスとして実行されるため、2番目のプロセスを開始すると、gedit
そのプロセスはメインプロセスに接続されるとすぐに終了します。ただし、最新バージョンではこれを使用してgedit -s
独立したプロセス/ウィンドウを実行できます。
xdotool
これがxwit
まさに、そして、同じユーティリティが存在する理由ですwmctl
。 ;-) 残念ながら、これらのユーティリティは、何の助けもなければ正しく動作しません。
スタンドアロンインスタンスを実行している場合、これはシェルスクリプトとして機能するため、わかりやすいです(ファイル名パラメータのサポート)。
#!/bin/bash
gedit -s "$@" &
_pid=$!
_wid=$(xdotool search --sync --onlyvisible --pid $_pid)
xprop -f MY_VAR1 8s -set MY_VAR1 MyCustomVar -id $_wid
# xprop -id $_wid MY_VAR1 ## for testing
これはxdotool
重い操作を実行するために使用され、「同期」モードでウィンドウを起動し、プロパティを設定する時間を提供するため、gedit -s
プロセスは既存のインスタンスに引き継がれてから消えるのではなく、自己完結型で長続きします(周りにぶら下げてくださいxdotool
)。
または同等の文章:
gedit -s & xdotool search --sync --onlyvisible --pid $! |
xargs -r xprop -f MY_VAR1 8s -set MY_VAR1 MyCustomVar -id
メモ:
xdotool
PIDで検索でき、一部の属性を名前に設定することもできますが、必要に応じて任意の属性名を設定することはできません。xprop
悪い検索と出力オプションxdotool
10進数ウィンドウID出力、xprop
10進数または16進数を許可- エラー処理が多い
あなたできるを使用せずにこれを実行しますxdotool
が、システム内のすべてのウィンドウを一覧表示し、各ウィンドウを順番に処理する必要がある状況が発生する可能性があります。試してみましたが、ここに貼り付けるのはとても悪いです:-)
別のアプローチ:標準のGTK +クライアントを使用すると、アプリケーションがプロパティを記録しなくても、コマンドラインオプションを使用してプロパティを設定できます(gedit --help-gtk
)。残念ながら、任意の属性ではありませんが、「Class」を任意の文字列に設定できます。クラスは複数値属性なので、各ウィンドウにはまだ「gedit」クラスがあります。したがって、この方法を選択すると、設定/リソースは引き続き適用されますが、「Gedit」設定が適用されないことがあります。これは効果がありますが、利点もあります)。
$ gedit --class MyCustomVar
$ xprop -notype -name gedit WM_CLASS _NET_WM_PID
WM_CLASS = "gedit", "MyCustomVar"
_NET_WM_PID = 1517
WM_NAME = "gedit"
ウィンドウ/プロセスマッピングにはいくつかの異なるオプションがあります(/proc/PID/environ
in for search WINDOWID
、これはその規則に準拠した端末エミュレータによって開始されたプロセスにのみ適用されますが、可能です)。gedit
プラグインの作成)しかし両方とも魅力的ではありません。また、見ることができますhttps://stackoverflow.com/questions/151407/how-to-get-an-x11-window-from-a-process-id- 最も興味深い答えの1つは、LD_PRELOAD
リンクXCreateWindow()
や他のいくつかのAPI関数をラップしてランダムなプロパティを設定するハッキングです。