110 lines
5.4 KiB
Diff
110 lines
5.4 KiB
Diff
|
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
|