wmctrl 无法在脚本内调整窗口大小或移动窗口

wmctrl 无法在脚本内调整窗口大小或移动窗口

我正在尝试编写一个脚本,打开一堆程序并移动/调整屏幕上的窗口大小。

例如,

#!/bin/bash
zim
wmctrl -r Zim -b toggle,maximized_vert
wmctrl -r Zim -e 0,700,0,-1,-1

我运行此脚本,窗口最大化并向右移动一点。但是,如果我用zimfirefox替换acroread,则无法移动/调整窗口大小。

wmctrl如果我在终端中输入,它确实有效,但我喜欢它在脚本中firefox我认为这一定与它在屏幕上记住位置的方式有关。

编辑:我放了

firefox
wmctrl -lG

在脚本中我得到以下输出:

0x03800032  0 1168 347  750  731  briareos emacs@briareos
0x02a00002  0 -2020 -1180 1920 1080 briareos XdndCollectionWindowImp
0x02a00005  0 0    24   47   1056 briareos unity-launcher
0x02a00008  0 0    0    1920 24   briareos unity-panel
0x02a0000b  0 -420 -300 320  200  briareos unity-dash
0x02a0000c  0 -420 -300 320  200  briareos Hud
0x03c00011  0 59   52   900  1026 briareos Notes - Zim

这意味着脚本不知道 Firefox 已启动。

答案1

问题

问题是,在您使用的命令组合中,您需要“幸运”地让应用程序的窗口及时出现,命令才能wmctrl成功执行。
您的命令可能在大多数情况下对轻量级应用程序有效,启动速度很快,但对其他应用程序(如 Inkscape、Firefox 或 Thunderbird)会失效。

就像您所做的那样(在评论中提到),内置 5 秒或 10 秒的中断,但要么您必须等待比必要更长的时间,要么如果您的处理器被占用并且窗口“比平时晚”,它最终会中断。

解决方案

解决方案是在脚本中包含一个过程,等待窗口出现在的输出中wmctrl -lp,然后运行命令以最大化窗口。

python下面的例子中,我习惯于调整窗口大小,根据我的经验,这比完成这项工作xdotool更为可靠:wmctrl

#!/usr/bin/env python3
import subprocess
import getpass
import time
import sys

app = sys.argv[1]

# to only list processes of the current user
user = getpass.getuser()
get = lambda x: subprocess.check_output(x).decode("utf-8")
# get the initial window list
ws1 = get(["wmctrl", "-lp"]); t = 0
# run the command to open the application
subprocess.Popen(app)

while t < 30:
    # fetch the updated window list, to see if the application's window appears
    ws2 = [(w.split()[2], w.split()[0]) for w in get(["wmctrl", "-lp"]).splitlines() if not w in ws1]
    # see if possible new windows belong to our application
    procs = sum([[(w[1], p) for p in get(["ps", "-u", user]).splitlines() \
              if app[:15].lower() in p.lower() and w[0] in p] for w in ws2], [])
    # in case of matches, move/resize the window
    if len(procs) > 0:
        subprocess.call(["xdotool", "windowsize", "-sync", procs[0][0] , "100%", "100%"])
        break
    time.sleep(0.5)
    t = t+1

如何使用

  1. 该脚本需要wmctrlxdotool

    sudo apt-get install wmctrl xdotool
    
  2. 将脚本复制到一个空文件中,另存为resize_window.py

  3. 测试运行脚本,使用应用程序作为参数,例如:

    python3 /path/to/resize_window.py firefox
    

笔记

  • 如果您将其用作启动应用程序中的脚本,则获取窗口列表的命令可能wmctrl会运行过早。如果您遇到问题,我们需要为整个过程添加一个try/ except。如果是这样,请告诉我。

相关内容