Hack 和 / - 使用 wmctrl 自动化您的桌面
好吧,我承认;我对自动化上瘾了。Roomba 为我吸尘,我的主路由器检查其 DSL 连接并在 DSL 调制解调器断线时自动重置,我的门廊灯是运动感应的,并且我的 bin 目录中充满了我用来自动化日常计算机任务的自制脚本。当你可以将一长串步骤简化为一个脚本并运行它时,会感到非常满足。
当大多数人想到使用脚本进行自动化时,他们会想到命令行。毕竟,大多数脚本都与标准的命令行操作有关,例如管道、简单逻辑、重定向和解析文本输出。如今,桌面上的许多工作都是在没有终端的情况下完成的,因此如果您也可以自动化一些更平凡的图形任务,那就太好了。一个名为 wmctrl 的工具可以做到这一点。wmctrl 为标准窗口管理任务提供了一个命令行界面,因此您可以从 shell 脚本中调整窗口大小和移动窗口、更改桌面、切换窗口的粘性和卷起状态等等。
wmctrl 是大多数现代发行版中的常见软件包,因此您应该能够使用发行版的软件包管理器安装它。否则,您可以从 wmctrl 的主网站 (www.sweb.cz/tripie/utils/wmctrl) 获取源代码并构建它。wmctrl 的优点之一是它不是特定于窗口管理器的。它通过扩展窗口管理器提示 (EWMH) 更改您的窗口,并且由于现在大多数流行的窗口管理器(例如 GNOME 的 Metacity、KDE 的 KWin、Compiz Fusion 和 Fluxbox)都支持 EWMH,因此 wmctrl 不仅可能与您的窗口管理器一起使用,而且如果您决定更改为不同的窗口管理器,您的 wmctrl 脚本也可能会同样工作。
说明 wmctrl 强大功能的最佳方法之一是创建一个脚本,将常规终端变成 Quake 终端。对于那些没有玩过 Quake 系列游戏的人来说,当您在 Quake 中按下 ` 键时,一个终端会从屏幕顶部弹出,以便您可以键入命令。这种类型的终端在杂乱的桌面上非常方便,但您甚至可以使用它来创建一种“老板键”,使窗口快速消失。
在本例中,我创建了一个标题为“Quake Term”的终端,但您可以更改此脚本以使用桌面上任何窗口的标题。如果您不确定 wmctrl 将如何查看您的窗口标题,请使用 -l 选项运行 wmctrl 以显示有关桌面上所有窗口的信息
greenfly@minimus:~$ wmctrl -l 0x020000ba 0 minimus Quake Term 0x00e00031 -1 minimus Desktop 0x01200003 -1 minimus gkrellm 0x00800029 -1 minimus Top Expanded Edge Panel 0x00800003 -1 minimus Bottom Expanded Edge Panel 0x01000172 0 minimus greenfly.org - Mozilla Firefox
此输出中的最后一个字段是特定窗口的标题,这是 wmctrl 可以用来识别您要为其编写脚本操作的窗口的信息。要创建一个基本的 Quake 终端,您只需要一个 wmctrl 命令
#!/bin/sh wmctrl -r 'Quake Term' -b toggle,shaded
-r 选项告诉 wmctrl 要操作的窗口标题,-b 选项告诉 wmctrl 添加、删除或切换最多两个不同的窗口属性(在本例中,是窗口的阴影状态)。wmctrl 手册页列出了您可以使用此选项和任何其他选项调整的所有可用属性。
请注意,如果窗口具有唯一的标题,则 wmctrl 脚本效果最佳。如果您打开了多个标题相同的窗口,则可能无法为正确的窗口添加阴影。每个终端设置其标题的方式都不同,但例如,在 GNOME 终端上,您可以在配置文件设置中更改标题(右键单击终端并选择“编辑当前配置文件”)。
我使用上述命令的修改版本,它不仅为窗口添加阴影,而且还将其移动到后面,低于任何其他窗口。该脚本还使用临时文件跟踪切换状态,以便我可以确保阴影和堆叠状态保持同步
#!/bin/sh # Unshade and bring to front if [ -f /tmp/.quake.shaded ]; then wmctrl -r 'Quake Term' -b remove,below wmctrl -r 'Quake Term' -b remove,shaded rm /tmp/.quake.shaded # Shade and send to back else wmctrl -r 'Quake Term' -b add,shaded wmctrl -r 'Quake Term' -b add,below touch /tmp/.quake.shaded fi
我只需将 Super-` 绑定为运行上述脚本,然后我就可以通过快速按键序列上下切换我的终端。
Quake 终端很方便,但您可以使用 wmctrl 做更多强大的事情。我使用 wmctrl 创建的最方便的脚本之一解决了我在 IRC 中聊天和同时浏览网页时遇到的问题——调整两个窗口的大小以便您可以同时看到它们是很麻烦的,只是为了在您完成聊天或浏览后将它们调整回原来的大小。wmctrl 允许您调整窗口大小和移动窗口,前提是您知道如何描述新的窗口位置和几何形状。考虑到这一点,我创建了一个脚本,可以在两种状态之间切换:正常模式和聊天模式。在聊天模式下,我的 IRC 窗口缩小并移动,使其位于屏幕顶部的窄条中,并且我的 Web 浏览器调整大小以使其更短,这样我可以同时看到两个窗口。然后,我可以再次运行该脚本,窗口将移回其正常位置。
要创建脚本,首先将您的两个窗口(在我的示例中,一个标题为“Irssi Term”,另一个标题为“Firefox”)按照您通常想要的方式排列,然后运行一个特殊的 wmctrl 命令来列出桌面上所有窗口及其几何形状和大小信息
greenfly@minimus:~$ wmctrl -lG 0x00e00031 -1 0 48 1280 768 minimus Desktop 0x01200003 -1 -130 100 62 367 minimus gkrellm 0x00800029 -1 0 0 1280 24 minimus Top Expanded Edge Panel 0x00800003 -1 0 1524 1280 25 minimus Bottom Expanded Edge Panel 0x01000172 0 6 96 1040 708 minimus greenfly.org - Mozilla Firefox 0x0201c24f 0 -2552 96 642 410 minimus Eterm Main 1 0x02000021 0 -2552 96 642 410 minimus Eterm Main 1 0x020000ba 0 938 96 810 500 minimus Irssi Term
在此输出中,-G 选项在中间添加了四个额外的列。这些列分别表示 x 偏移、y 偏移、宽度和高度。因此,在 Firefox 的情况下,x 偏移为 6,y 偏移为 96,宽度为 1040,高度为 708。记下您要编写脚本的两个窗口的这些值,然后调整它们的大小并移动它们以反映您的“聊天模式”。接下来,再次运行该命令并记下新值。
wmctrl 提供了 -e 参数,允许您修改窗口的位置和大小。该参数实际上连续接受五个整数值——g,x,y,w,h——其中 g 是窗口的重力(通常在此处放置 0),x 和 y 是窗口左上角的 x 和 y 坐标,w 和 h 分别是宽度和高度。因此,如果我移动了我的 Firefox 终端并想将其移回上述坐标,我将运行以下命令
wmctrl -r Firefox -e '0,6,0,1040,708'
如果您仔细观察,您可能会注意到我将 y 坐标更改为 0 而不是 96。我发现在某些窗口管理器中,窗口管理器报告给 wmctrl 的几何形状与实际情况不同。基本上,您需要进行一些试验和错误,并调整坐标,以便一切都恰到好处。一旦您对各自的 wmctrl 命令感到满意,您可以将它们放入一个脚本中,该脚本与我上面用于 Quake 终端的脚本非常相似
#!/bin/sh # Change to normal mode if [ -f /tmp/.irssi.halfshaded ]; then wmctrl -r 'Irssi Term' -e '0,469,0,810,500' wmctrl -r Firefox -e '0,3,0,1040,708' rm /tmp/.irssi.halfshaded # Change to chat mode else wmctrl -r Firefox -e '0,3,223,1210,535' wmctrl -r 'Irssi Term' -e '0,0,0,1214,160' touch /tmp/.irssi.halfshaded fi
我注意到,在使用当前的窗口管理器 (Compiz) 时,当我运行此命令时,一些错误——要么在 wmctrl 中,要么更可能在窗口管理器中——导致 Firefox 从我的第二个桌面移动到我当前的桌面。如果这种情况发生在您身上,有一个简单的修复方法。只需在脚本中的 if 语句上方添加以下行
wmctrl -o 1281,0
wmctrl 具有用于切换到不同桌面以及不同视口的命令。由于 Compiz 通常使用多个视口而不是桌面,因此上述命令将我移动到第二个视口(我的桌面是 1280x768,因此 1281,0 对应于我的第二个视口的顶角)。
wmctrl 功能强大。我建议查看其手册页并阅读有关大量可用选项的信息。然而,wmctrl 的真正威力在于您能够想象出新的和有趣的方式来编写窗口管理器操作脚本。我的下一个项目是创建一个“重置”脚本,将我所有桌面上的所有窗口移动到精确的位置和大小,以防它们都被移动和调整大小。当然,我可以手动完成所有这些操作,但那样我就会错过这个绝佳的自动化机会。
Kyle Rankin 是旧金山湾区的高级系统管理员,并且是多本书籍的作者,包括 O'Reilly Media 出版的 Knoppix Hacks 和 Ubuntu Hacks。他目前是 North Bay Linux 用户组的主席。