#include "ui/gtk/os_settings_provider_gtk.h"
#include <glib-object.h>
#include <glib.h>
#include <string>
#include "base/containers/contains.h"
#include "base/functional/bind.h"
#include "base/strings/string_util.h"
#include "base/time/time.h"
#include "ui/base/glib/scoped_gsignal.h"
#include "ui/gfx/color_utils.h"
#include "ui/gtk/gtk_compat.h"
#include "ui/gtk/gtk_util.h"
#include "ui/native_theme/native_theme.h"
namespace gtk {
OsSettingsProviderGtk::OsSettingsProviderGtk()
: OsSettingsProvider(PriorityLevel::kProduction) {}
OsSettingsProviderGtk::~OsSettingsProviderGtk() = default;
ui::NativeTheme::PreferredColorScheme
OsSettingsProviderGtk::PreferredColorScheme() const {
return color_utils::IsDark(GetBgColor({}))
? ui::NativeTheme::PreferredColorScheme::kDark
: ui::NativeTheme::PreferredColorScheme::kLight;
}
ui::NativeTheme::PreferredContrast OsSettingsProviderGtk::PreferredContrast()
const {
const std::string theme_name =
base::ToLowerASCII(GetGtkSettingsStringProperty(
gtk_settings_get_default(), "gtk-theme-name"));
const bool high_contrast = base::Contains(theme_name, "high") &&
base::Contains(theme_name, "contrast");
return high_contrast ? ui::NativeTheme::PreferredContrast::kMore
: ui::NativeTheme::PreferredContrast::kNoPreference;
}
base::TimeDelta OsSettingsProviderGtk::CaretBlinkInterval() const {
gint cursor_blink_time = 1200;
gboolean cursor_blink = TRUE;
g_object_get(gtk_settings_get_default(), "gtk-cursor-blink-time",
&cursor_blink_time, "gtk-cursor-blink", &cursor_blink, nullptr);
return cursor_blink ? base::Milliseconds(cursor_blink_time / 2)
: base::TimeDelta();
}
ScopedGSignal OsSettingsProviderGtk::ConnectSignal(const gchar* name) {
return ScopedGSignal(gtk_settings_get_default(), name,
base::BindRepeating(&OsSettingsProviderGtk::OnSignal,
base::Unretained(this)),
G_CONNECT_AFTER);
}
void OsSettingsProviderGtk::OnSignal(GtkSettings*, GtkParamSpec*) {
NotifyOnSettingsChanged();
}
}