- 桌面应用
【免费下载链接】DankMaterialShell
Desktop shell for wayland compositors built with Quickshell & GO, optimized for niri, hyprland, sway, MangoWC, labwc, and MiracleWM.
DankMaterialShell(简称 DMS)是一个面向 Wayland 合成器(compositor)的完整桌面 Shell,由 QML 界面层(Quickshell)与 Go 后端/CLI 双层构成,可替代 waybar、swaylock、swayidle、mako、fuzzel、polkit 等一系列手工拼装的桌面组件。本文以仓库 README.md 为主线,结合 core/ 源码、quickshell/ 界面层与 distro/ 打包脚本,系统讲解其仓库结构、安装方式、核心功能、受支持的合成器、dms命令行与 IPC 调用体系,以及从源码构建和 Nix 声明式安装的完整流程,帮助你快速上手并深入理解其底层实现。
项目定位与核心架构
DMS 的定位不是某个单一工具,而是一整套桌面环境集成方案。README 明确列出了它可以取代的传统组件:
- waybar(顶栏/状态栏)→ DMS 的 DankBar 与 OSD 模块
- swaylock / swayidle(锁屏与空闲管理)→ 内置锁屏与空闲检测、自动锁屏/挂起策略
- mako(通知守护进程)→ 智能通知中心(分组、富文本、键盘导航)
- fuzzel / rofi(应用启动器)→ Spotlight 风格启动器(应用、文件、表情、窗口、计算器、命令)
- polkit(授权代理)→ 内置 Polkit 认证代理界面
它针对 niri、Hyprland、Sway、MangoWC、labwc、Scroll、Miracle WM 等合成器做了深度适配,在 README 中被描述为"works best"的合成器集;其他 Wayland 合成器也能运行,但功能会有所缩减("Other Wayland compositors work with reduced features")。
从代码结构看,整个项目是一个monorepo,由两个大层次组成:
| 目录 | 角色 | 技术栈 |
|---|---|---|
| quickshell/ | Shell 界面层(面板、小组件、悬浮层) | QML(Qt6 / Quickshell) |
| core/ | Go 后端与 CLI(系统集成、IPC、发行版支持) | Go + cobra |
| distro/ | 发行版打包(Fedora RPM、Debian/Ubuntu、NixOS、openSUSE、Void) | spec / control / nix |
| flake.nix | Nix flake,提供声明式安装模块 | Nix |
README 中给出的仓库结构示意如下(此处为简化版,完整目录见仓库根):
DankMaterialShell/ ├── quickshell/ # QML-based shell interface │ ├── Modules/ # UI components (panels, widgets, overlays) │ ├── Services/ # System integration (audio, network, bluetooth) │ ├── Widgets/ # Reusable UI controls │ └── Common/ # Shared resources and themes ├── core/ # Go backend and CLI │ ├── cmd/ # dms CLI and dankinstall binaries │ ├── internal/ # System integration, IPC, distro support │ └── pkg/ # Shared packages ├── distro/ # Distribution packaging │ ├── fedora/ # Fedora RPM specs │ ├── debian/ # Debian packaging │ └── nix/ # NixOS/home-manager modules └── flake.nix # Nix flake for declarative installationdms二进制在 core/cmd/dms/main.go 中启动,其根命令在 core/cmd/dms/commands_root.go 定义:dms is the DankMaterialShell management CLI and backend server,同时提供了--config/-c全局标志(DMS_SHELL_DIR环境变量)用于指向包含shell.qml的自定义 UI 目录,替代内嵌 UI。
一键安装与发行版支持
官方一键脚本
README 给出的安装方式是一行命令:
curl -fsSL https://install.danklinux.com | sh该命令会在 Arch、Fedora、Debian、Ubuntu、openSUSE、Gentoo 上安装 DMS 及其全部依赖。安装器的实现位于 core/cmd/dankinstall/main.go,而各发行版的包定义在 distro/:
- Fedora:
dms.spec、dms-git.spec(distro/fedora/) - Debian/Ubuntu:
dms/与dms-git/打包目录(distro/debian/、distro/ubuntu/) - openSUSE:
dms.spec、dms-git.spec(distro/opensuse/) - Void Linux:
srcpkgs(distro/void/) - NixOS:
dms-rename.nix、home.nix、nixos.nix等模块(distro/nix/)
从dms-git包名可以推断,项目对"稳定版"和"每日 git 构建版"同时提供打包支持;版本格式(如0.6.2+git2264.c5c5ce84)的解析逻辑见 core/cmd/dms/commands_common.go。
systemd 会话服务
安装后,DMS 以 systemd 用户服务方式运行,服务定义见 assets/systemd/dms.service:
[Unit] Description=Dank Material Shell (DMS) PartOf=graphical-session.target After=graphical-session.target Requisite=graphical-session.target [Service] Type=dbus BusName=org.freedesktop.Notifications ExecStart=/usr/bin/dms run --session ExecReload=/bin/kill -USR1 $MAINPID LimitNOFILE=16384:infinity Restart=on-failure RestartSec=1.23注意BusName=org.freedesktop.Notifications:DMS 的 daemon 直接承担了 Freedesktop 通知总线服务角色,这也是它能替代 mako 的原因。Restart=on-failure配合RestartSec=1.23提供了故障自恢复。
核心功能全景
README 的 Features 一节列出了 DMS 的主要能力,下面结合源码逐项展开。
动态主题(Dynamic Theming)
基于壁纸自动生成配色方案,并通过matugen与dank16将主题同步到 GTK、Qt、终端、编辑器(vscode、vscodium)等应用。
- matugen 相关实现位于 core/internal/matugen/(包含
paletteinject.go、qtengine.go、svgsource.go、seedcache.go等模块),模板与配置在 quickshell/matugen/(configs/*.toml、templates/*)。 dank16是独立的 Base16 调色板生成命令,见 core/cmd/dms/commands_dank16.go,核心算法在 core/internal/dank16/dank16.go。它支持多种输出格式与对比度算法:
dms dank16 <hex_color> dms dank16 #7c3aed --light # 浅色变体 dms dank16 #7c3aed --json # JSON 输出 dms dank16 #7c3aed --kitty # Kitty 终端格式 dms dank16 #7c3aed --foot # Foot 终端格式 dms dank16 #7c3aed --neovim # Neovim 插件格式 dms dank16 #7c3aed --alacritty # Alacritty 格式 dms dank16 #7c3aed --ghostty # Ghostty 格式 dms dank16 #7c3aed --wezterm # Wezterm 格式 dms dank16 #7c3aed --background <bg> --contrast dps|wcag dms dank16 --variants --primary-dark <c> --primary-light <c>从 commands_dank16.go 可见--contrast支持两种对比度算法:dps(Delta Phi Star,默认)与wcag。
系统监控(System Monitoring)
实时 CPU、内存、GPU 指标与温度内置于 dms daemon(由dgop库驱动),并附带支持搜索与管理的进程列表。
- dgop 是独立的系统监控 TUI 与 Go 库项目,DMS 复用其库能力驱动进程列表与 Dashboard 组件。
- 相关服务端代码位于 core/internal/server/(包含
network/、brightness/、sysupdate/等 20 余个子包),IPC 暴露层见 quickshell/DMSShellIPC.qml(processlist目标)。 - 进程列表 UI 在 quickshell/Modules/ProcessList/(12 个 QML 文件)与悬浮弹窗 quickshell/Modals/ProcessListModal.qml。
强大的启动器(Launcher)
Spotlight 风格搜索,可检索应用、文件(由dsearch驱动)、表情、运行中窗口、计算器与命令,并支持通过插件扩展。
- 实现位于 quickshell/Modals/DankLauncherV2/(24 个文件:QML + JS)。
dsearch(danksearch)是独立的快速文件搜索项目,为启动器提供文件检索能力。
控制中心(Control Center)
统一的网络、蓝牙、音频设备、显示设置与夜间模式管理界面。
- 这是最大的 UI 模块之一: quickshell/Modules/ControlCenter/ 包含 62 个文件。
- 对应弹窗 quickshell/Modals/ControlCenterExample/、quickshell/Modals/MuxModal.qml。
智能通知(Smart Notifications)
通知中心支持分组、富文本与键盘导航。
- UI 模块 quickshell/Modules/Notifications/(17 个 QML 文件),弹窗 quickshell/Modals/NotificationModal.qml。
- 通知服务 quickshell/Services/NotificationService.qml 与 notify 命令 core/cmd/dms/commands_notify.go。
- 服务端 notifyactions 子包 core/internal/server/notifyactions/ 处理通知按钮动作。
媒体集成(Media Integration)
MPRIS 播放器控制、日历同步、天气组件、带图片预览的剪贴板历史。
- 剪贴板模块 quickshell/Modals/Clipboard/(14 个 QML 文件),服务 quickshell/Services/ClipboardService.qml,Go 实现 core/internal/clipboard/(含
store.go、watch.go、wl.go等)。 - 日历:dankcalendar 项目提供本地/Google/Microsoft/CalDAV 日历,DMS 内嵌 quickshell/Services/CalendarService.qml 与后端
CalendarDankBackend.qml、CalendarKhalBackend.qml。 - 天气:quickshell/Services/WeatherService.qml,地理位置支持 core/internal/geolocation/。
- 媒体控制:quickshell/Services/MprisController.qml、quickshell/Services/MediaAccentService.qml。
会话管理(Session Management)
锁屏、空闲检测、自动锁屏/挂起(AC/电池可分别设置),并为dank-greeter提供设置前端(Settings 中的 Greeter 页签)。
- 锁屏模块 quickshell/Modules/Lock/(11 个 QML 文件),登录界面 quickshell/Modules/Greetd/。
- 会话相关 Go 命令 core/cmd/dms/commands_session.go,服务 quickshell/Services/SessionService.qml。
插件系统(Plugin System)
通过插件注册中心扩展功能。DMS 持续维护~/.config/DankMaterialShell/plugins.lock.json,记录所有受管插件及其精确 Git commit,实现跨机器的可复现插件环境。
插件系统的 Go 实现非常完整:
- 插件管理器 core/internal/plugins/manager.go:负责安装(git clone)、更新(pull)、卸载、列表、依赖与安全性校验(
isSafePluginPathComponent防止路径穿越)。 - 锁文件机制 core/internal/plugins/manager_lockfile.go:
SnapshotLockfile为每个插件读取当前 Git 版本并写入plugins.lock.json;RestoreFromLockfile可按锁文件精确恢复到指定 commit。 - 注册中心 core/internal/plugins/registry.go:聚合多注册源(
registries.Load),支持模糊搜索(FuzzySearch)与SortByFirstParty排序。 - CLI 入口 core/cmd/dms/commands_common.go:
dms plugins browse # 浏览插件注册中心 dms plugins list # 列出已安装插件 dms plugins install <plugin-id> # 按 ID 安装插件 dms plugins uninstall <plugin-id> # 卸载插件 dms plugins update <plugin-id> # 更新单个插件 dms plugins update --all # 更新全部插件 dms plugins update --check # 仅检查更新,不实际应用 dms plugins lock [-o <path>] # 生成可移植的插件锁文件 dms plugins restore [lockfile] [--prune] # 按锁文件恢复插件其中plugins restore的--prune会移除锁文件中不存在的受管插件;plugins lock -o可将锁文件额外导出到指定路径(commands_common.go)。插件安装采用 git clone + 可选子目录 symlink 的方式(monorepo 插件支持Path字段),仓库缓存位于~/.config/DankMaterialShell/plugins/.repos/。
受支持的合成器与配置部署
README 明确列出的深度适配合成器:niri、Hyprland、Sway、MangoWC、labwc、Scroll、Miracle WM,支持完整的 workspace 切换、overview 集成与显示器管理;其他合成器功能缩减。
dms setup:交互式配置部署
core/cmd/dms/commands_setup.go 实现了交互式部署命令:
dms setup # 交互式选择合成器、终端、是否使用 systemd dms setup binds # 部署默认按键绑定 dms setup layout # 部署默认布局 dms setup colors # 部署默认配色 dms setup alttab # 部署 alt-tab 配置(仅 niri) dms setup outputs # 部署默认输出配置 dms setup cursor # 部署默认光标配置 dms setup windowrules # 部署默认窗口规则setup 逻辑要点:
- 自动探测已安装的合成器与终端(检测顺序:ghostty、foot、kitty、alacritty),多选时提示交互选择(commands_setup.go)。
- 配置按合成器写入不同格式:niri 用
.kdl、Hyprland 用.lua、MangoWC 用.conf,统一放到对应配置目录的dms/子目录(如~/.config/niri/dms/binds.kdl)。 - 已有非空文件时拒绝覆盖;已有配置会被带时间戳备份。
- 终端命令通过
{{TERMINAL_COMMAND}}占位符注入到按键绑定模板中。 dms setup还会将当前用户加入input组(用于 Caps Lock OSD 等输入状态追踪,需重新登录生效)。
默认配置模板内嵌于 Go 二进制,见 core/internal/config/embedded/:包含niri-binds.kdl、hypr-binds.lua、mango-binds.conf、ghostty.conf、kitty.conf、alacritty.toml等 26 个文件。以 niri 绑定为例(niri-binds.kdl),默认按键覆盖了:
- 系统与概览:
Mod+O/Mod+Tab切换 overview、Mod+Shift+Slash显示快捷键浮层 - 启动器:
Mod+Space应用启动器、Alt+SpaceSpotlight 栏、Mod+V剪贴板、Mod+M任务管理器 - 安全:
Mod+Alt+L锁屏、Ctrl+Alt+Delete任务管理器 - 音频:
XF86Audio*音量/静音/媒体控制(allow-when-locked=true锁屏可用) - 亮度:
XF86MonBrightnessUp/Down增减亮度
dms config resolve-include:检查 include 链路
core/cmd/dms/commands_config.go 提供dms config resolve-include <compositor> <filename>,用于递归检查某个 dms 片段文件是否已被主配置 include/source,输出 JSON:
dms config resolve-include hyprland binds.lua dms config resolve-include niri layout.kdl dms config resolve-include mangowc colors.conf底层分别实现了 Hyprland(luadofile与 hyprlangsource两种格式)、niri(include "...")与 MangoWC(source = ...)的递归 include 解析器。
命令行与 IPC:控制 Shell 的入口
dmsCLI 概览
README 给出的核心命令(完整命令集由 commands_common.go 注册,共 30+ 个子命令):
dms run # 启动 shell dms ipc call spotlight toggle # 切换启动器 dms ipc call audio setvolume 50 # 设置音量为 50 dms ipc call wallpaper set /path/to/image.jpg # 设置壁纸 dms brightness list # 列出可用显示设备 dms plugins search # 浏览插件注册中心 dms plugins lock # 刷新可移植插件锁文件 dms plugins restore ~/plugins.lock.json # 从锁文件恢复插件其他常用命令还包括:dms version(版本信息,支持多种 git/稳定版本格式解析)、dms debug-srv(启动 Unix socket 调试服务器)、dms dpms on|off|list、dms keybinds、dms screenshot、dms qr、dms clipboard、dms matugen、dms doctor、dms trash等。
IPC 调用机制
dms ipc子命令的完整形态(commands_common.go):
dms ipc call <target> <function> [args...] invoke a command dms ipc list list all targets and functions执行路径(shell.go)有两级:
- 先尝试直接通过 Unix socket(
qsipc.Call,socket 路径由会话 PID 推导)向运行中的 shell 发 IPC; - 失败则回退到启动
qs ipc子进程(Quickshell 的 IPC 命令),并支持--any-display探测。
从源码结构看(shell.go),dms ipc list通过解析qs ipc的输出动态枚举各target及其function签名,并用于 shell 补全。QML 侧的 IPC 处理见 quickshell/DMSShellIPC.qml(2258 行,包含powerMenuModalLoader、controlCenterLoader、notepadSlideoutVariants等大量 target 的协调逻辑),目标映射关系在 quickshell/Modules/Plugins/ 与各 Service 中声明。
亮度控制(Brightness)
core/cmd/dms/commands_brightness.go 实现了多后端的亮度控制:
dms brightness list # 列出所有亮度设备 dms brightness list --ddc # 包含 DDC/I2C 显示器(较慢) dms brightness get <device_id> # 查询设备当前亮度 dms brightness set <device_id> <percent> # 设置亮度(0-100) dms brightness set <device_id> 60 --exponential --exponent 1.2底层后端优先级:logind(backlight:/leds:前缀设备优先走 logind API)→ sysfs → DDC(仅--ddc时启用,探测前有 100ms 延时)。--exponential指数缩放用于更贴合人眼感知的调光曲线。
按键绑定管理(Keybinds)
core/cmd/dms/commands_keybinds.go 提供跨合成器的按键绑定与快捷键速查表管理:
dms keybinds list # 列出所有 provider dms keybinds show niri # 查看 niri 的快捷键表(JSON) dms keybinds set hyprland Mod+Shift+A "exec dms ipc call spotlight toggle" dms keybinds remove hyprland Mod+Shift+A dms keybinds reset hyprland Mod+Shift+Aset支持--desc(快捷键浮层描述)、--allow-when-locked、--cooldown-ms、--no-repeat、--flags(Hyprland 绑定标志,如e重复、l锁屏、r释放)等选项;remove对 Hyprland 会写入dms/binds-user.lua负向覆盖,使按键在 DMS 更新后保持未绑定状态。Provider 覆盖 niri、Hyprland、MangoWC、Sway、Scroll、Miracle WM、Aqueous,注册逻辑见 commands_keybinds.go,底层类型定义在 core/internal/keybinds/。
其他实用命令
dms screenshot:区域截图(commands_screenshot.go),配套 core/internal/screenshot/(含滚动截图、拼接、JPEG/PNG 编码)。dms qr:二维码生成(core/internal/qrcode/qrcode.go)。dms trash:文件移入回收站(core/internal/trash/)。dms doctor:环境自检(含测试 commands_doctor_test.go)。dms clipboard:剪贴板管理(core/internal/clipboard/)。dms matugen:matugen 主题生成(core/internal/matugen/)。dms icc:显示器 ICC 色彩配置(core/internal/icc/)。
从源码构建与开发
构建核心(dms + dankinstall)
在core/目录下执行(Makefile 见 core/Makefile):
cd core make # 构建 dms CLI(含内嵌 UI) make dankinstall # 构建安装器 make install # 安装到 /usr/local/bin make install-all # 同时安装 dms 与 dankinstall make dist # 交叉编译 linux/freebsd × amd64/arm64 make test # 运行 Go 测试构建细节(core/Makefile):
build目标依赖sync-shell:先用 tar 将 quickshell/ 拷贝到core/internal/shellembed/dist,过滤掉测试、.git、脚本等,然后以-tags withshell编译进 dms 二进制——这也是dms run能直接带 UI 启动的原因。- 版本号自动生成:
git describe+ commit 计数 + commit hash(如0.6.2+git2264.c5c5ce84),通过 ldflags 注入。 dankinstall是独立安装器二进制(core/cmd/dankinstall/main.go),即一键脚本实际调用的工具。- 要求 Go 1.22+(
check-go目标校验)。
运行 Shell
quickshell -p quickshell/该命令以quickshell/为 QML 根目录启动 shell。入口文件为 quickshell/shell.qml,其下依次加载 quickshell/ShellCore.qml、quickshell/DMSShell.qml。
NixOS / home-manager 声明式安装
README 提供 flake 方式(完整 flake 定义见 flake.nix,模块在 distro/nix/):
{ inputs.dms.url = "github:AvengeMedia/DankMaterialShell"; # Use in home-manager or NixOS configuration imports = [ inputs.dms.homeModules.dank-material-shell ]; }flake 支持 aarch64-linux / x86_64-linux 等平台,自动从core/go.mod读取 Go 版本选择对应工具链,并处理 QML 导入路径与 Qt 插件路径(kirigami、sonnet、qtmultimedia等 KDE/Qt 组件)。
生态:Dank 项目套件
README 的 Dank Projects 一节说明 DMS 是整套 Dank 生态的一部分:
- dank-greeter:greetd 登录界面,DMS Settings 中的 Greeter 页签是其配置前端
- dankcalendar:本地/Google/Microsoft/CalDAV 日历
- dgop:系统监控 TUI 与 Go 库,支撑 dms daemon 内的进程列表与 Dashboard 组件
- dsearch:快速文件搜索,为启动器提供文件结果
- dank-qml-common:DMS、dank-greeter、dankcalendar 共享的 QML 组件(仓库 dank-qml-common/)
- dankgo:单二进制应用背后的公共 Go 模块
开发指引与测试
- QML 界面开发:quickshell/ 下的 Modules(组件)、Services(系统集成)、Widgets(可复用控件)、Common(共享资源与主题)
- Go 后端开发:core/ 下的 cmd、internal(系统集成、IPC、发行版支持)、pkg(共享包)
- 打包:distro/(Fedora、Debian、NixOS、openSUSE、Void)
- 测试:Go 侧有大量单元测试(如 commands_doctor_test.go、immutable_policy_test.go);QML 侧使用 Node 测试框架,见 quickshell/tests/(
.test.mjs文件,覆盖 bar-content、dash-grid、dock-model、window-model、workspace-model 等关键逻辑)
许可证与结语
DMS 以 MIT 协议发布,详见仓库 LICENSE。整体来看,DankMaterialShell 的价值在于把"Wayland 桌面组装"这件事收敛为一个 monorepo 内的完整解决方案:QML 负责即时可调、可主题化的界面,Go daemon 负责系统级集成与跨合成器抽象,plugin registry + lockfile 则保证了扩展能力与可复现性。无论是想直接替换现有组件栈,还是作为研究 Wayland shell 分层架构的参考实现,README.md 与 core/ 源码都是很好的起点。
- 桌面应用
【免费下载链接】DankMaterialShell
Desktop shell for wayland compositors built with Quickshell & GO, optimized for niri, hyprland, sway, MangoWC, labwc, and MiracleWM.
相关推荐
Noctalia 完全指南:基于 Wayland 与 OpenGL ES 的原生桌面 Shell 架构、构建与配置实战
Noctalia 完全指南:基于 Wayland 与 OpenGL ES 的原生桌面 Shell 架构、构建与配置实战 Noctalia 是一个直接构建在 Wa
桌面应用Omarchy Shell 插件架构深度解析:单进程 Quickshell 宿主、Manifest 契约与可插拔桌面
Omarchy Shell 插件架构深度解析:单进程 Quickshell 宿主、Manifest 契约与可插拔桌面 导读 Omarchy 是一套"美观、现代且
操作系统开发工具AI 应用CLIKeep AIOps 告警管理平台:三步把告警墙变成一个事件
Keep AIOps 告警管理平台:三步把告警墙变成一个事件 每个监控工具都在画自己的告警墙,墙与墙互不相通。一次故障会被撕成碎片,散落在不同的控制台里。Kee
桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考