tor-browser

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

commit d8886e6742dffc92ab165094671329d5dc35005e
parent a383a1fc3258a12125040c927cffa631f126dfe3
Author: stransky <stransky@redhat.com>
Date:   Thu, 20 Nov 2025 13:18:15 +0000

Bug 1998657 [Linux] Set/Unset mGdkWindow on container realize/unrealize to make sure we have recent GdkWindow r=jhorak

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

Diffstat:
Mwidget/gtk/MozContainer.cpp | 16++++++++++++----
Mwidget/gtk/nsWindow.cpp | 20+++++++++++++-------
Mwidget/gtk/nsWindow.h | 3++-
3 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/widget/gtk/MozContainer.cpp b/widget/gtk/MozContainer.cpp @@ -189,20 +189,28 @@ void moz_container_realize(GtkWidget* widget) { attributes.visual = gtk_widget_get_visual(widget); window = gdk_window_new(parent, &attributes, attributes_mask); + auto w = moz_container_get_nsWindow(container); - LOGCONTAINER(("moz_container_realize() [%p] GdkWindow %p\n", - (void*)moz_container_get_nsWindow(container), (void*)window)); + LOGCONTAINER( + ("moz_container_realize() [%p] GdkWindow %p\n", (void*)w, (void*)window)); gtk_widget_register_window(widget, window); gtk_widget_set_window(widget, window); + + MOZ_DIAGNOSTIC_ASSERT(w); + w->SetGdkWindow(window); } void moz_container_unrealize(GtkWidget* widget) { GdkWindow* window = gtk_widget_get_window(widget); - LOGCONTAINER(("moz_container_unrealize() [%p] GdkWindow %p\n", - (void*)moz_container_get_nsWindow(MOZ_CONTAINER(widget)), + auto w = moz_container_get_nsWindow(MOZ_CONTAINER(widget)); + + LOGCONTAINER(("moz_container_unrealize() [%p] GdkWindow %p\n", (void*)w, (void*)window)); + MOZ_DIAGNOSTIC_ASSERT(w); + w->SetGdkWindow(nullptr); + if (gtk_widget_get_mapped(widget)) { gtk_widget_unmap(widget); } diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp @@ -722,10 +722,6 @@ void nsWindow::Destroy() { // just drop the reference here. mEGLWindow = nullptr; - // mGdkWindow is owned by mContainer, will be deleted with mShell/mContainer. - g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", nullptr); - mGdkWindow = nullptr; - gtk_widget_destroy(mShell); mShell = nullptr; mContainer = nullptr; @@ -6173,6 +6169,19 @@ void nsWindow::ConfigureCompositor() { ResumeCompositorImpl(); } +void nsWindow::SetGdkWindow(GdkWindow* aGdkWindow) { + LOG("nsWindow::SetGdkWindow() %p", aGdkWindow); + if (!aGdkWindow) { + if (mGdkWindow) { + g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", nullptr); + } + mGdkWindow = nullptr; + } else { + mGdkWindow = aGdkWindow; + g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this); + } +} + nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, const widget::InitData& aInitData) { MOZ_DIAGNOSTIC_ASSERT(aInitData.mWindowType != WindowType::Invisible); @@ -6424,9 +6433,6 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, gtk_widget_realize(container); - mGdkWindow = gtk_widget_get_window(GTK_WIDGET(mContainer)); - g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this); - #ifdef MOZ_X11 if (GdkIsX11Display()) { mEGLWindow = (void*)GDK_WINDOW_XID(mGdkWindow); diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h @@ -340,7 +340,8 @@ class nsWindow final : public nsIWidget { static guint32 sLastButtonPressTime; MozContainer* GetMozContainer() { return mContainer; } - GdkWindow* GetGdkWindow() const { return mGdkWindow; }; + GdkWindow* GetGdkWindow() const { return mGdkWindow; } + void SetGdkWindow(GdkWindow* aGdkWindow); GdkWindow* GetToplevelGdkWindow() const; GtkWidget* GetGtkWidget() const { return mShell; } nsWindow* GetEffectiveParent();