为什么我的 wmctrl -a 命令不能提升最小化的 Rhythmbox 窗口?

为什么我的 wmctrl -a 命令不能提升最小化的 Rhythmbox 窗口?

问题

我目前正在添加一些自定义快捷方式。

我无法显示最小化的 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窗口,等等。

相关内容