fix
This commit is contained in:
commit
11bbed2d96
2
.gitignore
vendored
2
.gitignore
vendored
@ -385,3 +385,5 @@ firefox-3.6.4.source.tar.bz2
|
||||
/firefox-langpacks-73.0-20200211.tar.xz
|
||||
/firefox-73.0.1.source.tar.xz
|
||||
/firefox-langpacks-73.0.1-20200220.tar.xz
|
||||
/firefox-74.0.source.tar.xz
|
||||
/firefox-langpacks-74.0-20200303.tar.xz
|
||||
|
37
firefox.spec
37
firefox.spec
@ -22,7 +22,11 @@ ExcludeArch: s390x
|
||||
%global enable_mozilla_crashreporter 0
|
||||
%endif
|
||||
|
||||
%if 0%{?fedora} > 31
|
||||
%global system_nss 0
|
||||
%else
|
||||
%global system_nss 1
|
||||
%endif
|
||||
%global system_ffi 1
|
||||
%ifarch armv7hl
|
||||
%global system_libvpx 1
|
||||
@ -112,13 +116,13 @@ ExcludeArch: s390x
|
||||
|
||||
Summary: Mozilla Firefox Web browser
|
||||
Name: firefox
|
||||
Version: 73.0.1
|
||||
Release: 4%{?dist}
|
||||
Version: 74.0
|
||||
Release: 1%{?dist}
|
||||
URL: https://www.mozilla.org/firefox/
|
||||
License: MPLv1.1 or GPLv2+ or LGPLv2+
|
||||
Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz
|
||||
%if %{with langpacks}
|
||||
Source1: firefox-langpacks-%{version}%{?pre_version}-20200220.tar.xz
|
||||
Source1: firefox-langpacks-%{version}%{?pre_version}-20200303.tar.xz
|
||||
%endif
|
||||
Source2: cbindgen-vendor.tar.xz
|
||||
Source10: firefox-mozconfig
|
||||
@ -157,8 +161,7 @@ Patch46: firefox-nss-version.patch
|
||||
Patch47: fedora-shebang-build.patch
|
||||
Patch48: build-arm-wasm.patch
|
||||
Patch49: build-arm-libaom.patch
|
||||
Patch50: Bug-1610814-Fix-NEON-compile-error-with-gcc-and-RGB-.patch
|
||||
Patch51: build-missing-size_t.patch
|
||||
#Patch50: Bug-1610814-Fix-NEON-compile-error-with-gcc-and-RGB-.patch
|
||||
|
||||
# Fedora specific patches
|
||||
Patch215: firefox-enable-addons.patch
|
||||
@ -178,10 +181,6 @@ Patch412: mozilla-1337988.patch
|
||||
Patch415: Bug-1238661---fix-mozillaSignalTrampoline-to-work-.patch
|
||||
Patch417: bug1375074-save-restore-x28.patch
|
||||
Patch422: mozilla-1580174-webrtc-popup.patch
|
||||
Patch427: mozilla-1607404-fix-remote-offset.patch
|
||||
Patch428: mozilla-1609732-no-full-hide.patch
|
||||
Patch429: mozilla-1609732-pause-renderer.patch
|
||||
Patch430: mozilla-1605795-popup-parent-fix.patch
|
||||
|
||||
# Wayland specific upstream patches
|
||||
Patch574: firefox-pipewire.patch
|
||||
@ -230,13 +229,7 @@ BuildRequires: clang-libs
|
||||
%if 0%{?build_with_clang}
|
||||
BuildRequires: lld
|
||||
%endif
|
||||
|
||||
%if 0%{?fedora} < 32
|
||||
BuildRequires: pipewire-devel
|
||||
%else
|
||||
BuildRequires: pipewire0.2-devel
|
||||
%endif
|
||||
|
||||
%if !0%{?use_bundled_cbindgen}
|
||||
BuildRequires: cbindgen
|
||||
%endif
|
||||
@ -364,8 +357,7 @@ This package contains results of tests executed during build.
|
||||
%patch47 -p1 -b .fedora-shebang
|
||||
%patch48 -p1 -b .build-arm-wasm
|
||||
%patch49 -p1 -b .build-arm-libaom
|
||||
%patch50 -p1 -b .build-arm-SwizzleNEON
|
||||
%patch51 -p1 -b .build-missing-size_t
|
||||
#%patch50 -p1 -b .build-arm-SwizzleNEON
|
||||
|
||||
# Fedora patches
|
||||
%patch215 -p1 -b .addons
|
||||
@ -388,14 +380,6 @@ This package contains results of tests executed during build.
|
||||
%patch415 -p1 -b .1238661
|
||||
%endif
|
||||
|
||||
# overflow widgets broken
|
||||
# dropdown missing on multimonitor
|
||||
# fix for wrong intl.accept_lang when using non en-us langpack
|
||||
%patch427 -p1 -b .1607404-fix-remote-offset
|
||||
%patch428 -p1 -b .1609732-no-full-hide
|
||||
%patch429 -p1 -b .1609732-pause-renderer
|
||||
%patch430 -p1 -b .1605795-popup-parent-fix
|
||||
|
||||
# Wayland specific upstream patches
|
||||
%patch574 -p1 -b .firefox-pipewire
|
||||
|
||||
@ -974,6 +958,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
%changelog
|
||||
* Tue Mar 03 2020 Martin Stransky <stransky@redhat.com> - 74.0-1
|
||||
- Update to 74.0 Build 1
|
||||
|
||||
* Mon Feb 24 2020 Martin Stransky <stransky@redhat.com> - 73.0.1-4
|
||||
- Using pipewire-0.2 as buildrequire
|
||||
- Added armv7hl fixes by Gabriel Hojda
|
||||
|
@ -1,231 +0,0 @@
|
||||
diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
|
||||
--- a/widget/gtk/nsWindow.h
|
||||
+++ b/widget/gtk/nsWindow.h
|
||||
@@ -687,6 +687,9 @@
|
||||
void HideWaylandPopupAndAllChildren();
|
||||
void CleanupWaylandPopups();
|
||||
GtkWindow* GetCurrentTopmostWindow();
|
||||
+ GtkWindow* GetCurrentWindow();
|
||||
+ GtkWindow* GetTopmostWindow();
|
||||
+ bool IsWidgetOverflowWindow();
|
||||
|
||||
/**
|
||||
* |mIMContext| takes all IME related stuff.
|
||||
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
|
||||
--- a/widget/gtk/nsWindow.cpp
|
||||
+++ b/widget/gtk/nsWindow.cpp
|
||||
@@ -1193,20 +1193,26 @@
|
||||
while (popupList) {
|
||||
LOG((" Looking for %p [nsWindow]\n", popupList->data));
|
||||
nsWindow* waylandWnd = static_cast<nsWindow*>(popupList->data);
|
||||
- bool popupFound = false;
|
||||
- for (unsigned long i = 0; i < widgetChain.Length(); i++) {
|
||||
- if (waylandWnd == widgetChain[i]) {
|
||||
- popupFound = true;
|
||||
- break;
|
||||
+ // Remove only menu popups or empty frames - they are most likely
|
||||
+ // already rolledup popups
|
||||
+ if (waylandWnd->IsMainMenuWindow() || !waylandWnd->GetFrame()) {
|
||||
+ bool popupFound = false;
|
||||
+ for (unsigned long i = 0; i < widgetChain.Length(); i++) {
|
||||
+ if (waylandWnd == widgetChain[i]) {
|
||||
+ popupFound = true;
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
- }
|
||||
- if (!popupFound) {
|
||||
- LOG((" nsWindow [%p] not found in PopupManager, hiding it.\n",
|
||||
- waylandWnd));
|
||||
- waylandWnd->HideWaylandWindow();
|
||||
- popupList = gVisibleWaylandPopupWindows;
|
||||
+ if (!popupFound) {
|
||||
+ LOG((" nsWindow [%p] not found in PopupManager, hiding it.\n",
|
||||
+ waylandWnd));
|
||||
+ waylandWnd->HideWaylandWindow();
|
||||
+ popupList = gVisibleWaylandPopupWindows;
|
||||
+ } else {
|
||||
+ LOG((" nsWindow [%p] is still open.\n", waylandWnd));
|
||||
+ popupList = popupList->next;
|
||||
+ }
|
||||
} else {
|
||||
- LOG((" nsWindow [%p] is still open.\n", waylandWnd));
|
||||
popupList = popupList->next;
|
||||
}
|
||||
}
|
||||
@@ -1229,6 +1235,55 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
+GtkWindow* nsWindow::GetTopmostWindow() {
|
||||
+ nsView* view = nsView::GetViewFor(this);
|
||||
+ if (view) {
|
||||
+ nsView* parentView = view->GetParent();
|
||||
+ if (parentView) {
|
||||
+ nsIWidget* parentWidget = parentView->GetNearestWidget(nullptr);
|
||||
+ if (parentWidget) {
|
||||
+ nsWindow* parentnsWindow = static_cast<nsWindow*>(parentWidget);
|
||||
+ LOG((" Topmost window: %p [nsWindow]\n", parentnsWindow));
|
||||
+ return GTK_WINDOW(parentnsWindow->mShell);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return nullptr;
|
||||
+}
|
||||
+
|
||||
+GtkWindow* nsWindow::GetCurrentWindow() {
|
||||
+ GtkWindow* parentGtkWindow = nullptr;
|
||||
+ // get the last opened window from gVisibleWaylandPopupWindows
|
||||
+ if (gVisibleWaylandPopupWindows) {
|
||||
+ nsWindow* parentnsWindow =
|
||||
+ static_cast<nsWindow*>(gVisibleWaylandPopupWindows->data);
|
||||
+ if (parentnsWindow) {
|
||||
+ LOG((" Setting parent to last opened window: %p [nsWindow]\n",
|
||||
+ parentnsWindow));
|
||||
+ parentGtkWindow = GTK_WINDOW(parentnsWindow->GetGtkWidget());
|
||||
+ }
|
||||
+ }
|
||||
+ // get the topmost window if the last opened windows are empty
|
||||
+ if (!parentGtkWindow) {
|
||||
+ parentGtkWindow = GetTopmostWindow();
|
||||
+ }
|
||||
+ if (parentGtkWindow && GTK_IS_WINDOW(parentGtkWindow)) {
|
||||
+ return GTK_WINDOW(parentGtkWindow);
|
||||
+ } else {
|
||||
+ LOG((" Failed to get current window for %p: %p\n", this, parentGtkWindow));
|
||||
+ }
|
||||
+ return nullptr;
|
||||
+}
|
||||
+
|
||||
+bool nsWindow::IsWidgetOverflowWindow() {
|
||||
+ if (this->GetFrame() && this->GetFrame()->GetContent()->GetID()) {
|
||||
+ nsCString nodeId;
|
||||
+ this->GetFrame()->GetContent()->GetID()->ToUTF8String(nodeId);
|
||||
+ return nodeId.Equals("widget-overflow");
|
||||
+ }
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
// Wayland keeps strong popup window hierarchy. We need to track active
|
||||
// (visible) popup windows and make sure we hide popup on the same level
|
||||
// before we open another one on that level. It means that every open
|
||||
@@ -1247,9 +1302,18 @@
|
||||
}
|
||||
#endif
|
||||
|
||||
- // Check if we're already configured.
|
||||
+ if (!GetFrame()) {
|
||||
+ LOG((" Window without frame cannot be configured.\n"));
|
||||
+ return nullptr;
|
||||
+ }
|
||||
+
|
||||
+ // Check if we're already configured. Popup can be reattached to various
|
||||
+ // windows, so don't consider them configured. Also the widget-overflow needs
|
||||
+ // special care because the opened (remote) popups has to be closed before is
|
||||
+ // it shown again.
|
||||
if (gVisibleWaylandPopupWindows &&
|
||||
- g_list_find(gVisibleWaylandPopupWindows, this)) {
|
||||
+ g_list_find(gVisibleWaylandPopupWindows, this) &&
|
||||
+ mPopupType != ePopupTypeTooltip && !IsWidgetOverflowWindow()) {
|
||||
LOG((" [%p] is already configured.\n", (void*)this));
|
||||
return GTK_WIDGET(gtk_window_get_transient_for(GTK_WINDOW(mShell)));
|
||||
}
|
||||
@@ -1257,80 +1321,30 @@
|
||||
// If we're opening a new window we don't want to attach it to a tooltip
|
||||
// as it's short lived temporary window.
|
||||
HideWaylandTooltips();
|
||||
+ // Cleanup already closed menus
|
||||
+ CleanupWaylandPopups();
|
||||
|
||||
GtkWindow* parentGtkWindow = nullptr;
|
||||
-
|
||||
- if (IsMainMenuWindow()) {
|
||||
- // Remove and hide already closed popups from the
|
||||
- // gVisibleWaylandPopupWindows which were not yet been hidden.
|
||||
- CleanupWaylandPopups();
|
||||
- // Since the popups are shown by unknown order it can happen that child
|
||||
- // popup is shown before parent popup.
|
||||
- // We look for the current window parent in nsXULPopupManager since it
|
||||
- // always has correct popup hierarchy while gVisibleWaylandPopupWindows may
|
||||
- // not.
|
||||
- nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
- AutoTArray<nsIWidget*, 5> widgetChain;
|
||||
- pm->GetSubmenuWidgetChain(&widgetChain);
|
||||
- for (unsigned long i = 0; i < widgetChain.Length() - 1; i++) {
|
||||
- unsigned long parentIndex = i + 1;
|
||||
- if (widgetChain.Length() > parentIndex && widgetChain[i] == this) {
|
||||
- nsWindow* parentWindow =
|
||||
- static_cast<nsWindow*>(widgetChain[parentIndex]);
|
||||
- parentGtkWindow = GTK_WINDOW(parentWindow->GetGtkWidget());
|
||||
- LOG((" [%p] Found %p as parent in nsXULPopupManager.", this,
|
||||
- parentWindow));
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
- } else {
|
||||
- // Panels usually ends there
|
||||
- if (gVisibleWaylandPopupWindows && HasRemoteContent()) {
|
||||
- // If the new panel is remote content, we need to close all other popups
|
||||
- // before to keep the correct hierarchy because the remote content popup
|
||||
- // can replace the overflow-widget panel.
|
||||
- HideWaylandOpenedPopups();
|
||||
- } else if (gVisibleWaylandPopupWindows) {
|
||||
- // If there is any remote content panel currently opened, close all
|
||||
- // opened popups to keep the correct hierarchy.
|
||||
- GList* popupList = gVisibleWaylandPopupWindows;
|
||||
- while (popupList) {
|
||||
- nsWindow* waylandWnd = static_cast<nsWindow*>(popupList->data);
|
||||
- LOG((" Checking [%p] IsRemoteContent %d\n", popupList->data,
|
||||
- waylandWnd->IsRemoteContent()));
|
||||
- if (waylandWnd->IsRemoteContent()) {
|
||||
- // close all popups including remote content before showing our panel
|
||||
- // Most likely returning from addon panel to overflow-widget.
|
||||
- HideWaylandOpenedPopups();
|
||||
- break;
|
||||
- }
|
||||
- popupList = popupList->next;
|
||||
- }
|
||||
- }
|
||||
- // For popups in panels use the last opened popup window as parent,
|
||||
- // panels are not stored in nsXULPopupManager.
|
||||
- if (gVisibleWaylandPopupWindows) {
|
||||
- nsWindow* parentWindow =
|
||||
- static_cast<nsWindow*>(gVisibleWaylandPopupWindows->data);
|
||||
- parentGtkWindow = GTK_WINDOW(parentWindow->GetGtkWidget());
|
||||
- }
|
||||
- }
|
||||
+ if (HasRemoteContent() || IsWidgetOverflowWindow()) {
|
||||
+ LOG(
|
||||
+ (" Hiding all opened popups because the window is remote content or "
|
||||
+ "overflow-widget"));
|
||||
+ HideWaylandOpenedPopups();
|
||||
+ }
|
||||
+
|
||||
+ parentGtkWindow = GetCurrentWindow();
|
||||
if (parentGtkWindow) {
|
||||
MOZ_ASSERT(parentGtkWindow != GTK_WINDOW(this->GetGtkWidget()),
|
||||
"Cannot set self as parent");
|
||||
gtk_window_set_transient_for(GTK_WINDOW(mShell),
|
||||
GTK_WINDOW(parentGtkWindow));
|
||||
- } else {
|
||||
- // Fallback to the parent given in nsWindow::Create (most likely the
|
||||
- // toplevel window).
|
||||
- parentGtkWindow = gtk_window_get_transient_for(GTK_WINDOW(mShell));
|
||||
- LOG((" Setting parent from transient: %p [GtkWindow]\n", parentGtkWindow));
|
||||
- }
|
||||
- // Add current window to the visible popup list
|
||||
- gVisibleWaylandPopupWindows =
|
||||
- g_list_prepend(gVisibleWaylandPopupWindows, this);
|
||||
-
|
||||
- LOG((" Parent window for %p: %p [GtkWindow]", this, parentGtkWindow));
|
||||
+ // Add current window to the visible popup list
|
||||
+ gVisibleWaylandPopupWindows =
|
||||
+ g_list_prepend(gVisibleWaylandPopupWindows, this);
|
||||
+ LOG((" Parent window for %p: %p [GtkWindow]", this, parentGtkWindow));
|
||||
+ }
|
||||
+
|
||||
+ MOZ_ASSERT(parentGtkWindow, "NO parent window for %p: expect popup glitches");
|
||||
return GTK_WIDGET(parentGtkWindow);
|
||||
}
|
||||
|
||||
|
@ -1,109 +0,0 @@
|
||||
diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
|
||||
--- a/widget/gtk/nsWindow.h
|
||||
+++ b/widget/gtk/nsWindow.h
|
||||
@@ -427,6 +427,8 @@
|
||||
#endif
|
||||
bool IsRemoteContent() { return HasRemoteContent(); }
|
||||
static void HideWaylandOpenedPopups();
|
||||
+ void NativeMoveResizeWaylandPopupCB(const GdkRectangle* aFinalSize,
|
||||
+ bool aFlippedX, bool aFlippedY);
|
||||
|
||||
protected:
|
||||
virtual ~nsWindow();
|
||||
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
|
||||
--- a/widget/gtk/nsWindow.cpp
|
||||
+++ b/widget/gtk/nsWindow.cpp
|
||||
@@ -1333,7 +1333,6 @@
|
||||
return GTK_WIDGET(parentGtkWindow);
|
||||
}
|
||||
|
||||
-#ifdef DEBUG
|
||||
static void NativeMoveResizeWaylandPopupCallback(
|
||||
GdkWindow* window, const GdkRectangle* flipped_rect,
|
||||
const GdkRectangle* final_rect, gboolean flipped_x, gboolean flipped_y,
|
||||
@@ -1341,12 +1340,60 @@
|
||||
LOG(("NativeMoveResizeWaylandPopupCallback [%p] flipped_x %d flipped_y %d\n",
|
||||
aWindow, flipped_x, flipped_y));
|
||||
|
||||
- LOG((" flipped_rect x: %d y: %d width: %d height: %d\n", flipped_rect->x,
|
||||
+ LOG((" flipped_rect x=%d y=%d width=%d height=%d\n", flipped_rect->x,
|
||||
flipped_rect->y, flipped_rect->width, flipped_rect->height));
|
||||
- LOG((" final_rect x: %d y: %d width: %d height: %d\n", final_rect->x,
|
||||
+ LOG((" final_rect x=%d y=%d width=%d height=%d\n", final_rect->x,
|
||||
final_rect->y, final_rect->width, final_rect->height));
|
||||
-}
|
||||
-#endif
|
||||
+ nsWindow* wnd = get_window_for_gdk_window(window);
|
||||
+
|
||||
+ wnd->NativeMoveResizeWaylandPopupCB(final_rect, flipped_x, flipped_y);
|
||||
+}
|
||||
+
|
||||
+void nsWindow::NativeMoveResizeWaylandPopupCB(const GdkRectangle* aFinalSize,
|
||||
+ bool aFlippedX, bool aFlippedY) {
|
||||
+ LOG((" orig mBounds x=%d y=%d width=%d height=%d\n", mBounds.x, mBounds.y,
|
||||
+ mBounds.width, mBounds.height));
|
||||
+
|
||||
+ GtkWindow* parentGtkWindow = gtk_window_get_transient_for(GTK_WINDOW(mShell));
|
||||
+ if (!parentGtkWindow) {
|
||||
+ NS_WARNING("Popup has no parent!");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ // The position of the menu in GTK is relative to it's parent window while
|
||||
+ // in mBounds we have position relative to toplevel window. We need to check
|
||||
+ // and update mBounds in the toplevel coordinates.
|
||||
+ int x_parent, y_parent;
|
||||
+ gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(parentGtkWindow)),
|
||||
+ &x_parent, &y_parent);
|
||||
+
|
||||
+ LayoutDeviceIntRect newBounds(aFinalSize->x + x_parent,
|
||||
+ aFinalSize->y + y_parent, aFinalSize->width,
|
||||
+ aFinalSize->height);
|
||||
+
|
||||
+ newBounds.Scale(nsWindow::GdkScaleFactor());
|
||||
+ LOG((" new mBounds x=%d y=%d width=%d height=%d\n", newBounds.x,
|
||||
+ newBounds.y, newBounds.width, newBounds.height));
|
||||
+
|
||||
+ bool needsPositionUpdate =
|
||||
+ (newBounds.x != mBounds.x || newBounds.y != mBounds.y);
|
||||
+ bool needsSizeUpdate =
|
||||
+ (newBounds.width != mBounds.width || newBounds.height != mBounds.height);
|
||||
+
|
||||
+ if (!needsPositionUpdate && !needsSizeUpdate) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (needsPositionUpdate && needsSizeUpdate) {
|
||||
+ Resize(newBounds.x, newBounds.y, newBounds.width, newBounds.height, true);
|
||||
+ NotifyWindowMoved(newBounds.x, newBounds.y);
|
||||
+ } else if (needsPositionUpdate) {
|
||||
+ Move(newBounds.x, newBounds.y);
|
||||
+ NotifyWindowMoved(newBounds.x, newBounds.y);
|
||||
+ } else {
|
||||
+ Resize(newBounds.width, newBounds.height, true);
|
||||
+ }
|
||||
+}
|
||||
|
||||
void nsWindow::NativeMoveResizeWaylandPopup(GdkPoint* aPosition,
|
||||
GdkRectangle* aSize) {
|
||||
@@ -1392,15 +1439,16 @@
|
||||
rect.width = aSize->width;
|
||||
rect.height = aSize->height;
|
||||
}
|
||||
-
|
||||
-#ifdef DEBUG
|
||||
+ LOG((" x_parent %d y_parent %d\n", x_parent, y_parent));
|
||||
+ LOG((" aPosition x %d aPosition y %d\n", aPosition->x, aPosition->y));
|
||||
+ LOG((" rect.x %d rect.y %d\n", rect.x, rect.y));
|
||||
+
|
||||
if (!g_signal_handler_find(
|
||||
gdkWindow, G_SIGNAL_MATCH_FUNC, 0, 0, nullptr,
|
||||
FuncToGpointer(NativeMoveResizeWaylandPopupCallback), this)) {
|
||||
g_signal_connect(gdkWindow, "moved-to-rect",
|
||||
G_CALLBACK(NativeMoveResizeWaylandPopupCallback), this);
|
||||
}
|
||||
-#endif
|
||||
|
||||
GdkGravity rectAnchor = GDK_GRAVITY_NORTH_WEST;
|
||||
GdkGravity menuAnchor = GDK_GRAVITY_NORTH_WEST;
|
||||
|
@ -1,60 +0,0 @@
|
||||
diff --git a/widget/gtk/WindowSurfaceWayland.cpp b/widget/gtk/WindowSurfaceWayland.cpp
|
||||
--- a/widget/gtk/WindowSurfaceWayland.cpp
|
||||
+++ b/widget/gtk/WindowSurfaceWayland.cpp
|
||||
@@ -805,6 +805,10 @@
|
||||
mBufferCommitAllowed = false;
|
||||
|
||||
LayoutDeviceIntRect lockedScreenRect = mWindow->GetBounds();
|
||||
+ // The window bounds of popup windows contains relative position to
|
||||
+ // the transient window. We need to remove that effect because by changing
|
||||
+ // position of the popup window the buffer has not changed its size.
|
||||
+ lockedScreenRect.x = lockedScreenRect.y = 0;
|
||||
gfx::IntRect lockSize = aRegion.GetBounds().ToUnknownRect();
|
||||
|
||||
bool isTransparentPopup =
|
||||
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
|
||||
--- a/widget/gtk/nsWindow.cpp
|
||||
+++ b/widget/gtk/nsWindow.cpp
|
||||
@@ -1324,6 +1324,7 @@
|
||||
// Fallback to the parent given in nsWindow::Create (most likely the
|
||||
// toplevel window).
|
||||
parentGtkWindow = gtk_window_get_transient_for(GTK_WINDOW(mShell));
|
||||
+ LOG((" Setting parent from transient: %p [GtkWindow]\n", parentGtkWindow));
|
||||
}
|
||||
// Add current window to the visible popup list
|
||||
gVisibleWaylandPopupWindows =
|
||||
@@ -1355,7 +1356,7 @@
|
||||
mBounds.width, mBounds.height));
|
||||
|
||||
GtkWindow* parentGtkWindow = gtk_window_get_transient_for(GTK_WINDOW(mShell));
|
||||
- if (!parentGtkWindow) {
|
||||
+ if (!parentGtkWindow || !GTK_IS_WIDGET(parentGtkWindow)) {
|
||||
NS_WARNING("Popup has no parent!");
|
||||
return;
|
||||
}
|
||||
@@ -1431,8 +1432,13 @@
|
||||
parentWindow));
|
||||
|
||||
int x_parent, y_parent;
|
||||
- gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(parentWindow)),
|
||||
- &x_parent, &y_parent);
|
||||
+ if (parentWindow) {
|
||||
+ gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(parentWindow)),
|
||||
+ &x_parent, &y_parent);
|
||||
+ } else {
|
||||
+ NS_WARNING(("no parent window, this should not happen for popup!"));
|
||||
+ x_parent = y_parent = 0;
|
||||
+ }
|
||||
|
||||
GdkRectangle rect = {aPosition->x - x_parent, aPosition->y - y_parent, 1, 1};
|
||||
if (aSize) {
|
||||
@@ -1470,7 +1476,7 @@
|
||||
bool isWidgetVisible =
|
||||
(sGtkWidgetIsVisible != nullptr) && sGtkWidgetIsVisible(mShell);
|
||||
if (isWidgetVisible) {
|
||||
- HideWaylandWindow();
|
||||
+ gtk_widget_hide(mShell);
|
||||
}
|
||||
|
||||
LOG((" requested rect: x: %d y: %d width: %d height: %d\n", rect.x, rect.y,
|
||||
|
@ -1,73 +0,0 @@
|
||||
diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
|
||||
--- a/widget/gtk/nsWindow.h
|
||||
+++ b/widget/gtk/nsWindow.h
|
||||
@@ -681,6 +681,7 @@
|
||||
|
||||
bool IsMainMenuWindow();
|
||||
GtkWidget* ConfigureWaylandPopupWindows();
|
||||
+ void PauseRemoteRenderer();
|
||||
void HideWaylandWindow();
|
||||
void HideWaylandTooltips();
|
||||
void HideWaylandPopupAndAllChildren();
|
||||
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
|
||||
--- a/widget/gtk/nsWindow.cpp
|
||||
+++ b/widget/gtk/nsWindow.cpp
|
||||
@@ -1386,10 +1386,10 @@
|
||||
}
|
||||
|
||||
if (needsPositionUpdate && needsSizeUpdate) {
|
||||
- Resize(newBounds.x, newBounds.y, newBounds.width, newBounds.height, true);
|
||||
+ mBounds = newBounds;
|
||||
NotifyWindowMoved(newBounds.x, newBounds.y);
|
||||
} else if (needsPositionUpdate) {
|
||||
- Move(newBounds.x, newBounds.y);
|
||||
+ mBounds = newBounds;
|
||||
NotifyWindowMoved(newBounds.x, newBounds.y);
|
||||
} else {
|
||||
Resize(newBounds.width, newBounds.height, true);
|
||||
@@ -1476,6 +1476,7 @@
|
||||
bool isWidgetVisible =
|
||||
(sGtkWidgetIsVisible != nullptr) && sGtkWidgetIsVisible(mShell);
|
||||
if (isWidgetVisible) {
|
||||
+ PauseRemoteRenderer();
|
||||
gtk_widget_hide(mShell);
|
||||
}
|
||||
|
||||
@@ -4497,16 +4498,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
-void nsWindow::HideWaylandWindow() {
|
||||
+void nsWindow::PauseRemoteRenderer() {
|
||||
#ifdef MOZ_WAYLAND
|
||||
- if (mWindowType == eWindowType_popup) {
|
||||
- LOG(("nsWindow::HideWaylandWindow: popup [%p]\n", this));
|
||||
- GList* foundWindow = g_list_find(gVisibleWaylandPopupWindows, this);
|
||||
- if (foundWindow) {
|
||||
- gVisibleWaylandPopupWindows =
|
||||
- g_list_delete_link(gVisibleWaylandPopupWindows, foundWindow);
|
||||
- }
|
||||
- }
|
||||
if (!mIsDestroyed) {
|
||||
if (mContainer && moz_container_has_wl_egl_window(mContainer)) {
|
||||
// Because wl_egl_window is destroyed on moz_container_unmap(),
|
||||
@@ -4529,6 +4522,18 @@
|
||||
}
|
||||
}
|
||||
#endif
|
||||
+}
|
||||
+
|
||||
+void nsWindow::HideWaylandWindow() {
|
||||
+ if (mWindowType == eWindowType_popup) {
|
||||
+ LOG(("nsWindow::HideWaylandWindow: popup [%p]\n", this));
|
||||
+ GList* foundWindow = g_list_find(gVisibleWaylandPopupWindows, this);
|
||||
+ if (foundWindow) {
|
||||
+ gVisibleWaylandPopupWindows =
|
||||
+ g_list_delete_link(gVisibleWaylandPopupWindows, foundWindow);
|
||||
+ }
|
||||
+ }
|
||||
+ PauseRemoteRenderer();
|
||||
gtk_widget_hide(mShell);
|
||||
}
|
||||
|
||||
|
4
sources
4
sources
@ -1,3 +1,3 @@
|
||||
SHA512 (cbindgen-vendor.tar.xz) = 9709c47df2dfb615554c6616c1d9f94c7a408ea4382400bd9f75eae29b0819a6418b5625eb0df2508fcbbbb74672347d00a5f6557755b9dd9de7d42fb2e509c4
|
||||
SHA512 (firefox-73.0.1.source.tar.xz) = 89fac2c50e092f2805f48399f68cdf0793324e1dce89266f62b76e9b335dfc553ae54a36738992630b6035a52cd65b9aa774e7e54cea2e3ec7d609d9219cdf76
|
||||
SHA512 (firefox-langpacks-73.0.1-20200220.tar.xz) = 652f9ebfcec2921d13baea5433d86f160bea66e0b528f94874ff19a9e1b73978c23651dce964755ca2bc87fecd2baeb239f613230fb2fe59b8bcd0b4d40f296f
|
||||
SHA512 (firefox-74.0.source.tar.xz) = 83fcdf1a8a702cc480314dbbef0a819f95fac2ebbe275207b052ba8d62bfa9d93dc21b25ebfc466e798933e3f7b9a3bd9afc6afc295451495bb3d8a2bf864f44
|
||||
SHA512 (firefox-langpacks-74.0-20200303.tar.xz) = 3cdb50c27adaaa85d727f2a8c0c6a284092fa4af815fdfbc8d170066287b22b566d052cc8e151ed901bcebf1a5ae2f19bb68be543738d35eac4a316aadb78232
|
||||
|
Loading…
Reference in New Issue
Block a user