news 2026/9/10 20:24:42

SerenityOS About 应用完全指南:Ladyball 图标、版本号机制与 AboutDialog 源码实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SerenityOS About 应用完全指南:Ladyball 图标、版本号机制与 AboutDialog 源码实现

SerenityOS About 应用完全指南:Ladyball 图标、版本号机制与 AboutDialog 源码实现

【免费下载链接】serenityThe Serenity Operating System 🐞项目地址: https://gitcode.com/GitHub_Trending/se/serenity

导读

About是 SerenityOS 内置的"关于"应用,用于在图形界面中展示系统名称、版本、修订号、版权信息以及官方 Ladyball 标志,是用户与开发者了解当前系统构建状态最直接的入口。本文以 Base/usr/share/man/man1/Applications/About.md 手册页为主线,结合 Userland/Applications/About/main.cpp、Userland/Libraries/LibGUI/AboutDialog.cpp 等源码,完整讲解该应用的启动方式、界面元素、版本号生成机制与内部实现原理。读完本文,你将掌握如何在 SerenityOS 中运行与理解 About 应用,并了解其背后 GUI 对话框框架的调用链。

一、运行方式与使用入口

手册页的 Synopsis 给出了应用的命令行用法:

$ About

在 SerenityOS 图形桌面环境中,可以直接在终端执行About,也可以从系统菜单中的应用列表启动。手册页还提供了launch:///bin/About的启动协议链接,这是 SerenityOS 桌面环境下通过 URL 协议拉起应用的统一方式,等效于运行/bin/About

从源码看,该应用的二进制正是由 Userland/Applications/About/CMakeLists.txt 中的serenity_app(About ICON ladyball)构建,程序入口是 Userland/Applications/About/main.cpp,其serenity_main在创建 GUI 应用后直接弹出关于对话框并进入事件循环:

GUI::AboutDialog::show("SerenityOS"_string, TRY(Core::Version::read_long_version_string()), app_icon.bitmap_for_size(32), nullptr, app_icon.bitmap_for_size(16)); return app->exec();

二、界面元素与 Ladyball 标志

打开 About 应用后,左侧展示官方 Ladyball 标志。该标志由 Katalin Kult 设计,将阴阳符号(Yin-Yang)与瓢虫(ladybird,本项目虫类意象)独特的壳纹相结合,寓意 SerenityOS 的设计哲学:

  • Serenity Prayer 的"接纳不可控之事":体现对无法改变事物的坦然接受;
  • 阴阳的"对立力量平衡":象征系统中各种对立力量的调和;
  • Lagom 的"恰到好处":瑞典语中"不多不少、刚刚好"的适度理念。

从源码看,About 对话框的图标由 Userland/Libraries/LibGUI/AboutDialog.gml 定义的 GML 布局渲染,界面自上而下包含品牌横幅(brand_banner,位图取自/res/graphics/brand-banner.png)、左侧图标区(icon_wrapper/icon)、右侧的name(SerenityOS)、serenity_osversioncopyright标签以及 OK 按钮。其中 copyright 标签固定显示Copyright © the SerenityOS developers, 2018-2026

三、版本号与修订号的生成机制

手册页明确说明:由于项目没有官方发布版本,版本号固定为1.0-dev,修订号则取当前 Git 最新提交哈希

这一机制在源码中有清晰印证。Userland/Libraries/LibCore/Version.cpp 的read_long_version_string()在 SerenityOS 平台上通过uname()系统调用读取内核releaseversion字段,格式化为Version {} revision {};而在非 SerenityOS 环境(如 Lagom 测试构建)下则直接返回Version 1.0

修订哈希的具体注入发生在构建期:Userland/Applications/About/CMakeLists.txt 通过三条execute_process命令读取当前 Git 信息:

execute_process(COMMAND "git rev-parse --short HEAD" OUTPUT_VARIABLE GIT_COMMIT) execute_process(COMMAND "git rev-parse --abbrev-ref HEAD" OUTPUT_VARIABLE GIT_BRANCH) execute_process(COMMAND "git diff-index --quiet HEAD -- && echo tracked || echo untracked" OUTPUT_VARIABLE GIT_CHANGES) add_definitions(-DGIT_COMMIT="${GIT_COMMIT}" -DGIT_BRANCH="${GIT_BRANCH}" -DGIT_CHANGES="${GIT_CHANGES}")

即:取当前分支、短哈希,并判断工作区是否有未提交改动(tracked/untracked),通过编译期宏注入目标,从而让 About 对话框显示的修订号反映当前构建所对应的确切 Git 提交

四、AboutDialog 的实现原理

About 应用本身只是一个薄壳,真正的界面逻辑由 LibGUI 的AboutDialog提供(Userland/Libraries/LibGUI/AboutDialog.cpp)。

AboutDialog::show是静态入口,接受五个参数:应用名称、版本字符串、应用图标位图、父窗口指针与窗口图标位图:

static void show(String name, String version, RefPtr<Gfx::Bitmap const> icon = nullptr, Window* parent_window = nullptr, RefPtr<Gfx::Bitmap const> window_icon = nullptr);

其内部流程为:

  1. 调用AboutDialog::create构建对话框,窗口标题自动设置为About {name}(如 "About SerenityOS");
  2. 从 GML 布局中按名字查找控件:若有图标则显示icon_wrapper并设置图标位图,否则隐藏图标区;设置nameversion标签文本,并仅当名称不是 "SerenityOS" 时才显示下方的 "SerenityOS" 副标题标签(见 AboutDialog.cpp);
  3. 为 OK 按钮绑定点击回调dialog->done(ExecResult::OK)关闭对话框;
  4. 设置窗口尺寸为413x204、不可调整大小,最后exec()以模态方式运行。

因此,任何 SerenityOS 应用都可以复用该组件快速生成风格统一的"关于"对话框,About 应用只是把它用于系统本身。

五、安全加固:pledge 与 unveil

Userland/Applications/About/main.cpp 在启动早期进行了两次pledge系统调用收紧权限,并配合unveil限制文件系统可见性:

TRY(Core::System::pledge("stdio recvfd sendfd rpath unix")); auto app = TRY(GUI::Application::create(arguments)); TRY(Core::System::pledge("stdio recvfd sendfd rpath")); TRY(Core::System::unveil("/res", "r")); TRY(Core::System::unveil(nullptr, nullptr));

第一次 pledge 允许unix以支持 GUI 应用初始化时的 IPC 连接;创建应用后再收紧,仅保留stdio recvfd sendfd rpath。随后仅向进程揭示/res目录(只读),用于加载 Ladyball 图标等资源,最后以unveil(nullptr, nullptr)锁定权限清单。这是 SerenityOS 应用"最小权限"安全模型的典型示例。

六、相关资源与延伸阅读

  • 手册页原文:Base/usr/share/man/man1/Applications/About.md
  • 应用入口:Userland/Applications/About/main.cpp
  • 构建配置:Userland/Applications/About/CMakeLists.txt
  • 对话框实现:Userland/Libraries/LibGUI/AboutDialog.cpp 与头文件 Userland/Libraries/LibGUI/AboutDialog.h
  • 界面布局:Userland/Libraries/LibGUI/AboutDialog.gml
  • 版本字符串生成:Userland/Libraries/LibCore/Version.cpp

若要在自己的 SerenityOS 应用中复用 About 对话框,可在 CMake 中链接LibGUI等库,并在代码中调用GUI::AboutDialog::show(...)传入应用名与版本字符串即可。

【免费下载链接】serenityThe Serenity Operating System 🐞项目地址: https://gitcode.com/GitHub_Trending/se/serenity

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

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

真空粉末分散器技术解析与应用实践

1. 项目概述&#xff1a;真空粉末分散器的多场景革命实验室里那堆结块的纳米材料又让我头疼了——传统搅拌器根本打不散&#xff0c;超声处理又怕破坏晶体结构。直到上个月在材料学研讨会上看到梓梦ZMD800的演示&#xff1a;30秒内把板结的碳化硅粉末分散得像烟雾般均匀。这台看…

作者头像 李华
网站建设 2026/9/10 20:24:16

expo-image 深度指南:Expo 跨平台高性能图片组件完全解析

expo-image 深度指南&#xff1a;Expo 跨平台高性能图片组件完全解析 【免费下载链接】expo An open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web. 项目地址: https://gitcode.com/GitHub_Trending/ex/expo …

作者头像 李华
网站建设 2026/9/10 20:19:29

C/C++二维数组格式化输出技巧详解

1. 二维数组格式化输出实战指南 在C/C编程中&#xff0c;二维数组的输出格式化是个看似简单却暗藏玄机的操作。今天我们就来深入探讨如何通过"%-4"和"%4d"这两种格式化方式&#xff0c;实现二维数组的整洁对齐输出。这不仅是基础功的体现&#xff0c;更关系…

作者头像 李华
网站建设 2026/9/10 20:18:07

费马大定理的代码化实现与数学验证实践

1. 项目概述 在数学与计算机科学的交叉领域&#xff0c;费马大定理&#xff08;Fermats Last Theorem&#xff09;一直是个引人入胜的话题。这个由皮埃尔德费马在17世纪提出的猜想&#xff0c;直到1994年才被安德鲁怀尔斯最终证明。定理简单表述为&#xff1a;当整数n>2时&a…

作者头像 李华