[技术贴] 吐槽一下libqt5-base的奇怪补丁

之前Telegram在GNOME/XFCE上面一直启动不了,参考bug:
https://bugzilla.opensuse.org/show_bug.cgi?id=1149986
简单来说就是一旦安装了libqt5-qtstyleplugins-platformtheme-gtk2这个包,Telegram就没法在GNOME/XFCE/Cinnamon上面启动,KDE上正常。可是又不能把这个包标为和Telegram 冲突,因为Cinnamon是硬依赖这个包的。

经过一晚上调试我发现根本原因是openSUSE对Qt打的一个莫名补丁,把gtk2的主题顺位前调了:
https://build.opensuse.org/package/view_file/KDE:Qt:5.13/libqt5-qtbase/libqt5-prioritise-gtk2-platformtheme.patch?expand=1

这样gtk2和gtk3主题同时存在的话就会优先使用gtk2的主题,导致了上面的问题发生。
现在各大桌面平台已经基本迁移到了gtk3,所以我向bugzilla和邮件列表发布了请求移除这个补丁。

很多补丁都是很早的时候为了解决某个问题加上的,但是后来不需要了可能还留着。你可以看看 .changes 文件里是谁加的这个补丁,什么时候加的,加的原因是什么。还有可以看看隔壁 Fedora/Debian/Arch 有没有这个补丁。如果这个补丁太老,或者别家都没有,那我觉得不该留着。

-------------------------------------------------------------------
Sun Oct  9 16:57:18 UTC 2016 - sor.alexei@meowr.ru
- Add libqt5-prioritise-gtk2-platformtheme.patch: Give
  Gtk2 Platform Theme (from qtstyleplugins) a priority over
  Gtk3 Platform Theme which currently lacks QGtk3Style
  (boo#1002900).

5.7.x 时代加进来的补丁。

https://bugzilla.opensuse.org/show_bug.cgi?id=1002900

可以让他们找一个别的 implementation

别的发行版都没有。

是不是现在Gtk3 平台已经实现了QGtk3Style?
另外“找一个别的Implementation” 是什么意思?不好意思没能理解

啥?GTK+3 平台实现 QGtk3Style?从来没有过,一直都是 Qt 去实现在 GTK+ 桌面用 GTK+ 引擎和主题去渲染自己的 UI。

看这个也许会更好的理解这个问题。现在可能 Qt 只想支持 GTK+ 3(我的理解是这样),所以把这部分全剥离出去做了 qtstyleplugins 这个项目。也就是说想要用 GTK+2 引擎渲染 Qt 程序就需要安装它。

所以很明显,应该是继续使用 gtk2 的桌面去单独安装和使用它。

现在 openSUSE 的 Qt 部分可能是想支持全平台不设置,主动去选择了 gtk2,造成了全程使用 gtk3 的程序,如果碰巧装在了一个安装有 gtk2 主题(和 gtk3 主题)的桌面上,比如 gnome 和 cinnamon 同时安装着,就会默认使用 gtk2 主题渲染,造成程序崩溃。

我理解你想表达的是这个意思。

那另找一个 implementation 可以像 manjaro 那样由各个桌面的维护者去想办法啊。

个人感觉当时不采用各个桌面自己弄的原因是 /etc/environment 只有一个…比如 Cinnamon 设置了,GNOME 也跟着生效,bug 依然还在…不用用户手动干预可能没有别的办法

这跟 Wayland 下输入法面临的问题是一样一样的…

我想知道现在还有继续使用gtk2的桌面吗?GNOME,XFCE和Cinnamon已经都迁移到GTK3了吧?
另外提请注意Cinnamon是hard-depending在qtstyle gtk2 plugin上的,所以gtk2主题插件不是“碰巧”是“一定”会安装。
注意qstylesplugin同时有gtk2和gtk3版本,目前是优先gtk2,而我的意见是提高gtk3的优先级,这个解决方案会有什么问题吗?

我回头看看 Cinnamon 为什么会 hard depends on gtk2。

就算不hard depend,libqt5-qtstyleplugins-platformtheme-gtk2这个包也会被默认推荐安装。我觉得更好的解决方案是把gtk3 plugin的优先级提高到高于gtk2。 @marguerite

现在 Factory 里面的 libqt5-qtbase 已经没有 -gtk2 这个包了啊?

原来的行为就是你说的这个。按你的说法,没有需要 gtk2 的了,直接删掉补丁就行。我的意思也是删掉补丁,谁出问题去解决出问题的那个程序。

这个patch还存在:
https://build.opensuse.org/package/view_file/KDE:Qt:5.13/libqt5-qtbase/libqt5-prioritise-gtk2-platformtheme.patch?expand=1
还有导致这个问题出现的gtk2主题在这个包:
https://pkgs.org/download/libqt5-qtstyleplugins-platformtheme-gtk2

苏姐再去确认一下吧。

能不能告诉我哪个 cinnamon 包?

@marguerite

~> zypper se --requires libqt5-qtstyleplugins-platformtheme-gtk2
S | Name | Summary | Type
–±----------------------------±---------------------------------------------±-------
| cinnamon-session | The session manager for the Cinnamon Desktop | package
| libqt5-qtstyleplugins-devel | Qt 5 Style Plugins Development Files | package
| mate-session-manager | MATE Session Manager | package

https://build.opensuse.org/package/view_file/X11:Cinnamon:Factory/cinnamon-session/cinnamon-session-qt-5.7-styleoverride.patch?expand=1

也是 distro only 的 patch。我回头试试去掉能不能用。

@xzhao

我删除了 cinnamon-session 的那个补丁,并且删除了 libqt5-qtstyleplugins-platformtheme-gtk2

结果发现我的 cinnamon 下面 Qt5 程序跑的好好的(kwrite)。

cinnamon in openSUSE 的主题是默认的 Menta(在 mate-themes 包里) 和 gnome 默认的那个 Adwaita。这两个都是完全支持 gtk3 的主题。

至少就目前我自己的情况来看,那个 libqt5-base 补丁是用来做 libqt5-qtstyleplugins-platformtheme-gtk2 的,而 cinnamon 连那个包都可以不需要。

https://build.opensuse.org/request/show/733954

根据这个人的说法:
https://bugzilla.opensuse.org/show_bug.cgi?id=1149986

没有 libqt5-qtstyleplugins-platformtheme-gtk2 会导致一些Qt程序在GTK环境下使用颜色不匹配的主题。他使用的样例Qt程序是keepass。
对应的两个截图:
https://bugzilla.opensuse.org/attachment.cgi?id=819630

https://bugzilla.opensuse.org/attachment.cgi?id=819626

另外只修改Cinnamon不修改Mate session也会比较奇怪。