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 获得许可。