这不是一个大问题,但是有点烦人,而且最重要的是有趣。我在一台装有 Xfce 4.12 的 Debian 9 稳定机器上运行了一段时间,并且正在并行设置一个 GNOME 桌面来尝试一下。
在 Xfce 上,我有一个自定义键盘快捷键wmctrl -r :ACTIVE: -b toggle,above
,它一直可以在顶部和与其他窗口相同的级别上切换焦点窗口。
我在 GNOME 3.22 上尝试了相同的系统设置/键盘,我只能将焦点窗口切换到其他窗口之上,它不会将其切换回与其他窗口相同的级别。我必须右键单击窗口的框架,然后取消选中“始终位于顶部”选项。
有谁知道为什么会发生这种情况?
答案1
我在 2016 年 4 月也注意到了这一点,我的解决方法是使用 2 个键进行切换,例如:
wmctrl -r :ACTIVE: -b add,above
wmctrl -r :ACTIVE: -b remove,above
答案2
好吧,经过大量研究并弄清楚如何在 bash 中编写正确的代码后,我创建了一个命令,该命令在逻辑层中使用 wmctrl 命令来在当前 GNOME 桌面上有效地切换“始终在最前面”状态!看哪:
bash -c 'wmctrl -r :ACTIVE: -b $([[ $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") _NET_WM_STATE) =~ "ABOVE" ]] && echo "remove" || echo "add"),above'
它使用 检查活动窗口状态属性“_NET_WM_STATE” xprops
,如果它包含文本“ABOVE”,则意味着“始终位于顶部”选项处于活动状态。然后它只运行wmctrl
带有参数add
或remove
适当的命令。
命令细分(每个命令插入下一个命令,替换■
占位符):
获取活动窗口 ID:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
使用 id 从 xprop 获取窗口状态:
xprop -id $(■) _NET_WM_STATE
检查状态是否包含 'ABOVE',表明窗口设置为 'always on top':
[[ $(■) =~ "ABOVE" ]]
如果为 true,则返回“remove”,否则返回“add”:
■ && echo "remove" || echo "add"
使用返回值作为参数运行 wmctrl 命令
wmctrl -r :ACTIVE: -b $(■),above
将整个内容发送到 ,
bash
以便您可以使用命令替换${ ... }
、bash 布尔求值[[ ... ]]
和正则表达式匹配运算符=~
bash -c '■'
特别是最后一步花了我很长时间才弄清楚。直到我意识到键盘快捷键默认情况下不在 bash 中运行,我不知道为什么这些命令在我测试它们时在控制台中工作,但在直接作为键盘快捷键运行时却默默地失败了。它让我在墙上呆了很长时间!
注意:因为您需要在发送到 bash 的命令周围加上引号,所以在编写命令时我必须小心,我从来没有深入过一层(使用双引号)。在引号中进一步嵌套字符串将需要大量令人困惑的反斜杠来转义引号。