我有几个 cron 任务可以在我的 KDE 系统上自动切换明暗主题(有兴趣的可以看看这个,lookandfeeltool
我可以在全局明暗主题之间切换(我必须根据其他人的定义自己的主题,并根据自己的喜好进行修改),或者你可以使用plasma-theme-switcher
(适用于 X 和 Wayland))。它运行良好,只是我碰巧依赖了一些 GTK 应用程序,它们不尊重这些。其中最重要的是基于 Chromium 的浏览器/Electron 应用程序(例如 Chrome 本身)或 VSCode。
然而有趣的是,Firefox 完美地处理了这个问题,尽管它是一个 GTK 应用程序,但它可以响应主题更改。它也是我运行的唯一一款似乎知道我不想使用 Nautilus 文件资源管理器,而是使用 Dolphin 进行所有文件提示的 GTK 应用程序。
我的问题是 Firefox 是如何做到这一点的,为什么常规 GTK 应用程序不能更好地处理这个问题?
我的问题的第二部分是,是否可以触发某种 DBUS 命令,导致 GTK 应用程序“检查主题更改”,以便允许我的程序响应我的脚本。
谢谢你的指点
答案1
我认为答案就在文件中/widget/gtk/nsLookAndFeel.cpp
。
1190-1200 行最新稳定代码:
// It seems GTK doesn't have an API to query if the current theme is "light" or
// "dark", so we synthesize it from the CSS2 Window/WindowText colors instead,
// by comparing their luminosity.
static bool GetThemeIsDark() {
GdkRGBA bg, fg;
GtkStyleContext* style = GetStyleContext(MOZ_GTK_WINDOW);
gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &bg);
gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &fg);
return RelativeLuminanceUtils::Compute(GDK_RGBA_TO_NS_RGBA(bg)) <
RelativeLuminanceUtils::Compute(GDK_RGBA_TO_NS_RGBA(fg));
}
该函数GDK_RGBA_TO_NS_RGBA()
可以简化为:
(请注意,这不是实际的实现)
#define GDK_RGBA_TO_NS_RGBA(c) \
( \
((c.alpha * 255) << 24) \
| ((c.blue * 255) << 16) \
| ((c.green * 255) << 8) \
| (c.red * 255) \
)
功能gtk_style_context_get_background_color()
和gtk_style_context_get_color()
分别返回给定状态的背景颜色和前景色。
因此显然答案是通过检查哪个整数值更大,背景还是前景,并据此决定主题是否是黑暗的。