使用 Devilspie2 定位多个窗口

使用 Devilspie2 定位多个窗口

我经常同时打开 2 个 Firefox 窗口,并且我喜欢将它们放在屏幕的相对角落。我的 Devilspie2 配置文件中有相关部分

--if string.match(get_window_name(), "Mozilla Firefox")
if get_application_name() == "Firefox"
then
    -- Apply default immediately
    set_window_geometry(1040,32,878, 950);

    -- Second window
    --os.execute("sleep " .. 10);
    if string.match(get_window_name(), "MySite")
    then
        set_window_geometry(0, 374, 824, 666);
    end
end

但第二个窗口始终具有默认位置。

我的观察表明,devilspie2 在 Firefox 加载站点并调整窗口标题之前完成了窗口的处理。睡眠是为了响应这一点而添加的,但这没有什么区别,我尝试过不睡眠,睡眠时间为一秒和十秒,但没有成功。我不是 lua 程序员,我从网络搜索中得到了 os.execute() 提示。同样,如果我在开始时使用 get_window_name() 或 get_application_name() 也没有什么区别。

这个问题可能相关,但尚未收到答案。 Devilspie2 仅在重新启动时检测 Firefox 窗口;我怎样才能解决这个问题?

有谁知道如何让 Devilspie2 对不断变化的窗口标题做出反应?

答案1

据我了解,仅在由于窗口创建、窗口销毁或焦点活动窗口更改而导致的devilspie2事件(来自 )上运行 lua 代码。libwnck

在 lua 中使用 sleep 不会有帮助,因为对窗口属性(例如窗口名称)的更改确实会导致事件被添加到队列中,但在 lua 将控制权返回到 Devilspie2 的主循环之前,队列不会被处理。此时,libwnck 将更新信息,但 lua 不会再次被 Devilspie2 调用,直到新的创建、销毁或焦点事件发生。

一种可能性是使用标准 X11 实用程序获取窗口名称, xprop。而不是os.execute("sleep " .. 10);使用类似的东西

local id = get_window_xid
local cmd = "xprop -id " .. id .. " WM_NAME"
local file = io.popen("sleep 10; " .. cmd)
local windowname = file:read("*a")
file:close()

我不是lua专家,我没有测试过上面的内容。该xprop命令给出当前窗口的十进制窗口 ID,并询问属性 WM_NAME,它以以下形式输出

WM_NAME(STRING) = "MySite"

然后你应该能够使用

string.match(windowname, "MySite")

用较短的 sleep/xprop 的有限循环替换单个 sleep/xprop 会很有用,以便尽快找到匹配。

答案2

受到@meuh 的回答的启发。我查看了 xdotool 并想出了这个脚本,它似乎有效:

#!/bin/bash
firefox_cmd="firefox ..."
$firefox_cmd &
pid=$!
xdotool search --sync --onlyvisible --pid $pid \
  windowactivate \
  windowmove 0 270 windowsize 870 900

相关内容