Easy_Desktop是一个非常规桌面
该次更新属于修复性更新
把几个旧插件更新了一下,有超一半升级了新接口,可以搞更多黑魔法了
不过这里我只做了linux x11 amd64下的.其他的最好还是找到对应架构/平台的机器再编译
该示例中的插件为 music-island-B-QT-P,基于新接口完成了几乎覆盖全量代码的重构。示例覆盖以下能力:
QtMultimedia
QtNetwork
QtDBus
libX11
Easy_Desktop
Multimedia_Loader
QNetwork_Loader
Dbus_Loader
PluginsItemInterface
init_V_0_0_3
dde-dock
dde-top-panel
~/.config/music-island/loader.ini
MusicPlayer
QMediaPlayer
XQueryPointer
Trans_Sender
.qm
彻底移除绝对定位:全面改用 QHBoxLayout 和 QVBoxLayout,解决了所有文字挤压、重叠、越界的问题。
QHBoxLayout
QVBoxLayout
尺寸固定:Popup 和试听界面尺寸统一固定为 675 x 350,左侧进度条面板固定为 260 x 240。
675 x 350
260 x 240
进度条重构:摒弃了基于全局鼠标按下的 QS_music_long_move 机制,改用原生 sliderPressed / sliderReleased 信号。修复了拖动进度条松手后会跳回原处的 bug。
QS_music_long_move
sliderPressed
sliderReleased
新增音调(Pitch)控制:新增音调滑块,支持变调,并持久化保存。
按钮美化:音量、进度条、速度、音调的文本标签重新设计为 Media_WidgetAction_Button,支持悬停变色、点击弹窗(Time_Dialog / Single_Int_Dialog)精确输入数值。
Media_WidgetAction_Button
Time_Dialog
Single_Int_Dialog
默认配色:将默认文字颜色调整为黑色,将默认歌词背景调整为半透明,修复了设置颜色后重启失效的问题。
我的赛扬可搞不定那么多架构,平台,我仅仅是做了一些交叉编译测试,最好就是找到物理机器去编译
无论如何,都强烈建议在X11下运行,在wayland上有些魔法用不了(内嵌窗口,全局菜单栏).还有一些奇奇怪怪的特性,我也搞不明白,等我搞到机器再说吧
windows绝对是个神奇的存在(这也太不听话了吧!).我需要用windows端的QtCreator看一下,是交叉编译的问题,还是wine的问题,或者是windows的问题,等我搞到机器再说吧
Weston下测试wayland
从 1.2.0 的 Easy_Desktop_dtk 这种含混名字,统一改为:
1.2.0
Easy_Desktop_dtk
Easy_Desktop___
amd64
i386
armhf
x11
wayland
empty
dtk
dtk 仅 amd64 + x11 发布,其它组合自动跳过。
1.2.1 新增 USE_PLATFORM_WAYLAND 平台宏,与 USE_PLATFORM_X11 / USE_PLATFORM_WIN32 并列:
1.2.1
USE_PLATFORM_WAYLAND
USE_PLATFORM_X11
USE_PLATFORM_WIN32
USE_PLATFORM=wayland
_wayland
Wayland_Loader
wlr-layer-shell
compile_header/wlr_layer_shell_abi.h
wayland_internal_types.h
zwlr_layer_shell_v1
BACKGROUND
My_Wayland_Libs::setAsDesktop()
QPlatformNativeInterface
wl_display*
wl_interface
wl_message
zwlr_layer_surface_v1
Wayland 下自动降级:
All_Control::mouse_effect_supported = false
keyscan
My_X11_Libs::isAvailable()
WAYLAND_DISPLAY
arm64
riscv64
ppc64el
build_deb.sh / install_dev_deps.sh / install_running_deps.sh 全部支持 --arch= 参数。
build_deb.sh
install_dev_deps.sh
install_running_deps.sh
--arch=
libraryload 全靠运行时 dlopen,编译器不参与——所以手写结构体和硬编码偏移必须按指针宽度自适应,否则 32 位下直接崩。
libraryload
dlopen
global_loader.cpp
sizeof
sizeof(void*)
multimedia_loader.cpp
findCodecparInStream
readCodecIdFromCodec
offsetof(AVCodec, id)
+20
compile_header/x11_internal_types.h
sizeof(long)
qdbus_loader.cpp
DBusMessageIter
my_x11_libs.h
#include
pid_t
my_linux_libs.cpp
isReadableMapped
0x00007fffffffffff
0xBFFFFFFF
compile_header/ffmpeg_player.h
QAtomicInteger
AtomicQReal
-latomic
qpdf_backend.cpp
poppler_backend.cpp
QCache::insert
cost
INT_MAX
.pro 里 EASY_DESKTOP_QT_ARCH 按 QT_ARCH 分支,不再硬编码 "i386":
.pro
EASY_DESKTOP_QT_ARCH
QT_ARCH
"i386"
equals(EASY_DESKTOP_32BIT, 1) { DEFINES += _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE _LARGEFILE64_SOURCE exists(/usr/include/i386-linux-gnu) { INCLUDEPATH += /usr/include/i386-linux-gnu } exists(/usr/include/arm-linux-gnueabihf){ INCLUDEPATH += /usr/include/arm-linux-gnueabihf } contains(QT_ARCH, arm) { DEFINES += EASY_DESKTOP_QT_ARCH=\\\"armhf\\\" } else { DEFINES += EASY_DESKTOP_QT_ARCH=\\\"i386\\\" } }
构建环境:
dpkg --add-architecture i386
qtbase5-dev:i386
g++-i686-linux-gnu
qmake -spec linux-g++-32
debootstrap
qemu-user-static
-spec
file
ELF 32-bit
ELF 32-bit ... ARM
./build_deb.sh --target=windows --win-arch=win64
用 MXE 的 qmake,输出:
Easy_Desktop.exe
libgcc_s_*.dll
libstdc++-6.dll
libwinpthread-1.dll
platforms/qwindows.dll
配套改动:
Wasapi_Backend
Wasapi_Player
My_Win_Libs::setAsDesktop()
Progman
WorkerW
SetParent
send_dbus
QLocalServer("Easy_Desktop_IPC")
Global_Loader
.dll
get_command_by_file
make_command
cmd.exe /c
pulse_audio_backend
新增 build_appimage.sh:
build_appimage.sh
./build_appimage.sh [--arch=...] [--platform=...] \
支持 --arch / --platform,环境变量 VARIANT=empty|dtk、OUTPUT=...、NO_LOADER=1。自动打包 Qt 插件、loader 依赖、libdsvg / libdsvgicon。
--arch
--platform
VARIANT=empty|dtk
OUTPUT=...
NO_LOADER=1
libdsvg
libdsvgicon
bug: 左声道获取值不合理
根因: Qt::QueuedConnection + 栈上数组的裸指针(use-after-free)
解决方案: 改为直接调用
backend->setDataCallback([this](const float *left_channel, const float *right_channel, size_t sample_count, int channels) { onAudioData(left_channel, right_channel, sample_count, channels); });
bug: 自动标记信息未被保存
解决方案:在load/save中处理一下就行了
bug: 壁纸插件鼠标效果无效
原因: 忘记为插件启动btnCheck了
添加:
if (mouse_effect_supported && path_list[Path_List_Index].mouse_effect) { btnCheck->m_start(); }
bug: 插件得到的loader指针偏移错误
解决方案: 先将loader static_cast到对应的interface,然后再用P_Sender传
bug: 每30s保存到/tmp的save也会通知插件,这是错误的
解决方案:先临时在Trans_Sender上加一个Trans_Sender::save_from_button,来管理
项目地址:https://github.com/3084793958/Easy_Desktop
该版本并没有加新功能,功能介绍请看 https://bbs.deepin.org/post/302254
测试截图:
确实花心思了,还有动画插图搭配,下了血本了。
我能不能理解成这就是deepin25桌面主题?15元付费下载?
Featured Collection
Popular Ranking
Popular Events
1.2.1-AKA-d26.10.17更新
Easy_Desktop是一个非常规桌面
该次更新属于修复性更新
插件新接口应用
把几个旧插件更新了一下,有超一半升级了新接口,可以搞更多黑魔法了
不过这里我只做了linux x11 amd64下的.其他的最好还是找到对应架构/平台的机器再编译
示例:2026/10/18 基于新接口的全量重构实践
该示例中的插件为 music-island-B-QT-P,基于新接口完成了几乎覆盖全量代码的重构。示例覆盖以下能力:
架构与加载器升级
QtMultimedia、QtNetwork、QtDBus、libX11的硬链接依赖,全面接入Easy_Desktop提供的Multimedia_Loader/QNetwork_Loader/Dbus_Loader。Easy_Desktop新版PluginsItemInterface,支持init_V_0_0_3动态获取宿主 Loader。若在dde-dock或dde-top-panel下运行,则自动降级使用插件内置的 Loader。~/.config/music-island/loader.ini自定义各底层库的加载路径(修复了 XPointer 无法自定义路径的问题)。MusicPlayer封装替代了QMediaPlayer,彻底改用 FFmpeg 解码,支持无损音频。XQueryPointer轮询获取全局点击。Trans_Sender体系,支持通过宿主的动态翻译模块加载.qm文件实时刷新 UI。UI 与布局大修
彻底移除绝对定位:全面改用
QHBoxLayout和QVBoxLayout,解决了所有文字挤压、重叠、越界的问题。尺寸固定:Popup 和试听界面尺寸统一固定为
675 x 350,左侧进度条面板固定为260 x 240。进度条重构:摒弃了基于全局鼠标按下的
QS_music_long_move机制,改用原生sliderPressed/sliderReleased信号。修复了拖动进度条松手后会跳回原处的 bug。新增音调(Pitch)控制:新增音调滑块,支持变调,并持久化保存。
按钮美化:音量、进度条、速度、音调的文本标签重新设计为
Media_WidgetAction_Button,支持悬停变色、点击弹窗(Time_Dialog/Single_Int_Dialog)精确输入数值。默认配色:将默认文字颜色调整为黑色,将默认歌词背景调整为半透明,修复了设置颜色后重启失效的问题。
新架构/平台支持
无论如何,都强烈建议在X11下运行,在wayland上有些魔法用不了(内嵌窗口,全局菜单栏).还有一些奇奇怪怪的特性,我也搞不明白,等我搞到机器再说吧
windows绝对是个神奇的存在(这也太不听话了吧!).我需要用windows端的QtCreator看一下,是交叉编译的问题,还是wine的问题,或者是windows的问题,等我搞到机器再说吧
Weston下测试wayland
产物命名
从
1.2.0的Easy_Desktop_dtk这种含混名字,统一改为::amd64/i386/armhf(其它架构脚本警告后按通用流程继续):x11/wayland:empty/dtkdtk仅amd64+x11发布,其它组合自动跳过。Wayland 平台
1.2.1新增USE_PLATFORM_WAYLAND平台宏,与USE_PLATFORM_X11/USE_PLATFORM_WIN32并列:USE_PLATFORM=wayland,产物命名后缀变为_waylandWayland_Loader手写wlr-layer-shellABI(compile_header/wlr_layer_shell_abi.h+wayland_internal_types.h),把窗口挂到zwlr_layer_shell_v1的BACKGROUND层My_Wayland_Libs::setAsDesktop()通过QPlatformNativeInterface拿wl_display*,再补 layer surface 的 anchor / size / exclusive_zonewl_interface/wl_message描述zwlr_layer_shell_v1与zwlr_layer_surface_v1,不 include 任何 wayland 头文件Wayland 下自动降级:
All_Control::mouse_effect_supported = false,壁纸鼠标效果与keyscan不可用My_X11_Libs::isAvailable()检测WAYLAND_DISPLAY环境变量,XWayland 下判 X11 不可用多架构
amd64dtk变体i386empty变体armhfempty变体arm64/riscv64/ppc64el等build_deb.sh/install_dev_deps.sh/install_running_deps.sh全部支持--arch=参数。32 位 ABI 自适应
libraryload全靠运行时dlopen,编译器不参与——所以手写结构体和硬编码偏移必须按指针宽度自适应,否则 32 位下直接崩。global_loader.cppsizeof默认值按sizeof(void*)分支(64 / 32 位两套实测值)multimedia_loader.cppfindCodecparInStream扫描步长改sizeof(void*);readCodecIdFromCodec用offsetof(AVCodec, id)取代硬编码+20compile_header/x11_internal_types.hsizeof(long)自适应qdbus_loader.cppDBusMessageIter按指针宽度自适应my_x11_libs.h#include拿pid_tmy_linux_libs.cppisReadableMapped用户空间上界按指针宽度分支(64 位0x00007fffffffffff,32 位0xBFFFFFFF)compile_header/ffmpeg_player.hQAtomicInteger/ 自造AtomicQReal,不再链接-latomicqpdf_backend.cpp/poppler_backend.cppQCache::insert的cost钳到INT_MAX(32 位大图 cost 溢出变负数,缓存会丢图).pro里EASY_DESKTOP_QT_ARCH按QT_ARCH分支,不再硬编码"i386":构建环境:
dpkg --add-architecture i386,装qtbase5-dev:i386与g++-i686-linux-gnu,qmake -spec linux-g++-32debootstrap+qemu-user-staticchroot),不加-specfile检查,i386 期望ELF 32-bit,armhf 期望ELF 32-bit ... ARMWindows 交叉编译
用 MXE 的 qmake,输出:
Easy_Desktop.exelibgcc_s_*.dll/libstdc++-6.dll/libwinpthread-1.dll)platforms/qwindows.dll配套改动:
Wasapi_Backend/Wasapi_Player:Windows 音频后端(Pulse / ALSA 的对应物)My_Win_Libs::setAsDesktop():找Progman→WorkerW→SetParent,把窗口挂到桌面层send_dbus在 Win32 下改走QLocalServer("Easy_Desktop_IPC")(没有 session bus)Global_Loader默认路径在 Win32 下改.dllget_command_by_file/make_command改用cmd.exe /cpulse_audio_backend在 Win32 下换成Wasapi_BackendAppImage
新增
build_appimage.sh:支持
--arch/--platform,环境变量VARIANT=empty|dtk、OUTPUT=...、NO_LOADER=1。自动打包 Qt 插件、loader 依赖、libdsvg/libdsvgicon。bug修复:
1.Visual_PulseAudio_Chart
bug: 左声道获取值不合理
根因: Qt::QueuedConnection + 栈上数组的裸指针(use-after-free)
解决方案: 改为直接调用
2.文本框(plain_my_lineedit,my_lineedit,multilinetextinputdialog)
bug: 自动标记信息未被保存
解决方案:在load/save中处理一下就行了
3.壁纸插件宿主
bug: 壁纸插件鼠标效果无效
原因: 忘记为插件启动btnCheck了
添加:
4.loader接口偏移错误
bug: 插件得到的loader指针偏移错误
解决方案: 先将loader static_cast到对应的interface,然后再用P_Sender传
5.通知插件保存逻辑错误
bug: 每30s保存到/tmp的save也会通知插件,这是错误的
解决方案:先临时在Trans_Sender上加一个Trans_Sender::save_from_button,来管理
链接
项目地址:https://github.com/3084793958/Easy_Desktop
该版本并没有加新功能,功能介绍请看 https://bbs.deepin.org/post/302254
测试截图:
