跳转到主要内容

在Linux上检索和设置窗口信息(通过扩展窗口管理器提示)

项目描述

==== EWMH ====

EWMH(扩展窗口管理器提示)可以用于检索和设置Linux系统上窗口的信息。这是通过调用并解析诸如wmctrl之类的程序的输出实现的。

示例

from subprocess import Popen
from ruamel.ewmh import ExtendedWindowManagerHints as EWMH
Popen(['xclock', '-name', 'test_xclock'])
# there can be more than one window matching the title
# therfore .by_title() returns a list
clk = EWMH().by_title('test_xclock')[0]
clk.resize_and_move(200, 200, 300, 600)

为什么不使用wmctrl包?

在编写此库之前,我尝试了Antonio Cuni的wmctrl包。这个库看起来已经被遗弃(至少从2013年4月到2014年10月)。

我开始开发ewmh是因为我遇到了性能问题和异常,最初无法修复。当我注意到这些问题是由于设计决策造成的,与我不需要的功能(例如检索WM_CLASS)相关,并且因为我需要更简单但能工作的东西,我从零开始。

  • wmctrl的输出信息没有缓存,并且最初获取信息非常慢。如果你的机器上有M个窗口打开,并且你想要N个窗口的状态,这将导致通过commands.getoutput调用外部程序的总数为N * (M+1)次。在我的系统上有200多个打开的窗口时,获取信息需要几秒钟的时间,而且对于我感兴趣的每个窗口都是如此。

  • 使用commands.getoutput(),但自2008年以来已经弃用了它,应该使用subprocess.checkout_output()

  • 没有检查getoutput()的输出是否有错误。

  • 使用了os.system(),导致不必要的shell调用。

  • 程序对系统上打开的每个窗口都调用了 xprop,尽管通常情况下,这些信息通常都不使用。

  • 为了激活窗口,包通过 wmctrl 调用 wmctrl -id -a <ID>,我不确定那里的 d 是要做什么,没有它,命令的效果/输出相同。

在尝试修补这些问题并进行测试后,发生了异常,迫使我放弃它,因为从头开始做更省时。

我通过编写 emwh 获得的认知是,wmctrl 包目前至少无法处理包含空格的窗口类,而且当桌面上某个地方有 无标题窗口 时,程序调用库也无法生存。

大部分与 wmctrl 库一起提供的原始测试,只需进行少量调整(似乎与我的窗口顶部菜单有关)和在 emwh 中的包装类。因此,从 wmctrl 移动到 ewmh 应该很容易。


2014年12月14日

下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

上传时间

由以下机构支持