add_maximized_parameter_to_linuxui_getwindowframeprovider.patch 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: msizanoen1 <[email protected]>
  3. Date: Tue, 19 Jul 2022 05:11:06 +0200
  4. Subject: Add maximized parameter to LinuxUI::GetWindowFrameProvider
  5. This allows ClientFrameViewLinux to instruct the toolkit to draw the window
  6. decorations in maximized mode where needed, preventing empty space caused
  7. by decoration shadows and rounded titlebars around the window while maximized.
  8. diff --git a/ui/gtk/gtk_ui.cc b/ui/gtk/gtk_ui.cc
  9. index a26cc74fc660c4d4873dd67e7c1c2b1223923ec8..6dfd2532bdd749adaeea820db0b88431f599a64a 100644
  10. --- a/ui/gtk/gtk_ui.cc
  11. +++ b/ui/gtk/gtk_ui.cc
  12. @@ -520,12 +520,13 @@ std::unique_ptr<ui::NavButtonProvider> GtkUi::CreateNavButtonProvider() {
  13. return std::make_unique<gtk::NavButtonProviderGtk>();
  14. }
  15. -ui::WindowFrameProvider* GtkUi::GetWindowFrameProvider(bool solid_frame) {
  16. +ui::WindowFrameProvider* GtkUi::GetWindowFrameProvider(bool solid_frame, bool maximized) {
  17. auto& provider =
  18. - solid_frame ? solid_frame_provider_ : transparent_frame_provider_;
  19. - if (!provider) {
  20. - provider = std::make_unique<gtk::WindowFrameProviderGtk>(solid_frame);
  21. - }
  22. + maximized
  23. + ? (solid_frame ? solid_maximized_frame_provider_ : transparent_maximized_frame_provider_)
  24. + : (solid_frame ? solid_frame_provider_ : transparent_frame_provider_);
  25. + if (!provider)
  26. + provider = std::make_unique<gtk::WindowFrameProviderGtk>(solid_frame, maximized);
  27. return provider.get();
  28. }
  29. diff --git a/ui/gtk/gtk_ui.h b/ui/gtk/gtk_ui.h
  30. index 38c1297588f30cc81d48cfd2321845815bb93ea5..0f4141d2146c38f054b060ddfa06a9f68ee2179c 100644
  31. --- a/ui/gtk/gtk_ui.h
  32. +++ b/ui/gtk/gtk_ui.h
  33. @@ -110,7 +110,7 @@ class GtkUi : public ui::LinuxUiAndTheme {
  34. bool PreferDarkTheme() const override;
  35. void SetDarkTheme(bool dark) override;
  36. std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
  37. - ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
  38. + ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame, bool maximized) override;
  39. private:
  40. using TintMap = std::map<int, color_utils::HSL>;
  41. @@ -203,6 +203,8 @@ class GtkUi : public ui::LinuxUiAndTheme {
  42. // while Chrome is running.
  43. std::unique_ptr<ui::WindowFrameProvider> solid_frame_provider_;
  44. std::unique_ptr<ui::WindowFrameProvider> transparent_frame_provider_;
  45. + std::unique_ptr<ui::WindowFrameProvider> solid_maximized_frame_provider_;
  46. + std::unique_ptr<ui::WindowFrameProvider> transparent_maximized_frame_provider_;
  47. // Objects to notify when the window frame button order changes.
  48. base::ObserverList<ui::WindowButtonOrderObserver>::Unchecked
  49. diff --git a/ui/gtk/window_frame_provider_gtk.cc b/ui/gtk/window_frame_provider_gtk.cc
  50. index a739dbab82f4b5b221f27364ccaa5daf2161a059..e2c47d50b64c2e994b3e63a3fc671504ce928964 100644
  51. --- a/ui/gtk/window_frame_provider_gtk.cc
  52. +++ b/ui/gtk/window_frame_provider_gtk.cc
  53. @@ -41,17 +41,20 @@ std::string GetThemeName() {
  54. return theme_string;
  55. }
  56. -GtkCssContext WindowContext(bool solid_frame, bool focused) {
  57. +GtkCssContext WindowContext(bool solid_frame, bool maximized, bool focused) {
  58. std::string selector = "window.background.";
  59. selector += solid_frame ? "solid-csd" : "csd";
  60. + if (maximized) {
  61. + selector += ".maximized";
  62. + }
  63. if (!focused) {
  64. selector += ":inactive";
  65. }
  66. return AppendCssNodeToStyleContext({}, selector);
  67. }
  68. -GtkCssContext DecorationContext(bool solid_frame, bool focused) {
  69. - auto context = WindowContext(solid_frame, focused);
  70. +GtkCssContext DecorationContext(bool solid_frame, bool maximized, bool focused) {
  71. + auto context = WindowContext(solid_frame, maximized, focused);
  72. // GTK4 renders the decoration directly on the window.
  73. if (!GtkCheckVersion(4)) {
  74. context = AppendCssNodeToStyleContext(context, "decoration");
  75. @@ -70,8 +73,8 @@ GtkCssContext DecorationContext(bool solid_frame, bool focused) {
  76. return context;
  77. }
  78. -GtkCssContext HeaderContext(bool solid_frame, bool focused) {
  79. - auto context = WindowContext(solid_frame, focused);
  80. +GtkCssContext HeaderContext(bool solid_frame, bool maximized, bool focused) {
  81. + auto context = WindowContext(solid_frame, maximized, focused);
  82. context =
  83. AppendCssNodeToStyleContext(context, "headerbar.header-bar.titlebar");
  84. if (!focused) {
  85. @@ -128,8 +131,8 @@ int ComputeTopCornerRadius() {
  86. // need to experimentally determine the corner radius by rendering a sample.
  87. // Additionally, in GTK4, the headerbar corners get clipped by the window
  88. // rather than the headerbar having its own rounded corners.
  89. - auto context = GtkCheckVersion(4) ? DecorationContext(false, false)
  90. - : HeaderContext(false, false);
  91. + auto context = GtkCheckVersion(4) ? DecorationContext(false, false, false)
  92. + : HeaderContext(false, false, false);
  93. ApplyCssToContext(context, R"(window, headerbar {
  94. background-image: none;
  95. background-color: black;
  96. @@ -163,7 +166,7 @@ int ComputeTopCornerRadius() {
  97. bool HeaderIsTranslucent() {
  98. // The arbitrary square size to render a sample header.
  99. constexpr int kHeaderSize = 32;
  100. - auto context = HeaderContext(false, false);
  101. + auto context = HeaderContext(false, false, false);
  102. double opacity = GetOpacityFromContext(context);
  103. if (opacity < 1.0) {
  104. return true;
  105. @@ -220,8 +223,8 @@ void WindowFrameProviderGtk::Asset::CloneFrom(
  106. unfocused_bitmap = src.unfocused_bitmap;
  107. }
  108. -WindowFrameProviderGtk::WindowFrameProviderGtk(bool solid_frame)
  109. - : solid_frame_(solid_frame) {}
  110. +WindowFrameProviderGtk::WindowFrameProviderGtk(bool solid_frame, bool maximized)
  111. + : solid_frame_(solid_frame), maximized_(maximized) {}
  112. WindowFrameProviderGtk::~WindowFrameProviderGtk() = default;
  113. @@ -330,7 +333,7 @@ void WindowFrameProviderGtk::PaintWindowFrame(
  114. const int top_area_height_px = top_area_bottom_px - client_bounds_px.y();
  115. auto header = PaintHeaderbar({client_bounds_px.width(), top_area_height_px},
  116. - HeaderContext(solid_frame_, focused), scale);
  117. + HeaderContext(solid_frame_, maximized_, focused), scale);
  118. image = gfx::ImageSkia::CreateFrom1xBitmap(header);
  119. // In GTK4, the headerbar gets clipped by the window.
  120. if (GtkCheckVersion(4)) {
  121. @@ -363,7 +366,7 @@ void WindowFrameProviderGtk::MaybeUpdateBitmaps(float scale) {
  122. gfx::Rect frame_bounds_dip(kMaxFrameSizeDip, kMaxFrameSizeDip,
  123. 2 * kMaxFrameSizeDip, 2 * kMaxFrameSizeDip);
  124. - auto focused_context = DecorationContext(solid_frame_, true);
  125. + auto focused_context = DecorationContext(solid_frame_, maximized_, true);
  126. frame_bounds_dip.Inset(-GtkStyleContextGetPadding(focused_context));
  127. frame_bounds_dip.Inset(-GtkStyleContextGetBorder(focused_context));
  128. gfx::Size bitmap_size(BitmapSizePx(asset), BitmapSizePx(asset));
  129. @@ -371,7 +374,7 @@ void WindowFrameProviderGtk::MaybeUpdateBitmaps(float scale) {
  130. focused_context, scale);
  131. asset.unfocused_bitmap =
  132. PaintBitmap(bitmap_size, gfx::RectF(frame_bounds_dip),
  133. - DecorationContext(solid_frame_, false), scale);
  134. + DecorationContext(solid_frame_, maximized_, false), scale);
  135. // In GTK4, there's no way to obtain the frame thickness from CSS values
  136. // directly, so we must determine it experimentally based on the drawn
  137. diff --git a/ui/gtk/window_frame_provider_gtk.h b/ui/gtk/window_frame_provider_gtk.h
  138. index 32c3d63ae4598339965c58443a8c2d12b99fb89a..91496d957b8291cd37948e237a1cc4bf605848b0 100644
  139. --- a/ui/gtk/window_frame_provider_gtk.h
  140. +++ b/ui/gtk/window_frame_provider_gtk.h
  141. @@ -14,7 +14,7 @@ namespace gtk {
  142. class WindowFrameProviderGtk : public ui::WindowFrameProvider {
  143. public:
  144. - explicit WindowFrameProviderGtk(bool solid_frame);
  145. + explicit WindowFrameProviderGtk(bool solid_frame, bool maximized);
  146. WindowFrameProviderGtk(const WindowFrameProviderGtk&) = delete;
  147. WindowFrameProviderGtk& operator=(const WindowFrameProviderGtk&) = delete;
  148. @@ -72,6 +72,9 @@ class WindowFrameProviderGtk : public ui::WindowFrameProvider {
  149. // Cached bitmaps and metrics. The scale is rounded to percent.
  150. base::flat_map<int, Asset> assets_;
  151. +
  152. + // Whether to draw the window decorations as maximized.
  153. + bool maximized_;
  154. };
  155. } // namespace gtk
  156. diff --git a/ui/linux/fallback_linux_ui.cc b/ui/linux/fallback_linux_ui.cc
  157. index 2b67f6ebcae4f0495b73c750e73250921fa0ac04..796b44df8c8b9a63ba97e28f14e457d724c8ae50 100644
  158. --- a/ui/linux/fallback_linux_ui.cc
  159. +++ b/ui/linux/fallback_linux_ui.cc
  160. @@ -135,7 +135,7 @@ FallbackLinuxUi::CreateNavButtonProvider() {
  161. }
  162. ui::WindowFrameProvider* FallbackLinuxUi::GetWindowFrameProvider(
  163. - bool solid_frame) {
  164. + bool solid_frame, bool maximized) {
  165. return nullptr;
  166. }
  167. diff --git a/ui/linux/fallback_linux_ui.h b/ui/linux/fallback_linux_ui.h
  168. index 9a6a5a7f21c318d3009df1766a7789f9c7597339..9454e8f8e622a5b92f980fdf6c1f68d6c4795cf7 100644
  169. --- a/ui/linux/fallback_linux_ui.h
  170. +++ b/ui/linux/fallback_linux_ui.h
  171. @@ -68,7 +68,7 @@ class FallbackLinuxUi : public LinuxUiAndTheme {
  172. bool PreferDarkTheme() const override;
  173. void SetDarkTheme(bool dark) override;
  174. std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
  175. - ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
  176. + ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame, bool maximized) override;
  177. private:
  178. std::string default_font_family_;
  179. diff --git a/ui/linux/linux_ui.h b/ui/linux/linux_ui.h
  180. index 9cc65cf5713464e5964e9aa2109c281055e5b70f..014d1145e44e5e9420846476d4349070c78852d0 100644
  181. --- a/ui/linux/linux_ui.h
  182. +++ b/ui/linux/linux_ui.h
  183. @@ -316,7 +316,7 @@ class COMPONENT_EXPORT(LINUX_UI) LinuxUiTheme {
  184. // if transparency is unsupported and the frame should be rendered opaque.
  185. // The returned object is not owned by the caller and will remain alive until
  186. // the process ends.
  187. - virtual WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) = 0;
  188. + virtual WindowFrameProvider* GetWindowFrameProvider(bool solid_frame, bool maximized) = 0;
  189. protected:
  190. LinuxUiTheme();