Pop Shell 是 GNOME Shell 的鍵盤驅動層,它允許快速、合理地導航和管理視窗。 Pop Shell 的核心功能是添加了高級平鋪視窗管理 - 這是我們社區中備受追捧的功能。對許多人(包括我們自己)來說,i3wm 已經成為 GNOME 桌面的主要競爭對手。
GNOME 中的平鋪視窗管理實際上不存在,這使得當您的需求在給定時間超過兩個視窗時桌面難以互動。幸運的是,GNOME Shell 是一個可擴展的桌面,其基礎使得在桌面上實現平鋪視窗管理器成為可能。
因此,我們在這裡看到了一個提高 GNOME 桌面可用性的機會,以便透過 Pop Shell 更好地滿足我們社群的需求。進階平鋪視窗管理是桌面的必備功能,因此我們將類似 i3 的平鋪視窗管理與 GNOME 桌面合併,以實現兩全其美。
提案:可能上游進入 GNOME
問題:為什麼我們在 GNOME 中需要這個
安裝:對於那些想要在其發行版上安裝此軟體的人
解決方案:
共享功能:堆疊和自動平鋪模式之間共享的行為
浮動模式:特定於浮動模式的行為
平鋪模式:特定於自動平鋪模式的行為
開發人員:開發入門指南
目前正在開發一項將 Pop Shell 的平鋪視窗管理功能整合到 GNOME 中的提案。一旦我們投入時間來製作功能原型,並了解什麼在實踐中有效和無效,它將作為 GNOME Shell 上的 GitLab 問題創建,以供將來討論。
理想情況下,Pop Shell 中探索的功能將適用於使用 Mutter 的任何環境 - 大大擴展了目前存在的半顯示器平鋪功能。透過從 shell 擴充功能開始,任何使用 GNOME Shell 的人都可以將其安裝到他們的系統上,而無需在他們的系統上安裝特定於 Pop 的 GNOME 分支。
那麼,為什麼這對我們來說是一個問題,為什麼我們有這麼多用戶轉向 i3wm?
GNOME 目前僅支援半平鋪,即將一個視窗平鋪到螢幕的一側,將另一個視窗平鋪到螢幕的另一側。如果您有兩個以上的窗口,則應將它們放置在單獨的工作區、監視器上,或使用Alt
+ Tab
在窗口之間交替。
如果您只有少量應用程序,這往往可以正常工作。如果顯示器上一次需要兩個以上的窗口,唯一的選擇就是手動將窗口拖動到位,並調整它們的大小以使其彼此並排——這是一個非常耗時的過程,可以輕鬆實現自動化和簡化。
假設您是一個幸運的(或者也許不幸的)超寬顯示器的擁有者。最大化的視窗將有很多首選項和控制分散在最左邊和最右邊的角落。應用程式可能會將帶有按鈕的面板放置在最左側,而其他按鈕則轉移到遠處的中心或最右側。
在這種情況下,半平鋪意味著每個視窗將與整個 2560x1440 或 4K 顯示器一樣大。無論哪種情況,在如此極端的尺寸下,滑鼠在實踐中都會變得完全無用,並且應用程式變得難以使用。
當您與視窗管理器作鬥爭時,很快就會發現,任何以傳統堆疊方式管理視窗的嘗試(您需要手動將視窗移動到位,然後手動調整它們的大小)都是徒勞的。在顯示器上將視窗相互對齊時,人類遠不如演算法精確或快速。
GNOME 桌面附帶了許多有用的桌面整合功能,這些功能在切換到 i3wm 會話時會遺失。儘管可以將各種 GNOME 會話服務連接到 i3wm 會話,但在此過程中仍會失去大部分 GNOME 桌面體驗。應用程式概述、GNOME 面板和 GNOME 擴充。
更糟的是,許多用戶完全不熟悉平鋪視窗管理器,並且可能永遠不會覺得「突然」切換到平鋪視窗管理器很舒服。透過提供平鋪視窗管理作為可選擇的功能,我們可以讓使用者輕鬆地獲得對其桌面的更大控制,從而使平鋪視窗管理的想法突然變得觸手可及。
另外還有一些人確實想要傳統的堆疊視窗管理體驗,但他們也希望能夠選擇進階的平鋪視窗管理。因此,應該可以根據需要選擇平鋪視窗管理。其他作業系統已經成功地將平鋪視窗管理功能與傳統的堆疊視窗管理體驗結合起來,我們認為 GNOME 也可以做到這一點。
使用與您的 GNOME Shell 版本相對應的分支 ( git checkout branch_name
):
GNOME 3.36 到 41:使用master_focal
分支。
GNOME 42 到 44:使用master_jammy
分支。
GNOME 45:使用master_mantic
分支。
GNOME 46+:使用master_noble
分支。
建置該專案還需要 GNU Make 和 TypeScript。
shell 的正常功能需要修改 GNOME 的預設鍵盤快速鍵。對於本機安裝,請執行make local-install
。
如果你想卸載擴展,你可以呼叫make uninstall
,然後打開 GNOME 設定中的「鍵盤快捷鍵」面板,選擇標題列中的「全部重置..」按鈕。
請注意,如果您要為 Linux 發行版進行打包,Pop Shell 中的許多功能將無法開箱即用,因為它們需要更改 GNOME 的預設鍵盤快捷鍵。如果您未在未設定或變更這些預設鍵盤快速鍵的情況下打包 GNOME 會話,則需要進行本機安裝。
Fedora: sudo dnf install gnome-shell-extension-pop-shell xprop
Gentoo: emerge gnome-shell-extension-pop-shell
openSUSE Tumbleweed: sudo zypper install gnome-shell-extension-pop-shell
Arch Linux(使用 Yay 為 AUR 助理):
yay -S gnome-shell-extension-pop-shell
預先編譯的二進位版本: yay -S gnome-shell-extension-pop-shell-bin
對於 GitHub 儲存庫版本: yay -S gnome-shell-extension-pop-shell-git
堆疊模式和自動平鋪模式之間共享的功能。
這些是平鋪視窗管理器使用的許多捷徑的關鍵。此後,本文檔將把這些鍵稱為<Direction>
,預設為以下鍵:
Left
或h
Down
或j
Up
或k
Right
或l
Super
+ q
: 關閉視窗
Super
+ m
:最大化對焦窗口
Super
+ ,
: 最小化對焦窗口
Super
+ Esc
: 鎖定螢幕
Super
+ f
:文件
Super
+ e
: 電子郵件
Super
+ b
:網頁瀏覽器
Super
+ t
: 終端
此模式可透過
Super
+Return
啟動。
視窗管理模式啟動對目前焦點視窗的大小和位置的額外鍵盤控制。根據您處於自動平鋪模式還是預設堆疊模式,此模式的行為會略有不同。在預設模式下,會顯示一個與網格對齊的覆蓋層,該網格表示聚焦視窗未來可能的位置和大小。此行為在自動平鋪模式下略有變化,在自動平鋪模式下,會立即執行大小調整,並且僅在交換視窗時顯示覆蓋。
啟動此功能可以實現以下行為:
<Direction>
在預設模式下,這將基於網格移動顯示的疊加層
在自動平鋪模式下,這將調整視窗大小
Shift
+ <Direction>
在預設模式下,這將調整覆蓋層的大小
在自動平鋪模式下,這不會執行任何操作
Ctrl
+ <Direction>
選擇覆蓋給定方向上的視窗
當按下Return
鍵時,視窗位置將被交換
Shift
+ Ctrl
+ <Direction>
在自動平鋪模式下,這會以相反方向調整大小
O
:在自動平鋪模式下在水平平鋪和垂直平鋪之間切換
~
:在自動平鋪模式下在浮動和平鋪之間切換
Return
:應用程式已請求的更改
Esc
:取消請求的任何更改
當不在視窗管理模式下時,按Super
+ <Direction>
會將視窗焦點移到給定方向的視窗。這是根據視窗被移動的聚焦視窗一側的中心與其周圍視窗的相對側之間的距離來計算的。
將焦點切換到左側將從聚焦視窗的東側中心到所有其他視窗的西側中心進行計算。距離最小的視窗是我們選擇的視窗。
Pop Shell 提供了一個整合的啟動器,可以直接與我們的 pop 啟動器服務互動。 JSON IPC 用於以非同步方式在 shell 和啟動器之間進行通訊。由於效能和可維護性問題,此功能與 shell 分離。新的啟動器是用 Rust 編寫的並且完全非同步。此啟動器具有廣泛的功能,對於在 shell 擴充功能之外實現桌面啟動器非常有用。
間隙提高了平鋪窗戶的美觀性,並且更容易抓住特定窗戶的邊緣。我們決定添加對內部和外部間隙的支持,並在擴展程序的彈出式選單中配置這些設定。
具有伺服器端裝飾的視窗可能會完全隱藏其標題欄,從而為您的應用程式提供額外的螢幕空間,並提供視覺上更乾淨的環境。可以在擴充功能的彈出式選單中切換此功能。可以使用滑鼠移動窗口,方法是在點擊視窗並將其拖曳到另一個位置時按住Super
,或使用 pop-shell 本身的鍵盤快捷鍵。可以按Super
+ Q
關閉窗口,並透過Super
+ M
最大化。
這是 Pop Shell 的預設模式,它結合了傳統的堆疊視窗管理和可選的平鋪視窗管理功能。
在此模式下,顯示被分為列和行的網格。進入平鋪模式時,視窗在放置時會捕捉到此網格。行數和列數可在面板中擴充的彈出式選單中進行設定。
改善平鋪體驗的一個可選功能是在使用滑鼠移動視窗和調整視窗大小時能夠將視窗對齊到網格。這提供了與進入視窗管理模式以使用鍵盤定位視窗相同的精度,但具有滑鼠的便利性和熟悉性。可以透過擴充功能的彈出式選單啟用此功能。
預設情況下停用,此模式使用基於樹的平鋪視窗管理器來管理視窗。與i3類似,樹的每個節點代表兩個分支。分支可以是一個視窗、包含更多分支的叉子或包含許多視窗的堆疊。每個分支代表螢幕上的一個矩形空間區域,並且可以透過在分支內部建立更多分支來細分。建立視窗時,它們會被指派給主動聚焦的視窗或堆疊,這會在視窗上建立新的分支,或將視窗附加到聚焦堆疊。當視窗被銷毀時,會執行相反的操作來壓縮樹並將視窗重新排列到新的尺寸。
Super
+ O
切換叉子平鋪方向的方向
Super
+ G
在浮動和平鋪之間切換視窗。
請參閱#customizing 視窗浮動列表
有檔案$XDG_CONFIG_HOME/pop-shell/config.json
您可以在其中加入以下結構:
{ class: "<WM_CLASS String from xprop>", title: "<Optional Window Title>" }
例如,在 GNOME 設定(或 GNOME 控制中心)上執行xprop
,WM_CLASS 值為gnome-control-center
和Gnome-control-center
。使用 pop-shell 將讀取的第二個值 (Gnome-control-center)。 title
字段是可選的。
在config.json
中套用變更後,如果第一次不起作用,您可以重新載入平鋪。
由於純 JavaScript 的危險性,此 GNOME Shell 擴充功能是用 TypeScript 編寫的。除了提供靜態類型檢查和自記錄類別和介面之外,它還允許我們編寫現代 JavaScript 語法,同時支援為舊目標產生程式碼。
開發時請安裝以下相依性:
Node.js
LTS+ (v12+)
最新的npm
(NodeJS 附帶)
npm install typescript@latest
在 shell 上工作時,您可以重新編譯、重新設定、重新安裝和重新啟動 GNOME Shell,並使用make debug
進行日誌記錄。請注意,這僅在 X11 會話中可靠地工作,因為 Wayland 將在重新啟動 shell 時退出到登入畫面。
歡迎在 Pop Chat 上討論
根據 GNU 通用公共授權 3.0 版授權(授權或 https://www.gnu.org/licenses/gpl-3.0.en.html)
您有意提交以包含在作品中的任何貢獻應根據 GNU GPLv3 獲得許可。