Firefox 如何检测 KDE 系统上的明暗主题变化?

Firefox 如何检测 KDE 系统上的明暗主题变化?

我有几个 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()分别返回给定状态的背景颜色和前景色。

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

相关内容