| // 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_plugin.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/public/flutter_linux/fl_basic_message_channel.h" | |
| #include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h" | |
| #include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h" | |
| static constexpr char kChannelName[] = "flutter/settings"; | |
| static constexpr char kTextScaleFactorKey[] = "textScaleFactor"; | |
| static constexpr char kAlwaysUse24HourFormatKey[] = "alwaysUse24HourFormat"; | |
| static constexpr char kPlatformBrightnessKey[] = "platformBrightness"; | |
| static constexpr char kPlatformBrightnessLight[] = "light"; | |
| static constexpr char kPlatformBrightnessDark[] = "dark"; | |
| struct _FlSettingsPlugin { | |
| GObject parent_instance; | |
| FlBasicMessageChannel* channel; | |
| FlEngine* engine; | |
| FlSettings* settings; | |
| }; | |
| G_DEFINE_TYPE(FlSettingsPlugin, fl_settings_plugin, G_TYPE_OBJECT) | |
| static const gchar* to_platform_brightness(FlColorScheme color_scheme) { | |
| switch (color_scheme) { | |
| case FL_COLOR_SCHEME_LIGHT: | |
| return kPlatformBrightnessLight; | |
| case FL_COLOR_SCHEME_DARK: | |
| return kPlatformBrightnessDark; | |
| default: | |
| g_return_val_if_reached(nullptr); | |
| } | |
| } | |
| // Sends the current settings to the Flutter engine. | |
| static void update_settings(FlSettingsPlugin* 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); | |
| g_autoptr(FlValue) message = fl_value_new_map(); | |
| fl_value_set_string_take(message, kTextScaleFactorKey, | |
| fl_value_new_float(scaling_factor)); | |
| fl_value_set_string_take( | |
| message, kAlwaysUse24HourFormatKey, | |
| fl_value_new_bool(clock_format == FL_CLOCK_FORMAT_24H)); | |
| fl_value_set_string_take( | |
| message, kPlatformBrightnessKey, | |
| fl_value_new_string(to_platform_brightness(color_scheme))); | |
| fl_basic_message_channel_send(self->channel, message, nullptr, nullptr, | |
| nullptr); | |
| if (self->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(self->engine, flags); | |
| } | |
| } | |
| static void fl_settings_plugin_dispose(GObject* object) { | |
| FlSettingsPlugin* self = FL_SETTINGS_PLUGIN(object); | |
| g_clear_object(&self->channel); | |
| g_clear_object(&self->settings); | |
| if (self->engine != nullptr) { | |
| g_object_remove_weak_pointer(G_OBJECT(self), | |
| reinterpret_cast<gpointer*>(&(self->engine))); | |
| self->engine = nullptr; | |
| } | |
| G_OBJECT_CLASS(fl_settings_plugin_parent_class)->dispose(object); | |
| } | |
| static void fl_settings_plugin_class_init(FlSettingsPluginClass* klass) { | |
| G_OBJECT_CLASS(klass)->dispose = fl_settings_plugin_dispose; | |
| } | |
| static void fl_settings_plugin_init(FlSettingsPlugin* self) {} | |
| FlSettingsPlugin* fl_settings_plugin_new(FlEngine* engine) { | |
| g_return_val_if_fail(FL_IS_ENGINE(engine), nullptr); | |
| FlSettingsPlugin* self = | |
| FL_SETTINGS_PLUGIN(g_object_new(fl_settings_plugin_get_type(), nullptr)); | |
| self->engine = engine; | |
| g_object_add_weak_pointer(G_OBJECT(self), | |
| reinterpret_cast<gpointer*>(&(self->engine))); | |
| FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(engine); | |
| g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new(); | |
| self->channel = fl_basic_message_channel_new(messenger, kChannelName, | |
| FL_MESSAGE_CODEC(codec)); | |
| return self; | |
| } | |
| void fl_settings_plugin_start(FlSettingsPlugin* self, FlSettings* settings) { | |
| g_return_if_fail(FL_IS_SETTINGS_PLUGIN(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); | |
| } |