Index: chrome/browser/ui/libgtkui/gtk_ui.cc |
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc |
index d5160f6d1cafef6408e596ee85b9e63afa3bfbea..a38c6b806be78c594af7213df426a797d7c1b050 100644 |
--- a/chrome/browser/ui/libgtkui/gtk_ui.cc |
+++ b/chrome/browser/ui/libgtkui/gtk_ui.cc |
@@ -58,6 +58,7 @@ |
#include "ui/views/controls/button/blue_button.h" |
#include "ui/views/controls/button/label_button.h" |
#include "ui/views/controls/button/label_button_border.h" |
+#include "ui/views/linux_ui/device_scale_factor_observer.h" |
#include "ui/views/linux_ui/window_button_order_observer.h" |
#include "ui/views/resources/grit/views_resources.h" |
@@ -313,21 +314,6 @@ gfx::FontRenderParams GetGtkFontRenderParams() { |
return params; |
} |
-float GetRawDeviceScaleFactor() { |
- if (display::Display::HasForceDeviceScaleFactor()) |
- return display::Display::GetForcedDeviceScaleFactor(); |
- |
- GdkScreen* screen = gdk_screen_get_default(); |
- gint scale = gdk_screen_get_monitor_scale_factor( |
- screen, gdk_screen_get_primary_monitor(screen)); |
- gdouble resolution = gdk_screen_get_resolution(screen); |
- const float scale_factor = |
- resolution <= 0 ? scale : resolution * scale / kDefaultDPI; |
- // Blacklist scaling factors <120% (crbug.com/484400) and round |
- // to 1 decimal to prevent rendering problems (crbug.com/485183). |
- return scale_factor < 1.2f ? 1.0f : roundf(scale_factor * 10) / 10; |
-} |
- |
views::LinuxUI::NonClientMiddleClickAction GetDefaultMiddleClickAction() { |
std::unique_ptr<base::Environment> env(base::Environment::Create()); |
switch (base::nix::GetDesktopEnvironment(env.get())) { |
@@ -416,19 +402,17 @@ GtkUi::GtkUi() : middle_click_action_(GetDefaultMiddleClickAction()) { |
#if GTK_MAJOR_VERSION == 2 |
native_theme_ = NativeThemeGtk2::instance(); |
fake_window_ = chrome_gtk_frame_new(); |
- gtk_widget_realize(fake_window_); // Is this necessary? |
#elif GTK_MAJOR_VERSION == 3 |
native_theme_ = NativeThemeGtk3::instance(); |
- (void)fake_window_; // Silence the unused warning. |
+ fake_window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
#else |
#error "Unsupported GTK version" |
#endif |
+ gtk_widget_realize(fake_window_); |
} |
GtkUi::~GtkUi() { |
-#if GTK_MAJOR_VERSION == 2 |
gtk_widget_destroy(fake_window_); |
-#endif |
} |
void OnThemeChanged(GObject* obj, GParamSpec* param, GtkUi* gtkui) { |
@@ -442,6 +426,17 @@ void GtkUi::Initialize() { |
g_signal_connect_after(settings, "notify::gtk-icon-theme-name", |
G_CALLBACK(OnThemeChanged), this); |
+ GdkScreen* screen = gdk_screen_get_default(); |
+ // Listen for DPI changes. |
+ g_signal_connect_after(screen, "notify::resolution", |
+ G_CALLBACK(OnDeviceScaleFactorMaybeChangedThunk), |
+ this); |
+ // Listen for scale factor changes. We would prefer to listen on |
+ // |screen|, but there is no scale-factor property, so use an |
+ // unmapped window instead. |
+ g_signal_connect(fake_window_, "notify::scale-factor", |
+ G_CALLBACK(OnDeviceScaleFactorMaybeChangedThunk), this); |
+ |
LoadGtkValues(); |
#if BUILDFLAG(ENABLE_BASIC_PRINTING) |
@@ -703,12 +698,12 @@ void GtkUi::AddWindowButtonOrderObserver( |
observer->OnWindowButtonOrderingChange(leading_buttons_, trailing_buttons_); |
} |
- observer_list_.AddObserver(observer); |
+ window_button_order_observer_list_.AddObserver(observer); |
} |
void GtkUi::RemoveWindowButtonOrderObserver( |
views::WindowButtonOrderObserver* observer) { |
- observer_list_.RemoveObserver(observer); |
+ window_button_order_observer_list_.RemoveObserver(observer); |
} |
void GtkUi::SetWindowButtonOrdering( |
@@ -717,8 +712,10 @@ void GtkUi::SetWindowButtonOrdering( |
leading_buttons_ = leading_buttons; |
trailing_buttons_ = trailing_buttons; |
- for (views::WindowButtonOrderObserver& observer : observer_list_) |
+ for (views::WindowButtonOrderObserver& observer : |
+ window_button_order_observer_list_) { |
observer.OnWindowButtonOrderingChange(leading_buttons_, trailing_buttons_); |
+ } |
} |
void GtkUi::SetNonClientMiddleClickAction(NonClientMiddleClickAction action) { |
@@ -770,6 +767,16 @@ void GtkUi::NotifyWindowManagerStartupComplete() { |
gdk_notify_startup_complete(); |
} |
+void GtkUi::AddDeviceScaleFactorObserver( |
+ views::DeviceScaleFactorObserver* observer) { |
+ device_scale_factor_observer_list_.AddObserver(observer); |
+} |
+ |
+void GtkUi::RemoveDeviceScaleFactorObserver( |
+ views::DeviceScaleFactorObserver* observer) { |
+ device_scale_factor_observer_list_.RemoveObserver(observer); |
+} |
+ |
bool GtkUi::MatchEvent(const ui::Event& event, |
std::vector<ui::TextEditCommandAuraLinux>* commands) { |
// Ensure that we have a keyboard handler. |
@@ -779,6 +786,10 @@ bool GtkUi::MatchEvent(const ui::Event& event, |
return key_bindings_handler_->MatchEvent(event, commands); |
} |
+void GtkUi::OnDeviceScaleFactorMaybeChanged(void*, GParamSpec*) { |
+ UpdateDeviceScaleFactor(); |
+} |
+ |
void GtkUi::SetScrollbarColors() { |
thumb_active_color_ = SkColorSetRGB(244, 244, 244); |
thumb_inactive_color_ = SkColorSetRGB(234, 234, 234); |
@@ -1037,11 +1048,29 @@ void GtkUi::ResetStyle() { |
native_theme_->NotifyObservers(); |
} |
+float GtkUi::GetRawDeviceScaleFactor() { |
+ if (display::Display::HasForceDeviceScaleFactor()) |
+ return display::Display::GetForcedDeviceScaleFactor(); |
+ |
+ GdkScreen* screen = gdk_screen_get_default(); |
+ gint scale = gtk_widget_get_scale_factor(fake_window_); |
+ gdouble resolution = gdk_screen_get_resolution(screen); |
+ const float scale_factor = |
+ resolution <= 0 ? scale : resolution * scale / kDefaultDPI; |
+ // Blacklist scaling factors <120% (crbug.com/484400) and round |
+ // to 1 decimal to prevent rendering problems (crbug.com/485183). |
+ return scale_factor < 1.2f ? 1.0f : roundf(scale_factor * 10) / 10; |
+} |
+ |
void GtkUi::UpdateDeviceScaleFactor() { |
- // Note: Linux chrome currently does not support dynamic DPI |
- // changes. This is to allow flags to override the DPI settings |
- // during startup. |
+ float old_device_scale_factor = device_scale_factor_; |
device_scale_factor_ = GetRawDeviceScaleFactor(); |
+ if (device_scale_factor_ != old_device_scale_factor) { |
+ for (views::DeviceScaleFactorObserver& observer : |
+ device_scale_factor_observer_list_) { |
+ observer.OnDeviceScaleFactorChanged(); |
+ } |
+ } |
UpdateDefaultFont(); |
} |