在尝试了这个问题的答案之后:如何启动一个设置了“Always On Top”的应用程序?,特别是@MichaelTunnell评论中的那个:
这对我来说是最好的选择,因为我可以使用这个命令创建一个 bash 脚本或键盘快捷键(我做过),这样我可以在需要时使用它,但在不需要时不能使用。不过,我确实进行了更改...我想要一个快捷方式来始终打开活动窗口的顶部,并且仅在需要时才打开,所以这是我的命令。
wmctrl -r :ACTIVE: -b toggle,above
我能够在 Ubuntu 16.10 或更低版本中始终切换到顶部,但不能在我现在安装的 Ubuntu 17.10 上切换,并且希望拥有相同的快捷方式
我也试过这篇文章,基本上是 Michael Tunnell 评论的更详细的帖子:始终在顶部 Ubuntu 的键盘快捷键
该快捷方式可以在下图中看到,它用于将窗口 Always-on-top 设置为 True,但即使我再次使用相同的命令“将其关闭”,我也无法删除活动的应用程序那个属性。
这是 GNOME Ubuntu 17.10 中的错误吗?还是我在这个特定版本中缺少任何额外的配置?
经过大量研究并弄清楚如何在 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
适当的命令。命令分解(每个命令插入下一个,替换
■
占位符):xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
xprop -id $(■) _NET_WM_STATE
[[ $(■) =~ "ABOVE" ]]
■ && echo "remove" || echo "add"
wmctrl -r :ACTIVE: -b $(■),above
bash
以便您可以使用命令替换$( ... )
、bash 布尔评估[[ ... ]]
和正则表达式匹配运算符=~
bash -c '■'
尤其是最后一步,我花了很长时间才弄清楚。直到我意识到键盘快捷键默认情况下没有在 bash 中运行,我才知道为什么这些命令在我测试它们时在控制台中工作,但是当直接作为键盘快捷键运行时会默默地失败。它把我逼上墙很久了!
注意:因为您需要在发送到 bash 的命令周围加上引号,所以在编写命令时我必须小心,因为我从来没有超过一层(使用双引号)。引号中任何进一步的字符串嵌套都需要大量令人困惑的反斜杠来转义引号。
wmctrl
与 Wayland 不完全兼容,Wayland 是 Ubuntu 17.10 上的默认会话。作为一种解决方法,您可以在此问答之后切换回 Xorg 会话:如何在 Ubuntu 17.10 中从 Wayland 切换回 Xorg?
我认为 Geoff 的解决方案很棒,但我想要一些更具可读性/适应性的东西,所以我编写了这个快速 bash 脚本,它的功能非常相似,但
xdotool
用于获取 idxprop
现在我只是把我的快捷方式指向这个脚本,它对我有用。
很不言自明,我想。可能需要解释的部分是
$?
它只返回前一个命令的退出代码(在这种情况下,grep:如果匹配则为 0,如果失败则为 1)。请注意,以这种方式使用退出代码可能不是一个好习惯,因为grep
可能由于其他原因而失败,但此脚本失败的风险非常低;)