「wmctrl」を使用してPIDを介してウィンドウのサイズを変更して移動する方法は?

「wmctrl」を使用してPIDを介してウィンドウのサイズを変更して移動する方法は?

私は21:9モニターを使用しており、キーボードショートカットを使用してウィンドウをモニターの左、中央、右にタイリング/ソートするスクリプトを作成しました。

┌─────────┬─────────┬─────────┐
│ window1 │ window2 │ window3 │
│ left    │ centre  │ right   │
│ aligned │ aligned │ aligned │
└─────────┴─────────┴─────────┘

スクリプトは、現在フォーカスされたウィンドウの名前を取得し、
WINDOW_NAME=$(xdotool getwindowfocus getwindowname)
ウィンドウ名を使用してウィンドウをソートする方法で動作します。
wmctrl -ir "$WINDOW_NAME" -e 1,$X_OFFSET,$Y_OFFSET,$X_WIDTH,$Y_HEIGHT

問題は、同じウィンドウ名(たとえば、2つのFirefoxブラウザまたは3つの端末など)で複数のウィンドウが開かれたときに、現在フォーカスされているウィンドウを移動せずに、同じ名前のすべてのウィンドウのうちの最初のウィンドウを移動することです。

つまり、3つの端末が開いていて端末T2をソートしようとすると、T1が最初に開かれるため、スクリプトはT2の代わりにT1をソートします。

だから私の考えは、ウィンドウ名とは異なり、PIDが一意であるため、ウィンドウ名を使用する代わりにプロセスID(PID)を使用することです。問題は、wmctrlPIDを使用して作業できるかどうかです。

マニュアルページで、wmctrl変数を文字列名ではなく数値として解釈するオプションが見つかりました。-i<WIN>

$ man wmctrl 
[...]
    -e <MVARG>
      Resize  and  move  a  window  that  has been specified with a -r
      action according to the <MVARG> argument.
[...]
    -r <WIN>
      Specify a target window for an action.
[...]
    -i     
      Interpret window arguments (<WIN>) as  a  numeric  value  rather
      than  a  string name for the window. If the numeric value starts
      with the prefix '0x' it is assumed to be a hexadecimal number.
[...]

私はこのオプションが何を意味するのかよく理解しておらず、-iウィンドウ名の代わりにPIDを使用できるという意味かもしれないと思いました。

WINDOW_ID=$(xdotool getactivewindow getwindowpid)
WINDOW_ID=$(printf 0x%x $WINDOW_ID)
wmctrl -ir "$WINDOW_ID" -e 1,$X_OFFSET,$Y_OFFSET,$X_WIDTH,$Y_HEIGHT

残念ながら、これは機能しません(10進数または16進数では)。

wmctrlQ1:ウィンドウ名の代わりにPIDを使用できますか?
Q2:-iこのオプションは実際に何を意味しますか?

答え1

この-iオプションには、実行後に取得されるウィンドウIDが必要です。

xdotool getactivewindow

20971543などの10進数を印刷します。だからあなたはこれを行うことができます

wmctrl -i -r "$(xdotool getactivewindow)" ...

wmctrlしかし、疑似ウィンドウID文字列はフォーカスされた:ACTIVE:ウィンドウを表すために許可されるため、これを行う必要はありません。

wmctrl -r :ACTIVE: ...

関連情報