[App Sharing] Easy_Desktop 1.2.0-AKA-d26.10.10 更新日志
Tofloor
poster avatar
曾子康 TIM
deepin
2026-10-11 12:07
Author

Easy_Desktop 1.2.0-AKA-d26.10.10 更新日志

// 写了3个月,可算把细节写完了
// 写了太多东西了,以至于自己写了什么都不记得了...

关于 Easy_Desktop 载体几何插件设计规则 和 标记规则,这些是开发端才需要关注的,我放另一篇了。

提一下:为了实现音调与速率不同的效果,我放弃了QMediaPlayer,用FFmpeg+PulseAudio/ALSA处理了,这个东西会移植到music-island上的.

关于性能问题:不用担心,我的赛扬都能流畅运行,你们肯定没问题的

有些技术细节,如 multimedia_loader 的设计、全局菜单获取逻辑、插件设计原则,以后有空再讲。(其实源码中的注释都写了)

libraryload(动态加载库)的操作非常逆天,后面有机会再说。

接下来还得重写一些老插件,让它们接上新接口。

还得找时间把 Easy_Desktop 拉到 ubuntu1404 上编译,这可是个大工程。

tips

使用须知:Easy_Desktop 改完配置不会自动保存,要手动右键 → 储存。

libraryload 模块现在几乎把第三方依赖都改成运行时动态加载了,程序内部基本成了一个“小型 loader 集合”。

保存系统

以前是全量保存,现在只保存和默认配置不一样的项目,缺的会自动补回来。

编译变体精简与动态加载

1.1.0 之前,QChart 和 QtPdf 是编译期靠 DEFINES += USE_CHART / DEFINES += USE_PDF 控制的,所以发布时要出 8 个变体:empty / chart / pdf / dtk / chart_pdf / dtk_chart / dtk_pdf / dtk_chart_pdf。

这次改完:

  • USE_CHART 宏废弃了:可视化图表全改成 QPaintEvent 自绘,后面会讲。
  • USE_PDF 宏也废弃了:QPdf_Loader 跟其他 Loader 一样,改成用 QLibrary 运行时动态加载 libQt5Pdf.so.5。
  • USE_DTK 保留:QT += dtkcore dtkgui dtkwidget 是编译期链接,没法运行时加载(DApplication的动态加载我是想都不敢想)。

所以 .pro 里现在只有 USE_DTK 一个宏,发布变体从 8 个缩到 2 个:

  • empty:基础版。
  • dtk:带 DTK 支持,给 dde-dock 插件 V2.0.0 用(有些插件如libtray.so的运行依赖DApplication,所以也要开启这项)

标注系统:PDF / 图像预览补上能力

这次给 PDF 预览(QPdf_Viewer)和图像/视频预览(GraphicsViewer)加了一套共享标注系统,放在 core/module/annotation/。

组件有:

  • Annotation_Manager:管标注数据,增删改查、历史栈、选择集、剪贴板、文件 I/O 都在这里。
  • AnnotationTool_Manager:工具栏,切工具、调颜色/宽度/字体、撤销重做、缩放、文件菜单。
  • Annotation_SelectionBox:选区框,缩放/旋转/角三种模式,8 个手柄,内部也能拖。
  • Annotation_Overlay:叠加层,WA_TransparentForMouseEvents,只负责画。

支持的标注类型:

  • 高亮笔:半透明,alpha=80,拿来高亮文本。
  • 自由划线:不透明线条,按最小步长采样,路径会自动优化。
  • 文字注释:圆角框 + 背景色 + 字体 + 可自定义框大小,悬停显示内容。
  • 图像标注:本地或远程图像,支持异步加载。

p1.png

工具和交互:

  • 工具:平移、选择、高亮笔、自由划线、文字注释、图像标注、橡皮擦。
  • 选区框三模式:缩放(蓝色虚线 + 方形手柄)、旋转(橙色实线 + 圆形手柄)、角模式(绿色点划线 + 菱形手柄)。
  • Alt 拖拽:切换成“每个标注绕自身中心变换”。
  • 鼠标中键:快速平移视图。
  • 滚轮:缩放视图,以鼠标位置为锚点。
  • 框选:左键在空白处拖。

快捷键:

Ctrl+Z 撤销、Ctrl+Shift+Z / Ctrl+Y 重做、Ctrl+C/X/V 复制/剪切/粘贴、Ctrl+D 原地复制、Ctrl+A 全选、Del / Backspace 删除、Esc 取消、方向键平移(Shift 加速 10 倍)。

持久化:

  • 格式:.annotations.json(JSON)。
  • 打开 PDF 时,如果同目录有 .annotations.json,会自动加载。
  • 剪贴板:自定义 MIME 类型 application/x-pdf-annotations+json。

PDF 专属:

  • 多页:单页 / 双页 / 全部横排 / n 页(3-10)四种排布。
  • 视图旋转:底部状态栏滑块,范围 -180° 到 180°。
  • 渲染后端:QPdf 或 Poppler 运行时切换。
  • 降采样:旋转拖动时自动切低质量模式。

载体几何插件接口

新增第四类插件接口 Ext_Carrier_Geometry_PluginInterface,用来控制载体里控件的布局、视觉变换、tick 动画。

元数据要求:

{
    "Ext_Carrier_Geometry_Plugin": ""
}

生命周期:

  1. 宿主加载 .so
  2. 校验元数据和版本
  3. 调用 init(Carrier_Geometry_Interface*)
  4. 如果 tick_interval_ms() > 0,就按这个间隔调 on_tick(elapsed_ms)
  5. 用户操作时调 on_widget_* / on_page_changed / on_container_resized
  6. 用户保存时调 on_host_save()
  7. 插件被移除或载体销毁时调 RemovePlugin()

约束:

  • 插件只能操作当前挂载的载体,不能越级到父/子/兄弟载体。
  • 直接子项如果是可载体,也当普通 Basic_Widget 处理。
  • 插件必须在 on_widget_removed() 里清空对该 widget 的所有引用。

宿主通过 Carrier_Geometry_Interface 提供的能力:载体信息、页管理、控件信息、几何操作、视觉变换(旋转/倾斜/缩放/透明度/透视)、可见性、z-index、信号发送、拖入拖出、鼠标查询、能力位查询。

另外,Carrier_Transform 结构体支持纯视觉变换(不影响命中),鼠标靠近时会自动抑制变换,保证点击命中正确。

three_d_plugin 3D效果插件的演示效果:

p2.png

全局菜单

新增 core/globalmenu/ 模块,用来在 X11 环境下消费全局菜单:

  • Raw_GlobalMenu_Manager:尝试读窗口的 X11 属性(GTK 的 _GTK_UNIQUE_BUS_NAME / _GTK_MENUBAR_OBJECT_PATH,KDE 的 _KDE_NET_WM_APPMENU_*),再通过注册中心服务查真实应用服务名。
  • GMenu_Importer:消费 org.gtk.Menus 协议,把扁平 + section 引用 + submenu 引用的结构转成和 dbusmenu 一样的嵌套 JSON。
  • GlobalMenu_Manager:把 JSON 渲染成 QWidget + QPushButton + QMenu 的菜单栏,支持停在上/下/左/右四边。
  • 这个模块只做 dbusmenu 的消费者,不注册任何 D-Bus 服务名,所以不会导致应用菜单栏隐藏。
  • 支持 Geany 这类 GTK3 应用(它们在 org.gtk.Menus 而不是 com.canonical.dbusmenu 下暴露菜单)。
  • image.png

音频波形图预览

新增 Audio_Wave_Preview / Audio_Wave_Widget,用来在预览窗口里显示音频文件波形。

显示模式:

  • 不显示波形图
  • RMS(均方根)图
  • dB(分贝)图
  • 峰值图

峰值图也集成到了声音服务可视化图表里,可以在声音服务界面右键切换。

交互:

  • 鼠标滚轮缩放
  • 拖拽平移
  • 标线拖动(左键在标线 10px 内)
  • 点上下栏左右箭头可以 ±5s 跳转

p3.png

性能:

  • 波形图加载是异步的,不阻塞 UI 主线程。
  • 可以通过配置项限制单通道最大数据量,超过阈值时对区间采样点做带正负号的 RMS 合并,绘制压力会小很多。

可视化图表的 QPaintEvent 化

1.1.0 时用 QPaintEvent 自绘折线图做过 QChart 的平行版本,让不带 chart 字样的变体也能用数据可视化。

这次所有可视化图表都完全迁到 QPaintEvent 驱动了:

  • Visual_Chart / Visual_ChartView / Visual_QLineSeries / Visual_ValueAxis 四个类组成一个简化版图表框架。
  • 原来的 QChart 依赖全部移除,USE_CHART 宏废弃。
  • 图例位置、风格(圆角式 / 非圆角式)、网格色、文字色、高亮色都能通过 Visual_Chart_Settings_Dialog 配。

覆盖:CPU、内存、网络、磁盘、声音服务。

安全机制

新增 CommandBlacklist 和 SecureSettings 两个安全模块。

CommandBlacklist 会在执行外部命令前做危险命令检查,命中规则就弹警告对话框,默认选“取消”。

覆盖规则:

  • 危险程序名:rm、dd、mkfs、shutdown、reboot、chmod、chown、sudo、su、pkexec、nc、curl、wget、bash、sh、eval、exec 等。
  • 危险子串:rm -rf /、mkfs.、dd if=、fork 炸弹、curl | bash、wget | sh 等。
  • 正则规则:递归强制删除根目录、格式化文件系统、直接写块设备、关机/重启、Fork 炸弹、远程脚本直接执行、提权命令。

非 GUI 环境(没有 QApplication)下默认拒绝执行。

SecureSettings 继承 QSettings,但数据实际放内存里,靠 syncSecure() 手动触发写入:

  • 先写临时文件(QTemporaryFile)
  • 强制设置 600 权限
  • 通过 rename() 原子替换目标文件
  • 如果在 root 环境下写入失败,可以选择强制保存

这样配置文件不容易被中途截断,权限也不会被意外放宽。

构建脚本与 deb 安装体验

build_deb.sh:

  • 只构建 empty 和 dtk 两个变体。
  • 版本号和 AKA 名称从 core/easy_desktop_version.h 读。
  • 生成的 .deb 里 Depends 只包含 Qt 核心运行时和(仅 dtk 变体)DTK 运行时。
  • 所有 Loader 的运行时库放进 Suggests(不会被自动安装)。

postinst 交互安装:

.deb 的 postinst 会弹 whiptail / dialog 勾选界面,让用户按需选要装的 Loader 运行时库:

[*] X11        X11 窗口操作 (嵌入窗口/设为桌面/工作区切换)
[*] DBus       D-Bus 通信 (全局菜单等)
[*] QNetwork   远程图片 / 网络请求
...
[ ] FFmpeg     音视频解码 (视频壁纸/音视频预览)

选中的项通过 setsid 延迟到后台安装,避免和 dpkg 锁冲突,日志写 /var/log/easy-desktop-optional-deps.log。

  • 幂等:/var/lib/easy-desktop/optional-deps-prompted 标记文件避免升级时重复弹窗。
  • 非交互环境:打印可直接复制执行的 apt install 命令。
  • FFmpeg 版本自适应:用 apt-cache show 探测系统上可用的 58/59/60。

install_dev_deps.sh:

  • 强制安装:build-essential、qtbase5-dev、qttools5-dev-tools。
  • 可选安装:DTK 开发包(只有 dtk 变体需要)。

所有 Loader 都通过运行时动态加载符号,不 include 任何第三方头文件,所以没有编译依赖。

其它改动

  1. Dock_Bar_Appearance_Dialog:新增边栏(顶部工具栏 / 底部状态栏通用)外观设置,支持停靠位置、背景色、文字色、悬浮文字色、禁用文字色、圆角、字体。
  2. TextEdit_Appearance_Dialog:新增文本编辑器文档外观设置(背景色、圆角)。
  3. Mark_Rule_Highlighter:文本编辑器 / 纯文本编辑器的自动标记(语法高亮)规则支持 JSON 和 INI 两种格式。
  4. 动态保存开关:新增“在 /tmp 定时储存”选项,每 30s 备份到 /tmp/Easy_Desktop/backup_config.ini。
  5. 插件接口版本升级:Ext_Preview_PluginInterface 升到 V0.0.4,Ext_Wallpaper_PluginInterface 升到 V0.0.3,都支持通过 seek_loader_sender / recive_loader_sender 访问 Easy_Desktop 内部的 Loader。
  6. libtray.so 特化处理:在 plugin_widget.cpp 里对 dde-tray 做专门兼容,把它提升为独立顶层窗口(Qt::Tool + FramelessWindowHint + BypassWindowManagerHint),加 WA_TranslucentBackground 和 WA_ShowWithoutActivating,实时同步位置,并在右键菜单上做拦截——目的仅仅是让它能正常运行。
  7. 翻译系统:Trans_Sender / Trans_Action / Trans_Menu / Trans_PushButton / Trans_CheckBox / Trans_Label 一整套可热更新的翻译控件,所有对话框都支持。
  8. -icon_theme 参数:多个路径用竖线 | 分隔。
  9. 图标主题热重载:Update_Icon_Theme 支持自定义路径 + 缓存默认值 + 恢复默认。

想不起来还做了什么了,想到了再说吧╮( ̄▽ ̄)╭

相关链接:

Reply Favorite View the author
All Replies

No replies yet