¿Cómo detecta Firefox el cambio de tema claro/oscuro en sistemas KDE?

¿Cómo detecta Firefox el cambio de tema claro/oscuro en sistemas KDE?

Tengo algunos trabajos cron que cambian automáticamente entre temas claros y oscuros en mi sistema KDE (para aquellos interesados, está el lookandfeeltoolque simplemente cambio entre temas claros y oscuros globales (tuve que definir el mío en base a otros con las modificaciones que quería). hacer), o puedes ajustar los colores usandoplasma-theme-switcher(funciona en X y Wayland)). Funciona bien, excepto que dependo de un puñado de aplicaciones GTK, que no las respetan. Los más importantes son los navegadores/aplicaciones Electron basados ​​en Chromium, como el propio Chrome o VSCode.

Curiosamente, Firefox maneja esto perfectamente y responde a los cambios de tema a pesar de ser una aplicación GTK. También es la única aplicación GTK que ejecuto que parece entender que no quiero usar el explorador de archivos Nautilus y, en su lugar, usa Dolphin para todas las solicitudes de archivos.

Mi pregunta es ¿cómo hace esto Firefox y por qué las aplicaciones GTK normales no lo manejan con más gracia?

La segunda parte de mi pregunta es si hay algún tipo de comando DBUS que pueda ejecutar y que haga que las aplicaciones GTK "verifiquen cambios de tema" para permitir que mis programas respondan a mis scripts.

Gracias por cualquier consejo

Respuesta1

Creo que la respuesta se encuentra en el archivo /widget/gtk/nsLookAndFeel.cpp.

Líneas 1190-1200 enel último código estable:


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

La función GDK_RGBA_TO_NS_RGBA()se puede simplificar como:

(Tenga en cuenta que esta no es la implementación real.)

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

Las funcionesgtk_style_context_get_background_color()ygtk_style_context_get_color()devuelve los colores de fondo y primer plano para un estado determinado (respectivamente).

Entonces, aparentemente la respuesta es verificar qué valor entero es mayor, el fondo o el primer plano, y decidir en base a eso si el tema es oscuro o no.

información relacionada