如何使用“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 首先打开。

所以我的想法是使用进程 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选项的实际含义是什么?

答案1

-i选项需要一个窗口 ID,这是您运行后得到的

xdotool getactivewindow

它打印一个十进制数,如 20971543。所以你可以这样做

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

但你不需要这样做,因为wmctrl接受伪窗口 id 字符串来:ACTIVE:表示聚焦窗口,所以你可以这样做

wmctrl -r :ACTIVE: ...

相关内容