From a924f1a629291c6d4bd37f1d062d97c6a57fe18f Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Fri, 7 Nov 2025 18:41:47 +0100 Subject: [PATCH] fix: CSD window frame tiles properly on Wayland (#48836) fix: CSD window frame tiles properly on Linux Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Mitchell Cohen --- ...electron_desktop_window_tree_host_linux.cc | 10 ++++++++-- .../ui/views/client_frame_view_linux.cc | 20 +++++++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/shell/browser/ui/electron_desktop_window_tree_host_linux.cc b/shell/browser/ui/electron_desktop_window_tree_host_linux.cc index 4502f132c7..ff0fa9051c 100644 --- a/shell/browser/ui/electron_desktop_window_tree_host_linux.cc +++ b/shell/browser/ui/electron_desktop_window_tree_host_linux.cc @@ -100,13 +100,19 @@ void ElectronDesktopWindowTreeHostLinux::OnWindowStateChanged( void ElectronDesktopWindowTreeHostLinux::OnWindowTiledStateChanged( ui::WindowTiledEdges new_tiled_edges) { if (auto* const view = native_window_view_->GetClientFrameViewLinux()) { - bool maximized = new_tiled_edges.top && new_tiled_edges.left && - new_tiled_edges.bottom && new_tiled_edges.right; + // GNOME on Ubuntu reports all edges as tiled + // even if the window is only half-tiled so do not trust individual edge + // values. + bool maximized = native_window_view_->IsMaximized(); bool tiled = new_tiled_edges.top || new_tiled_edges.left || new_tiled_edges.bottom || new_tiled_edges.right; view->set_tiled(tiled && !maximized); } UpdateFrameHints(); + ScheduleRelayout(); + if (GetWidget()->non_client_view()) { + GetWidget()->non_client_view()->SchedulePaint(); + } } void ElectronDesktopWindowTreeHostLinux::UpdateWindowState( diff --git a/shell/browser/ui/views/client_frame_view_linux.cc b/shell/browser/ui/views/client_frame_view_linux.cc index 316752492b..591fca437f 100644 --- a/shell/browser/ui/views/client_frame_view_linux.cc +++ b/shell/browser/ui/views/client_frame_view_linux.cc @@ -40,7 +40,6 @@ namespace { // These values should be the same as Chromium uses. constexpr int kResizeBorder = 10; -constexpr int kResizeInsideBoundsSize = 5; ui::NavButtonProvider::ButtonState ButtonStateToNavButtonProviderState( views::Button::ButtonState state) { @@ -151,8 +150,19 @@ gfx::Insets ClientFrameViewLinux::RestoredMirroredFrameBorderInsets() const { gfx::Insets ClientFrameViewLinux::RestoredFrameBorderInsets() const { gfx::Insets insets = GetFrameProvider()->GetFrameThicknessDip(); - insets.SetToMax(GetInputInsets()); - return insets; + const gfx::Insets input = GetInputInsets(); + + auto expand_if_visible = [](int side_thickness, int min_band) { + return side_thickness > 0 ? std::max(side_thickness, min_band) : 0; + }; + + gfx::Insets merged; + merged.set_top(expand_if_visible(insets.top(), input.top())); + merged.set_left(expand_if_visible(insets.left(), input.left())); + merged.set_bottom(expand_if_visible(insets.bottom(), input.bottom())); + merged.set_right(expand_if_visible(insets.right(), input.right())); + + return merged; } gfx::Insets ClientFrameViewLinux::GetInputInsets() const { @@ -197,9 +207,7 @@ void ClientFrameViewLinux::OnWindowButtonOrderingChange() { } int ClientFrameViewLinux::ResizingBorderHitTest(const gfx::Point& point) { - return ResizingBorderHitTestImpl(point, - RestoredMirroredFrameBorderInsets() + - gfx::Insets(kResizeInsideBoundsSize)); + return ResizingBorderHitTestImpl(point, RestoredMirroredFrameBorderInsets()); } gfx::Rect ClientFrameViewLinux::GetBoundsForClientView() const {