這不是一個大問題,但有點煩人,而且最重要的是有趣。我在一台裝有 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
帶有參數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',表示視窗設定為 'always on top':
[[ $(■) =~ "ABOVE" ]]
如果為 true,則傳回“remove”,否則傳回“add”:
■ && echo "remove" || echo "add"
使用返回值作為參數運行 wmctrl 命令
wmctrl -r :ACTIVE: -b $(■),above
將整個內容傳送到 ,
bash
以便您可以使用命令替換${ ... }
、bash 布林求值[[ ... ]]
和正規表示式匹配運算符=~
bash -c '■'
特別是最後一步花了我很長時間才弄清楚。直到我意識到鍵盤快捷鍵預設不在 bash 中運行,我不知道為什麼這些命令在我測試它們時在控制台中工作,但在直接作為鍵盤快捷鍵運行時卻默默地失敗了。它讓我在牆上呆了很長時間!
注意:因為您需要在發送到 bash 的命令周圍加上引號,所以在編寫命令時我必須小心,我從來沒有深入過一層(使用雙引號)。在引號中進一步嵌套字串將需要大量令人困惑的反斜線來轉義引號。