From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: msizanoen1 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 a91b303e77f4b5b47742d12749eb70d857e0badf..284174aa697b3379863e0aa440b5d03c6b06f8e3 100644 --- a/ui/gtk/gtk_ui.cc +++ b/ui/gtk/gtk_ui.cc @@ -523,12 +523,13 @@ std::unique_ptr GtkUi::CreateNavButtonProvider() { return std::make_unique(); } -ui::WindowFrameProvider* GtkUi::GetWindowFrameProvider(bool solid_frame) { +ui::WindowFrameProvider* GtkUi::GetWindowFrameProvider(bool solid_frame, bool maximized) { auto& provider = - solid_frame ? solid_frame_provider_ : transparent_frame_provider_; - if (!provider) { - provider = std::make_unique(solid_frame); - } + maximized + ? (solid_frame ? solid_maximized_frame_provider_ : transparent_maximized_frame_provider_) + : (solid_frame ? solid_frame_provider_ : transparent_frame_provider_); + if (!provider) + provider = std::make_unique(solid_frame, maximized); return provider.get(); } diff --git a/ui/gtk/gtk_ui.h b/ui/gtk/gtk_ui.h index 8ae3369be0b628ce94eeb067b2be9f3ace31eccb..520de739d2f6f63757c15bf738c9c09b71c2a479 100644 --- a/ui/gtk/gtk_ui.h +++ b/ui/gtk/gtk_ui.h @@ -109,7 +109,7 @@ class GtkUi : public ui::LinuxUiAndTheme { bool PreferDarkTheme() const override; void SetDarkTheme(bool dark) override; std::unique_ptr CreateNavButtonProvider() override; - ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override; + ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame, bool maximized) override; private: using TintMap = std::map; @@ -200,6 +200,8 @@ class GtkUi : public ui::LinuxUiAndTheme { // while Chrome is running. std::unique_ptr solid_frame_provider_; std::unique_ptr transparent_frame_provider_; + std::unique_ptr solid_maximized_frame_provider_; + std::unique_ptr transparent_maximized_frame_provider_; // Objects to notify when the window frame button order changes. base::ObserverList::Unchecked diff --git a/ui/gtk/window_frame_provider_gtk.cc b/ui/gtk/window_frame_provider_gtk.cc index 1f4eeebe54780a4927104d7cdaa4f7cfae6e7d2a..64d243287a367ff4201efebeda95f553c33f5d9b 100644 --- a/ui/gtk/window_frame_provider_gtk.cc +++ b/ui/gtk/window_frame_provider_gtk.cc @@ -39,17 +39,20 @@ std::string GetThemeName() { return theme_string; } -GtkCssContext WindowContext(bool solid_frame, bool focused) { +GtkCssContext WindowContext(bool solid_frame, bool maximized, bool focused) { std::string selector = "window.background."; selector += solid_frame ? "solid-csd" : "csd"; + if (maximized) { + selector += ".maximized"; + } if (!focused) { selector += ":inactive"; } return AppendCssNodeToStyleContext({}, selector); } -GtkCssContext DecorationContext(bool solid_frame, bool focused) { - auto context = WindowContext(solid_frame, focused); +GtkCssContext DecorationContext(bool solid_frame, bool maximized, bool focused) { + auto context = WindowContext(solid_frame, maximized, focused); // GTK4 renders the decoration directly on the window. if (!GtkCheckVersion(4)) { context = AppendCssNodeToStyleContext(context, "decoration"); @@ -68,8 +71,8 @@ GtkCssContext DecorationContext(bool solid_frame, bool focused) { return context; } -GtkCssContext HeaderContext(bool solid_frame, bool focused) { - auto context = WindowContext(solid_frame, focused); +GtkCssContext HeaderContext(bool solid_frame, bool maximized, bool focused) { + auto context = WindowContext(solid_frame, maximized, focused); context = AppendCssNodeToStyleContext(context, "headerbar.header-bar.titlebar"); if (!focused) { @@ -125,8 +128,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) - : HeaderContext(false, false); + auto context = GtkCheckVersion(4) ? DecorationContext(false, false, false) + : HeaderContext(false, false, false); ApplyCssToContext(context, R"(window, headerbar { background-image: none; background-color: black; @@ -159,7 +162,7 @@ int ComputeTopCornerRadius() { bool HeaderIsTranslucent() { // The arbitrary square size to render a sample header. constexpr int kHeaderSize = 32; - auto context = HeaderContext(false, false); + auto context = HeaderContext(false, false, false); double opacity = GetOpacityFromContext(context); if (opacity < 1.0) { return true; @@ -216,8 +219,8 @@ void WindowFrameProviderGtk::Asset::CloneFrom( unfocused_bitmap = src.unfocused_bitmap; } -WindowFrameProviderGtk::WindowFrameProviderGtk(bool solid_frame) - : solid_frame_(solid_frame) {} +WindowFrameProviderGtk::WindowFrameProviderGtk(bool solid_frame, bool maximized) + : solid_frame_(solid_frame), maximized_(maximized) {} WindowFrameProviderGtk::~WindowFrameProviderGtk() = default; @@ -325,7 +328,7 @@ void WindowFrameProviderGtk::PaintWindowFrame( top_area_height_dip * scale - effective_frame_thickness_px.top(); auto header = PaintHeaderbar({client_bounds_px.width(), top_area_height_px}, - HeaderContext(solid_frame_, focused), scale); + HeaderContext(solid_frame_, maximized_, focused), scale); image = gfx::ImageSkia::CreateFrom1xBitmap(header); // In GTK4, the headerbar gets clipped by the window. if (GtkCheckVersion(4)) { @@ -358,7 +361,7 @@ void WindowFrameProviderGtk::MaybeUpdateBitmaps(float scale) { gfx::Rect frame_bounds_dip(kMaxFrameSizeDip, kMaxFrameSizeDip, 2 * kMaxFrameSizeDip, 2 * kMaxFrameSizeDip); - auto focused_context = DecorationContext(solid_frame_, true); + auto focused_context = DecorationContext(solid_frame_, maximized_, true); frame_bounds_dip.Inset(-GtkStyleContextGetPadding(focused_context)); frame_bounds_dip.Inset(-GtkStyleContextGetBorder(focused_context)); gfx::Size bitmap_size(BitmapSizePx(asset), BitmapSizePx(asset)); @@ -366,7 +369,7 @@ void WindowFrameProviderGtk::MaybeUpdateBitmaps(float scale) { PaintBitmap(bitmap_size, frame_bounds_dip, focused_context, scale); asset.unfocused_bitmap = PaintBitmap(bitmap_size, frame_bounds_dip, - DecorationContext(solid_frame_, false), scale); + DecorationContext(solid_frame_, maximized_, false), scale); // In GTK4, there's no way to obtain the frame thickness from CSS values // directly, so we must determine it experimentally based on the drawn diff --git a/ui/gtk/window_frame_provider_gtk.h b/ui/gtk/window_frame_provider_gtk.h index 32c3d63ae4598339965c58443a8c2d12b99fb89a..91496d957b8291cd37948e237a1cc4bf605848b0 100644 --- a/ui/gtk/window_frame_provider_gtk.h +++ b/ui/gtk/window_frame_provider_gtk.h @@ -14,7 +14,7 @@ namespace gtk { class WindowFrameProviderGtk : public ui::WindowFrameProvider { public: - explicit WindowFrameProviderGtk(bool solid_frame); + explicit WindowFrameProviderGtk(bool solid_frame, bool maximized); WindowFrameProviderGtk(const WindowFrameProviderGtk&) = delete; WindowFrameProviderGtk& operator=(const WindowFrameProviderGtk&) = delete; @@ -72,6 +72,9 @@ class WindowFrameProviderGtk : public ui::WindowFrameProvider { // Cached bitmaps and metrics. The scale is rounded to percent. base::flat_map assets_; + + // Whether to draw the window decorations as maximized. + bool maximized_; }; } // namespace gtk diff --git a/ui/linux/fallback_linux_ui.cc b/ui/linux/fallback_linux_ui.cc index 6d77be047e202d1b1a75c62ab829dd1131ce7f68..ee1f503a679b3e939e3f2d2417aec2182063dbd8 100644 --- a/ui/linux/fallback_linux_ui.cc +++ b/ui/linux/fallback_linux_ui.cc @@ -135,7 +135,7 @@ FallbackLinuxUi::CreateNavButtonProvider() { } ui::WindowFrameProvider* FallbackLinuxUi::GetWindowFrameProvider( - bool solid_frame) { + bool solid_frame, bool maximized) { return nullptr; } diff --git a/ui/linux/fallback_linux_ui.h b/ui/linux/fallback_linux_ui.h index 9901d4939400da87610b1a960ca989eb9da6dc9b..035ab6679f9f6a9083382580bbbe7fa2420ab28d 100644 --- a/ui/linux/fallback_linux_ui.h +++ b/ui/linux/fallback_linux_ui.h @@ -67,7 +67,7 @@ class FallbackLinuxUi : public LinuxUiAndTheme { bool PreferDarkTheme() const override; void SetDarkTheme(bool dark) override; std::unique_ptr CreateNavButtonProvider() override; - ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override; + ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame, bool maximized) override; private: std::string default_font_family_; diff --git a/ui/linux/linux_ui.h b/ui/linux/linux_ui.h index a47134d7fa67213e8928ce98071f85fa1bc66508..2fe17292aee5021864615abc5b60ee38d7fa0e4b 100644 --- a/ui/linux/linux_ui.h +++ b/ui/linux/linux_ui.h @@ -313,7 +313,7 @@ class COMPONENT_EXPORT(LINUX_UI) LinuxUiTheme { // 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; + virtual WindowFrameProvider* GetWindowFrameProvider(bool solid_frame, bool maximized) = 0; protected: LinuxUiTheme();