Firefox 如何检测 KDE 系统上的浅色/深色主题变化?

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 应用程序“检查主题更改”,以便允许我的程序响应我的脚本。

感谢您的指点

Yog*_*ann 5

我认为答案就在文件中/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()返回给定状态的背景色和前景色(分别)。

所以显然答案是通过检查哪个整数值更大,背景还是前景,并根据该值决定主题是否是黑暗的。