Wmctrl

如何使用 wmctrl 通過 PID 調整視窗大小和移動視窗?

  • June 23, 2019

我正在使用 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。

所以我的想法是使用程序ID(PID)而不是使用視窗名稱,因為與視窗名稱不同,PID是唯一的。問題是:是否可以wmctrl使用 PID?

在我的手冊頁中,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

不幸的是,這不起作用(無論是十進制數,還是十六進制數)。

Q1:是否可以使用wmctrlPID 而不是視窗名稱?

Q2:這個-i選項實際上是什麼意思?

-i選項需要一個視窗 id,如果你只是執行,你會得到這個

xdotool getactivewindow

它列印一個十進制數,如 20971543。所以你可以這樣做

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

但是你不需要這樣做,因為它wmctrl接受一個偽視窗 id 字元串:ACTIVE:來表示焦點視窗,所以你可以這樣做

wmctrl -r :ACTIVE: ...

引用自:https://unix.stackexchange.com/questions/526503