3000字干货!桌面的窗口管理交互有没有更好的设计方案?
编者按:如果你用过Ubuntu 一类的 Linux 操作系统,那么你大概率是接触过 GNOME 这个桌面环境的。这篇文章出自 GNOME 团队的博客,他们一直在重新思考桌面窗口管理器的交互逻辑,并且试图提升它的整体可用性。这个问题其实 Windows 和 macOS 的团队同样在思考,各自都有一些探索性的设计,但是 GNOME 的这个,更有意思,也更加值得学习和思考。以下是正文:
窗口管理是最令我着迷的一个设计问题,掐指算来,窗口随着图形化界面诞生,至今已经 50 年了,可是如今依然没有彻底完善的管理方案。我们从一开始,就依赖将窗口作为承载内容、处理多任务的隐喻和方式。在这个隐喻当中,每个应用程序都可以生成一个乃至于多个矩形的窗口,窗口之间可以互相交叠,移动,并且可以调整大小。
互相重叠的窗口很快会变得混乱
如果你的桌面上只有几个小窗口,传统的桌面窗口系统通常可以很好地工作,但是随着窗口数量和大小的增加,问题就会出现。当新窗口出现的时候,互相之间就会遮挡,有的窗口会被完全遮盖住。当你最大化某个窗口的时候,所有的窗口都会被隐藏。
几十年来,各种不同的操作系统使用不同的工具和流程,来处理这个问题,工作区、任务栏、切换器,都是这样来的。然而,从 70 年代开始,一直到现在,基本没有根本上的改变,而问题也从未消失。
虽然我们当中绝大多数人,已经习惯了这套体系,也能够忍耐这套系统的各种情况,但是这并不意味着它没有问题。尤其当你看电脑新手的时候,比如小孩和老人,你会更加明显地感知到这些问题。移动窗口,调整窗口的尺寸,这两个操作最为明显,因为它需要用户进行精细的操作。但是这种功能是整个窗口管理系统自带的,用户必须要掌握的,也经常被人戏称为「Shit work」。
大多数时候,你其实并不关心窗口的大小和位置,仅仅只是想查看当前任务所涉及到的窗口而已。而在多数时候,你会将窗口最大化。少的时候,这种最大化的窗口有三四个,多的时候有十几个,即使这比较少见。混乱是默认存在的,而用户需要接纳它们,还得整理它们。
将窗口变成「瓷砖」
传统的窗口管理机制当中,会使用平铺展示来解决窗口重叠的问题。虽然这种设计在某种情况下效果不错,但是考虑到实际的需求,它也就帮用户整体预览一下有哪些程序有哪些窗口仅此而已,在可用性上,远远不够。
原因之一,是窗口管理器的平铺视图之下,会根据屏幕空间大小将所有的窗口等比例的缩放预览,但是绝大多数的程序其实都有各自所设定的窗口比例。最典型的就是即时通讯类的程序,它们通常窗口都比较瘦长。当然,有的桌面窗口管理系统会使用一些特殊的窗口平铺机制,比如在 Linux 下著名的桌面管理器 Gnome 下,会使用名为 Forge 的屏幕窗口模式,窗口会统一缩的很窄:
当然,这也很容易联想到锤子 TNT 系统下的搜索引擎多开的「发牌手」功能:
窗口管理的平铺模式的另一个问题,是会将新的窗口随意放置一个位置。这主要是因为系统不了解用户使用程序打开窗口的上下文环境,这导致用户只能在事后手动调整窗口大小,而这正是我们想要要尽量避免的问题。
而 iPadOS 上的窗口管理机制则非常有趣,它的使用场景更加受限,而正是这种受限让它可以更加具有目的性,这种方式只允许并排平铺2个窗口,并不能很好的扩展到更大的屏幕上。
历史发展
长期以来,Gnome 设计团队一直都非常关注窗口管理这个话题,我记得是在 2017 年第一次 GUADEC 上就和 Jakub 讨论过这个问题,此后进行过无数次的讨论,沟通想法,构想概念。在这些概念设计和想法当中,比较具有里程碑意义的是 2019 年的一次设计和 2020 年 GNOME40 的设计,此后,在 2022 年柏林的 Mini GUADEC 和 2023 年 Brno hackfest 上,我们基于之前的概念更进一步调整。
在 HDR hackfest 期间,提出了磁贴式窗口管理的概念。从左到右分别是Robert Mader、Marco Trevisan、Georges Stavracase、Jakub Steiner 和 Allan Day(远程)、Florian Müllner、Jonas Dreßler。
我个人有个习惯,每年会花费几周的时间来研究这个问题。比如在 2020 第一次疫情隔离期间,我花费了相当多的时间来构想一个磁贴版本的 GNOME Shell。
目前的平铺界面模式
基本上,从 GNOME 3 的早期版本开始,GNOME 就有了基本的平铺视图,虽然很好,但是它有明显的局限性:
- 它完全是手动的
- 仅支持2个个窗口的并列展示,并且无法扩展到更加复杂的布局
- 在堆栈视图中,2窗口平铺视图并不会同时呈现,其他窗口随时会影响使用
- 工作区的创建也是手动的,并未集成到工作流当中
多年来,我们也一直想创建出更强更易用的平铺视图,但是由于技术限制,牵涉到的工作量很大,并且缺乏明确的设计方向,因此一直没有取得太大的进展。现在,我们终于找到相对明确的设计方向了,这着实是令人振奋!
不互相遮挡的界面模式
关于这个功能的设计,我们讨论关键点是,如果向 GNOME 添加一种新的窗口管理方式,它需要足够好用才能成为默认的窗口管理机制。我不想添加一个额外的工具,但是又无法解决绝大多数用户的窗口管理的问题。
因此,我们提出的想法大概是这样的:
- 自动执行用户可能想要的操作,并且允许用户根据需求进行调整
- 将工作区作为工作流程可以集成的一个部分
- 为应用程序添加更加丰富的元数据,以更好地实现集成的需求
按照我们当前的概念设计,它有3种潜在的布局状态:
- 马赛克布局,一种新的窗口管理模式,结合了平铺布局和传统浮动堆叠布局的优点
- 边缘平铺布局,即窗口会水平方向平铺展示
- 堆叠浮动布局,就是咱们现在最常用的经典窗口管理方式
马赛克布局被设置为默认交互。当你打开一个窗口,它会按照这个 APP 最实用的比例和尺寸,在屏幕中心打开,浏览器这种 APP 通常可能会最大化展示,而天气类的应用,通常大概 700x500 px 的尺寸也就够用了。
当你打开更多窗口的时候,现有的窗口会自动移动到一旁,为新的窗口腾出空间。如果新打开的窗口空间不够用,比如它需要最大化呈现,那么会它会移动到自己的独立的工作区。如果所有的窗口布局接近铺满屏幕,那么所有窗口会自动扩展平铺,占满屏幕。
当然,用户可以手动让窗口平铺。如果有足够的空间,其他的窗口能够保留马赛克布局,但是如果没有足够的空间用于马赛克布局,那么系统会提示你另外新开一个桌面窗口。
用户可以让一个桌面不止并排放置 2 个窗口,任何平铺的区域或者剩余的区域,都可以拖进另外一个窗口,来进行分割,并且在允许的情况下,平铺状态下的小窗口的尺寸是可以调整的。
当然,总会有一些情况需要将窗口放在屏幕的特定位置,新的系统也会允许窗口出现在马赛克模式和平铺窗口层之上的经典浮动模式,然而,我们认为这种浮动窗口相对情况较少,它们类似我们如今的「始终处于最上层」的界面行为。
当然,这套体系还有更多的规则和细节,但是希望上面的内容可以让你对于我们接下来的设计有一个基本的了解。
新窗口的元数据
如你所见,为了避开传统平铺窗口管理器的陷阱,我们需要有更多来自窗口的元数据。目前体系下,窗口可以设置固定大小,但是为了构建更出色的体验,我们需要更多的信息和数据。
有的窗口永远都不应该在 4K 显示器上最大化显示。
目前缺少一个重要的信息,是窗口所需的最大尺寸的信息,超过这个尺寸,窗口内的内容将不再好看。没有这些信息,也恰恰是传统桌面的窗口管理器平铺模式下的问题之一,尤其是在大屏幕上呈现的时候。这个最大尺寸并不是硬性要求,而更像是一个推荐尺寸,依然可以手动调整大小,但是,系统可以借此来计算最佳的窗口布局,比如,当这个窗口被拖到屏幕一侧平铺开的时候,平铺的宽度会参考这个最大尺寸的参考数据。
此外,程序窗口的最佳尺寸数据,对于新的马赛克模式也是非常有帮助的。理想情况下,这些属性都可以根据窗口的内容动态设置。
当然,想要将整个生态迁移到新的窗口管理模式,并不是一件容易的事情,但是由于 API 的简单性和通用性存在,我认为这种情况成功的概率还是很大的。
下一步
在今年 4 月的 Brno hackfest 上,我们和 GNOME Shell 的开发者就很多技术细节进行了初步的讨论,我们初步统一按照前文的计划来推进整个桌面窗口管理器的研发,当然,还有大量的工作要做。
在设计方面,最大的不确定性,依然是马赛克模式本身,这种新颖的窗口管理方式并没有太多现有的技术支持,这令人兴奋,同时也有点冒险。
作者:陈子木
想了解更多网站技术的内容,请访问:网站技术