![如何使用“wmctrl”通过 PID 调整窗口大小和移动窗口?](https://linux22.com/image/155911/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E2%80%9Cwmctrl%E2%80%9D%E9%80%9A%E8%BF%87%20PID%20%E8%B0%83%E6%95%B4%E7%AA%97%E5%8F%A3%E5%A4%A7%E5%B0%8F%E5%92%8C%E7%A7%BB%E5%8A%A8%E7%AA%97%E5%8F%A3%EF%BC%9F.png)
我使用的是 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
选项的实际含义是什么?
答案1
该-i
选项需要一个窗口 ID,这是您运行后得到的
xdotool getactivewindow
它打印一个十进制数,如 20971543。所以你可以这样做
wmctrl -i -r "$(xdotool getactivewindow)" ...
但你不需要这样做,因为wmctrl
接受伪窗口 id 字符串来:ACTIVE:
表示聚焦窗口,所以你可以这样做
wmctrl -r :ACTIVE: ...