// 写了3个月,可算把细节写完了 // 写了太多东西了,以至于自己写了什么都不记得了...
关于 Easy_Desktop 载体几何插件设计规则 和 标记规则,这些是开发端才需要关注的,我放另一篇了。
提一下:为了实现音调与速率不同的效果,我放弃了QMediaPlayer,用FFmpeg+PulseAudio/ALSA处理了,这个东西会移植到music-island上的.
关于性能问题:不用担心,我的赛扬都能流畅运行,你们肯定没问题的
有些技术细节,如 multimedia_loader 的设计、全局菜单获取逻辑、插件设计原则,以后有空再讲。(其实源码中的注释都写了)
libraryload(动态加载库)的操作非常逆天,后面有机会再说。
libraryload
接下来还得重写一些老插件,让它们接上新接口。
还得找时间把 Easy_Desktop 拉到 ubuntu1404 上编译,这可是个大工程。
使用须知: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。
QChart
QtPdf
DEFINES += USE_CHART
DEFINES += USE_PDF
这次改完:
USE_CHART
QPaintEvent
USE_PDF
QPdf_Loader
QLibrary
libQt5Pdf.so.5
USE_DTK
QT += dtkcore dtkgui dtkwidget
所以 .pro 里现在只有 USE_DTK 一个宏,发布变体从 8 个缩到 2 个:
.pro
empty
dtk
这次给 PDF 预览(QPdf_Viewer)和图像/视频预览(GraphicsViewer)加了一套共享标注系统,放在 core/module/annotation/。
QPdf_Viewer
GraphicsViewer
core/module/annotation/
组件有:
Annotation_Manager
AnnotationTool_Manager
Annotation_SelectionBox
Annotation_Overlay
WA_TransparentForMouseEvents
支持的标注类型:
工具和交互:
Alt
快捷键:
Ctrl+Z 撤销、Ctrl+Shift+Z / Ctrl+Y 重做、Ctrl+C/X/V 复制/剪切/粘贴、Ctrl+D 原地复制、Ctrl+A 全选、Del / Backspace 删除、Esc 取消、方向键平移(Shift 加速 10 倍)。
Ctrl+Z
Ctrl+Shift+Z
Ctrl+Y
Ctrl+C/X/V
Ctrl+D
Ctrl+A
Del
Backspace
Esc
Shift
持久化:
.annotations.json
application/x-pdf-annotations+json
PDF 专属:
新增第四类插件接口 Ext_Carrier_Geometry_PluginInterface,用来控制载体里控件的布局、视觉变换、tick 动画。
Ext_Carrier_Geometry_PluginInterface
元数据要求:
{ "Ext_Carrier_Geometry_Plugin": "" }
生命周期:
.so
init(Carrier_Geometry_Interface*)
tick_interval_ms() > 0
on_tick(elapsed_ms)
on_widget_*
on_page_changed
on_container_resized
on_host_save()
RemovePlugin()
约束:
Basic_Widget
on_widget_removed()
宿主通过 Carrier_Geometry_Interface 提供的能力:载体信息、页管理、控件信息、几何操作、视觉变换(旋转/倾斜/缩放/透明度/透视)、可见性、z-index、信号发送、拖入拖出、鼠标查询、能力位查询。
Carrier_Geometry_Interface
另外,Carrier_Transform 结构体支持纯视觉变换(不影响命中),鼠标靠近时会自动抑制变换,保证点击命中正确。
Carrier_Transform
three_d_plugin 3D效果插件的演示效果:
新增 core/globalmenu/ 模块,用来在 X11 环境下消费全局菜单:
core/globalmenu/
Raw_GlobalMenu_Manager
_GTK_UNIQUE_BUS_NAME
_GTK_MENUBAR_OBJECT_PATH
_KDE_NET_WM_APPMENU_*
GMenu_Importer
org.gtk.Menus
GlobalMenu_Manager
QWidget + QPushButton + QMenu
com.canonical.dbusmenu
新增 Audio_Wave_Preview / Audio_Wave_Widget,用来在预览窗口里显示音频文件波形。
Audio_Wave_Preview
Audio_Wave_Widget
显示模式:
峰值图也集成到了声音服务可视化图表里,可以在声音服务界面右键切换。
交互:
性能:
1.1.0 时用 QPaintEvent 自绘折线图做过 QChart 的平行版本,让不带 chart 字样的变体也能用数据可视化。
chart
这次所有可视化图表都完全迁到 QPaintEvent 驱动了:
Visual_Chart
Visual_ChartView
Visual_QLineSeries
Visual_ValueAxis
Visual_Chart_Settings_Dialog
覆盖:CPU、内存、网络、磁盘、声音服务。
新增 CommandBlacklist 和 SecureSettings 两个安全模块。
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=
curl | bash
wget | sh
非 GUI 环境(没有 QApplication)下默认拒绝执行。
QApplication
SecureSettings 继承 QSettings,但数据实际放内存里,靠 syncSecure() 手动触发写入:
QSettings
syncSecure()
QTemporaryFile
rename()
这样配置文件不容易被中途截断,权限也不会被意外放宽。
build_deb.sh:
build_deb.sh
core/easy_desktop_version.h
.deb
Depends
Suggests
postinst 交互安装:
postinst
.deb 的 postinst 会弹 whiptail / dialog 勾选界面,让用户按需选要装的 Loader 运行时库:
whiptail
dialog
[*] X11 X11 窗口操作 (嵌入窗口/设为桌面/工作区切换) [*] DBus D-Bus 通信 (全局菜单等) [*] QNetwork 远程图片 / 网络请求 ... [ ] FFmpeg 音视频解码 (视频壁纸/音视频预览)
选中的项通过 setsid 延迟到后台安装,避免和 dpkg 锁冲突,日志写 /var/log/easy-desktop-optional-deps.log。
setsid
dpkg
/var/log/easy-desktop-optional-deps.log
/var/lib/easy-desktop/optional-deps-prompted
apt install
apt-cache show
58/59/60
install_dev_deps.sh:
install_dev_deps.sh
build-essential
qtbase5-dev
qttools5-dev-tools
所有 Loader 都通过运行时动态加载符号,不 include 任何第三方头文件,所以没有编译依赖。
Dock_Bar_Appearance_Dialog
TextEdit_Appearance_Dialog
Mark_Rule_Highlighter
/tmp/Easy_Desktop/backup_config.ini
Ext_Preview_PluginInterface
Ext_Wallpaper_PluginInterface
seek_loader_sender
recive_loader_sender
libtray.so
plugin_widget.cpp
Qt::Tool
FramelessWindowHint
BypassWindowManagerHint
WA_TranslucentBackground
WA_ShowWithoutActivating
Trans_Sender
Trans_Action
Trans_Menu
Trans_PushButton
Trans_CheckBox
Trans_Label
-icon_theme
|
Update_Icon_Theme
想不起来还做了什么了,想到了再说吧╮( ̄▽ ̄)╭
相关链接:
No replies yet
Featured Collection
Popular Ranking
Popular Events
Easy_Desktop 1.2.0-AKA-d26.10.10 更新日志
// 写了3个月,可算把细节写完了
// 写了太多东西了,以至于自己写了什么都不记得了...
关于 Easy_Desktop 载体几何插件设计规则 和 标记规则,这些是开发端才需要关注的,我放另一篇了。
提一下:为了实现音调与速率不同的效果,我放弃了QMediaPlayer,用FFmpeg+PulseAudio/ALSA处理了,这个东西会移植到music-island上的.
关于性能问题:不用担心,我的赛扬都能流畅运行,你们肯定没问题的
tips
保存系统
以前是全量保存,现在只保存和默认配置不一样的项目,缺的会自动补回来。
编译变体精简与动态加载
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,只负责画。支持的标注类型:
工具和交互:
Alt拖拽:切换成“每个标注绕自身中心变换”。快捷键:
Ctrl+Z撤销、Ctrl+Shift+Z/Ctrl+Y重做、Ctrl+C/X/V复制/剪切/粘贴、Ctrl+D原地复制、Ctrl+A全选、Del/Backspace删除、Esc取消、方向键平移(Shift加速 10 倍)。持久化:
.annotations.json(JSON)。.annotations.json,会自动加载。application/x-pdf-annotations+json。PDF 专属:
载体几何插件接口
新增第四类插件接口
Ext_Carrier_Geometry_PluginInterface,用来控制载体里控件的布局、视觉变换、tick 动画。元数据要求:
生命周期:
.soinit(Carrier_Geometry_Interface*)tick_interval_ms() > 0,就按这个间隔调on_tick(elapsed_ms)on_widget_*/on_page_changed/on_container_resizedon_host_save()RemovePlugin()约束:
Basic_Widget处理。on_widget_removed()里清空对该 widget 的所有引用。宿主通过
Carrier_Geometry_Interface提供的能力:载体信息、页管理、控件信息、几何操作、视觉变换(旋转/倾斜/缩放/透明度/透视)、可见性、z-index、信号发送、拖入拖出、鼠标查询、能力位查询。另外,
Carrier_Transform结构体支持纯视觉变换(不影响命中),鼠标靠近时会自动抑制变换,保证点击命中正确。three_d_plugin 3D效果插件的演示效果:
全局菜单
新增
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的菜单栏,支持停在上/下/左/右四边。org.gtk.Menus而不是com.canonical.dbusmenu下暴露菜单)。音频波形图预览
新增
Audio_Wave_Preview/Audio_Wave_Widget,用来在预览窗口里显示音频文件波形。显示模式:
峰值图也集成到了声音服务可视化图表里,可以在声音服务界面右键切换。
交互:
性能:
可视化图表的 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等。非 GUI 环境(没有
QApplication)下默认拒绝执行。SecureSettings继承QSettings,但数据实际放内存里,靠syncSecure()手动触发写入:QTemporaryFile)rename()原子替换目标文件这样配置文件不容易被中途截断,权限也不会被意外放宽。
构建脚本与 deb 安装体验
build_deb.sh:empty和dtk两个变体。core/easy_desktop_version.h读。.deb里Depends只包含 Qt 核心运行时和(仅 dtk 变体)DTK 运行时。Suggests(不会被自动安装)。postinst交互安装:.deb的postinst会弹whiptail/dialog勾选界面,让用户按需选要装的 Loader 运行时库:选中的项通过
setsid延迟到后台安装,避免和dpkg锁冲突,日志写/var/log/easy-desktop-optional-deps.log。/var/lib/easy-desktop/optional-deps-prompted标记文件避免升级时重复弹窗。apt install命令。apt-cache show探测系统上可用的58/59/60。install_dev_deps.sh:build-essential、qtbase5-dev、qttools5-dev-tools。dtk变体需要)。所有 Loader 都通过运行时动态加载符号,不 include 任何第三方头文件,所以没有编译依赖。
其它改动
Dock_Bar_Appearance_Dialog:新增边栏(顶部工具栏 / 底部状态栏通用)外观设置,支持停靠位置、背景色、文字色、悬浮文字色、禁用文字色、圆角、字体。TextEdit_Appearance_Dialog:新增文本编辑器文档外观设置(背景色、圆角)。Mark_Rule_Highlighter:文本编辑器 / 纯文本编辑器的自动标记(语法高亮)规则支持 JSON 和 INI 两种格式。/tmp/Easy_Desktop/backup_config.ini。Ext_Preview_PluginInterface升到 V0.0.4,Ext_Wallpaper_PluginInterface升到 V0.0.3,都支持通过seek_loader_sender/recive_loader_sender访问 Easy_Desktop 内部的 Loader。libtray.so特化处理:在plugin_widget.cpp里对 dde-tray 做专门兼容,把它提升为独立顶层窗口(Qt::Tool+FramelessWindowHint+BypassWindowManagerHint),加WA_TranslucentBackground和WA_ShowWithoutActivating,实时同步位置,并在右键菜单上做拦截——目的仅仅是让它能正常运行。Trans_Sender/Trans_Action/Trans_Menu/Trans_PushButton/Trans_CheckBox/Trans_Label一整套可热更新的翻译控件,所有对话框都支持。-icon_theme参数:多个路径用竖线|分隔。Update_Icon_Theme支持自定义路径 + 缓存默认值 + 恢复默认。想不起来还做了什么了,想到了再说吧╮( ̄▽ ̄)╭
相关链接: