wmctrl
コマンドトグルを使用しようとしましたが、Ubuntuのセットアップでは機能しませんでした。トグルはオンになりますが、オフにはなりません。(wmctrl
おそらく、私の知る限り、GNOMEデスクトップ環境を使用しているためだと思います)。
とにかく、bashで適切なコードを書く方法を多くの調査と作業を行った後wmctrl
、現在のGNOMEデスクトップで「常にトップ」状態を効果的に切り替えるために、ロジックのレイヤー内のコマンドを使用する単一のコマンドを作成しました。この答えはAsk Unix / Linuxに投稿しましたが、同じ問題が発生した場合に備えてここにも投稿すると思いました。
コマンドは次のとおりです。
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
に応じてコマンドを実行します。
コマンドの内訳(各コマンドは■
プレースホルダーを置き換えて次のコマンドに挿入されます):
アクティブなウィンドウIDを取得します。
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
xprop
idを使用してウィンドウの状態を取得します。
xprop -id $(■) _NET_WM_STATE
状態に「ABOVE」が含まれているかどうかを確認します。これは、ウィンドウが「常に上」に設定されていることを示しています。
[[ $(■) =~ "ABOVE" ]]
trueの場合は「remove」を返し、そうでない場合は「add」を返します。
■ && echo "remove" || echo "add"
wmctrl
返された値をパラメーターとして使用してコマンドを実行します。
wmctrl -r :ACTIVE: -b $(■),above
すべてを送信して、bash
コマンド置換${ ... }
、bashブール評価[[ ... ]]
、および正規表現一致演算子を使用できるようにします=~
。
bash -c '■'
特にこの最後のステップを理解するのに非常に長い時間がかかりました。デフォルトでキーボードショートカットがbashで実行されていないことに気付くまで、コマンドをテストしているときにコンソールでコマンドが機能する理由はわかりませんでしたが、キーボードショートカットとして直接実行すると静かに失敗しました。それは何年もの間私を壁に追いやった!
注:bashに送信するコマンドは引用符で囲む必要があるため、コマンドを記述するときは、二重引用符を使用して1レベル以上深くしないように注意する必要がありました。文字列を引用符でさらにネストすると、引用符をエスケープするために多くの混乱するバックスラッシュが必要になります。