资讯动态

Denial插件系统入门:5步安装Windows风格任务栏,并构建你的第一个桌面扩展

发布时间:2026/10/14 17:59:10 来源:尧图企业网站定制
【免费下载链接】denialA smooth, customizable Wayland compositor with glass effects, three window layouts, and settings you can actually click. We got a little carried away.项目地址https://gitcode.com/gh_mirrors/de/denial点击查看免费下载Denial 是一款流畅、可高度定制的 Wayland 桌面合成器它的桌面界面完全由插件组装而成。本文带你走进 Denial 插件系统先用 5 步在桌面上装好 Windows 风格的任务栏再动手构建你的第一个桌面扩展把能点点点的桌面真正变成你自己的桌面。先认识 Denial 插件系统桌面是组装出来的很多窗口管理器的桌面是一个不可拆分的整体而 Denial 不同整个参考桌面本身就是由几个一等公民插件拼装出来的。默认桌面、顶部状态栏、应用启动器、桌面时钟……每一个都是独立可选的插件见内置插件清单 plugins/builtins.yaml内置插件作用说明文档denial_desktop参考桌面本体提供完整的桌面组合plugins/denial_desktop/denial_top_bar顶部系统状态栏plugins/denial_top_bar/README.mddenial_launcher应用启动器搜索、磁贴、键盘导航plugins/denial_launcher/README.mddenial_clock桌面时钟plugins/denial_clock/README.md理解这套系统只需记住 4 个概念插件 普通的 Dart 包。每个插件就是一个带pubspec.yaml的 Dart 包依赖通过 Pub 声明依赖解析完全交给 Pub。契约Contract。插件通过公开契约与桌面通信例如ShellSurface桌面表面、ShellWorkArea为原生窗口预留空间、ShellAction可绑定快捷键的动作、ShellLauncher启动器。契约定义在两个 SDK 里packages/denial_sdk纯 Dart 类型与贡献元数据和 packages/denial_flutter_sdkFlutter 契约、主题、渲染与输入原语。编译时组装。启用/禁用插件改变的是构建输入插件管理器会对选中的插件做静态发现、生成组合代码并 AOT 编译出新的桌面包然后热替换正在运行的 shell。没有运行时插件扫描、没有反射、没有动态加载——所以最终得到的就是一个普通、确定的 Flutter 桌面应用。插件管理器Plugin Manager。一个独立的 Flutter 应用类似插件商店加上denial-plugins命令行工具负责目录浏览、选择、构建和激活。架构细节见 docs/PLUGIN_SYSTEM.md 与 docs/PLUGIN_MANAGER.md。⚠️ 信任边界插件会编译进桌面的进程并共享其故障域这不是运行时沙箱。安装来路不明的插件前请先阅读它的源码。准备工作安装 Denial 插件管理器默认安装的denial包不包含插件管理器需要安装与你的 Denial 版本精确匹配的denial-plugin-manager包。以 Arch Linux / CachyOS 为例sudo pacman -S denial-plugin-managerNixOS 用户则在配置中启用programs.denial.plugins.enable true;这个包里带有与当前版本匹配的 Flutter 工具链、公开 SDK 源码denial_sdk、denial_flutter_sdk和编译器输入原生 Linux 上位于/usr/lib/denial/plugin-build-kit。装上它之后你在 GUI 里点 Apply 时的一切编译都自动完成不需要自己配置任何编译器或引擎路径。5步安装 Windows 风格任务栏Windows 风格任务栏插件denial_taskbar不在默认预设里而是发布在 Denial 官方插件合集denialwm/denial-plugins中位于plugins/denial_taskbar。下面 5 步把它装到桌面上。第1步打开 Plugins 应用查看当前插件组合从应用列表启动Plugins插件管理器。左侧导航有三个主要页面My plugins已安装与当前选中的插件Discover内置插件 Denial 官方目录首次使用会自动拉取目录Activity构建与激活的历史记录。确认当前选中的是默认预设denial_desktopdenial_top_bardenial_launcherdenial_clock。切换开关只是暂存草稿不会立刻影响运行中的桌面。第2步在 Discover 目录中添加任务栏插件进入Discover找到denial_taskbar官方合集会自动出现在目录里通常无需手动粘贴 Git 地址点击Add plugin若想安装其他 Git 仓库里的插件也可以用Add plugin输入仓库地址展开Local development还能直接选本地开发目录。命令行等价操作仓库根目录只有一个插件包时无需--pathdenial-plugins status denial-plugins --path plugins/denial_taskbar add denialwm/denial-plugins 合集的 Git 地址第3步处理面板冲突禁用顶部状态栏任务栏和顶部状态栏都通过独占的ShellWorkArea契约向合成器申请预留空间——同一时间只能有一个提供方。所以添加任务栏后Plugins 会在底部提示冲突并禁用 Apply。解决方式很简单在My plugins里关闭denial_top_bar同时保持denial_desktop等其他选择不被改动。GUI 会明确告诉你需要禁用哪一个面板绝不会替你自动改选择。第4步Apply 应用更改并等待编译点击Apply changes管理器会依次执行 5 个阶段底部进度条会显示阶段标签准备依赖Pub 解析检查兼容性静态发现 契约校验编译 / 复用 shellDart AOT 编译验证并封包sealed bundle原生激活与健康确认热替换运行中的 shell首次编译任务栏组合实测约46 秒之后如果再次应用相同组合命中构建缓存只需要约 3 秒。整个过程不需要重编译 Rust也不需要重启合成器。第5步验证任务栏生效桌面会在数秒内热替换为新组合。确认一切正常denialctl --json ui status看到期望的 bundle 处于 active 状态且plugin_healthy: true即可。如果某次构建失败正在运行的桌面不受任何影响——失败的候选包会被丢弃你还可以随时请求回退。构建你的第一个 Denial 桌面扩展装好任务栏只是开始插件系统的真正乐趣在于自己写插件。好消息是写插件不需要 clone Denial 仓库也不需要把 SDK 或插件发布到 pub.dev。1. 创建一个普通 Dart 包mkdir -p ~/Projects/example_plugin/lib cd ~/Projects/example_plugin创建pubspec.yaml版本号以你机器上安装的 SDK 为准name: example_plugin description: An example Denial action plugin. publish_to: none version: 0.0.0 environment: sdk: ^3.13.0 flutter: 3.47.5 dependencies: flutter: sdk: flutter denial_sdk: 0.0.0 denial_flutter_sdk: 0.0.02. 把项目指向已安装的 SDK在pubspec.yaml旁边创建pubspec_overrides.yaml用绝对路径指向管理器准备的 SDKdenial-plugins prepare会打印这些路径。这个文件是本地开发配置记得加进.gitignore不要提交——别人安装你的插件时Plugin Manager 会自动提供他们自己安装的 SDK 对。3. 写一个贡献Contribution每个贡献库用Plugin()标记实现一个公开契约的类用Provides(契约类型)标记。例如给桌面贡献一个可绑定快捷键的打开电源设置动作Plugin() library; Provides(ShellAction) final class OpenPowerPreferences implements ShellAction { const OpenPowerPreferences(); override String get id example_plugin.openPowerPreferences; override String get provider Example plugin; override String label(BuildContext context) Open power preferences; override String description(BuildContext context) Show power settings; override void invoke(ShellActionContext context) context.services.openPowerSettings(); }想在桌面上画一块自定义区域比如天气小部件则实现ShellSurface给它一个稳定的id在place()里用屏幕工作区几何声明位置与可见策略在build()里返回任意 Flutter widget——完整示例见 docs/PLUGIN_DEVELOPMENT.md 的Declare your own position and visibility一节。写完用配套工具链自检$DENIAL_PLUGIN_FLUTTER pub get $DENIAL_PLUGIN_DART analyze lib4. 本地安装并应用在 Plugins 里选择Add plugin → Local development → 使用本地开发目录填入项目路径点Find plugins选中包后 Apply或直接用 CLIdenial-plugins --local add ~/Projects/example_plugin denial-plugins submit apply denial-plugins statusApply 完成后在Settings → Shortcuts → Denial actions里就能给你的example_plugin.openPowerPreferences动作绑定快捷键。之后每改一次源码重复一次 plan/build/apply 即可——这是 AOT 重新编译不是热重载。5. 用 Git 分发你的插件把pubspec.yaml、lib/下的贡献库和文档提交到任意 Git 仓库并分享地址即可仓库根目录只有一个插件包时别人只需要仓库地址monorepo 里的插件还需要提供包路径以及可选的分支/tag/commit每个可独立启停的插件都是单独的 Dart 包不要把 SDK 拷贝进插件仓库。常见问题与回滚问编译失败会弄坏我的桌面吗不会。候选包在新目录里编译并验证只有通过原生健康检查后才会替换运行中的 shell构建失败时原组合继续工作。问怎么回退GUI 中可请求上一个可用组合denial-plugins submit revert或打包恢复 shelldenial-plugins submit restore后者回到出厂默认桌面。问为什么两个状态栏不能同时用ShellWorkArea是独占契约——原生窗口工作区同一时间只认一个预留提供方冲突会在编译前被明确拒绝并列出冲突的提供方类型。问插件能访问系统底层能力吗只能通过 SDK 公开的服务与控制器窗口、显示、音频、截屏、托盘等。Rust 侧的合成器始终掌握资源生命周期、Wayland 正确性与认证策略的权威。进一步阅读插件架构完整契约docs/PLUGIN_SYSTEM.md插件管理器与分发模型docs/PLUGIN_MANAGER.md插件开发分步指南SDK 配置、编辑器设置、Git 分发docs/PLUGIN_DEVELOPMENT.md插件管理器后端实现packages/denial_plugin_manager/README.md自定义完整 shell不只是加面板docs/CUSTOM_SHELLS.md插件管理器源码plugin_manager_app/Denial 的桌面哲学一句话总结We built the windows. You decide the view.——现在任务栏只是你的第一个决定。赞分享【免费下载链接】denialA smooth, customizable Wayland compositor with glass effects, three window layouts, and settings you can actually click. We got a little carried away.项目地址https://gitcode.com/gh_mirrors/de/denial点击查看免费下载相关推荐终极Voyager插件开发指南从零开始构建你的第一个Laravel后台扩展终极Voyager插件开发指南从零开始构建你的第一个Laravel后台扩展 Voyager是基于Laravel框架的强大后台管理系统它提供了直观的界面和丰富后端CMSVSCodium扩展开发入门从零构建你的第一个插件VSCodium扩展开发入门从零构建你的第一个插件 为什么选择VSCodium开发扩展 VSCodium作为Visual Studio Code的开源替代版本开发工具BlueOcean插件开发入门从零构建你的第一个扩展BlueOcean插件开发入门从零构建你的第一个扩展 BlueOcean是Jenkins的一款革命性插件为开发者提供现代化、直观的持续集成/持续部署 CI/创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑