tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 99ba24a411e322bd9ec23aeb0eb14141c9669667
parent 48aa2404e61655d5597e7056b758b0b6a45c8f2d
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date:   Tue,  6 Jan 2026 12:22:51 +0000

Bug 2006480 - Keep synchronously computing bounds on fullscreen changes. r=stransky

This is needed to avoid spurious resizes due to the async nature of the
fullscreen transitions vs resizes.

Differential Revision: https://phabricator.services.mozilla.com/D277321

Diffstat:
Mwidget/gtk/nsWindow.cpp | 23+++++++++++++++++++++--
Mwidget/gtk/nsWindow.h | 1+
2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp @@ -3356,6 +3356,12 @@ auto nsWindow::Bounds::ComputeX11(const nsWindow* aWindow) -> Bounds { LOG_WIN(aWindow, " toplevelBoundsWithTitlebar %s", ToString(toplevelBoundsWithTitlebar).c_str()); + if (aWindow->GetSizeMode() == nsSizeMode_Fullscreen) { + // In order to avoid spurious extra resizes during fullscreen transitions, + // we assume we're not decorated. + return {.mClientArea = toplevelBoundsWithTitlebar, .mClientMargin = {}}; + } + const auto toplevelBounds = GetBounds(toplevel); LOG_WIN(aWindow, " toplevelBounds %s", ToString(toplevelBounds).c_str()); @@ -3416,6 +3422,11 @@ auto nsWindow::Bounds::ComputeWayland(const nsWindow* aWindow) -> Bounds { const auto toplevelBounds = GetBounds(aWindow->GetToplevelGdkWindow()); LOG_WIN(aWindow, " toplevelBounds %s", ToString(toplevelBounds).c_str()); + + if (aWindow->GetSizeMode() == nsSizeMode_Fullscreen) { + return {.mClientArea = toplevelBounds, .mClientMargin = {}}; + } + Bounds result; result.mClientArea = GetBounds(aWindow->GetGdkWindow()); LOG_WIN(aWindow, " bounds %s", ToString(result.mClientArea).c_str()); @@ -5533,11 +5544,19 @@ void nsWindow::OnWindowStateEvent(GtkWidget* aWidget, }(); if (mSizeMode != oldSizeMode) { + const bool fullscreenChanging = mSizeMode == nsSizeMode_Fullscreen || + oldSizeMode == nsSizeMode_Fullscreen; + if (fullscreenChanging) { + // As a special-case when going in / out of fullscreen mode we recompute + // bounds synchronously. This avoids spurious resizes when going into + // fullscreen mode if the relevant configure hasn't happened yet or what + // not. + RecomputeBounds(); + } if (mWidgetListener) { mWidgetListener->SizeModeChanged(mSizeMode); } - if (mSizeMode == nsSizeMode_Fullscreen || - oldSizeMode == nsSizeMode_Fullscreen) { + if (fullscreenChanging) { if (mCompositorWidgetDelegate) { mCompositorWidgetDelegate->NotifyFullscreenChanged( mSizeMode == nsSizeMode_Fullscreen); diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h @@ -204,6 +204,7 @@ class nsWindow final : public nsIWidget { void Resize(const DesktopRect&, bool aRepaint) override; bool IsEnabled() const override; + nsSizeMode GetSizeMode() const { return mSizeMode; } nsSizeMode SizeMode() override { return mSizeMode; } void SetSizeMode(nsSizeMode aMode) override; void GetWorkspaceID(nsAString& workspaceID) override;