ShellTile FakeWindow 幽灵窗口深度解析:平铺占位符如何保持窗口树优雅 ShellTile FakeWindow 幽灵窗口深度解析平铺占位符如何保持窗口树优雅【免费下载链接】shelltileA tiling window extension for GNOME Shell项目地址: https://gitcode.com/gh_mirrors/sh/shelltileShellTile是一款专为 GNOME Shell 打造的平铺窗口扩展把窗口拖到屏幕边缘即可半屏、四分之一分屏按住 Ctrl 叠放窗口还能自动分组平铺。而它最精妙的设计是fakewindow.js中的FakeWindow 幽灵窗口——一个只存在于内存里的占位符窗口用来在窗口退出平铺组时撑住整棵平铺树让布局始终优雅、不留空洞。为什么平铺扩展需要幽灵窗口ShellTile 的核心数据结构是一棵二元平铺树tiling.js每个节点WindowGroup恰好拥有first和second两个子节点可以是两个真实窗口也可以是两个子分组。问题来了当你把某个窗口移出分组时如果直接删除该节点二元树就缺了一条腿——要么整棵子树坍塌要么所有平铺逻辑都要为缺失的兄弟写满防御性判断。ShellTile 的解法非常巧妙不删除用假窗口替换。FakeWindow 占位符是如何实现的FakeWindow定义在 fakewindow.js它完美模仿了真实窗口包装类Windowwindow.js的完整接口几何信息通过outer_rect()、move_resize()维护 x/y/宽高平铺计算照常进行无副作用minimize()、maximize()、raise()、activate()全部是空方法永远不会触碰真实窗口自我标识has_real_window()返回falsehas_hole()返回true明确告诉系统这里是个洞唯一身份id()用自增序列生成fake_window_N避免与真实窗口的 stable sequence 冲突。换句话说它就是一个有坐标、有尺寸、没有灵魂的幽灵——布局计算看得见它窗口管理器却感知不到它。detach_window() 中的关键决策 var replacement new FakeWindow(this.extension);占位符保持平铺树的三个关键技巧1. 脱离时替换而非删除窗口被拖出分组时detach_windowtiling.js#L1080ShellTile 会创建一个FakeWindow填入空出的位置而不是拆掉分组。树的结构保持完整其余窗口无需重新计算拓扑。2. 边缘平铺自动补洞当你把新窗口拖到屏幕边缘而光标下方恰好是空洞时扩展会用新窗口直接替换这个FakeWindowtiling.js#L1573 处的 replace fake window under 逻辑——空位瞬间被填充分屏体验流畅自然。3. 树遍历主动跳过幽灵get_first_non_fake_window()沿树一路跳过假窗口找到真正的代表窗口用于置顶、工作区切换等需要真实窗口的操作has_hole()递归向上传播first.has_hole() || second.has_hole()分组预览计算遇到空洞即停止避免在无效位置生成预览框。设计点评为什么这是优雅的方案代价直接删除节点树结构坍塌平铺算法要处理大量缺失分支特例惰性重建整棵树性能开销大动画与预览容易错位FakeWindow 占位结构恒稳逻辑统一一处替换即可FakeWindow 本质上是鸭子类型的典范只要看起来像窗口、行为无副作用平铺树的所有代码路径都无需关心节点真假。真实窗口window.js与幽灵窗口fakewindow.js共用同一套接口分组逻辑tiling.js也因此保持简洁。写在最后一个不到 200 行的文件解决的是平铺窗口管理器最棘手的结构完整性问题——这正是 ShellTile 值得新手阅读源码的原因。想动手看看占位符如何流转从detach_window()入手跟着replacement变量读一遍你会发现整棵平铺树始终稳如泰山。入口与主循环extension.js窗口包装类window.js平铺树与策略tiling.js功能设置项prefs.js【免费下载链接】shelltileA tiling window extension for GNOME Shell项目地址: https://gitcode.com/gh_mirrors/sh/shelltile创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

multidplyr 并行合并实战:left_join 等 6 种 join 与集合运算完整指南 + 你必须知道的 auto_copy 陷阱

multidplyr 并行合并实战:left_join 等 6 种 join 与集合运算完整指南 + 你必须知道的 auto_copy 陷阱

multidplyr 并行合并实战:left_join 等 6 种 join 与集合运算完整指南 你必须知道的 auto_copy 陷阱 【免费下载链接】multidplyr A dplyr backend that partitions a data frame over multiple processes 项目地址: https://gitcode.com/gh_mirrors/mu/multidpl…

2026/8/23 13:51:28
请解释一下PHP中的闭包和匿名函数。

请解释一下PHP中的闭包和匿名函数。

匿名函数(Anonymous Function)在PHP中,函数通常都有一个名字,比如add、subtract等。但有时候,我们可能只需要使用一次函数,而不需要给它起一个具体的名字。这时候,我们就可以使用匿名函数。匿名…

2026/8/23 13:51:28
如何在PHP中实现多线程或多进程编程?

如何在PHP中实现多线程或多进程编程?

多线程(Multithreading)和多进程(Multiprocessing) 是两种常用的编程技术,它们都可以让我们的程序同时处理多个任务,从而更快地完成任务。多线程想象一下,你正在做一个蛋糕。如果你只有一双手&a…

2026/8/23 13:51:28
为什么PHP操作redis需要安装redis扩展?

为什么PHP操作redis需要安装redis扩展?

首先,我们要明白什么是PHP和Redis。PHP是一种编程语言,就像我们学校里学的数学、英语一样,但它不是用来和人交流的,而是用来和电脑交流的,告诉电脑应该怎么做。比如,我们可以用PHP来创建一个网页&#xff0…

2026/8/23 13:51:28
在PHP中,如何处理大整数和大浮点数数据类型?

在PHP中,如何处理大整数和大浮点数数据类型?

在PHP中,处理大整数和大浮点数是一个重要的功能,尤其是当我们需要计算超出常规数值范围的数据时。那么,PHP是如何做到的呢?大整数首先,我们来说说大整数。在PHP中,普通的整数类型有一个范围限制&#xff0c…

2026/8/23 13:51:28
自己的Anaconda管理多个虚拟环境,这样就可以在不同的环境下安装互不干扰的库

自己的Anaconda管理多个虚拟环境,这样就可以在不同的环境下安装互不干扰的库

项目场景:Anaconda可以安装多个虚拟解释器,每个解释器可以安装自己独有的库,从而每个解释器之间起到互不干扰的作用,这点Anaconda就非常强大了。 查看Anaconda的解释环境在电脑开始中选择Anaconda Prompt (setup)之后输入&#xf…

2026/8/23 13:46:28