Firefox는 KDE 시스템에서 밝은/어두운 테마 변경을 어떻게 감지합니까?

Firefox는 KDE 시스템에서 밝은/어두운 테마 변경을 어떻게 감지합니까?

내 KDE 시스템에는 밝은 테마와 어두운 테마 사이를 자동으로 전환하는 몇 가지 cron 작업이 있습니다(관심 있는 분들을 위해 간단히 전역 밝은 테마와 어두운 테마 사이를 전환하는 곳이 있습니다 lookandfeeltool(나는 원하는 변경 사항을 적용하여 다른 테마를 기반으로 내 자신의 테마를 정의해야 했습니다). 만들기) 또는 다음을 사용하여 색상을 조정할 수 있습니다.plasma-theme-switcher(X 및 Wayland에서 작동)). 이 기능을 존중하지 않는 소수의 GTK 애플리케이션에 의존한다는 점을 제외하면 잘 작동합니다. 그 중 가장 중요한 것은 Chromium 기반 브라우저/Chrome 자체 또는 VSCode와 같은 Electron 앱입니다.

그러나 흥미롭게도 Firefox는 이를 완벽하게 처리하고 GTK 애플리케이션임에도 불구하고 테마 변경에 응답합니다. 그것은 또한 내가 Nautilus 파일 탐색기를 사용하고 싶지 않고 대신 모든 파일 프롬프트에 Dolphin을 사용한다는 것을 이해하는 것처럼 보이는 유일한 GTK 응용 프로그램입니다.

내 질문은 Firefox가 이 작업을 어떻게 수행하는지, 그리고 일반 GTK 앱이 이를 더 우아하게 처리하지 못하는 이유는 무엇입니까?

내 질문의 두 번째 부분은 내 프로그램이 내 스크립트에 응답할 수 있도록 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()주어진 상태에 대한 배경색과 전경색을 각각 반환합니다.

따라서 분명히 대답은 배경 또는 전경 중 어느 정수 값이 더 큰지 확인하고 이에 따라 테마가 어두운지 여부를 결정하는 것입니다.

관련 정보