news 2026/9/26 2:22:38

DankMaterialShell 完全指南:基于 Quickshell 与 Go 的 Wayland 桌面 Shell 架构、安装、CLI 与插件体系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DankMaterialShell 完全指南:基于 Quickshell 与 Go 的 Wayland 桌面 Shell 架构、安装、CLI 与插件体系
  • 桌面应用

【免费下载链接】DankMaterialShell

Desktop shell for wayland compositors built with Quickshell & GO, optimized for niri, hyprland, sway, MangoWC, labwc, and MiracleWM.

项目地址:https://gitcode.com/gh_mirrors/da/DankMaterialShell
点击查看免费下载

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.nixNix 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 installation

dms二进制在 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)有两级:

  1. 先尝试直接通过 Unix socket(qsipc.Call,socket 路径由会话 PID 推导)向运行中的 shell 发 IPC;
  2. 失败则回退到启动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+A

set支持--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.

项目地址:https://gitcode.com/gh_mirrors/da/DankMaterialShell
点击查看免费下载

相关推荐

上一篇:Ant Design表单输入格式化:数字/日期格式化实现
下一篇:10分钟快速搭建:Docker容器化部署wvp-GB28181-pro视频监控平台终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 2:22:02

3 步把 EPUB 变成有声书:abogen 文本转语音完整指南

3 步把 EPUB 变成有声书&#xff1a;abogen 文本转语音完整指南 【免费下载链接】abogen Generate audiobooks from EPUBs, PDFs and text with synchronized captions. 项目地址: https://gitcode.com/GitHub_Trending/ab/abogen 电子书包得越来越满&#xff0c;通勤路…

作者头像 李华
网站建设 2026/9/26 2:21:21

Spring Boot个人博客系统设计与实现:从零搭建到答辩指南

1. 选题价值与整体设计思路1.1 这个题目到底在考察什么如果你的毕设题目是“个人博客系统设计与实现”&#xff0c;或者你正在Spring Boot相关的选题清单里反复犹豫&#xff0c;那这篇文章值得你花十分钟看完。我前几年带过的几个学生都选了类似方向&#xff0c;自己也完整从零…

作者头像 李华
网站建设 2026/9/26 2:20:54

甘蔗病害图像分类实战:19,000张标注数据从训练到评估的避坑指南

简介&#xff1a;甘蔗植物病害图像分类数据集提供约19,000张已标注图片&#xff0c;面向深度学习图像分类方向的开发者、研究人员及农业AI学习者&#xff0c;可解决甘蔗红腐病、锈病、枯萎病及健康叶片等6类病害分类模型的训练与验证需求。数据已按训练集、测试集划分&#xff…

作者头像 李华