分享一个在 GNOME 上让 Flatpak 的 Qt 应用也能有阴影的方法

背景

我目前在使用 GNOME 桌面,日常使用没有问题,但是总是不可避免地需要使用一些 Qt 应用,特别是我还喜欢使用 Flatpak 来安装一些图形应用,例如 org.prismlauncher.PrismLauncher

                  -- /home/kands/ --
                  pc ~> 81YN
        /\        with ~> Linux 7.1.9-zen1-2-zen
       /  \       pkgs ~> 16 (flatpak-user), 828 (pacman)
      /    \      sh ~> bash
     /      \     wm ~> Mutter 
    /   ,,   \    term ~> GNOME Console
   /   |  |   \   cpu ~> AMD Ryzen 5 4600U (12) @ 4.00 GHz [327.1 K]
  /_-''    ''-_\  gpu ~> Integrated (amdgpu) @ [314.1 K]
                  mem ~> 3.20 GiB (24%)
                  disk ~> 17.45 GiB [btrfs] (4%)

但对于 Flatpak 上的 Qt 应用,由于 GNOME 的种种原因,缺少了阴影,有些应用甚至还缺少标题栏,不太美观,所以我在搜索下注意到了 QAdwaitaDecorations 这个项目

基于这个 issue,这个项目说是已经被 Qt 上游合并了,但实际上应用还是缺少阴影,所以我在 issue 中又翻找了一下,最后看到了这个帖子

解决方法

如这个 PR 所言,现在可以通过 QT_WAYLAND_DECORATION=qadwaitadecorations 这个环境变量来获得较好的 GNOME 窗口装饰支持

但可惜的是,Flathub 上的 org.kde.WaylandDecoration.QAdwaitaDecorations 停在了 6.7 版本,所以只能手动编译并加载了

步骤

安装 KDE Sdk

为了与 Flatpak 应用尽可能使用相同环境,避免奇怪的问题,这里最好使用 Flatpak 提供的 Sdk 环境来编译,其中第一步自然就是要安装 Sdk,具体的 Sdk 版本需要与应用使用的运行时版本对应,这里我使用的是 6.10

flatpak install --user flathub org.kde.Sdk//6.10

这里的 --user 是因为我习惯将 Flatpak 应用分用户安装,如果应用是全局安装,可以去掉

拉取仓库到本地

接下来就要把仓库拉取到本地,也就是 https://github.com/FedoraQt/QAdwaitaDecorations,这里需要注意检查是否支持对应的 KDE 版本,按需选择 tag,对于 6.10 可以直接拉取:

cd path-to-some-folder
git clone https://github.com/FedoraQt/QAdwaitaDecorations.git
cd QAdwaitaDecorations

编译

这一步比较简单,进入到 Flatpak 环境后按照 CMake 的方式编译即可:

flatpak run --user --command=sh --filesystem="$PWD" org.kde.Sdk//6.10
# in sandbox
mkdir build && cd build
cmake .. -DQT_NO_PRIVATE_MODULE_WARNING=ON -DUSE_QT6=ON -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
exit
# out sandbox

编译好后的结果在 build/src 目录下

使用 QAdwaitaDecorations

这里最好可以将编译好的结果放到特定目录下,这里我选择放到 $XDG_DATA_HOME/qt-plugins/$sdk_version 下:

mkdir -p "$XDG_DATA_HOME/qt-plugins/6.10/wayland-decoration-client"
cp "build/src/libqadwaitadecorations.so" "$XDG_DATA_HOME/qt-plugins/6.10/wayland-decoration-client"

然后设置 Flatpak 来加载:

flatpak override --user --filesystem=xdg-data/qt-plugins org.prismlauncher.PrismLauncher
flatpak override --user --env=QT_PLUGIN_PATH=$XDG_DATA_HOME/qt-plugins/6.10 org.prismlauncher.PrismLauncher
flatpak override --user --env=QT_WAYLAND_DECORATION=qadwaitadecorations org.prismlauncher.PrismLauncher

效果演示

正确加载后,就可以看到阴影成功出现了:

对于其他 Qt 应用,只要使用的运行时版本相同,都可以直接使用 flatpak override 来加载这个库,后续如果运行时更新,还需要重新下载对应版本的 Sdk 重新编译,否则大概率无法正常工作,需要注意

后记

GNOME 究竟在搞什么啊,GTK 的字体渲染到现在也没修,GNOME Weather 到现在也还没支持任意地名获取天气,而连基本的显示效果也有各种奇怪的问题,难绷

不过目前所有 DE/WM 我体验下来,只有 KDE 和 GNOME 的体验是相对较好的,其他的多少有些不太能接受的问题等待 修复/改善,而 KDE 我虽然之前在 OpenSUSE 的时候有在使用,后续有因为一些事情有了不太好的印象,所以我目前长时间使用的只有 GNOME

希望 Linux 桌面未来能更稳定一些吧

可以直接安装 CN 仓库中的 qadwaitadecorations-qt5qadwaitadecorations-qt6 包,然后配置 QT_WAYLAND_DECORATION=qadwaitadecorations

嘛,我手动编译是为了尽可能与应用运行时的版本对齐啦,这点我也特别说明了

如果使用 cn 源的库或系统库,万一之后系统更新到了 6.11,而应用还在使用 6.10 的运行时,可能会有问题 ,并且整个流程也并不麻烦,起码对我而言可以接受

实际上 CN 仓库中 lilac 会监控 alpm qt6-base 包自动触发 rebuild 的,所以一般不用太担心

嘛,注意标题,我这里是针对 Flatpak 中的应用,而非通过 pacman 安装的应用,所以我一直在强调运行时的版本