问题
我目前正在添加一些自定义快捷方式。
我无法显示最小化的 Rhythmbox 窗口。我使用 shell 脚本中的 wmctrl(见下文)来完成此任务。当我按下组合键时,没有任何反应(视觉上)。例如,使用下面改编的 shell 脚本显示 Firefox 没有任何问题;为什么 Rhythmbox 的行为不一样?
所述shell脚本:
sh -c "if pgrep -x rhythmbox > /dev/null; then wmctrl -a rhythmbox; else rhythmbox; fi"
重要编辑:
显然我的脚本现在可以正常工作了 - 无需对其进行任何更改。但是,我运行了killall rhythmbox
。之后我的 shell 脚本按预期工作。我认为只需添加修复程序而不是删除问题,我也许可以帮助遇到相同问题的人。如果您认为您知道为什么会发生这种情况,请随时分享您的理论。
又一次编辑:
哇,好吧……在添加最后一个编辑几秒钟后,我尝试再次使用上述快捷方式,但没有成功。我终止了该进程,一切又恢复了正常 -then
以及else
主体。在点击了其他几个窗口后,它又停止了工作。在我运行killall rhythmbox
并看到它再次完美运行后,即使在我未能重现错误之后,我得出的结论是它的行为有点随机。当然是伪随机的。如果你想亲自尝试,你知道怎么做。你可以通过运行来获取 wmctrl sudo apt install wmctrl
。我在 Ubuntu 16.04 LTS 上使用它的 1.07 版本,非常困惑。
最后一次编辑(永远不要说最后一次):
实际上,我按下组合键后 Firefox 就会自动显示出来。这很酷,但不是我想要的。我现在要喝一大杯咖啡,然后做点别的事,哇。
答案1
问题:rhythmbox 正在更改窗口名称
问题是你通过窗口来识别窗口姓名,使用wmctrl -a
。来自man wmctrl
:
-a <WIN>
Switch to the desktop containing the window <WIN>, raise the window, and give it focus.
<WIN>
是一种识别细绳在窗口名称中。
尤其是在您的例子中,这可能会导致错误,因为 Rhythmbox 会根据歌曲更改窗口名称。您需要通过其窗口来识别窗口班级或其id
后者可以使用以下方法完成:
wmctrl -ia
其中选项-i
代表窗口 ID:
-i Interpret window arguments (<WIN>) as a numeric value rather
than a string name for the window. If the numeric value starts
with the prefix '0x' it is assumed to be a hexadecimal number.
可以从窗口列表中检索窗口所属的窗口 id 和 pid,命令如下:
wmctrl -lp
例如,从 Rhythmbox 打开最新窗口的可靠命令是:
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"
解释:
wmctrl -lp
列出所有窗口,包括它们的 pid。该命令的一个重要特性是它列出了窗口按照创建顺序。
所以:
wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }'
将要:
列出所有窗口 + 它们所属的 pid:
wmctrl -lp
找到属于 rhythmbox 的那些:
grep "$(pgrep rhythmbox)"
找到最后一个(也是最后创建的那个):
tail -1
提取行中的第一个字符串(即窗口 -id):
awk '{ print $1 }'
命令:
wmctrl -ia
然后将通过其 id 调出最新的 Rhythmbox 窗口。
脚本
为了方便起见,并为了防止出现引号问题,我会使用该命令创建一个小脚本,然后从快捷方式运行它:
#!/bin/bash
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"
做了可执行文件添加快捷键:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。点击“+”并添加命令:
/path/to/script.sh
此外
看起来您正在为多个应用程序使用该命令/脚本。您可以制作应用程序,而不是为每个应用程序制作单独的脚本争论脚本:
#!/bin/bash
app=$(pgrep $1)
wmctrl -ia "$(wmctrl -lp | grep "$app" | tail -1 | awk '{ print $1 }')"
然后
/path/to/script.sh gedit
将会弹出最近创建的gedit
窗口,同时
/path/to/script.sh rhythmbox
将会出现最近创建的rhythmbox
窗口,等等。