[App Sharing] Easy_Desktop 1.2.1:插件使用新接口 + X11/Wayland/多架构 + 32 位适配
Tofloor
poster avatar
曾子康 TIM
deepin
11 hours ago
Author

1.2.1-AKA-d26.10.17更新

Easy_Desktop是一个非常规桌面

该次更新属于修复性更新

插件新接口应用

把几个旧插件更新了一下,有超一半升级了新接口,可以搞更多黑魔法了

不过这里我只做了linux x11 amd64下的.其他的最好还是找到对应架构/平台的机器再编译

示例:2026/10/18 基于新接口的全量重构实践

该示例中的插件为 music-island-B-QT-P,基于新接口完成了几乎覆盖全量代码的重构。示例覆盖以下能力:

架构与加载器升级

  • 全动态加载 (Loader):移除了对 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。
  • 动态库路径配置:新增 UI 设置,可通过配置文件 ~/.config/music-island/loader.ini 自定义各底层库的加载路径(修复了 XPointer 无法自定义路径的问题)。
  • 核心播放器:用 MusicPlayer 封装替代了 QMediaPlayer,彻底改用 FFmpeg 解码,支持无损音频。
  • 全局鼠标监听:废弃了易崩溃的 XRecord,改用 XQueryPointer 轮询获取全局点击。
  • 翻译模块:接入 Easy_Desktop 的 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)精确输入数值。

  • 默认配色:将默认文字颜色调整为黑色,将默认歌词背景调整为半透明,修复了设置颜色后重启失效的问题。

    E_new_p2.png

    E_new_p1.png

新架构/平台支持

我的赛扬可搞不定那么多架构,平台,我仅仅是做了一些交叉编译测试,最好就是找到物理机器去编译

无论如何,都强烈建议在X11下运行,在wayland上有些魔法用不了(内嵌窗口,全局菜单栏).还有一些奇奇怪怪的特性,我也搞不明白,等我搞到机器再说吧

windows绝对是个神奇的存在(这也太不听话了吧!).我需要用windows端的QtCreator看一下,是交叉编译的问题,还是wine的问题,或者是windows的问题,等我搞到机器再说吧

Weston下测试wayland

weston.png

产物命名

从 1.2.0 的 Easy_Desktop_dtk 这种含混名字,统一改为:

Easy_Desktop___
  • :amd64 / i386 / armhf(其它架构脚本警告后按通用流程继续)
  • :x11 / wayland
  • :empty / dtk

dtk 仅 amd64 + x11 发布,其它组合自动跳过。

Wayland 平台

1.2.1 新增 USE_PLATFORM_WAYLAND 平台宏,与 USE_PLATFORM_X11 / USE_PLATFORM_WIN32 并列:

  • 构建时 USE_PLATFORM=wayland,产物命名后缀变为 _wayland
  • Wayland_Loader 手写 wlr-layer-shell ABI(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_zone
  • 手写 wl_interface / wl_message 描述 zwlr_layer_shell_v1 与 zwlr_layer_surface_v1,不 include 任何 wayland 头文件

Wayland 下自动降级:

  • All_Control::mouse_effect_supported = false,壁纸鼠标效果与 keyscan 不可用
  • X11 专属功能(嵌入窗口、设为桌面、工作区切换)返回空操作
  • My_X11_Libs::isAvailable() 检测 WAYLAND_DISPLAY 环境变量,XWayland 下判 X11 不可用

多架构

架构 状态 说明
amd64 ✅ 主线 唯一发布 dtk 变体
i386 ✅ 已测试 仅 empty 变体
armhf ✅ 已测试 仅 empty 变体
arm64 / riscv64 / ppc64el 等 ⚠️ 未测试 脚本警告后按通用流程继续

build_deb.sh / install_dev_deps.sh / install_running_deps.sh 全部支持 --arch= 参数。

32 位 ABI 自适应

libraryload 全靠运行时 dlopen,编译器不参与——所以手写结构体和硬编码偏移必须按指针宽度自适应,否则 32 位下直接崩。

文件 改造点
global_loader.cpp 各 Qt 类 sizeof 默认值按 sizeof(void*) 分支(64 / 32 位两套实测值)
multimedia_loader.cpp findCodecparInStream 扫描步长改 sizeof(void*);readCodecIdFromCodec 用 offsetof(AVCodec, id) 取代硬编码 +20
compile_header/x11_internal_types.h 手写 X11 结构体按 sizeof(long) 自适应
qdbus_loader.cpp 手写 DBusMessageIter 按指针宽度自适应
my_x11_libs.h 补 #include 拿 pid_t
my_linux_libs.cpp isReadableMapped 用户空间上界按指针宽度分支(64 位 0x00007fffffffffff,32 位 0xBFFFFFFF)
compile_header/ffmpeg_player.h 8 字节原子类型改 QAtomicInteger / 自造 AtomicQReal,不再链接 -latomic
qpdf_backend.cpp / poppler_backend.cpp QCache::insert 的 cost 钳到 INT_MAX(32 位大图 cost 溢出变负数,缓存会丢图)

.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\\\"
    }
}

构建环境:

  • i386:宿主开多架构 dpkg --add-architecture i386,装 qtbase5-dev:i386 与 g++-i686-linux-gnu,qmake -spec linux-g++-32
  • armhf:原生 armhf 环境(debootstrap + qemu-user-static chroot),不加 -spec
  • ELF 校验:编完 file 检查,i386 期望 ELF 32-bit,armhf 期望 ELF 32-bit ... ARM

Windows 交叉编译

./build_deb.sh --target=windows --win-arch=win64

用 MXE 的 qmake,输出:

  • Easy_Desktop.exe
  • Qt5 Core / Gui / Widgets / Network / Svg DLL
  • MinGW 运行时(libgcc_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 下改 .dll
  • get_command_by_file / make_command 改用 cmd.exe /c
  • pulse_audio_backend 在 Win32 下换成 Wasapi_Backend

AppImage

新增 build_appimage.sh:

./build_appimage.sh [--arch=...] [--platform=...] \
         

支持 --arch / --platform,环境变量 VARIANT=empty|dtk、OUTPUT=...、NO_LOADER=1。自动打包 Qt 插件、loader 依赖、libdsvg / libdsvgicon。

bug修复:

1.Visual_PulseAudio_Chart

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);
});

2.文本框(plain_my_lineedit,my_lineedit,multilinetextinputdialog)

bug: 自动标记信息未被保存

解决方案:在load/save中处理一下就行了

3.壁纸插件宿主

bug: 壁纸插件鼠标效果无效

原因: 忘记为插件启动btnCheck了

添加:

if (mouse_effect_supported && path_list[Path_List_Index].mouse_effect)
{
    btnCheck->m_start();
}

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

测试截图:
p3.png

Reply Favorite View the author
All Replies
avatar
流星追月
deepin
7 hours ago
#1

确实花心思了,还有动画插图搭配,下了血本了。

我能不能理解成这就是deepin25桌面主题?15元付费下载?

Reply View the author