123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: msizanoen1 <[email protected]>
- Date: Tue, 19 Jul 2022 05:11:06 +0200
- Subject: Add maximized parameter to LinuxUI::GetWindowFrameProvider
- This allows ClientFrameViewLinux to instruct the toolkit to draw the window
- decorations in maximized mode where needed, preventing empty space caused
- by decoration shadows and rounded titlebars around the window while maximized.
- diff --git a/ui/gtk/gtk_ui.cc b/ui/gtk/gtk_ui.cc
- index 771c253082e2ab1103fd22218d56bf1a8d5ba7ab..d50528171925436a34ddd61ff7a0e7dee998d10c 100644
- --- a/ui/gtk/gtk_ui.cc
- +++ b/ui/gtk/gtk_ui.cc
- @@ -584,11 +584,12 @@ std::unique_ptr<ui::NavButtonProvider> GtkUi::CreateNavButtonProvider() {
- }
-
- ui::WindowFrameProvider* GtkUi::GetWindowFrameProvider(bool solid_frame,
- - bool tiled) {
- - auto& provider = frame_providers_[solid_frame][tiled];
- + bool tiled,
- + bool maximized) {
- + auto& provider = frame_providers_[solid_frame][tiled][maximized];
- if (!provider) {
- provider =
- - std::make_unique<gtk::WindowFrameProviderGtk>(solid_frame, tiled);
- + std::make_unique<gtk::WindowFrameProviderGtk>(solid_frame, tiled, maximized);
- }
- return provider.get();
- }
- diff --git a/ui/gtk/gtk_ui.h b/ui/gtk/gtk_ui.h
- index 32051374590fc1179e5cfa21ebc34474d2ce0190..09e9399a67d30d4686f4c141050538b8dde9f301 100644
- --- a/ui/gtk/gtk_ui.h
- +++ b/ui/gtk/gtk_ui.h
- @@ -110,7 +110,8 @@ class GtkUi : public ui::LinuxUiAndTheme {
- void SetAccentColor(std::optional<SkColor> accent_color) override;
- std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
- ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame,
- - bool tiled) override;
- + bool tiled,
- + bool maximized) override;
-
- private:
- using TintMap = std::map<int, color_utils::HSL>;
- @@ -199,7 +200,7 @@ class GtkUi : public ui::LinuxUiAndTheme {
- // while Chrome is running. This 2D array is indexed first by whether the
- // frame is translucent (0) or solid(1), then by whether the frame is normal
- // (0) or tiled (1).
- - std::unique_ptr<ui::WindowFrameProvider> frame_providers_[2][2];
- + std::unique_ptr<ui::WindowFrameProvider> frame_providers_[2][2][2];
-
- // Objects to notify when the window frame button order changes.
- base::ObserverList<ui::WindowButtonOrderObserver>::Unchecked
- diff --git a/ui/gtk/window_frame_provider_gtk.cc b/ui/gtk/window_frame_provider_gtk.cc
- index e24cce85b453ecee9a4854bfdf7b8eeb6814f8c3..d3e3e9b918011c433b4ac6ded245803410ccb5d4 100644
- --- a/ui/gtk/window_frame_provider_gtk.cc
- +++ b/ui/gtk/window_frame_provider_gtk.cc
- @@ -29,20 +29,23 @@ constexpr int kMaxFrameSizeDip = 64;
- // will get an incorrect hint as to which pixels are fully opaque.
- constexpr int kMaxCornerRadiusDip = 32;
-
- -GtkCssContext WindowContext(bool solid_frame, bool tiled, bool focused) {
- +GtkCssContext WindowContext(bool solid_frame, bool tiled, bool maximized, bool focused) {
- std::string selector = "window.background.";
- selector += solid_frame ? "solid-csd" : "csd";
- if (tiled) {
- selector += ".tiled";
- }
- + if (maximized) {
- + selector += ".maximized";
- + }
- if (!focused) {
- selector += ":inactive";
- }
- return AppendCssNodeToStyleContext({}, selector);
- }
-
- -GtkCssContext DecorationContext(bool solid_frame, bool tiled, bool focused) {
- - auto context = WindowContext(solid_frame, tiled, focused);
- +GtkCssContext DecorationContext(bool solid_frame, bool tiled, bool maximized, bool focused) {
- + auto context = WindowContext(solid_frame, tiled, maximized, focused);
- // GTK4 renders the decoration directly on the window.
- if (!GtkCheckVersion(4)) {
- context = AppendCssNodeToStyleContext(context, "decoration");
- @@ -61,8 +64,8 @@ GtkCssContext DecorationContext(bool solid_frame, bool tiled, bool focused) {
- return context;
- }
-
- -GtkCssContext HeaderContext(bool solid_frame, bool tiled, bool focused) {
- - auto context = WindowContext(solid_frame, tiled, focused);
- +GtkCssContext HeaderContext(bool solid_frame, bool tiled, bool maximized, bool focused) {
- + auto context = WindowContext(solid_frame, tiled, maximized, focused);
- context =
- AppendCssNodeToStyleContext(context, "headerbar.header-bar.titlebar");
- if (!focused) {
- @@ -117,8 +120,8 @@ int ComputeTopCornerRadius() {
- // need to experimentally determine the corner radius by rendering a sample.
- // Additionally, in GTK4, the headerbar corners get clipped by the window
- // rather than the headerbar having its own rounded corners.
- - auto context = GtkCheckVersion(4) ? DecorationContext(false, false, false)
- - : HeaderContext(false, false, false);
- + auto context = GtkCheckVersion(4) ? DecorationContext(false, false, false, false)
- + : HeaderContext(false, false, false, false);
- ApplyCssToContext(context, R"(window, headerbar {
- background-image: none;
- background-color: black;
- @@ -152,7 +155,7 @@ int ComputeTopCornerRadius() {
- bool HeaderIsTranslucent() {
- // The arbitrary square size to render a sample header.
- constexpr int kHeaderSize = 32;
- - auto context = HeaderContext(false, false, false);
- + auto context = HeaderContext(false, false, false, false);
- double opacity = GetOpacityFromContext(context);
- if (opacity < 1.0) {
- return true;
- @@ -186,8 +189,8 @@ WindowFrameProviderGtk::Asset& WindowFrameProviderGtk::Asset::operator=(
-
- WindowFrameProviderGtk::Asset::~Asset() = default;
-
- -WindowFrameProviderGtk::WindowFrameProviderGtk(bool solid_frame, bool tiled)
- - : solid_frame_(solid_frame), tiled_(tiled) {
- +WindowFrameProviderGtk::WindowFrameProviderGtk(bool solid_frame, bool tiled, bool maximized)
- + : solid_frame_(solid_frame), tiled_(tiled), maximized_(maximized) {
- GtkSettings* settings = gtk_settings_get_default();
- // Unretained() is safe since WindowFrameProviderGtk will own the signals.
- auto callback = base::BindRepeating(&WindowFrameProviderGtk::OnThemeChanged,
- @@ -337,7 +340,7 @@ void WindowFrameProviderGtk::PaintWindowFrame(gfx::Canvas* canvas,
-
- auto header =
- PaintHeaderbar({client_bounds_px.width(), top_area_height_px},
- - HeaderContext(solid_frame_, tiled_, focused), scale);
- + HeaderContext(solid_frame_, tiled_, maximized_, focused), scale);
- image = gfx::ImageSkia::CreateFrom1xBitmap(header);
- // In GTK4, the headerbar gets clipped by the window.
- if (GtkCheckVersion(4)) {
- @@ -366,7 +369,7 @@ WindowFrameProviderGtk::Asset& WindowFrameProviderGtk::GetOrCreateAsset(
-
- gfx::Rect frame_bounds_dip(kMaxFrameSizeDip, kMaxFrameSizeDip,
- 2 * kMaxFrameSizeDip, 2 * kMaxFrameSizeDip);
- - auto focused_context = DecorationContext(solid_frame_, tiled_, true);
- + auto focused_context = DecorationContext(solid_frame_, tiled_, maximized_, true);
- frame_bounds_dip.Inset(-GtkStyleContextGetPadding(focused_context));
- frame_bounds_dip.Inset(-GtkStyleContextGetBorder(focused_context));
- gfx::Size bitmap_size(BitmapSizePx(asset), BitmapSizePx(asset));
- @@ -374,7 +377,7 @@ WindowFrameProviderGtk::Asset& WindowFrameProviderGtk::GetOrCreateAsset(
- focused_context, scale);
- asset.unfocused_bitmap =
- PaintBitmap(bitmap_size, gfx::RectF(frame_bounds_dip),
- - DecorationContext(solid_frame_, tiled_, false), scale);
- + DecorationContext(solid_frame_, tiled_, maximized_, false), scale);
-
- return asset;
- }
- diff --git a/ui/gtk/window_frame_provider_gtk.h b/ui/gtk/window_frame_provider_gtk.h
- index 4faaae32a203bfa57f3e61c391dc6917c4a0bf59..94050a0136b78730f607f42991742e0434948d0e 100644
- --- a/ui/gtk/window_frame_provider_gtk.h
- +++ b/ui/gtk/window_frame_provider_gtk.h
- @@ -20,7 +20,7 @@ namespace gtk {
-
- class WindowFrameProviderGtk : public ui::WindowFrameProvider {
- public:
- - WindowFrameProviderGtk(bool solid_frame, bool tiled);
- + WindowFrameProviderGtk(bool solid_frame, bool tiled, bool maximized);
-
- WindowFrameProviderGtk(const WindowFrameProviderGtk&) = delete;
- WindowFrameProviderGtk& operator=(const WindowFrameProviderGtk&) = delete;
- @@ -65,6 +65,8 @@ class WindowFrameProviderGtk : public ui::WindowFrameProvider {
- // Input parameters used for drawing.
- const bool solid_frame_;
- const bool tiled_;
- + // Whether to draw the window decorations as maximized.
- + const bool maximized_;
-
- // Scale-independent metric calculated based on the bitmaps.
- std::optional<gfx::Insets> frame_thickness_dip_;
- diff --git a/ui/linux/fallback_linux_ui.cc b/ui/linux/fallback_linux_ui.cc
- index e4a7f8eb0ef8bacd2d4e4231d0990b4a01021626..3477542587b08691c164941b2c2e3b22050231ca 100644
- --- a/ui/linux/fallback_linux_ui.cc
- +++ b/ui/linux/fallback_linux_ui.cc
- @@ -143,7 +143,8 @@ FallbackLinuxUi::CreateNavButtonProvider() {
-
- ui::WindowFrameProvider* FallbackLinuxUi::GetWindowFrameProvider(
- bool solid_frame,
- - bool tiled) {
- + bool tiled,
- + bool maximized) {
- return nullptr;
- }
-
- diff --git a/ui/linux/fallback_linux_ui.h b/ui/linux/fallback_linux_ui.h
- index 0800349bc18753e6a41a938c70213dd7dd123d0d..a1553e0cb1fac188fb2c74e10163c52dead02f29 100644
- --- a/ui/linux/fallback_linux_ui.h
- +++ b/ui/linux/fallback_linux_ui.h
- @@ -67,7 +67,8 @@ class FallbackLinuxUi : public LinuxUiAndTheme {
- void SetAccentColor(std::optional<SkColor> accent_color) override;
- std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
- ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame,
- - bool tiled) override;
- + bool tiled,
- + bool maximized) override;
-
- private:
- std::optional<gfx::FontRenderParams> default_font_render_params_;
- diff --git a/ui/linux/linux_ui.h b/ui/linux/linux_ui.h
- index 1e59679d206462f72495d587740ac48ba0fa30df..090e770ac2f8e5231f2bdd11247cacaceb0c7ef6 100644
- --- a/ui/linux/linux_ui.h
- +++ b/ui/linux/linux_ui.h
- @@ -306,7 +306,8 @@ class COMPONENT_EXPORT(LINUX_UI) LinuxUiTheme {
- // The returned object is not owned by the caller and will remain alive until
- // the process ends.
- virtual WindowFrameProvider* GetWindowFrameProvider(bool solid_frame,
- - bool tiled) = 0;
- + bool tiled,
- + bool maximized) = 0;
-
- protected:
- LinuxUiTheme();
|