diff --git a/examples/flutter-drm-eglstream-backend/flutter_embedder_options.h b/examples/flutter-drm-eglstream-backend/flutter_embedder_options.h index 8a5cfd4..04138b3 100644 --- a/examples/flutter-drm-eglstream-backend/flutter_embedder_options.h +++ b/examples/flutter-drm-eglstream-backend/flutter_embedder_options.h @@ -21,6 +21,8 @@ class FlutterEmbedderOptions { options_.AddInt("rotation", "r", "Window rotation(degree) [0(default)|90|180|270]", 0, false); + options_.AddDouble("text-scaling-factor", "x", "Text scaling factor", 1.0, + false); options_.AddDouble("force-scale-factor", "s", "Force a scale factor instead using default value", 1.0, false); @@ -83,6 +85,8 @@ class FlutterEmbedderOptions { } } + text_scale_factor_ = options_.GetValue("text-scaling-factor"); + if (options_.Exist("force-scale-factor")) { is_force_scale_factor_ = true; scale_factor_ = options_.GetValue("force-scale-factor"); @@ -154,6 +158,9 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation WindowRotation() const { return window_view_rotation_; } + double TextScaleFactor() const { + return text_scale_factor_; + } bool IsForceScaleFactor() const { return is_force_scale_factor_; } @@ -181,6 +188,7 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation::kRotation_0; bool is_force_scale_factor_; double scale_factor_; + double text_scale_factor_; bool enable_vsync_; }; diff --git a/examples/flutter-drm-eglstream-backend/main.cc b/examples/flutter-drm-eglstream-backend/main.cc index e1da779..37b179e 100644 --- a/examples/flutter-drm-eglstream-backend/main.cc +++ b/examples/flutter-drm-eglstream-backend/main.cc @@ -35,6 +35,7 @@ int main(int argc, char** argv) { view_properties.use_mouse_cursor = options.IsUseMouseCursor(); view_properties.use_onscreen_keyboard = options.IsUseOnscreenKeyboard(); view_properties.use_window_decoration = options.IsUseWindowDecoraation(); + view_properties.text_scale_factor = options.TextScaleFactor(); view_properties.force_scale_factor = options.IsForceScaleFactor(); view_properties.scale_factor = options.ScaleFactor(); view_properties.enable_vsync = options.EnableVsync(); diff --git a/examples/flutter-drm-gbm-backend/flutter_embedder_options.h b/examples/flutter-drm-gbm-backend/flutter_embedder_options.h index 8a5cfd4..04138b3 100644 --- a/examples/flutter-drm-gbm-backend/flutter_embedder_options.h +++ b/examples/flutter-drm-gbm-backend/flutter_embedder_options.h @@ -21,6 +21,8 @@ class FlutterEmbedderOptions { options_.AddInt("rotation", "r", "Window rotation(degree) [0(default)|90|180|270]", 0, false); + options_.AddDouble("text-scaling-factor", "x", "Text scaling factor", 1.0, + false); options_.AddDouble("force-scale-factor", "s", "Force a scale factor instead using default value", 1.0, false); @@ -83,6 +85,8 @@ class FlutterEmbedderOptions { } } + text_scale_factor_ = options_.GetValue("text-scaling-factor"); + if (options_.Exist("force-scale-factor")) { is_force_scale_factor_ = true; scale_factor_ = options_.GetValue("force-scale-factor"); @@ -154,6 +158,9 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation WindowRotation() const { return window_view_rotation_; } + double TextScaleFactor() const { + return text_scale_factor_; + } bool IsForceScaleFactor() const { return is_force_scale_factor_; } @@ -181,6 +188,7 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation::kRotation_0; bool is_force_scale_factor_; double scale_factor_; + double text_scale_factor_; bool enable_vsync_; }; diff --git a/examples/flutter-drm-gbm-backend/main.cc b/examples/flutter-drm-gbm-backend/main.cc index e1da779..37b179e 100644 --- a/examples/flutter-drm-gbm-backend/main.cc +++ b/examples/flutter-drm-gbm-backend/main.cc @@ -35,6 +35,7 @@ int main(int argc, char** argv) { view_properties.use_mouse_cursor = options.IsUseMouseCursor(); view_properties.use_onscreen_keyboard = options.IsUseOnscreenKeyboard(); view_properties.use_window_decoration = options.IsUseWindowDecoraation(); + view_properties.text_scale_factor = options.TextScaleFactor(); view_properties.force_scale_factor = options.IsForceScaleFactor(); view_properties.scale_factor = options.ScaleFactor(); view_properties.enable_vsync = options.EnableVsync(); diff --git a/examples/flutter-external-texture-plugin/flutter_embedder_options.h b/examples/flutter-external-texture-plugin/flutter_embedder_options.h index 8a5cfd4..04138b3 100644 --- a/examples/flutter-external-texture-plugin/flutter_embedder_options.h +++ b/examples/flutter-external-texture-plugin/flutter_embedder_options.h @@ -21,6 +21,8 @@ class FlutterEmbedderOptions { options_.AddInt("rotation", "r", "Window rotation(degree) [0(default)|90|180|270]", 0, false); + options_.AddDouble("text-scaling-factor", "x", "Text scaling factor", 1.0, + false); options_.AddDouble("force-scale-factor", "s", "Force a scale factor instead using default value", 1.0, false); @@ -83,6 +85,8 @@ class FlutterEmbedderOptions { } } + text_scale_factor_ = options_.GetValue("text-scaling-factor"); + if (options_.Exist("force-scale-factor")) { is_force_scale_factor_ = true; scale_factor_ = options_.GetValue("force-scale-factor"); @@ -154,6 +158,9 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation WindowRotation() const { return window_view_rotation_; } + double TextScaleFactor() const { + return text_scale_factor_; + } bool IsForceScaleFactor() const { return is_force_scale_factor_; } @@ -181,6 +188,7 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation::kRotation_0; bool is_force_scale_factor_; double scale_factor_; + double text_scale_factor_; bool enable_vsync_; }; diff --git a/examples/flutter-external-texture-plugin/main.cc b/examples/flutter-external-texture-plugin/main.cc index e1da779..37b179e 100644 --- a/examples/flutter-external-texture-plugin/main.cc +++ b/examples/flutter-external-texture-plugin/main.cc @@ -35,6 +35,7 @@ int main(int argc, char** argv) { view_properties.use_mouse_cursor = options.IsUseMouseCursor(); view_properties.use_onscreen_keyboard = options.IsUseOnscreenKeyboard(); view_properties.use_window_decoration = options.IsUseWindowDecoraation(); + view_properties.text_scale_factor = options.TextScaleFactor(); view_properties.force_scale_factor = options.IsForceScaleFactor(); view_properties.scale_factor = options.ScaleFactor(); view_properties.enable_vsync = options.EnableVsync(); diff --git a/examples/flutter-video-player-plugin/flutter_embedder_options.h b/examples/flutter-video-player-plugin/flutter_embedder_options.h index 8a5cfd4..04138b3 100644 --- a/examples/flutter-video-player-plugin/flutter_embedder_options.h +++ b/examples/flutter-video-player-plugin/flutter_embedder_options.h @@ -21,6 +21,8 @@ class FlutterEmbedderOptions { options_.AddInt("rotation", "r", "Window rotation(degree) [0(default)|90|180|270]", 0, false); + options_.AddDouble("text-scaling-factor", "x", "Text scaling factor", 1.0, + false); options_.AddDouble("force-scale-factor", "s", "Force a scale factor instead using default value", 1.0, false); @@ -83,6 +85,8 @@ class FlutterEmbedderOptions { } } + text_scale_factor_ = options_.GetValue("text-scaling-factor"); + if (options_.Exist("force-scale-factor")) { is_force_scale_factor_ = true; scale_factor_ = options_.GetValue("force-scale-factor"); @@ -154,6 +158,9 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation WindowRotation() const { return window_view_rotation_; } + double TextScaleFactor() const { + return text_scale_factor_; + } bool IsForceScaleFactor() const { return is_force_scale_factor_; } @@ -181,6 +188,7 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation::kRotation_0; bool is_force_scale_factor_; double scale_factor_; + double text_scale_factor_; bool enable_vsync_; }; diff --git a/examples/flutter-video-player-plugin/main.cc b/examples/flutter-video-player-plugin/main.cc index e1da779..37b179e 100644 --- a/examples/flutter-video-player-plugin/main.cc +++ b/examples/flutter-video-player-plugin/main.cc @@ -35,6 +35,7 @@ int main(int argc, char** argv) { view_properties.use_mouse_cursor = options.IsUseMouseCursor(); view_properties.use_onscreen_keyboard = options.IsUseOnscreenKeyboard(); view_properties.use_window_decoration = options.IsUseWindowDecoraation(); + view_properties.text_scale_factor = options.TextScaleFactor(); view_properties.force_scale_factor = options.IsForceScaleFactor(); view_properties.scale_factor = options.ScaleFactor(); view_properties.enable_vsync = options.EnableVsync(); diff --git a/examples/flutter-wayland-client/flutter_embedder_options.h b/examples/flutter-wayland-client/flutter_embedder_options.h index 8a5cfd4..04138b3 100644 --- a/examples/flutter-wayland-client/flutter_embedder_options.h +++ b/examples/flutter-wayland-client/flutter_embedder_options.h @@ -21,6 +21,8 @@ class FlutterEmbedderOptions { options_.AddInt("rotation", "r", "Window rotation(degree) [0(default)|90|180|270]", 0, false); + options_.AddDouble("text-scaling-factor", "x", "Text scaling factor", 1.0, + false); options_.AddDouble("force-scale-factor", "s", "Force a scale factor instead using default value", 1.0, false); @@ -83,6 +85,8 @@ class FlutterEmbedderOptions { } } + text_scale_factor_ = options_.GetValue("text-scaling-factor"); + if (options_.Exist("force-scale-factor")) { is_force_scale_factor_ = true; scale_factor_ = options_.GetValue("force-scale-factor"); @@ -154,6 +158,9 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation WindowRotation() const { return window_view_rotation_; } + double TextScaleFactor() const { + return text_scale_factor_; + } bool IsForceScaleFactor() const { return is_force_scale_factor_; } @@ -181,6 +188,7 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation::kRotation_0; bool is_force_scale_factor_; double scale_factor_; + double text_scale_factor_; bool enable_vsync_; }; diff --git a/examples/flutter-wayland-client/main.cc b/examples/flutter-wayland-client/main.cc index e1da779..37b179e 100644 --- a/examples/flutter-wayland-client/main.cc +++ b/examples/flutter-wayland-client/main.cc @@ -35,6 +35,7 @@ int main(int argc, char** argv) { view_properties.use_mouse_cursor = options.IsUseMouseCursor(); view_properties.use_onscreen_keyboard = options.IsUseOnscreenKeyboard(); view_properties.use_window_decoration = options.IsUseWindowDecoraation(); + view_properties.text_scale_factor = options.TextScaleFactor(); view_properties.force_scale_factor = options.IsForceScaleFactor(); view_properties.scale_factor = options.ScaleFactor(); view_properties.enable_vsync = options.EnableVsync(); diff --git a/examples/flutter-x11-client/flutter_embedder_options.h b/examples/flutter-x11-client/flutter_embedder_options.h index 8a5cfd4..04138b3 100644 --- a/examples/flutter-x11-client/flutter_embedder_options.h +++ b/examples/flutter-x11-client/flutter_embedder_options.h @@ -21,6 +21,8 @@ class FlutterEmbedderOptions { options_.AddInt("rotation", "r", "Window rotation(degree) [0(default)|90|180|270]", 0, false); + options_.AddDouble("text-scaling-factor", "x", "Text scaling factor", 1.0, + false); options_.AddDouble("force-scale-factor", "s", "Force a scale factor instead using default value", 1.0, false); @@ -83,6 +85,8 @@ class FlutterEmbedderOptions { } } + text_scale_factor_ = options_.GetValue("text-scaling-factor"); + if (options_.Exist("force-scale-factor")) { is_force_scale_factor_ = true; scale_factor_ = options_.GetValue("force-scale-factor"); @@ -154,6 +158,9 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation WindowRotation() const { return window_view_rotation_; } + double TextScaleFactor() const { + return text_scale_factor_; + } bool IsForceScaleFactor() const { return is_force_scale_factor_; } @@ -181,6 +188,7 @@ class FlutterEmbedderOptions { flutter::FlutterViewController::ViewRotation::kRotation_0; bool is_force_scale_factor_; double scale_factor_; + double text_scale_factor_; bool enable_vsync_; }; diff --git a/examples/flutter-x11-client/main.cc b/examples/flutter-x11-client/main.cc index e1da779..37b179e 100644 --- a/examples/flutter-x11-client/main.cc +++ b/examples/flutter-x11-client/main.cc @@ -35,6 +35,7 @@ int main(int argc, char** argv) { view_properties.use_mouse_cursor = options.IsUseMouseCursor(); view_properties.use_onscreen_keyboard = options.IsUseOnscreenKeyboard(); view_properties.use_window_decoration = options.IsUseWindowDecoraation(); + view_properties.text_scale_factor = options.TextScaleFactor(); view_properties.force_scale_factor = options.IsForceScaleFactor(); view_properties.scale_factor = options.ScaleFactor(); view_properties.enable_vsync = options.EnableVsync(); diff --git a/src/client_wrapper/flutter_view_controller.cc b/src/client_wrapper/flutter_view_controller.cc index 9b412a3..42e3d21 100644 --- a/src/client_wrapper/flutter_view_controller.cc +++ b/src/client_wrapper/flutter_view_controller.cc @@ -40,6 +40,7 @@ FlutterViewController::FlutterViewController( view_properties.use_onscreen_keyboard; c_view_properties.use_window_decoration = view_properties.use_window_decoration; + c_view_properties.text_scale_factor = view_properties.text_scale_factor; c_view_properties.force_scale_factor = view_properties.force_scale_factor; c_view_properties.scale_factor = view_properties.scale_factor; c_view_properties.enable_vsync = view_properties.enable_vsync; diff --git a/src/client_wrapper/include/flutter/flutter_view_controller.h b/src/client_wrapper/include/flutter/flutter_view_controller.h index b0403c5..1659a56 100644 --- a/src/client_wrapper/include/flutter/flutter_view_controller.h +++ b/src/client_wrapper/include/flutter/flutter_view_controller.h @@ -76,6 +76,9 @@ class FlutterViewController { // This option is only active for Wayland backend. bool use_window_decoration; + // Text scaling factor. + double text_scale_factor; + // Force scale factor specified by command line argument bool force_scale_factor; double scale_factor; diff --git a/src/flutter/shell/platform/linux_embedded/flutter_elinux.cc b/src/flutter/shell/platform/linux_embedded/flutter_elinux.cc index 99313f2..4ceb598 100644 --- a/src/flutter/shell/platform/linux_embedded/flutter_elinux.cc +++ b/src/flutter/shell/platform/linux_embedded/flutter_elinux.cc @@ -100,6 +100,9 @@ FlutterDesktopViewControllerRef FlutterDesktopViewControllerCreate( if (!state->view->GetEngine()->RunWithEntrypoint(nullptr)) { return nullptr; } + + const float text_scaling_factor = view_properties->text_scale_factor; + state->view->GetEngine()->SetSystemSettings(text_scaling_factor); } // Must happen after engine is running. diff --git a/src/flutter/shell/platform/linux_embedded/flutter_elinux_engine.cc b/src/flutter/shell/platform/linux_embedded/flutter_elinux_engine.cc index e71961e..76e83b3 100644 --- a/src/flutter/shell/platform/linux_embedded/flutter_elinux_engine.cc +++ b/src/flutter/shell/platform/linux_embedded/flutter_elinux_engine.cc @@ -277,11 +277,6 @@ bool FlutterELinuxEngine::RunWithEntrypoint(const char* entrypoint) { return false; } - // TODO: add theme initial value support. - view_->UpdateHighContrastEnabled(false); - - SendSystemLocales(); - return true; } @@ -384,6 +379,15 @@ void FlutterELinuxEngine::ReloadSystemFonts() { embedder_api_.ReloadSystemFonts(engine_); } +void FlutterELinuxEngine::SetSystemSettings(float text_scaling_factor) { + view_->UpdateTextScaleFactor(text_scaling_factor); + + // TODO: add theme initial value support. + view_->UpdateHighContrastEnabled(false); + + SendSystemLocales(); +} + void FlutterELinuxEngine::SendSystemLocales() { auto languages = flutter::GetPreferredLanguageInfo(); auto flutter_locales = flutter::ConvertToFlutterLocale(languages); diff --git a/src/flutter/shell/platform/linux_embedded/flutter_elinux_engine.h b/src/flutter/shell/platform/linux_embedded/flutter_elinux_engine.h index c05c1fa..5708707 100644 --- a/src/flutter/shell/platform/linux_embedded/flutter_elinux_engine.h +++ b/src/flutter/shell/platform/linux_embedded/flutter_elinux_engine.h @@ -127,6 +127,9 @@ class FlutterELinuxEngine { // Gets the status whether Impeller is enabled. bool IsImpellerEnabled() const { return enable_impeller_; } + // Sets system settings. + void SetSystemSettings(float text_scaling_factor); + private: // Allows swapping out embedder_api_ calls in tests. friend class EngineEmbedderApiModifier; diff --git a/src/flutter/shell/platform/linux_embedded/flutter_elinux_view.cc b/src/flutter/shell/platform/linux_embedded/flutter_elinux_view.cc index c5c2269..ec625d6 100644 --- a/src/flutter/shell/platform/linux_embedded/flutter_elinux_view.cc +++ b/src/flutter/shell/platform/linux_embedded/flutter_elinux_view.cc @@ -510,4 +510,8 @@ void FlutterELinuxView::UpdateHighContrastEnabled(bool enabled) { settings_handler_->UpdateHighContrastMode(enabled); } +void FlutterELinuxView::UpdateTextScaleFactor(float factor) { + settings_handler_->UpdateTextScaleFactor(factor); +} + } // namespace flutter diff --git a/src/flutter/shell/platform/linux_embedded/flutter_elinux_view.h b/src/flutter/shell/platform/linux_embedded/flutter_elinux_view.h index 1a5ff51..977bd3e 100644 --- a/src/flutter/shell/platform/linux_embedded/flutter_elinux_view.h +++ b/src/flutter/shell/platform/linux_embedded/flutter_elinux_view.h @@ -148,6 +148,9 @@ class FlutterELinuxView : public WindowBindingHandlerDelegate { // |WindowBindingHandlerDelegate| void UpdateHighContrastEnabled(bool enabled) override; + // |WindowBindingHandlerDelegate| + void UpdateTextScaleFactor(float factor) override; + private: // Struct holding the mouse state. The engine doesn't keep track of which // mouse buttons have been pressed, so it's the embedding's responsibility. diff --git a/src/flutter/shell/platform/linux_embedded/plugins/settings_plugin.cc b/src/flutter/shell/platform/linux_embedded/plugins/settings_plugin.cc index 3492cdb..6e11873 100644 --- a/src/flutter/shell/platform/linux_embedded/plugins/settings_plugin.cc +++ b/src/flutter/shell/platform/linux_embedded/plugins/settings_plugin.cc @@ -50,8 +50,12 @@ bool SettingsPlugin::GetAlwaysUse24HourFormat() { } float SettingsPlugin::GetTextScaleFactor() { - // The current OS does not have text scale factor. - return 1.0; + return text_scaling_factor_; +} + +void SettingsPlugin::UpdateTextScaleFactor(float factor) { + text_scaling_factor_ = factor; + SendSettings(); } SettingsPlugin::PlatformBrightness SettingsPlugin::GetPreferredBrightness() { diff --git a/src/flutter/shell/platform/linux_embedded/plugins/settings_plugin.h b/src/flutter/shell/platform/linux_embedded/plugins/settings_plugin.h index 25f1058..0029f69 100644 --- a/src/flutter/shell/platform/linux_embedded/plugins/settings_plugin.h +++ b/src/flutter/shell/platform/linux_embedded/plugins/settings_plugin.h @@ -34,6 +34,9 @@ class SettingsPlugin { // Update the high contrast status of the system. void UpdateHighContrastMode(bool is_high_contrast); + // Update the text scale factor of the system. + void UpdateTextScaleFactor(float factor); + private: // Returns `true` if the user uses 24 hour time. bool GetAlwaysUse24HourFormat(); @@ -44,11 +47,10 @@ class SettingsPlugin { // Returns the user-preferred brightness. PlatformBrightness GetPreferredBrightness(); - bool is_high_contrast_ = false; - - private: std::unique_ptr> channel_; WindowBindingHandler* delegate_; + bool is_high_contrast_ = false; + float text_scaling_factor_ = 1.0; }; } // namespace flutter diff --git a/src/flutter/shell/platform/linux_embedded/public/flutter_elinux.h b/src/flutter/shell/platform/linux_embedded/public/flutter_elinux.h index d5f2234..97d9343 100644 --- a/src/flutter/shell/platform/linux_embedded/public/flutter_elinux.h +++ b/src/flutter/shell/platform/linux_embedded/public/flutter_elinux.h @@ -106,6 +106,9 @@ typedef struct { // This option is only active for Wayland backend. bool use_window_decoration; + // Text scaling factor. + double text_scale_factor; + // Force scale factor specified by command line argument bool force_scale_factor; double scale_factor; diff --git a/src/flutter/shell/platform/linux_embedded/window_binding_handler_delegate.h b/src/flutter/shell/platform/linux_embedded/window_binding_handler_delegate.h index fd7369e..3bc6429 100644 --- a/src/flutter/shell/platform/linux_embedded/window_binding_handler_delegate.h +++ b/src/flutter/shell/platform/linux_embedded/window_binding_handler_delegate.h @@ -107,6 +107,9 @@ class WindowBindingHandlerDelegate { // Update the status of the high contrast feature virtual void UpdateHighContrastEnabled(bool enabled) = 0; + + // Update the status of the text scaling factor feature + virtual void UpdateTextScaleFactor(float factor) = 0; }; } // namespace flutter