Jac*_*der 1 colors kde themes firefox gtk
我有一些 cron 作业,可以在我的 KDE 系统上自动在浅色和深色主题之间切换(对于那些感兴趣的人,lookandfeeltool我可以在全局浅色和深色主题之间简单地切换(我必须根据其他人的需要进行更改来定义自己的主题)制作),或者您可以使用plasma-theme-switcher(适用于 X 和 Wayland))调整颜色。它工作得很好,只是我碰巧依赖了一些不尊重这些的 GTK 应用程序。其中最重要的是基于 Chromium 的浏览器/Electron 应用程序,例如 Chrome 本身或 VSCode。
然而有趣的是,尽管 Firefox 是 GTK 应用程序,但它完美地处理了这个问题,并响应主题更改。它也是我运行的唯一 GTK 应用程序,它似乎明白我不想使用 Nautilus 文件资源管理器,而是使用 Dolphin 来显示所有文件提示。
我的问题是 Firefox 如何做到这一点,为什么常规 GTK 应用程序不能更优雅地处理这个问题?
我的问题的第二部分是是否有某种我可以触发的 DBUS 命令,它会导致 GTK 应用程序“检查主题更改”,以便允许我的程序响应我的脚本。
感谢您的指点
我认为答案就在文件中/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));
}
Run Code Online (Sandbox Code Playgroud)
该函数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) \
)
Run Code Online (Sandbox Code Playgroud)
函数gtk_style_context_get_background_color()和gtk_style_context_get_color()返回给定状态的背景色和前景色(分别)。
所以显然答案是通过检查哪个整数值更大,背景还是前景,并根据该值决定主题是否是黑暗的。
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |