Quickshell 桌面外壳
顶栏、侧栏、控制中心、通知这些"壳",用 Quickshell 写——它让你拿 QML 描述 Wayland 桌面组件。我这套基于 illogical-impulse(end-4 的 dots,目录代号 ii),在它上面改。
先把话说清楚:这是七万行 QML、九百多个文件,大半不是我写的。所以对我(和看这篇的人)真正有用的不是逐文件讲解,而是两件事——它怎么分层、颜色从哪来,知道这两点,要改哪个组件顺着找就行。
先说 Quickshell 本身给你什么:它把 QML(Qt 的声明式 UI 语言)接到 Wayland 的 layer-shell 上,于是你能用"属性绑定 + 信号"这套声明式写法,描述顶栏、悬浮窗、锁屏这些桌面层组件。好处是响应式——某个值变了,绑定它的界面自动重画,不用手写刷新逻辑。
在这之上,ii 的结构就是 services 取数据、modules 画界面两层:
- services 把系统状态封成 QML 单例对象:PipeWire(音量/设备)、NetworkManager(网络)、UPower(电量)、MPRIS(正在播放)这些,各自暴露成可绑定的属性。
- modules 声明式地把这些状态画成面板和控件,交互(点了、拖了)再回调回 service。
// 大意:一个跟着系统音量走的小条
Slider {
value: Pipewire.defaultSink.volume // 绑定 service 的属性
onMoved: Pipewire.defaultSink.volume = value // 交互回写
}
所以想给顶栏加个小组件,套路是固定的:在 modules 里写段 QML,从对应 service 拿数据绑上去——不用碰那九百个文件里的大半。要改现成组件,顺着"它读哪个 service"往回找就行。
颜色它自己不定义,读 matugen 生成的 ~/.local/state/quickshell/user/generated/colors.json,所以换壁纸时整个壳和 Ghostty、锁屏一起变色(matugen 那篇)。
它由 Hyprland 开机拉起常驻。因为是跟着上游 rice 走的大件,我没把它塞进 chezmoi——跟上游更新 + 本地改几处,比自己扛着七万行省心。