检测应用程序是否使用 gtk 或 qt

检测应用程序是否使用 gtk 或 qt

之前,我的笔记本电脑使用 Ubuntu 14.04 没有任何问题,但在升级到 Ubuntu 16.04(不是升级,而是格式化)后,我遇到了一些渲染问题。由于我不知道到底发生了什么,所以我无法在这里提供具体细节,所以我还在寻找错误。

我目前的假设是,渲染问题仅影响 gtk 应用程序(例如,一些 PDF 图像在 中渲染效果不佳evince,但在 中则不然Okular)。

我想知道是否有一种方法可以以尽可能简单的方式知道一个应用程序是 gtk 还是 Qt,打开不同的应用程序,查看哪个显示了糟糕的渲染,以及哪个库被用于构建该软件。

答案1

应用程序可以使用 Qt、Tk 和 Gtk(尽管这通常是 -但不总是- 一种非常糟糕的做法)。

因此唯一的方法是启动应用程序并pmap使用应用程序的 pid 检查输出,正如 Lekensteyn 在评论中所提出的那样。

答案2

正如评论中指出的那样,你可以用于列出二进制程序使用的库。在这里,我们还过滤了工具包、和及其版本号的ldd列表:gtkqttk

ldd "$(readlink -f "$(type -p INSERT-APP-NAME-HERE)")" |
grep -Poi '\b(lib)?\K(gtk|qt|tk)([^a-z/]*\d)*(?=[^/]*\.so\b)' | sort -u

但是,如果程序是脚本文件(例如 Python 或 Perl 程序)或使用脚本/程序来启动实际二进制文件,则此方法将不起作用。后者非常常见,例如firefox使用libreoffice启动脚本。在这种情况下,您可以手动检查启动程序以找出实际程序的路径。但即便如此,的输出也ldd可能不完整。至少对于 Firefox 90,打印的列表ldd缺少几乎所有 Firefox 依赖项。

因此,启动程序、运行以下脚本,然后单击您想要了解工具包的窗口可能会更容易、更安全:

grep -Poi '\b(lib)?\K(gtk|qt|tk)([^a-z/]*\d)*(?=[^/]*\.so\b)' \
/proc/"$(xprop _NET_WM_PID | cut -d' ' -f3)"/maps | sort -u

虽然如果xprop找不到所点击窗口的 PID,此操作可能会失败。在这种情况下,您可以$(xprop ...)用类似 的内容替换$(pgrep -o INSERT-APP-NAME-HERE)

相关内容