Firefox 如何偵測 KDE 系統上的淺色/深色主題變化?

Firefox 如何偵測 KDE 系統上的淺色/深色主題變化?

我有一些 cron 作業,可以在我的 KDE 系統上自動在淺色和深色主題之間切換(對於有興趣的人,lookandfeeltool我可以在全域淺色和深色主題之間進行簡單切換(我必須根據其他人的需求進行更改來定義自己的主題)製作),或者您可以使用調整顏色plasma-theme-switcher(適用於 X 和 Wayland))。它工作得很好,只是我碰巧依賴了一些不尊重這些的 GTK 應用程式。其中最重要的是基於 Chromium 的瀏覽器/Electron 應用程序,例如 Chrome 本身或 VSCode。

然而有趣的是,儘管 Firefox 是 GTK 應用程序,但它完美地處理了這個問題,並回應主題更改。它也是我運行的唯一 GTK 應用程序,它似乎明白我不想使用 Nautilus 文件資源管理器,而是使用 Dolphin 來顯示所有文件提示。

我的問題是 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()(分別)傳回給定狀態的背景色和前景色。

所以顯然答案是透過檢查哪個整數值更大,背景還是前景,並根據該值決定主題是否是黑暗的。

相關內容