我正在使用 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:是否可以使用wmctrl
PID 而不是窗口名称?
Q2:这个-i
选项实际上是什么意思?
该
-i
选项需要一个窗口 id,如果你只是运行,你会得到这个它打印一个十进制数,如 20971543。所以你可以这样做
但是你不需要这样做,因为它
wmctrl
接受一个伪窗口 id 字符串:ACTIVE:
来表示焦点窗口,所以你可以这样做