GNOME 3「始終位於頂部」鍵盤快速鍵未關閉

GNOME 3「始終位於頂部」鍵盤快速鍵未關閉

這不是一個大問題,但有點煩人,而且最重要的是有趣。我在一台裝有 Xfce 4.12 的 Debian 9 穩定機器上運行了一段時間,並且正在並行設置一個 GNOME 桌面來嘗試一下。

在 Xfce 上,我有一個自訂鍵盤快捷鍵wmctrl -r :ACTIVE: -b toggle,above,它一直可以在頂部和與其他視窗相同的層級上切換焦點視窗。

我在 GNOME 3.22 上嘗試了相同的系統設定/鍵盤,我只能將焦點視窗切換到其他視窗之上,它不會將其切換回與其他視窗相同的等級。我必須右鍵單擊視窗的框架,然後取消選取“始終位於頂部”選項。

有人知道為什麼會發生這種情況?

答案1

我在 2016 年 4 月也注意到了這一點,我的解決方法是使用 2 個鍵進行切換,例如:

wmctrl  -r :ACTIVE: -b add,above
wmctrl  -r :ACTIVE: -b remove,above

答案2

好吧,經過大量研究並弄清楚如何在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'

它使用 檢查活動視窗狀態屬性“_NET_WM_STATE” xprops,如果它包含文字“ABOVE”,則表示“始終位於頂部”選項處於活動狀態。然後它只運行wmctrl帶有參數addremove適當的命令。


命令細分(每個命令插入下一個命令,替換佔位符):

  • 取得活動視窗 ID:

    xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"

  • 使用 id 從 xprop 取得視窗狀態:

    xprop -id $(■) _NET_WM_STATE

  • 檢查狀態是否包含 'ABOVE',表示視窗設定為 'always on top':

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

  • 如果為 true,則傳回“remove”,否則傳回“add”:

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

  • 使用返回值作為參數運行 wmctrl 命令

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

  • 將整個內容傳送到 ,bash以便您可以使用命令替換${ ... }、bash 布林求值[[ ... ]]和正規表示式匹配運算符=~

    bash -c '■'

    特別是最後一步花了我很長時間才弄清楚。直到我意識到鍵盤快捷鍵預設不在 bash 中運行,我不知道為什麼這些命令在我測試它們時在控制台中工作,但在直接作為鍵盤快捷鍵運行時卻默默地失敗了。它讓我在牆上呆了很長時間!

注意:因為您需要在發送到 bash 的命令周圍加上引號,所以在編寫命令時我必須小心,我從來沒有深入過一層(使用雙引號)。在引號中進一步嵌套字串將需要大量令人困惑的反斜線來轉義引號。

相關內容