Wie erkennt Firefox den Wechsel zum hellen/dunklen Design auf KDE-Systemen?

Wie erkennt Firefox den Wechsel zum hellen/dunklen Design auf KDE-Systemen?

Ich habe ein paar Cron-Jobs, die auf meinem KDE-System automatisch zwischen hellen und dunklen Themen wechseln (für diejenigen, die es interessiert: Es gibt den , lookandfeeltoolbei dem ich einfach zwischen globalen hellen und dunklen Themen wechsle (ich musste mein eigenes basierend auf anderen mit den Änderungen definieren, die ich vornehmen wollte), oder Sie können die Farben anpassen mitplasma-theme-switcher(funktioniert auf X und Wayland)). Es funktioniert gut, außer dass ich mich auf eine Handvoll GTK-Anwendungen verlasse, die diese nicht respektieren. Die wichtigsten davon sind Chromium-basierte Browser / Electron-Apps wie Chrome selbst oder VSCode.

Interessanterweise kommt Firefox damit jedoch perfekt zurecht und reagiert auf Designänderungen, obwohl es sich um eine GTK-Anwendung handelt. Es ist auch die einzige GTK-Anwendung, die ich ausführe und die zu verstehen scheint, dass ich den Nautilus-Dateiexplorer nicht verwenden möchte und stattdessen Dolphin für alle Dateieingabeaufforderungen verwendet.

Meine Frage ist, wie Firefox das macht und warum normale GTK-Apps nicht eleganter damit umgehen.

Der zweite Teil meiner Frage betrifft die Frage, ob es eine Art DBUS-Befehl gibt, den ich ausführen kann, um GTK-Anwendungen dazu zu veranlassen, „nach Designänderungen zu suchen“, damit meine Programme auf meine Skripte reagieren können.

Danke für alle Hinweise

Antwort1

Ich denke, dass die Antwort in der Datei zu finden ist /widget/gtk/nsLookAndFeel.cpp.

Zeilen 1190-1200 inder neueste stabile Code:


// 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));
}

Die Funktion GDK_RGBA_TO_NS_RGBA()kann wie folgt vereinfacht werden:

(Beachten Sie, dass dies nicht die tatsächliche Implementierung ist)

#define GDK_RGBA_TO_NS_RGBA(c)                             \
  (                                                        \
      ((c.alpha * 255) << 24)                              \
    | ((c.blue * 255) << 16)                               \
    | ((c.green * 255) << 8)                               \
    | (c.red * 255)                                        \
  )

Die Funktionengtk_style_context_get_background_color()Undgtk_style_context_get_color()Gibt die Hintergrund- und Vordergrundfarben für einen bestimmten Status zurück.

Die Antwort liegt also offensichtlich darin, zu prüfen, welcher ganzzahlige Wert größer ist, der Hintergrund oder der Vordergrund, und auf dieser Grundlage zu entscheiden, ob das Design dunkel ist oder nicht.

verwandte Informationen