我有一些 cron 作業,可以在我的 KDE 系統上自動在淺色和深色主題之間切換(對於有興趣的人,lookandfeeltool
我可以在全域淺色和深色主題之間進行簡單切換(我必須根據其他人的需求進行更改來定義自己的主題)製作),或者您可以使用調整顏色plasma-theme-switcher
(適用於 X 和 Wayland))。它工作得很好,只是我碰巧依賴了一些不尊重這些的 GTK 應用程式。其中最重要的是基於 Chromium 的瀏覽器/Electron 應用程序,例如 Chrome 本身或 VSCode。
然而有趣的是,儘管 Firefox 是 GTK 應用程序,但它完美地處理了這個問題,並回應主題更改。它也是我運行的唯一 GTK 應用程序,它似乎明白我不想使用 Nautilus 文件資源管理器,而是使用 Dolphin 來顯示所有文件提示。
我的問題是 Firefox 如何做到這一點,為什麼常規 GTK 應用程式不能更優雅地處理這個問題?
我的問題的第二部分是是否有某種我可以觸發的 DBUS 命令,它會導致 GTK 應用程式“檢查主題更改”,以便允許我的程式回應我的腳本。
感謝您的指點
答案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()
(分別)傳回給定狀態的背景色和前景色。
所以顯然答案是透過檢查哪個整數值更大,背景還是前景,並根據該值決定主題是否是黑暗的。