xpropを使用してカスタムプロパティを設定し、1行でプログラムを開く方法は?

xpropを使用してカスタムプロパティを設定し、1行でプログラムを開く方法は?

私はこれを試しました:

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

メモ:

  • xdotoolPIDで検索でき、一部の属性を名前に設定することもできますが、必要に応じて任意の属性名を設定することはできません。
  • xprop悪い検索と出力オプション
  • xdotool10進数ウィンドウID出力、xprop10進数または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/environin for search WINDOWID、これはその規則に準拠した端末エミュレータによって開始されたプロセスにのみ適用されますが、可能です)。geditプラグインの作成)しかし両方とも魅力的ではありません。また、見ることができますhttps://stackoverflow.com/questions/151407/how-to-get-an-x11-window-from-a-process-id- 最も興味深い答えの1つは、LD_PRELOADリンクXCreateWindow()や他のいくつかのAPI関数をラップしてランダムなプロパティを設定するハッキングです。

おすすめ記事