Firefox は KDE システムでライト/ダークテーマの変更をどのように検出しますか?

Firefox は KDE システムでライト/ダークテーマの変更をどのように検出しますか?

KDEシステムでライトテーマとダークテーマを自動的に切り替えるcronジョブがいくつかあります(興味のある方のために、lookandfeeltoolグローバルなライトテーマとダークテーマを切り替える方法があります(他のテーマに基づいて独自のテーマを定義する必要がありましたが、変更したいテーマは自分で定義する必要がありました)。または、plasma-theme-switcher(X および Wayland で動作)) うまく動作しますが、たまたま私が依存している GTK アプリケーションがこれらを尊重していません。最も重要なのは、Chrome 自体や VSCode などの Chromium ベースのブラウザー / Electron アプリです。

しかし興味深いことに、Firefox はこれを完璧に処理し、GTK アプリケーションであるにもかかわらずテーマの変更に応答します。また、これは私が実行している唯一の GTK アプリケーションであり、Nautilus ファイル エクスプローラーを使用せず、代わりにすべてのファイル プロンプトに Dolphin を使用することを理解しているようです。

私の質問は、Firefox はこれをどうやって行うのか、そしてなぜ通常の GTK アプリはこれをもっとうまく処理しないのかということです。

私の質問の 2 番目の部分は、プログラムがスクリプトに応答できるようにするために、GTK アプリケーションに「テーマの変更をチェック」させる DBUS コマンドを実行できるかどうかです。

何かアドバイスがあればよろしくお願いします

答え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()指定された状態の背景色と前景色をそれぞれ返します。

したがって、答えは、背景と前景のどちらの整数値が大きいかを確認し、それに基づいてテーマが暗いかどうかを決定することです。

関連情報