diff options
Diffstat (limited to 'mozilla-1562827.patch')
-rw-r--r-- | mozilla-1562827.patch | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/mozilla-1562827.patch b/mozilla-1562827.patch new file mode 100644 index 0000000..497133c --- /dev/null +++ b/mozilla-1562827.patch @@ -0,0 +1,141 @@ +diff -up firefox-69.0/widget/gtk/nsWindow.cpp.mozilla-1562827 firefox-69.0/widget/gtk/nsWindow.cpp +--- firefox-69.0/widget/gtk/nsWindow.cpp.mozilla-1562827 2019-09-02 15:16:15.031528276 +0200 ++++ firefox-69.0/widget/gtk/nsWindow.cpp 2019-09-02 15:16:15.037528254 +0200 +@@ -818,7 +818,6 @@ void nsWindow::SetParent(nsIWidget* aNew + if (mParent) { + mParent->RemoveChild(this); + } +- + mParent = aNewParent; + + GtkWidget* oldContainer = GetMozContainerWidget(); +@@ -830,88 +829,73 @@ void nsWindow::SetParent(nsIWidget* aNew + return; + } + ++ nsWindow* newParent = static_cast<nsWindow*>(aNewParent); ++ GdkWindow* newParentWindow = nullptr; ++ GtkWidget* newContainer = nullptr; + if (aNewParent) { + aNewParent->AddChild(this); +- ReparentNativeWidget(aNewParent); ++ newParentWindow = newParent->mGdkWindow; ++ newContainer = newParent->GetMozContainerWidget(); + } else { + // aNewParent is nullptr, but reparent to a hidden window to avoid + // destroying the GdkWindow and its descendants. + // An invisible container widget is needed to hold descendant + // GtkWidgets. +- GtkWidget* newContainer = EnsureInvisibleContainer(); +- GdkWindow* newParentWindow = gtk_widget_get_window(newContainer); +- ReparentNativeWidgetInternal(aNewParent, newContainer, newParentWindow, +- oldContainer); +- } +-} +- +-bool nsWindow::WidgetTypeSupportsAcceleration() { return !IsSmallPopup(); } +- +-void nsWindow::ReparentNativeWidget(nsIWidget* aNewParent) { +- MOZ_ASSERT(aNewParent, "null widget"); +- NS_ASSERTION(!mIsDestroyed, ""); +- NS_ASSERTION(!static_cast<nsWindow*>(aNewParent)->mIsDestroyed, ""); +- +- GtkWidget* oldContainer = GetMozContainerWidget(); +- if (!oldContainer) { +- // The GdkWindows have been destroyed so there is nothing else to +- // reparent. +- MOZ_ASSERT(gdk_window_is_destroyed(mGdkWindow), +- "live GdkWindow with no widget"); +- return; ++ newContainer = EnsureInvisibleContainer(); ++ newParentWindow = gtk_widget_get_window(newContainer); + } +- MOZ_ASSERT(!gdk_window_is_destroyed(mGdkWindow), +- "destroyed GdkWindow with widget"); + +- auto* newParent = static_cast<nsWindow*>(aNewParent); +- GdkWindow* newParentWindow = newParent->mGdkWindow; +- GtkWidget* newContainer = newParent->GetMozContainerWidget(); +- GtkWindow* shell = GTK_WINDOW(mShell); +- +- if (shell && gtk_window_get_transient_for(shell)) { +- GtkWindow* topLevelParent = +- GTK_WINDOW(gtk_widget_get_toplevel(newContainer)); +- gtk_window_set_transient_for(shell, topLevelParent); +- } +- +- ReparentNativeWidgetInternal(aNewParent, newContainer, newParentWindow, +- oldContainer); +-} +- +-void nsWindow::ReparentNativeWidgetInternal(nsIWidget* aNewParent, +- GtkWidget* aNewContainer, +- GdkWindow* aNewParentWindow, +- GtkWidget* aOldContainer) { +- if (!aNewContainer) { ++ if (!newContainer) { + // The new parent GdkWindow has been destroyed. +- MOZ_ASSERT(!aNewParentWindow || gdk_window_is_destroyed(aNewParentWindow), ++ MOZ_ASSERT(!newParentWindow || gdk_window_is_destroyed(newParentWindow), + "live GdkWindow with no widget"); + Destroy(); + } else { +- if (aNewContainer != aOldContainer) { +- MOZ_ASSERT(!gdk_window_is_destroyed(aNewParentWindow), ++ if (newContainer != oldContainer) { ++ MOZ_ASSERT(!gdk_window_is_destroyed(newParentWindow), + "destroyed GdkWindow with widget"); +- SetWidgetForHierarchy(mGdkWindow, aOldContainer, aNewContainer); ++ SetWidgetForHierarchy(mGdkWindow, oldContainer, newContainer); + +- if (aOldContainer == gInvisibleContainer) { ++ if (oldContainer == gInvisibleContainer) { + CheckDestroyInvisibleContainer(); + } + } + +- if (!mIsTopLevel) { +- gdk_window_reparent(mGdkWindow, aNewParentWindow, +- DevicePixelsToGdkCoordRoundDown(mBounds.x), +- DevicePixelsToGdkCoordRoundDown(mBounds.y)); +- } ++ gdk_window_reparent(mGdkWindow, newParentWindow, ++ DevicePixelsToGdkCoordRoundDown(mBounds.x), ++ DevicePixelsToGdkCoordRoundDown(mBounds.y)); ++ mToplevelParentWindow = GTK_WINDOW(gtk_widget_get_toplevel(newContainer)); + } + +- auto* newParent = static_cast<nsWindow*>(aNewParent); + bool parentHasMappedToplevel = newParent && newParent->mHasMappedToplevel; + if (mHasMappedToplevel != parentHasMappedToplevel) { + SetHasMappedToplevel(parentHasMappedToplevel); + } + } + ++bool nsWindow::WidgetTypeSupportsAcceleration() { return !IsSmallPopup(); } ++ ++void nsWindow::ReparentNativeWidget(nsIWidget* aNewParent) { ++ MOZ_ASSERT(aNewParent, "null widget"); ++ MOZ_ASSERT(!mIsDestroyed, ""); ++ MOZ_ASSERT(!static_cast<nsWindow*>(aNewParent)->mIsDestroyed, ""); ++ MOZ_ASSERT(!gdk_window_is_destroyed(mGdkWindow), ++ "destroyed GdkWindow with widget"); ++ ++ MOZ_ASSERT( ++ !mParent, ++ "nsWindow::ReparentNativeWidget() works on toplevel windows only."); ++ ++ auto* newParent = static_cast<nsWindow*>(aNewParent); ++ GtkWindow* newParentWidget = GTK_WINDOW(newParent->GetGtkWidget()); ++ GtkWindow* shell = GTK_WINDOW(mShell); ++ ++ if (shell && gtk_window_get_transient_for(shell)) { ++ gtk_window_set_transient_for(shell, newParentWidget); ++ mToplevelParentWindow = newParentWidget; ++ } ++} ++ + void nsWindow::SetModal(bool aModal) { + LOG(("nsWindow::SetModal [%p] %d\n", (void*)this, aModal)); + if (mIsDestroyed) return; +diff -up firefox-69.0/widget/gtk/nsWindow.h.mozilla-1562827 firefox-69.0/widget/gtk/nsWindow.h |