【免费下载链接】driftwmA trackpad-first infinite canvas Wayland compositor.项目地址https://gitcode.com/gh_mirrors/dr/driftwm点击查看免费下载driftwm 是一个用 Rust 编写的、以触控板手势优先的无限画布 Wayland 合成器infinite canvas Wayland compositor窗口以原生尺寸生活在无边界的二维画布上而你的显示器只是一台相机。本文带你拆解支撑这一体验的两大核心——相机/视口模型与Stage 抽象看看它们如何共同构成这个合成器可测试、可扩展的架构底座无需 Rust 基础也能读懂。 一图看懂相机/视口模型如何工作传统窗口管理器要么把窗口堆叠层叠合成器要么把窗口挤进格子平铺合成器。driftwm 反其道而行没有工作区、没有平铺每个窗口占据无限 2D 平面上的一个绝对坐标多显示器则只是多个独立视口看向同一块画布。整个几何模型浓缩成两个变换画布坐标 → 屏幕坐标screen (canvas - camera) × zoom屏幕坐标 → 画布坐标canvas screen / zoom camera这一对变换是整个项目几何学的地基就定义在 src/canvas.rs 里CanvasPos是世界绝对坐标ScreenPos是屏幕局部坐标0,0 为显示器左上角。核心概念含义代码位置camera相机视口左上角在画布坐标中的位置每个输出显示器一份src/state/mod.rszoom缩放0.001–1.01.0 为原生分辨率、不放大src/canvas.rs视口可见区域viewport ÷ zoom的画布矩形用于裁剪src/canvas.rs锚点缩放缩放时保持光标下的点原地不动src/canvas.rs几个值得注意的细节动态最小缩放根据所有窗口的包围盒计算恰好看全所有窗口的缩放值zoom-to-fit 的数学基础见zoom_to_fit/dynamic_min_zoomsrc/canvas.rs1.0 附近的吸附死区缩放到 1.0 ±0.05 时自动吸附避免卡在 98%的怪异手感src/canvas.rs惯性滑行触控板轻扫后的甩动由一套小物理引擎驱动——VelocityTracker用 80ms 滑动窗口基于 libinput 事件时间戳而非处理时间计算出手速度MomentumState再逐帧按帧率无关的方式衰减直到低于 15 px/s 才停下见 src/canvas.rs Stage 抽象让窗口状态拥有唯一事实来源架构的第二根支柱是 src/stage/模块顶部的注释说得很直白它是不依赖 smithay 的窗口状态唯一事实来源——窗口列表、z 序、每窗口的画布坐标、MRU 焦点历史、全屏/钉屏/适应状态全部在这里。Stage 从不触碰协议状态configures、buffers、damage它只回答查询、记录决策随后由合成器层去落实副作用键盘焦点、相机移动、configure 发送。这个边界带来三个关键设计稳定的身份句柄每个窗口在首次映射时分配一个ElementId随 z 序变化始终不变、会话内不复用src/stage/mod.rs可还原状态集中存放全屏前的几何、钉到哪个输出的屏幕位置、fill 前的视口快照分别由FullscreenEntry/PinnedSite/FillSaved承载src/stage/mod.rs入口和还原永远成对出现不会漂移唯一的修改入口map/raise/unmap是仅有的变异方法src/stage/mod.rsdebug 模式下每次 tick 结束还会断言不变量为什么 Stage 是泛型的Stage 与具体窗口类型之间只隔着一个小 traitStageElement只有 3 个方法size/is_alive/is_child_ofsrc/stage/element.rs。这就是可测试性的根基测试时用 mock 的TestWindowsrc/stage/mock.rs顶替 smithay 的真实Window同一套 stage 逻辑在无显示器、无 GPU 的cargo test里完整跑通用例规模达两千余行src/stage/tests.rs甚至配有 proptest 回归基线proptest-regressions/stage/tests.txt。项目还有一条被 clippy lint 强制执行的硬规则一切窗口操作必须经由 stage绝不同 smithay 的Space窗口 API 直接打交道dev/docs/caveats.md。️ 视口状态与渲染管线相机如何驱动屏幕相机/缩放本身按输出存放在OutputState中挂在Output的UserDataMap上src/state/mod.rs除camera和zoom还有一整套动画字段——camera_target/zoom_target相机正在缓动前往的目标、zoom_animation_anchor缩放锚点、momentum惯性状态、edge_pan_velocity拖到视口边缘时画布自动跟随。所有相机写入都经过统一收口set_camera_on它首先检查全屏锁全屏窗口以 zoom 1.0 停在输出相机原点相机一动窗口就会滑出画面露出黑边——因此任何动画、惯性、缩放都无法移动全屏输出的相机见 src/state/viewport.rs。渲染侧src/render/则把相机落到屏幕上视口裁剪用visible_canvas_rect算出当前视口在画布上的矩形不相交的窗口直接跳过同一对变换管渲染与输入窗口屏幕位置的几何变换与输入命中测试完全一致看到的与点到的永远吻合随画布滚动的背景默认是 GLSL 点阵着色器 src/shaders/dot_grid.glsl静态背景缓存后仅在视口变化时重绘extras/wallpapers/ 里还有可玩的着色器壁纸见 docs/gigapixel-wallpapers.md动画驱动事件循环每帧调用tick_all_animations推进各输出的惯性滑行、边缘跟随与缩放缓动src/state/viewport_animation.rs 架构分层让无 GPU 测试成为可能AGENTS.md 把 crate 划分为lib纯逻辑、可测试与bin持有合成器状态分层职责一目了然层路径职责libsrc/canvas.rs、src/stage/、src/layout/坐标数学、窗口状态、吸附/聚类/自动摆放binsrc/state/、src/backend/、src/render/DriftWm主结构、udev/winit 后端、帧合成binsrc/handlers/、src/protocols/Wayland 协议实现binsrc/input/、src/grabs/键盘/指针/手势分发与抓取这个边界让全部测试无需显示器与 GPU 即可运行——stage 的每条不变量都用纯逻辑加 mock 窗口验证。 driftwm 源码导航地图遇到想读的问题从哪入手坐标系统与缩放数学src/canvas.rs窗口状态事实来源src/stage/mod.rs、src/stage/element.rs每输出视口状态src/state/mod.rs、src/state/viewport.rs吸附与集群布局src/layout/IPCdriftwm msg命令行src/ipc/用户手册 docs/ipc.md窗口规则docs/window-rules.md完整配置参考config.reference.toml生成文档 docs/config.md 代码之外一个重视观感的合成器driftwm 对视觉细节很挑剔圆角、阴影、标题栏全部由着色器自绘src/shaders/连官方文化衫的漂移质感都一丝不苟项目欢迎贡献代码与测试约定分别见 CONTRIBUTING.md 和 dev/docs/testing.md。 一句话总结driftwm 的架构可以浓缩为一句话画布是世界相机是屏幕Stage 是账本——几何变换集中在 canvas.rs窗口状态集中在 stage/两者皆泛型、可测试并与渲染管线解耦。这正是触控板优先的无限画布 Wayland 合成器不写一行平铺或工作区代码、依然保持整洁可扩展的原因。赞分享【免费下载链接】driftwmA trackpad-first infinite canvas Wayland compositor.项目地址https://gitcode.com/gh_mirrors/dr/driftwm点击查看免费下载相关推荐告别传统桌面driftwm如何用无限画布重新定义Wayland合成器告别传统桌面driftwm如何用无限画布重新定义Wayland合成器 还在为窗口堆叠、分屏挤压而头疼吗 driftwm 是一款以触控板手势为核心的 WaylDISMTools AppX包管理加密应用包安装与配置终极指南DISMTools AppX包管理加密应用包安装与配置终极指南 DISMTools是Windows系统管理的一站式解决方案提供强大的AppX包管理功能支持NodeGui QAbstractItemView 完全指南模型/视图架构下的抽象基类与全部 API 实战解析NodeGui QAbstractItemView 完全指南模型/视图架构下的抽象基类与全部 API 实战解析 本文聚焦 NodeGui 中 QAbstrac桌面应用跨平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考