拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门