これは大きな問題ではありませんが、少し面倒で、何よりも興味深いです。私はしばらくの間、Xfce 4.12 を搭載した Debian 9 安定マシンを実行しており、それと並行して GNOME デスクトップをセットアップして試しています。
wmctrl -r :ACTIVE: -b toggle,above
Xfce には、フォーカスされたウィンドウを最上位や他のウィンドウと同じレベルに切り替えるために機能するカスタム キーボード ショートカットがあります。
GNOME 3.22 のシステム設定 / キーボードで同じことを試してみましたが、フォーカスされたウィンドウを他のウィンドウの上に切り替えられるだけで、他のウィンドウと同じレベルに戻すことはできません。ウィンドウのフレームを右クリックして、「常に最前面に表示」オプションのチェックを外す必要があります。
なぜこのようなことが起こるのか、誰か分かるでしょうか?
答え1
私も 2016 年 4 月にこれに気づきました。回避策としては、2 つのキーを使用して切り替えます。例:
wmctrl -r :ACTIVE: -b add,above
wmctrl -r :ACTIVE: -b remove,above
答え2
さて、多くの調査と bash で適切なコードを書く方法の検討を経て、現在の GNOME デスクトップで「常に最前面」状態を効果的に切り替えるために、ロジックのレイヤー内で wmctrl コマンドを使用する単一のコマンドを作成しました。ご覧ください:
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" をチェックし、そこにテキスト "ABOVE" が含まれている場合は、「常に最前面に表示」オプションがアクティブであることを意味します。その後、必要に応じてパラメータまたはを使用xprops
してコマンドを実行します。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 の場合は「remove」を返し、そうでない場合は「add」を返します。
■ && echo "remove" || echo "add"
返された値をパラメータとして使用してwmctrlコマンドを実行する
wmctrl -r :ACTIVE: -b $(■),above
全体を送信して、コマンド置換、bashブール評価、正規表現一致演算子
bash
を使用できるようにします。${ ... }
[[ ... ]]
=~
bash -c '■'
特にこの最後のステップを理解するのに非常に長い時間がかかりました。キーボード ショートカットがデフォルトで bash で実行されていないことに気付くまで、コマンドをテストしているときにコンソールでコマンドが機能しているのに、キーボード ショートカットとして直接実行すると何も言わずに失敗する理由がわかりませんでした。長い間、私は頭を悩ませていました。
注: bash に送信するコマンドを引用符で囲む必要があるため、コマンドを記述するときに、1 レベル以上深くならないように注意する必要がありました (二重引用符を使用)。引用符で文字列をさらにネストすると、引用符をエスケープするために多くの紛らわしいバックスラッシュが必要になります。