diff options
Diffstat (limited to 'mozilla-1683578.patch')
-rw-r--r-- | mozilla-1683578.patch | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/mozilla-1683578.patch b/mozilla-1683578.patch new file mode 100644 index 0000000..942c114 --- /dev/null +++ b/mozilla-1683578.patch @@ -0,0 +1,109 @@ +diff -up firefox-86.0/widget/gtk/nsWindow.cpp.1683578 firefox-86.0/widget/gtk/nsWindow.cpp +--- firefox-86.0/widget/gtk/nsWindow.cpp.1683578 2021-02-24 10:09:53.471680954 +0100 ++++ firefox-86.0/widget/gtk/nsWindow.cpp 2021-02-24 10:09:53.510681881 +0100 +@@ -1769,6 +1769,9 @@ void nsWindow::NativeMoveResizeWaylandPo + bool isWidgetVisible = + (sGtkWidgetIsVisible != nullptr) && sGtkWidgetIsVisible(mShell); + if (isWidgetVisible) { ++ LOG( ++ (" temporary hide popup due to " ++ "https://gitlab.gnome.org/GNOME/gtk/issues/1986\n")); + PauseRemoteRenderer(); + gtk_widget_hide(mShell); + } +@@ -1823,6 +1826,9 @@ void nsWindow::NativeMoveResizeWaylandPo + if (isWidgetVisible) { + // We show the popup with the same configuration so no need to call + // ConfigureWaylandPopupWindows() before gtk_widget_show(). ++ LOG( ++ (" show popup due to " ++ "https://gitlab.gnome.org/GNOME/gtk/issues/1986\n")); + gtk_widget_show(mShell); + } + } +diff -up firefox-86.0/widget/gtk/WindowSurfaceWayland.cpp.1683578 firefox-86.0/widget/gtk/WindowSurfaceWayland.cpp +--- firefox-86.0/widget/gtk/WindowSurfaceWayland.cpp.1683578 2021-02-22 15:47:05.000000000 +0100 ++++ firefox-86.0/widget/gtk/WindowSurfaceWayland.cpp 2021-02-24 10:12:59.835110678 +0100 +@@ -467,7 +467,7 @@ WindowSurfaceWayland::WindowSurfaceWayla + mWaylandBuffer(nullptr), + mWaylandFullscreenDamage(false), + mFrameCallback(nullptr), +- mLastCommittedSurface(nullptr), ++ mLastCommittedSurfaceID(-1), + mLastCommitTime(0), + mDrawToWaylandBufferDirectly(true), + mCanSwitchWaylandBuffer(true), +@@ -964,7 +964,7 @@ bool WindowSurfaceWayland::FlushPendingC + (" mDrawToWaylandBufferDirectly = %d\n", mDrawToWaylandBufferDirectly)); + LOGWAYLAND((" mCanSwitchWaylandBuffer = %d\n", mCanSwitchWaylandBuffer)); + LOGWAYLAND((" mFrameCallback = %p\n", mFrameCallback)); +- LOGWAYLAND((" mLastCommittedSurface = %p\n", mLastCommittedSurface)); ++ LOGWAYLAND((" mLastCommittedSurfaceID = %d\n", mLastCommittedSurfaceID)); + LOGWAYLAND((" mBufferPendingCommit = %d\n", mBufferPendingCommit)); + LOGWAYLAND((" mBufferCommitAllowed = %d\n", mBufferCommitAllowed)); + +@@ -990,12 +990,6 @@ bool WindowSurfaceWayland::FlushPendingC + LOGWAYLAND((" [%p] mWindow->GetWaylandSurface() failed, delay commit.\n", + (void*)this)); + +- // Target window is not created yet - delay the commit. This can happen only +- // when the window is newly created and there's no active +- // frame callback pending. +- MOZ_ASSERT(!mFrameCallback || waylandSurface != mLastCommittedSurface, +- "Missing wayland surface at frame callback!"); +- + if (!mSurfaceReadyTimerID) { + mSurfaceReadyTimerID = g_timeout_add( + EVENT_LOOP_DELAY, &WaylandBufferFlushPendingCommits, this); +@@ -1016,8 +1010,10 @@ bool WindowSurfaceWayland::FlushPendingC + + // We have an active frame callback request so handle it. + if (mFrameCallback) { +- if (waylandSurface == mLastCommittedSurface) { +- LOGWAYLAND((" [%p] wait for frame callback.\n", (void*)this)); ++ int waylandSurfaceID = wl_proxy_get_id((struct wl_proxy*)waylandSurface); ++ if (waylandSurfaceID == mLastCommittedSurfaceID) { ++ LOGWAYLAND((" [%p] wait for frame callback ID %d.\n", (void*)this, ++ waylandSurfaceID)); + // We have an active frame callback pending from our recent surface. + // It means we should defer the commit to FrameCallbackHandler(). + return true; +@@ -1026,7 +1022,7 @@ bool WindowSurfaceWayland::FlushPendingC + // callback is no longer active and we should release it. + wl_callback_destroy(mFrameCallback); + mFrameCallback = nullptr; +- mLastCommittedSurface = nullptr; ++ mLastCommittedSurfaceID = -1; + } + + if (mWaylandFullscreenDamage) { +@@ -1055,7 +1051,7 @@ bool WindowSurfaceWayland::FlushPendingC + wl_callback_add_listener(mFrameCallback, &frame_listener, this); + + mWaylandBuffer->Attach(waylandSurface); +- mLastCommittedSurface = waylandSurface; ++ mLastCommittedSurfaceID = wl_proxy_get_id((struct wl_proxy*)waylandSurface); + mLastCommitTime = g_get_monotonic_time() / 1000; + + // There's no pending commit, all changes are sent to compositor. +@@ -1097,7 +1093,7 @@ void WindowSurfaceWayland::Commit(const + void WindowSurfaceWayland::FrameCallbackHandler() { + MOZ_ASSERT(mFrameCallback != nullptr, + "FrameCallbackHandler() called without valid frame callback!"); +- MOZ_ASSERT(mLastCommittedSurface != nullptr, ++ MOZ_ASSERT(mLastCommittedSurfaceID != -1, + "FrameCallbackHandler() called without valid wl_surface!"); + LOGWAYLAND( + ("WindowSurfaceWayland::FrameCallbackHandler [%p]\n", (void*)this)); +diff -up firefox-86.0/widget/gtk/WindowSurfaceWayland.h.1683578 firefox-86.0/widget/gtk/WindowSurfaceWayland.h +--- firefox-86.0/widget/gtk/WindowSurfaceWayland.h.1683578 2021-02-22 15:47:05.000000000 +0100 ++++ firefox-86.0/widget/gtk/WindowSurfaceWayland.h 2021-02-24 10:09:53.509681857 +0100 +@@ -215,7 +215,7 @@ class WindowSurfaceWayland : public Wind + // Any next commit to wayland compositor will happen when frame callback + // comes from wayland compositor back as it's the best time to do the commit. + wl_callback* mFrameCallback; +- wl_surface* mLastCommittedSurface; ++ int mLastCommittedSurfaceID; + + // Cached drawings. If we can't get WaylandBuffer (wl_buffer) at + // WindowSurfaceWayland::Lock() we direct gecko rendering to |