我经常同时打开 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