Split LinuxUi into (LinuxUi, LinuxUiTheme)
LinuxUi was previously used in 2 ways:
- for global settings (eg. caret blink interval)
- for theme settings which are specific to a profile
- eg. the window background color
- multiple profiles may use different themes at the same time
(eg. GTK and QT)
It was up to callers to make the correct choice of using the global
LinuxUi instance or the theme-specific one. This CL splits LinuxUi
into global and a theme-specific interface to prevent incorrectly using
the wrong interface. Some instances of this are caught and fixed in
this CL.
R=sky
Bug: 1317782
Change-Id: I717af684f42d229b03ea6972becb7bd013e7cdf2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3885999
Auto-Submit: Thomas Anderson <[email protected]>
Commit-Queue: Thomas Anderson <[email protected]>
Reviewed-by: Scott Violet <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1046956}
diff --git a/ui/gtk/gtk_ui.cc b/ui/gtk/gtk_ui.cc
index 7d1c3407f..46edb98 100644
--- a/ui/gtk/gtk_ui.cc
+++ b/ui/gtk/gtk_ui.cc
@@ -165,9 +165,9 @@
return params;
}
-ui::LinuxUi::WindowFrameAction GetDefaultMiddleClickAction() {
+ui::LinuxUiTheme::WindowFrameAction GetDefaultMiddleClickAction() {
if (GtkCheckVersion(3, 14))
- return ui::LinuxUi::WindowFrameAction::kNone;
+ return ui::LinuxUiTheme::WindowFrameAction::kNone;
std::unique_ptr<base::Environment> env(base::Environment::Create());
switch (base::nix::GetDesktopEnvironment(env.get())) {
case base::nix::DESKTOP_ENVIRONMENT_KDE4:
@@ -176,9 +176,9 @@
// middle mouse button to create tab groups. We don't support that in
// Chrome, but at least avoid lowering windows in response to middle
// clicks to avoid surprising users who expect the KDE behavior.
- return ui::LinuxUi::WindowFrameAction::kNone;
+ return ui::LinuxUiTheme::WindowFrameAction::kNone;
default:
- return ui::LinuxUi::WindowFrameAction::kLower;
+ return ui::LinuxUiTheme::WindowFrameAction::kLower;
}
}
@@ -242,8 +242,8 @@
// so this must be done after to avoid the race condition.
shell_dialog_linux::Initialize();
- using Action = ui::LinuxUi::WindowFrameAction;
- using ActionSource = ui::LinuxUi::WindowFrameActionSource;
+ using Action = ui::LinuxUiTheme::WindowFrameAction;
+ using ActionSource = ui::LinuxUiTheme::WindowFrameActionSource;
window_frame_actions_ = {
{ActionSource::kDoubleClick, Action::kToggleMaximize},
{ActionSource::kMiddleClick, GetDefaultMiddleClickAction()},
@@ -479,7 +479,7 @@
std::move(policy));
}
-ui::LinuxUi::WindowFrameAction GtkUi::GetWindowFrameAction(
+ui::LinuxUiTheme::WindowFrameAction GtkUi::GetWindowFrameAction(
WindowFrameActionSource source) {
return window_frame_actions_[source];
}
@@ -626,6 +626,10 @@
}
#endif
+ui::LinuxUiTheme* GtkUi::AsLinuxUiTheme() {
+ return this;
+}
+
void GtkUi::OnThemeChanged(GtkSettings* settings, GtkParamSpec* param) {
colors_.clear();
custom_frame_colors_.clear();
diff --git a/ui/gtk/gtk_ui.h b/ui/gtk/gtk_ui.h
index 3bf62d4..afa299a 100644
--- a/ui/gtk/gtk_ui.h
+++ b/ui/gtk/gtk_ui.h
@@ -37,7 +37,7 @@
class SettingsProvider;
// Interface to GTK desktop features.
-class GtkUi : public ui::LinuxUi {
+class GtkUi : public ui::LinuxUi, public ui::LinuxUiTheme {
public:
GtkUi();
@@ -57,11 +57,29 @@
void SetWindowFrameAction(WindowFrameActionSource source,
WindowFrameAction action);
- // ui::LinuxInputMethodContextFactory:
+ // ui::LinuxUi:
+ bool Initialize() override;
+ base::TimeDelta GetCursorBlinkInterval() const override;
+ gfx::Image GetIconForContentType(const std::string& content_type,
+ int size,
+ float scale) const override;
+ float GetDeviceScaleFactor() const override;
+ base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override;
+#if BUILDFLAG(ENABLE_PRINTING)
+ printing::PrintDialogLinuxInterface* CreatePrintDialog(
+ printing::PrintingContextLinux* context) override;
+ gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) override;
+#endif
+ ui::SelectFileDialog* CreateSelectFileDialog(
+ void* listener,
+ std::unique_ptr<ui::SelectFilePolicy> policy) const override;
+ std::string GetCursorThemeName() override;
+ int GetCursorThemeSize() override;
std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
ui::LinuxInputMethodContextDelegate* delegate) const override;
-
- // gfx::LinuxFontDelegate:
+ bool GetTextEditCommandsForEvent(
+ const ui::Event& event,
+ std::vector<ui::TextEditCommandAuraLinux>* commands) override;
gfx::FontRenderParams GetDefaultFontRenderParams() const override;
void GetDefaultFontDescription(
std::string* family_out,
@@ -69,14 +87,10 @@
int* style_out,
int* weight_out,
gfx::FontRenderParams* params_out) const override;
+ bool AnimationsEnabled() const override;
+ LinuxUiTheme* AsLinuxUiTheme() override;
- // ui::ShellDialogLinux:
- ui::SelectFileDialog* CreateSelectFileDialog(
- void* listener,
- std::unique_ptr<ui::SelectFilePolicy> policy) const override;
-
- // ui::LinuxUi:
- bool Initialize() override;
+ // ui::LinuxUiTheme:
ui::NativeTheme* GetNativeTheme() const override;
bool GetColor(int id, SkColor* color, bool use_custom_frame) const override;
bool GetDisplayProperty(int id, int* result) const override;
@@ -85,32 +99,11 @@
SkColor GetActiveSelectionFgColor() const override;
SkColor GetInactiveSelectionBgColor() const override;
SkColor GetInactiveSelectionFgColor() const override;
- base::TimeDelta GetCursorBlinkInterval() const override;
- gfx::Image GetIconForContentType(const std::string& content_type,
- int size,
- float scale) const override;
WindowFrameAction GetWindowFrameAction(
WindowFrameActionSource source) override;
- float GetDeviceScaleFactor() const override;
bool PreferDarkTheme() const override;
- bool AnimationsEnabled() const override;
std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
- base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override;
- std::string GetCursorThemeName() override;
- int GetCursorThemeSize() override;
-
- // ui::TextEditKeybindingDelegate:
- bool GetTextEditCommandsForEvent(
- const ui::Event& event,
- std::vector<ui::TextEditCommandAuraLinux>* commands) override;
-
-#if BUILDFLAG(ENABLE_PRINTING)
- // printing::PrintingContextLinuxDelegate:
- printing::PrintDialogLinuxInterface* CreatePrintDialog(
- printing::PrintingContextLinux* context) override;
- gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) override;
-#endif
private:
using TintMap = std::map<int, color_utils::HSL>;
diff --git a/ui/gtk/settings_provider_gsettings.cc b/ui/gtk/settings_provider_gsettings.cc
index 9ac11213..920b080 100644
--- a/ui/gtk/settings_provider_gsettings.cc
+++ b/ui/gtk/settings_provider_gsettings.cc
@@ -116,22 +116,22 @@
GtkUi::WindowFrameAction action;
if (click_action == "none") {
- action = ui::LinuxUi::WindowFrameAction::kNone;
+ action = ui::LinuxUiTheme::WindowFrameAction::kNone;
} else if (click_action == "lower") {
- action = ui::LinuxUi::WindowFrameAction::kLower;
+ action = ui::LinuxUiTheme::WindowFrameAction::kLower;
} else if (click_action == "minimize") {
- action = ui::LinuxUi::WindowFrameAction::kMinimize;
+ action = ui::LinuxUiTheme::WindowFrameAction::kMinimize;
} else if (click_action == "toggle-maximize") {
- action = ui::LinuxUi::WindowFrameAction::kToggleMaximize;
+ action = ui::LinuxUiTheme::WindowFrameAction::kToggleMaximize;
} else {
// While we want to have the default state be lower if there isn't a
// value, we want to default to no action if the user has explicitly
// chose an action that we don't implement.
- action = ui::LinuxUi::WindowFrameAction::kNone;
+ action = ui::LinuxUiTheme::WindowFrameAction::kNone;
}
delegate_->SetWindowFrameAction(
- ui::LinuxUi::WindowFrameActionSource::kMiddleClick, action);
+ ui::LinuxUiTheme::WindowFrameActionSource::kMiddleClick, action);
}
} // namespace gtk
diff --git a/ui/gtk/settings_provider_gtk.cc b/ui/gtk/settings_provider_gtk.cc
index 76f51c7..c8e8196 100644
--- a/ui/gtk/settings_provider_gtk.cc
+++ b/ui/gtk/settings_provider_gtk.cc
@@ -32,15 +32,15 @@
void ParseActionString(const std::string& value,
GtkUi::WindowFrameAction* action) {
if (value == "none")
- *action = ui::LinuxUi::WindowFrameAction::kNone;
+ *action = ui::LinuxUiTheme::WindowFrameAction::kNone;
else if (value == "lower")
- *action = ui::LinuxUi::WindowFrameAction::kLower;
+ *action = ui::LinuxUiTheme::WindowFrameAction::kLower;
else if (value == "minimize")
- *action = ui::LinuxUi::WindowFrameAction::kMinimize;
+ *action = ui::LinuxUiTheme::WindowFrameAction::kMinimize;
else if (value == "toggle-maximize")
- *action = ui::LinuxUi::WindowFrameAction::kToggleMaximize;
+ *action = ui::LinuxUiTheme::WindowFrameAction::kToggleMaximize;
else if (value == "menu")
- *action = ui::LinuxUi::WindowFrameAction::kMenu;
+ *action = ui::LinuxUiTheme::WindowFrameAction::kMenu;
}
} // namespace
@@ -48,8 +48,8 @@
SettingsProviderGtk::FrameActionSettingWatcher::FrameActionSettingWatcher(
SettingsProviderGtk* settings_provider,
const std::string& setting_name,
- ui::LinuxUi::WindowFrameActionSource action_type,
- ui::LinuxUi::WindowFrameAction default_action)
+ ui::LinuxUiTheme::WindowFrameActionSource action_type,
+ ui::LinuxUiTheme::WindowFrameAction default_action)
: settings_provider_(settings_provider),
setting_name_(setting_name),
action_type_(action_type),
@@ -91,18 +91,18 @@
frame_action_setting_watchers_.push_back(
std::make_unique<FrameActionSettingWatcher>(
this, "gtk-titlebar-middle-click",
- ui::LinuxUi::WindowFrameActionSource::kMiddleClick,
- ui::LinuxUi::WindowFrameAction::kNone));
+ ui::LinuxUiTheme::WindowFrameActionSource::kMiddleClick,
+ ui::LinuxUiTheme::WindowFrameAction::kNone));
frame_action_setting_watchers_.push_back(
std::make_unique<FrameActionSettingWatcher>(
this, "gtk-titlebar-double-click",
- ui::LinuxUi::WindowFrameActionSource::kDoubleClick,
- ui::LinuxUi::WindowFrameAction::kToggleMaximize));
+ ui::LinuxUiTheme::WindowFrameActionSource::kDoubleClick,
+ ui::LinuxUiTheme::WindowFrameAction::kToggleMaximize));
frame_action_setting_watchers_.push_back(
std::make_unique<FrameActionSettingWatcher>(
this, "gtk-titlebar-right-click",
- ui::LinuxUi::WindowFrameActionSource::kRightClick,
- ui::LinuxUi::WindowFrameAction::kMenu));
+ ui::LinuxUiTheme::WindowFrameActionSource::kRightClick,
+ ui::LinuxUiTheme::WindowFrameAction::kMenu));
} else {
signal_id_decoration_layout_ =
g_signal_connect_after(settings, "notify::gtk-theme-name",
diff --git a/ui/gtk/settings_provider_gtk.h b/ui/gtk/settings_provider_gtk.h
index bb6c7e6..be8e679 100644
--- a/ui/gtk/settings_provider_gtk.h
+++ b/ui/gtk/settings_provider_gtk.h
@@ -33,10 +33,11 @@
private:
class FrameActionSettingWatcher {
public:
- FrameActionSettingWatcher(SettingsProviderGtk* settings_provider,
- const std::string& setting_name,
- ui::LinuxUi::WindowFrameActionSource action_type,
- ui::LinuxUi::WindowFrameAction default_action);
+ FrameActionSettingWatcher(
+ SettingsProviderGtk* settings_provider,
+ const std::string& setting_name,
+ ui::LinuxUiTheme::WindowFrameActionSource action_type,
+ ui::LinuxUiTheme::WindowFrameAction default_action);
FrameActionSettingWatcher(const FrameActionSettingWatcher&) = delete;
FrameActionSettingWatcher& operator=(const FrameActionSettingWatcher&) =
@@ -53,8 +54,8 @@
private:
raw_ptr<SettingsProviderGtk> settings_provider_;
std::string setting_name_;
- ui::LinuxUi::WindowFrameActionSource action_type_;
- ui::LinuxUi::WindowFrameAction default_action_;
+ ui::LinuxUiTheme::WindowFrameActionSource action_type_;
+ ui::LinuxUiTheme::WindowFrameAction default_action_;
unsigned long signal_id_;
};
diff --git a/ui/linux/fake_linux_ui.cc b/ui/linux/fake_linux_ui.cc
index 398fa37..4e5a8c9 100644
--- a/ui/linux/fake_linux_ui.cc
+++ b/ui/linux/fake_linux_ui.cc
@@ -84,7 +84,7 @@
return gfx::Image();
}
-LinuxUi::WindowFrameAction FakeLinuxUi::GetWindowFrameAction(
+LinuxUiTheme::WindowFrameAction FakeLinuxUi::GetWindowFrameAction(
WindowFrameActionSource source) {
return WindowFrameAction::kNone;
}
@@ -143,4 +143,8 @@
}
#endif
+LinuxUiTheme* FakeLinuxUi::AsLinuxUiTheme() {
+ return this;
+}
+
} // namespace ui
diff --git a/ui/linux/fake_linux_ui.h b/ui/linux/fake_linux_ui.h
index 98d82cb..1b20990 100644
--- a/ui/linux/fake_linux_ui.h
+++ b/ui/linux/fake_linux_ui.h
@@ -12,7 +12,7 @@
// This class is meant to be overridden by tests. It's provided as a
// convenience so that tests don't have to stub lots of methods just to override
// a single one.
-class FakeLinuxUi : public LinuxUi {
+class FakeLinuxUi : public LinuxUi, public LinuxUiTheme {
public:
FakeLinuxUi();
~FakeLinuxUi() override;
@@ -60,6 +60,7 @@
printing::PrintingContextLinux* context) override;
gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) override;
#endif
+ LinuxUiTheme* AsLinuxUiTheme() override;
};
} // namespace ui
diff --git a/ui/linux/linux_ui.cc b/ui/linux/linux_ui.cc
index 92e7fea1..b86efef 100644
--- a/ui/linux/linux_ui.cc
+++ b/ui/linux/linux_ui.cc
@@ -31,20 +31,6 @@
return g_linux_ui;
}
-// static
-LinuxUi* LinuxUi::GetForWindow(aura::Window* window) {
- if (auto* getter = LinuxUiGetter::instance())
- return getter->GetForWindow(window);
- return nullptr;
-}
-
-// static
-LinuxUi* LinuxUi::GetForProfile(Profile* profile) {
- if (auto* getter = LinuxUiGetter::instance())
- return getter->GetForProfile(profile);
- return nullptr;
-}
-
LinuxUi::LinuxUi() = default;
LinuxUi::~LinuxUi() = default;
@@ -57,16 +43,6 @@
LinuxUi::CmdLineArgs::~CmdLineArgs() = default;
-void LinuxUi::AddWindowButtonOrderObserver(
- WindowButtonOrderObserver* observer) {
- window_button_order_observer_list_.AddObserver(observer);
-}
-
-void LinuxUi::RemoveWindowButtonOrderObserver(
- WindowButtonOrderObserver* observer) {
- window_button_order_observer_list_.RemoveObserver(observer);
-}
-
void LinuxUi::AddDeviceScaleFactorObserver(
DeviceScaleFactorObserver* observer) {
device_scale_factor_observer_list_.AddObserver(observer);
@@ -91,6 +67,10 @@
cursor_theme_observer_list_.RemoveObserver(observer);
}
+const LinuxUiTheme* LinuxUi::AsLinuxUiTheme() const {
+ return const_cast<LinuxUi*>(this)->AsLinuxUiTheme();
+}
+
// static
LinuxUi::CmdLineArgs LinuxUi::CopyCmdLine(
const base::CommandLine& command_line) {
@@ -112,4 +92,32 @@
return cmd_line;
}
+LinuxUiTheme::LinuxUiTheme() = default;
+
+LinuxUiTheme::~LinuxUiTheme() = default;
+
+// static
+LinuxUiTheme* LinuxUiTheme::GetForWindow(aura::Window* window) {
+ if (auto* getter = LinuxUiGetter::instance())
+ return getter->GetForWindow(window);
+ return nullptr;
+}
+
+// static
+LinuxUiTheme* LinuxUiTheme::GetForProfile(Profile* profile) {
+ if (auto* getter = LinuxUiGetter::instance())
+ return getter->GetForProfile(profile);
+ return nullptr;
+}
+
+void LinuxUiTheme::AddWindowButtonOrderObserver(
+ WindowButtonOrderObserver* observer) {
+ window_button_order_observer_list_.AddObserver(observer);
+}
+
+void LinuxUiTheme::RemoveWindowButtonOrderObserver(
+ WindowButtonOrderObserver* observer) {
+ window_button_order_observer_list_.RemoveObserver(observer);
+}
+
} // namespace ui
diff --git a/ui/linux/linux_ui.h b/ui/linux/linux_ui.h
index e1779234..dbfa760 100644
--- a/ui/linux/linux_ui.h
+++ b/ui/linux/linux_ui.h
@@ -9,7 +9,6 @@
#include <string>
#include <vector>
-#include "base/callback.h"
#include "base/command_line.h"
#include "base/component_export.h"
#include "base/containers/flat_map.h"
@@ -22,6 +21,7 @@
// be executed behind this interface.
using SkColor = uint32_t;
+// TODO(thomasanderson): Remove Profile forward declaration.
class Profile;
namespace aura {
@@ -50,6 +50,7 @@
class Event;
class LinuxInputMethodContext;
class LinuxInputMethodContextDelegate;
+class LinuxUiTheme;
class NativeTheme;
class NavButtonProvider;
class SelectFileDialog;
@@ -62,26 +63,6 @@
// project that wants to do linux desktop native rendering.
class COMPONENT_EXPORT(LINUX_UI) LinuxUi {
public:
- using GetLinuxUiForWindowCallback =
- base::RepeatingCallback<LinuxUi*(aura::Window*)>;
-
- // Describes the window management actions that could be taken in response to
- // a middle click in the non client area.
- enum class WindowFrameAction {
- kNone,
- kLower,
- kMinimize,
- kToggleMaximize,
- kMenu,
- };
-
- // The types of clicks that might invoke a WindowFrameAction.
- enum class WindowFrameActionSource {
- kDoubleClick,
- kMiddleClick,
- kRightClick,
- };
-
LinuxUi(const LinuxUi&) = delete;
LinuxUi& operator=(const LinuxUi&) = delete;
virtual ~LinuxUi();
@@ -97,19 +78,6 @@
// running with the "--ash" flag.)
static LinuxUi* instance();
- // Returns the LinuxUi instance for the given window.
- static LinuxUi* GetForWindow(aura::Window* window);
-
- // Returns the LinuxUi instance for the given profile.
- static LinuxUi* GetForProfile(Profile* profile);
-
- // Notifies the observer about changes about how window buttons should be
- // laid out.
- void AddWindowButtonOrderObserver(WindowButtonOrderObserver* observer);
-
- // Removes the observer from the LinuxUI's list.
- void RemoveWindowButtonOrderObserver(WindowButtonOrderObserver* observer);
-
// Registers |observer| to be notified about changes to the device
// scale factor.
void AddDeviceScaleFactorObserver(DeviceScaleFactorObserver* observer);
@@ -124,23 +92,10 @@
void RemoveCursorThemeObserver(CursorThemeManagerObserver* observer);
- // Returns the native theme for this toolkit.
- virtual ui::NativeTheme* GetNativeTheme() const = 0;
-
// Returns true on success. If false is returned, this instance shouldn't
// be used and the behavior of all functions is undefined.
[[nodiscard]] virtual bool Initialize() = 0;
- virtual bool GetColor(int id,
- SkColor* color,
- bool use_custom_frame) const = 0;
- virtual bool GetDisplayProperty(int id, int* result) const = 0;
- // Returns the preferences that we pass to Blink.
- virtual SkColor GetFocusRingColor() const = 0;
- virtual SkColor GetActiveSelectionBgColor() const = 0;
- virtual SkColor GetActiveSelectionFgColor() const = 0;
- virtual SkColor GetInactiveSelectionBgColor() const = 0;
- virtual SkColor GetInactiveSelectionFgColor() const = 0;
virtual base::TimeDelta GetCursorBlinkInterval() const = 0;
// Returns the icon for a given content type from the icon theme.
@@ -150,29 +105,9 @@
int size,
float scale) const = 0;
- // What action we should take when the user clicks on the non-client area.
- // |source| describes the type of click.
- virtual WindowFrameAction GetWindowFrameAction(
- WindowFrameActionSource source) = 0;
-
// Determines the device scale factor of the primary screen.
virtual float GetDeviceScaleFactor() const = 0;
- // Only used on GTK to indicate if the dark GTK theme variant is
- // preferred.
- virtual bool PreferDarkTheme() const = 0;
-
- // Returns a new NavButtonProvider, or nullptr if the underlying
- // toolkit does not support drawing client-side navigation buttons.
- virtual std::unique_ptr<NavButtonProvider> CreateNavButtonProvider() = 0;
-
- // Returns a WindowFrameProvider, or nullptr if the underlying toolkit does
- // not support drawing client-side window decorations. |solid_frame| indicates
- // if transparency is unsupported and the frame should be rendered opaque.
- // The returned object is not owned by the caller and will remain alive until
- // the process ends.
- virtual WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) = 0;
-
// Returns a map of KeyboardEvent code to KeyboardEvent key values.
virtual base::flat_map<std::string, std::string> GetKeyboardLayoutMap() = 0;
@@ -226,6 +161,12 @@
// Indicates if animations are enabled by the toolkit.
virtual bool AnimationsEnabled() const = 0;
+ // Casts `this` to a LinuxUiTheme. Should only be used by tests or LinuxUi
+ // internals. Otherwise, use the accessors in LinuxUiTheme instead.
+ virtual LinuxUiTheme* AsLinuxUiTheme() = 0;
+
+ const LinuxUiTheme* AsLinuxUiTheme() const;
+
protected:
struct CmdLineArgs {
CmdLineArgs();
@@ -247,11 +188,6 @@
static CmdLineArgs CopyCmdLine(const base::CommandLine& command_line);
- const base::ObserverList<WindowButtonOrderObserver>::Unchecked&
- window_button_order_observer_list() const {
- return window_button_order_observer_list_;
- }
-
const base::ObserverList<DeviceScaleFactorObserver>::Unchecked&
device_scale_factor_observer_list() const {
return device_scale_factor_observer_list_;
@@ -263,12 +199,6 @@
}
private:
- static GetLinuxUiForWindowCallback get_linux_ui_for_window_callback_;
-
- // Objects to notify when the window frame button order changes.
- base::ObserverList<WindowButtonOrderObserver>::Unchecked
- window_button_order_observer_list_;
-
// Objects to notify when the device scale factor changes.
base::ObserverList<DeviceScaleFactorObserver>::Unchecked
device_scale_factor_observer_list_;
@@ -277,6 +207,91 @@
base::ObserverList<CursorThemeManagerObserver> cursor_theme_observer_list_;
};
+class COMPONENT_EXPORT(LINUX_UI) LinuxUiTheme {
+ public:
+ // Describes the window management actions that could be taken in response to
+ // a middle click in the non client area.
+ enum class WindowFrameAction {
+ kNone,
+ kLower,
+ kMinimize,
+ kToggleMaximize,
+ kMenu,
+ };
+
+ // The types of clicks that might invoke a WindowFrameAction.
+ enum class WindowFrameActionSource {
+ kDoubleClick,
+ kMiddleClick,
+ kRightClick,
+ };
+
+ LinuxUiTheme(const LinuxUiTheme&) = delete;
+ LinuxUiTheme& operator=(const LinuxUiTheme&) = delete;
+ virtual ~LinuxUiTheme();
+
+ // Returns the LinuxUi instance for the given window.
+ static LinuxUiTheme* GetForWindow(aura::Window* window);
+
+ // Returns the LinuxUi instance for the given profile.
+ static LinuxUiTheme* GetForProfile(Profile* profile);
+
+ // Notifies the observer about changes about how window buttons should be
+ // laid out.
+ void AddWindowButtonOrderObserver(WindowButtonOrderObserver* observer);
+
+ // Removes the observer from the LinuxUI's list.
+ void RemoveWindowButtonOrderObserver(WindowButtonOrderObserver* observer);
+
+ // Returns the native theme for this toolkit.
+ virtual ui::NativeTheme* GetNativeTheme() const = 0;
+
+ virtual bool GetColor(int id,
+ SkColor* color,
+ bool use_custom_frame) const = 0;
+ virtual bool GetDisplayProperty(int id, int* result) const = 0;
+
+ // Returns the preferences that we pass to Blink.
+ virtual SkColor GetFocusRingColor() const = 0;
+ virtual SkColor GetActiveSelectionBgColor() const = 0;
+ virtual SkColor GetActiveSelectionFgColor() const = 0;
+ virtual SkColor GetInactiveSelectionBgColor() const = 0;
+ virtual SkColor GetInactiveSelectionFgColor() const = 0;
+
+ // What action we should take when the user clicks on the non-client area.
+ // |source| describes the type of click.
+ virtual WindowFrameAction GetWindowFrameAction(
+ WindowFrameActionSource source) = 0;
+
+ // Only used on GTK to indicate if the dark GTK theme variant is
+ // preferred.
+ virtual bool PreferDarkTheme() const = 0;
+
+ // Returns a new NavButtonProvider, or nullptr if the underlying
+ // toolkit does not support drawing client-side navigation buttons.
+ virtual std::unique_ptr<NavButtonProvider> CreateNavButtonProvider() = 0;
+
+ // Returns a WindowFrameProvider, or nullptr if the underlying toolkit does
+ // not support drawing client-side window decorations. |solid_frame| indicates
+ // if transparency is unsupported and the frame should be rendered opaque.
+ // The returned object is not owned by the caller and will remain alive until
+ // the process ends.
+ virtual WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) = 0;
+
+ const base::ObserverList<WindowButtonOrderObserver>::Unchecked&
+ window_button_order_observer_list() const {
+ return window_button_order_observer_list_;
+ }
+
+ protected:
+ LinuxUiTheme();
+
+ private:
+ // Objects to notify when the window frame button order changes.
+ base::ObserverList<WindowButtonOrderObserver>::Unchecked
+ window_button_order_observer_list_;
+};
+
} // namespace ui
#endif // UI_LINUX_LINUX_UI_H_
diff --git a/ui/linux/linux_ui_factory.cc b/ui/linux/linux_ui_factory.cc
index 77f36b1..eb7c74d 100644
--- a/ui/linux/linux_ui_factory.cc
+++ b/ui/linux/linux_ui_factory.cc
@@ -81,12 +81,12 @@
}
}
-LinuxUi* GetLinuxUi(SystemTheme system_theme) {
+LinuxUiTheme* GetLinuxUiTheme(SystemTheme system_theme) {
switch (system_theme) {
case SystemTheme::kQt:
- return GetQtUi();
+ return GetQtUi()->AsLinuxUiTheme();
case SystemTheme::kGtk:
- return GetGtkUi();
+ return GetGtkUi()->AsLinuxUiTheme();
case SystemTheme::kDefault:
return nullptr;
}
diff --git a/ui/linux/linux_ui_factory.h b/ui/linux/linux_ui_factory.h
index aa60909..a1757677 100644
--- a/ui/linux/linux_ui_factory.h
+++ b/ui/linux/linux_ui_factory.h
@@ -11,6 +11,7 @@
namespace ui {
class LinuxUi;
+class LinuxUiTheme;
enum class SystemTheme : int;
// TODO(https://crbug.com/1317782): Remove in M110.
@@ -23,7 +24,7 @@
LinuxUi* GetDefaultLinuxUi();
COMPONENT_EXPORT(LINUX_UI_FACTORY)
-LinuxUi* GetLinuxUi(SystemTheme system_theme);
+LinuxUiTheme* GetLinuxUiTheme(SystemTheme system_theme);
COMPONENT_EXPORT(LINUX_UI_FACTORY)
SystemTheme GetDefaultSystemTheme();
diff --git a/ui/linux/linux_ui_getter.h b/ui/linux/linux_ui_getter.h
index 1de1c83..d237e5c6 100644
--- a/ui/linux/linux_ui_getter.h
+++ b/ui/linux/linux_ui_getter.h
@@ -15,9 +15,9 @@
namespace ui {
-class LinuxUi;
+class LinuxUiTheme;
-// Use the getters in LinuxUi instead of using this class directly.
+// Use the getters in LinuxUiTheme instead of using this class directly.
class COMPONENT_EXPORT(LINUX_UI) LinuxUiGetter {
public:
LinuxUiGetter& operator=(const LinuxUiGetter&) = delete;
@@ -26,8 +26,8 @@
LinuxUiGetter();
virtual ~LinuxUiGetter();
- virtual LinuxUi* GetForWindow(aura::Window* window) = 0;
- virtual LinuxUi* GetForProfile(Profile* profile) = 0;
+ virtual LinuxUiTheme* GetForWindow(aura::Window* window) = 0;
+ virtual LinuxUiTheme* GetForProfile(Profile* profile) = 0;
static LinuxUiGetter* instance() { return instance_; }
static void set_instance(LinuxUiGetter* instance) { instance_ = instance; }
diff --git a/ui/qt/qt_ui.cc b/ui/qt/qt_ui.cc
index b9411a5f..12d9725 100644
--- a/ui/qt/qt_ui.cc
+++ b/ui/qt/qt_ui.cc
@@ -322,6 +322,10 @@
}
#endif
+ui::LinuxUiTheme* QtUi::AsLinuxUiTheme() {
+ return this;
+}
+
void QtUi::FontChanged() {
auto params = shim_->GetFontRenderParams();
auto desc = shim_->GetFontDescription();
diff --git a/ui/qt/qt_ui.h b/ui/qt/qt_ui.h
index bab9d6e6..21fc63e2 100644
--- a/ui/qt/qt_ui.h
+++ b/ui/qt/qt_ui.h
@@ -25,7 +25,9 @@
class QtNativeTheme;
// Interface to QT desktop features.
-class QtUi : public ui::LinuxUi, QtInterface::Delegate {
+class QtUi : public ui::LinuxUi,
+ public ui::LinuxUiTheme,
+ QtInterface::Delegate {
public:
explicit QtUi(ui::LinuxUi* fallback_linux_ui);
@@ -34,11 +36,29 @@
~QtUi() override;
- // ui::LinuxInputMethodContextFactory:
+ // ui::LinuxUi:
+ bool Initialize() override;
+ base::TimeDelta GetCursorBlinkInterval() const override;
+ gfx::Image GetIconForContentType(const std::string& content_type,
+ int size,
+ float scale) const override;
+ float GetDeviceScaleFactor() const override;
+ base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override;
+#if BUILDFLAG(ENABLE_PRINTING)
+ printing::PrintDialogLinuxInterface* CreatePrintDialog(
+ printing::PrintingContextLinux* context) override;
+ gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) override;
+#endif
+ ui::SelectFileDialog* CreateSelectFileDialog(
+ void* listener,
+ std::unique_ptr<ui::SelectFilePolicy> policy) const override;
+ std::string GetCursorThemeName() override;
+ int GetCursorThemeSize() override;
std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
ui::LinuxInputMethodContextDelegate* delegate) const override;
-
- // gfx::LinuxFontDelegate:
+ bool GetTextEditCommandsForEvent(
+ const ui::Event& event,
+ std::vector<ui::TextEditCommandAuraLinux>* commands) override;
gfx::FontRenderParams GetDefaultFontRenderParams() const override;
void GetDefaultFontDescription(
std::string* family_out,
@@ -46,14 +66,10 @@
int* style_out,
int* weight_out,
gfx::FontRenderParams* params_out) const override;
+ bool AnimationsEnabled() const override;
+ LinuxUiTheme* AsLinuxUiTheme() override;
- // ui::ShellDialogLinux:
- ui::SelectFileDialog* CreateSelectFileDialog(
- void* listener,
- std::unique_ptr<ui::SelectFilePolicy> policy) const override;
-
- // ui::LinuxUi:
- bool Initialize() override;
+ // ui::LinuxUiTheme:
ui::NativeTheme* GetNativeTheme() const override;
bool GetColor(int id, SkColor* color, bool use_custom_frame) const override;
bool GetDisplayProperty(int id, int* result) const override;
@@ -62,33 +78,11 @@
SkColor GetActiveSelectionFgColor() const override;
SkColor GetInactiveSelectionBgColor() const override;
SkColor GetInactiveSelectionFgColor() const override;
- base::TimeDelta GetCursorBlinkInterval() const override;
- gfx::Image GetIconForContentType(const std::string& content_type,
- int size,
- float scale) const override;
WindowFrameAction GetWindowFrameAction(
WindowFrameActionSource source) override;
- float GetDeviceScaleFactor() const override;
bool PreferDarkTheme() const override;
- bool AnimationsEnabled() const override;
std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
- base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override;
- std::string GetCursorThemeName() override;
- int GetCursorThemeSize() override;
-
- // ui::TextEditKeybindingDelegate:
- bool GetTextEditCommandsForEvent(
- const ui::Event& event,
- std::vector<ui::TextEditCommandAuraLinux>* commands) override;
-
-#if BUILDFLAG(ENABLE_PRINTING)
- // printing::PrintingContextLinuxDelegate:
- printing::PrintDialogLinuxInterface* CreatePrintDialog(
- printing::PrintingContextLinux* context) override;
- gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) override;
-#endif
-
// QtInterface::Delegate:
void FontChanged() override;
void ThemeChanged() override;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
index 5cb499f..478b58d 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
@@ -259,9 +259,6 @@
void DesktopWindowTreeHostLinux::AddAdditionalInitProperties(
const Widget::InitParams& params,
ui::PlatformWindowInitProperties* properties) {
- const ui::LinuxUi* linux_ui = ui::LinuxUi::instance();
- properties->prefer_dark_theme = linux_ui && linux_ui->PreferDarkTheme();
-
// Set the background color on startup to make the initial flickering
// happening between the XWindow is mapped and the first expose event
// is completely handled less annoying. If possible, we use the content
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
index e6842b0..2c5553b 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
@@ -74,14 +74,16 @@
ui::X11Extension* GetX11Extension();
const ui::X11Extension* GetX11Extension() const;
+ // DesktopWindowTreeHostPlatform:
+ void AddAdditionalInitProperties(
+ const Widget::InitParams& params,
+ ui::PlatformWindowInitProperties* properties) override;
+
private:
FRIEND_TEST_ALL_PREFIXES(DesktopWindowTreeHostPlatformImplTestWithTouch,
HitTest);
- // DesktopWindowTreeHostPlatform overrides:
- void AddAdditionalInitProperties(
- const Widget::InitParams& params,
- ui::PlatformWindowInitProperties* properties) override;
+ // DesktopWindowTreeHostPlatform:
base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override;
// Called back by compositor_observer_ if the latter is set.
diff --git a/ui/views/widget/desktop_aura/window_event_filter_linux.cc b/ui/views/widget/desktop_aura/window_event_filter_linux.cc
index 98e1761..9b91c3e5 100644
--- a/ui/views/widget/desktop_aura/window_event_filter_linux.cc
+++ b/ui/views/widget/desktop_aura/window_event_filter_linux.cc
@@ -75,23 +75,21 @@
void WindowEventFilterLinux::OnClickedCaption(ui::MouseEvent* event,
int previous_click_component) {
- ui::LinuxUi* linux_ui = ui::LinuxUi::instance();
-
- ui::LinuxUi::WindowFrameActionSource action_type;
- ui::LinuxUi::WindowFrameAction default_action;
+ ui::LinuxUiTheme::WindowFrameActionSource action_type;
+ ui::LinuxUiTheme::WindowFrameAction default_action;
if (event->IsRightMouseButton()) {
- action_type = ui::LinuxUi::WindowFrameActionSource::kRightClick;
- default_action = ui::LinuxUi::WindowFrameAction::kMenu;
+ action_type = ui::LinuxUiTheme::WindowFrameActionSource::kRightClick;
+ default_action = ui::LinuxUiTheme::WindowFrameAction::kMenu;
} else if (event->IsMiddleMouseButton()) {
- action_type = ui::LinuxUi::WindowFrameActionSource::kMiddleClick;
- default_action = ui::LinuxUi::WindowFrameAction::kNone;
+ action_type = ui::LinuxUiTheme::WindowFrameActionSource::kMiddleClick;
+ default_action = ui::LinuxUiTheme::WindowFrameAction::kNone;
} else if (event->IsLeftMouseButton() &&
event->flags() & ui::EF_IS_DOUBLE_CLICK) {
click_component_ = HTNOWHERE;
if (previous_click_component == HTCAPTION) {
- action_type = ui::LinuxUi::WindowFrameActionSource::kDoubleClick;
- default_action = ui::LinuxUi::WindowFrameAction::kToggleMaximize;
+ action_type = ui::LinuxUiTheme::WindowFrameActionSource::kDoubleClick;
+ default_action = ui::LinuxUiTheme::WindowFrameAction::kToggleMaximize;
} else {
return;
}
@@ -101,24 +99,26 @@
}
auto* content_window = desktop_window_tree_host_->GetContentWindow();
- ui::LinuxUi::WindowFrameAction action =
- linux_ui ? linux_ui->GetWindowFrameAction(action_type) : default_action;
+ auto* linux_ui_theme = ui::LinuxUiTheme::GetForWindow(content_window);
+ ui::LinuxUiTheme::WindowFrameAction action =
+ linux_ui_theme ? linux_ui_theme->GetWindowFrameAction(action_type)
+ : default_action;
switch (action) {
- case ui::LinuxUi::WindowFrameAction::kNone:
+ case ui::LinuxUiTheme::WindowFrameAction::kNone:
break;
- case ui::LinuxUi::WindowFrameAction::kLower:
+ case ui::LinuxUiTheme::WindowFrameAction::kLower:
LowerWindow();
event->SetHandled();
break;
- case ui::LinuxUi::WindowFrameAction::kMinimize:
+ case ui::LinuxUiTheme::WindowFrameAction::kMinimize:
desktop_window_tree_host_->Minimize();
event->SetHandled();
break;
- case ui::LinuxUi::WindowFrameAction::kToggleMaximize:
+ case ui::LinuxUiTheme::WindowFrameAction::kToggleMaximize:
MaybeToggleMaximizedState(content_window);
event->SetHandled();
break;
- case ui::LinuxUi::WindowFrameAction::kMenu:
+ case ui::LinuxUiTheme::WindowFrameAction::kMenu:
views::Widget* widget =
views::Widget::GetWidgetForNativeView(content_window);
if (!widget)
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index e5ea1440..3b8eb3f 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -1851,8 +1851,8 @@
return parent_->GetNativeTheme();
#if BUILDFLAG(IS_LINUX)
- if (auto* linux_ui = ui::LinuxUi::GetForWindow(GetNativeWindow()))
- return linux_ui->GetNativeTheme();
+ if (auto* linux_ui_theme = ui::LinuxUiTheme::GetForWindow(GetNativeWindow()))
+ return linux_ui_theme->GetNativeTheme();
#endif
return ui::NativeTheme::GetInstanceForNativeUi();