blob: 11718a68fff46d07c97b904e42ea4891d609806b [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flutter/shell/platform/linux/fl_settings_handler.h"
#include <gmodule.h>
#include "flutter/shell/platform/embedder/embedder.h"
#include "flutter/shell/platform/linux/fl_engine_private.h"
#include "flutter/shell/platform/linux/fl_settings_channel.h"
struct _FlSettingsHandler {
GObject parent_instance;
FlSettingsChannel* channel;
GWeakRef engine;
FlSettings* settings;
};
G_DEFINE_TYPE(FlSettingsHandler, fl_settings_handler, G_TYPE_OBJECT)
static FlSettingsChannelPlatformBrightness to_platform_brightness(
FlColorScheme color_scheme) {
switch (color_scheme) {
case FL_COLOR_SCHEME_LIGHT:
return FL_SETTINGS_CHANNEL_PLATFORM_BRIGHTNESS_LIGHT;
case FL_COLOR_SCHEME_DARK:
return FL_SETTINGS_CHANNEL_PLATFORM_BRIGHTNESS_DARK;
default:
g_assert_not_reached();
}
}
// Sends the current settings to the Flutter engine.
static void update_settings(FlSettingsHandler* self) {
FlClockFormat clock_format = fl_settings_get_clock_format(self->settings);
FlColorScheme color_scheme = fl_settings_get_color_scheme(self->settings);
gdouble scaling_factor = fl_settings_get_text_scaling_factor(self->settings);
fl_settings_channel_send(self->channel, scaling_factor,
clock_format == FL_CLOCK_FORMAT_24H,
to_platform_brightness(color_scheme));
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
if (engine != nullptr) {
int32_t flags = 0;
if (!fl_settings_get_enable_animations(self->settings)) {
flags |= kFlutterAccessibilityFeatureDisableAnimations;
}
if (fl_settings_get_high_contrast(self->settings)) {
flags |= kFlutterAccessibilityFeatureHighContrast;
}
fl_engine_update_accessibility_features(engine, flags);
}
}
static void fl_settings_handler_dispose(GObject* object) {
FlSettingsHandler* self = FL_SETTINGS_HANDLER(object);
g_clear_object(&self->channel);
g_clear_object(&self->settings);
g_weak_ref_clear(&self->engine);
G_OBJECT_CLASS(fl_settings_handler_parent_class)->dispose(object);
}
static void fl_settings_handler_class_init(FlSettingsHandlerClass* klass) {
G_OBJECT_CLASS(klass)->dispose = fl_settings_handler_dispose;
}
static void fl_settings_handler_init(FlSettingsHandler* self) {}
FlSettingsHandler* fl_settings_handler_new(FlEngine* engine) {
g_return_val_if_fail(FL_IS_ENGINE(engine), nullptr);
FlSettingsHandler* self = FL_SETTINGS_HANDLER(
g_object_new(fl_settings_handler_get_type(), nullptr));
g_weak_ref_init(&self->engine, engine);
FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(engine);
self->channel = fl_settings_channel_new(messenger);
return self;
}
void fl_settings_handler_start(FlSettingsHandler* self, FlSettings* settings) {
g_return_if_fail(FL_IS_SETTINGS_HANDLER(self));
g_return_if_fail(FL_IS_SETTINGS(settings));
self->settings = FL_SETTINGS(g_object_ref(settings));
g_signal_connect_object(settings, "changed", G_CALLBACK(update_settings),
self, G_CONNECT_SWAPPED);
update_settings(self);
}