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()
指定された状態の背景色と前景色をそれぞれ返します。
したがって、答えは、背景と前景のどちらの整数値が大きいかを確認し、それに基づいてテーマが暗いかどうかを決定することです。