web-dev-qa-db-ja.com

wmctrl Ubuntu 17.10トグル、上にトグルダウンしない

この質問の答えを試した後: 「常に最上位」を設定してアプリを起動する方法 、特に@MichaelTunnellによる コメント の1つ:

このコマンドを使用してbashスクリプトまたはキーボードショートカット(作成したもの)を作成でき、必要なときに使用できますが、不要な場合は使用できないため、これは私にとって最良のオプションです。私は変更を加えましたが、アクティブウィンドウのショートカットを常にオンにして、必要な場合にのみオンにしたいので、ここにコマンドがあります。 wmctrl -r :ACTIVE: -b toggle,above

私はUbuntu 16.10以下で常に上に切り替えることができましたが、今インストールしたUbuntu 17.10では同じショートカットを使用したいと思いません

私はこの投稿も試しましたが、これは基本的にMichael Tunnellのコメントのより詳細な投稿です 常にトップのUbuntuのキーボードショートカット

ショートカットは下の画像で確認でき、ウィンドウのAlways-on-topをTrueに設定するために機能しますが、同じコマンドを再度使用して「オフにする」場合でも、アクティブなアプリケーションを削除できませんそのプロパティ。

enter image description here

これはGNOME Ubuntu 17.10のバグですか?または、この特定のバージョンで追加の構成が不足していますか?

4
Frakcool

wmctrlは、Ubuntu 17.10のデフォルトセッションであるWaylandと完全には互換性がありません。

回避策として、このQ&Aの後にXorgセッションに切り替えます: Ubuntu 17.10でWaylandからXorgに切り替えるにはどうすればよいですか?

2
pomsky

多くの調査と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'

xpropsを使用してアクティブなウィンドウの状態のプロパティ「_NET_WM_STATE」をチェックし、「常に上」オプションがアクティブであることを示す「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」が含まれているかどうかを確認します。これは、ウィンドウが「常に手前」に設定されていることを示しています。

    [[ $(■) =~ "ABOVE" ]]

  • Trueの場合は「削除」を返し、そうでない場合は「追加」を返します。

    _■ && echo "remove" || echo "add"_

  • 戻り値をパラメーターとして使用してwmctrlコマンドを実行する

    wmctrl -r :ACTIVE: -b $(■),above

  • すべてをbashに送信して、コマンド置換_${ ... }_、bashブール評価_[[ ... ]]_、および正規表現一致演算子_=~_を使用できるようにします。

    _bash -c '■'_

    特にこの最後のステップでは、理解するのに非常に長い時間がかかりました。キーボードショートカットがデフォルトでbashで実行されていないことに気づくまで、コマンドをテストしているときにコンソールでコマンドが機能する理由がわかりませんでしたが、キーボードショートカットとして直接実行すると、静かに失敗しました。それは私を何年も壁に駆り立てました!

注:bashに送信するコマンドを引用符で囲む必要があるため、コマンドを作成するときは、(二重引用符を使用して)1レベル以上深くならないように注意する必要がありました。引用符で文字列をさらにネストするには、引用符をエスケープするために多くの混乱するバックスラッシュが必要になります。

1
Geoff Davids