web-dev-qa-db-ja.com

wmctrl -aコマンドで最小化されたRhythmboxウィンドウが表示されないのはなぜですか?

問題

現在、いくつかのカスタムショートカットを追加しています。

最小化されたRhythmboxウィンドウを表示できません。このタスクには、シェルスクリプトでwmctrlを使用します。以下を参照してください。キーコンボを押しても、何も起こりません(視覚的に)。たとえば、Firefoxを公開すると、以下のシェルスクリプトの適合バージョンを使用しても問題なく機能します。 Rhythmboxが同じように動作しないのはなぜですか?

上記のシェルスクリプト:

sh -c "if pgrep -x rhythmbox > /dev/null; then wmctrl -a rhythmbox; else rhythmbox; fi"

重要な編集:

どうやら私のスクリプトは現在動作しています-それについて何も変更することなく。ただし、killall rhythmboxを実行しました。その後、私のシェルスクリプトは期待どおりに機能しました。質問を削除する代わりに修正を追加するだけで、誰かが同じ問題に出くわすのを助けることができると思います。これが起こった理由を知っていると思うなら、あなたのtheroyを共有してください。

まだ別の編集:

うわー、大丈夫...その最後の編集を追加してから数秒後、私は上記のショートカットを再度使用しようとしましたが、機能しませんでした。プロセスを強制終了し、すべてが再び機能しました-then AND else body。他のいくつかのウィンドウをクリックした後、再び動作しなくなりました。 killall rhythmboxを実行し、エラーを再現できなかった場合でも、それが完全に機能することを確認した後、それは一種のランダムな動作であるという結論に達しました。もちろん、疑似ランダムです。自分で試してみたい場合は、その方法を知っています。 Sudo apt install wmctrlを実行してwmctrlを取得できます。 Ubuntu 16.04 LTSでバージョン1.07を使用していますが、非常に混乱しています。

最後の編集(最後とは言いません):

キーの組み合わせを押すと、Firefoxが実際に表示されるようになりました。それはクールで、私が望むものではありません。私は今大きなコーヒーを飲み、何か他のことをします、すごい。

3
Reum12

問題:rhythmboxがウィンドウ名を変更している

問題は、wmctrl -aを使用して、nameでウィンドウを識別することです。 man wmctrlから:

-a <WIN>
    Switch to the desktop containing the window <WIN>, raise the window, and give it focus. 

<WIN>は、ウィンドウ名の識別stringです。

特にあなたの場合、Rhythmboxは曲に応じてウィンドウ名を変更するため、これはエラーを引き起こす可能性があります。ウィンドウclassまたはidでウィンドウを識別する必要があります。

後者は以下を使用して実行できます。

wmctrl -ia

オプション-iはwindow-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.

ウィンドウが属するwindow-idとpidの両方は、コマンドによって呼び出されるwindow-listから取得できます。

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
    
  • 行の最初の文字列(window -id)を抽出します。

    awk '{ print $1 }'
    

コマンド:

wmctrl -ia

次に、IDで最新のRhythmboxウィンドウを上げます。

脚本

便宜上、引用符の問題を防ぐために、コマンドを使用して小さなスクリプトを作成し、ショートカットから実行します。

#!/bin/bash
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"

executableにして、ショートカットキーを追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 。 「+」をクリックして、コマンドを追加します。

/path/to/script.sh

さらに

複数のアプリケーションでコマンド/スクリプトを使用しているようです。アプリケーションごとに個別のスクリプトを作成する代わりに、スクリプトに対してアプリケーションargumentを作成できます。

#!/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ウィンドウなどを表示します。

2
Jacob Vlijm