commit 3a006d1c8f2a58b5e6796683609690ebbf67a996
parent 7cf41c4eb1616dad42f3e66e7dd4d04fed1da602
Author: stransky <stransky@redhat.com>
Date: Thu, 20 Nov 2025 10:21:50 +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:
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();