Added fix for mozbz#1539471 - wayland popups/tooltips
This commit is contained in:
parent
739f4c25cc
commit
384fee2ff4
@ -99,7 +99,7 @@ ExcludeArch: s390x
|
|||||||
Summary: Mozilla Firefox Web browser
|
Summary: Mozilla Firefox Web browser
|
||||||
Name: firefox
|
Name: firefox
|
||||||
Version: 66.0.1
|
Version: 66.0.1
|
||||||
Release: 3%{?pre_tag}%{?dist}
|
Release: 4%{?pre_tag}%{?dist}
|
||||||
URL: https://www.mozilla.org/firefox/
|
URL: https://www.mozilla.org/firefox/
|
||||||
License: MPLv1.1 or GPLv2+ or LGPLv2+
|
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
|
Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz
|
||||||
@ -163,6 +163,7 @@ Patch576: mozilla-1532643-popup.patch
|
|||||||
Patch577: mozilla-1535567.patch
|
Patch577: mozilla-1535567.patch
|
||||||
Patch578: mozilla-1431399.patch
|
Patch578: mozilla-1431399.patch
|
||||||
Patch579: mozilla-1468911.patch
|
Patch579: mozilla-1468911.patch
|
||||||
|
Patch580: mozilla-1539471.patch
|
||||||
|
|
||||||
# PGO/LTO patches
|
# PGO/LTO patches
|
||||||
Patch600: pgo.patch
|
Patch600: pgo.patch
|
||||||
@ -381,6 +382,7 @@ This package contains results of tests executed during build.
|
|||||||
%patch577 -p1 -b .mozilla-1535567
|
%patch577 -p1 -b .mozilla-1535567
|
||||||
%patch578 -p1 -b .mozilla-1431399
|
%patch578 -p1 -b .mozilla-1431399
|
||||||
%patch579 -p1 -b .mozilla-1468911
|
%patch579 -p1 -b .mozilla-1468911
|
||||||
|
%patch580 -p1 -b .mozilla-1539471
|
||||||
|
|
||||||
# PGO patches
|
# PGO patches
|
||||||
%patch600 -p1 -b .pgo
|
%patch600 -p1 -b .pgo
|
||||||
@ -934,6 +936,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
|
|||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Mar 28 2019 Martin Stransky <stransky@redhat.com> - 66.0.1-4
|
||||||
|
- Added fix for mozbz#1539471 - wayland popups/tooltips
|
||||||
|
|
||||||
* Wed Mar 27 2019 Martin Stransky <stransky@redhat.com> - 66.0.1-3
|
* Wed Mar 27 2019 Martin Stransky <stransky@redhat.com> - 66.0.1-3
|
||||||
- Added fix for mozbz#526293 - show remote locations at
|
- Added fix for mozbz#526293 - show remote locations at
|
||||||
file chooser dialog
|
file chooser dialog
|
||||||
|
206
mozilla-1539471.patch
Normal file
206
mozilla-1539471.patch
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
diff -up firefox-66.0.1/widget/gtk/nsWindow.cpp.mozilla-1539471 firefox-66.0.1/widget/gtk/nsWindow.cpp
|
||||||
|
--- firefox-66.0.1/widget/gtk/nsWindow.cpp.mozilla-1539471 2019-03-28 14:08:42.351128620 +0100
|
||||||
|
+++ firefox-66.0.1/widget/gtk/nsWindow.cpp 2019-03-28 14:20:23.282890178 +0100
|
||||||
|
@@ -312,6 +312,9 @@ static nsWindow *gFocusWindow = nullptr;
|
||||||
|
static bool gBlockActivateEvent = false;
|
||||||
|
static bool gGlobalsInitialized = false;
|
||||||
|
static bool gRaiseWindows = true;
|
||||||
|
+#ifdef MOZ_WAYLAND
|
||||||
|
+static GList *gCurrentPopupWindows = nullptr;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
#if GTK_CHECK_VERSION(3, 4, 0)
|
||||||
|
static uint32_t gLastTouchID = 0;
|
||||||
|
@@ -1136,8 +1139,16 @@ void nsWindow::NativeMoveResizeWaylandPo
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- GtkWidget* parentWidget =
|
||||||
|
- GTK_WIDGET(gtk_window_get_transient_for(GTK_WINDOW(mShell)));
|
||||||
|
+ GtkWidget *parentWidget;
|
||||||
|
+ if (mPopupType == ePopupTypeTooltip && gCurrentPopupWindows) {
|
||||||
|
+ // Attach tooltip window to the latest popup window
|
||||||
|
+ // to have both visible.
|
||||||
|
+ parentWidget = GTK_WIDGET(gCurrentPopupWindows->data);
|
||||||
|
+ gtk_window_set_transient_for(GTK_WINDOW(mShell),
|
||||||
|
+ GTK_WINDOW(parentWidget));
|
||||||
|
+ } else {
|
||||||
|
+ parentWidget = GTK_WIDGET(gtk_window_get_transient_for(GTK_WINDOW(mShell)));
|
||||||
|
+ }
|
||||||
|
|
||||||
|
int x_parent, y_parent;
|
||||||
|
gdk_window_get_origin(gtk_widget_get_window(parentWidget), &x_parent, &y_parent);
|
||||||
|
@@ -3489,7 +3500,7 @@ nsresult nsWindow::Create(nsIWidget *aPa
|
||||||
|
gtkTypeHint = GDK_WINDOW_TYPE_HINT_DND;
|
||||||
|
mIsDragPopup = true;
|
||||||
|
} else {
|
||||||
|
- switch (aInitData->mPopupHint) {
|
||||||
|
+ switch (mPopupType) {
|
||||||
|
case ePopupTypeMenu:
|
||||||
|
gtkTypeHint = GDK_WINDOW_TYPE_HINT_POPUP_MENU;
|
||||||
|
break;
|
||||||
|
@@ -3610,6 +3621,8 @@ nsresult nsWindow::Create(nsIWidget *aPa
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
case eWindowType_child: {
|
||||||
|
+ MOZ_ASSERT(mIsX11Display,
|
||||||
|
+ "eWindowType_child is not supported on Wayland!");
|
||||||
|
if (parentMozContainer) {
|
||||||
|
mGdkWindow = CreateGdkWindow(parentGdkWindow, parentMozContainer);
|
||||||
|
mHasMappedToplevel = parentnsWindow->mHasMappedToplevel;
|
||||||
|
@@ -3979,6 +3992,49 @@ void nsWindow::NativeMoveResize() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef MOZ_WAYLAND
|
||||||
|
+void nsWindow::OpenToplevelWaylandWindow() {
|
||||||
|
+ // 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
|
||||||
|
+ // popup needs to have an unique parent.
|
||||||
|
+ if (mWindowType == eWindowType_popup) {
|
||||||
|
+ GtkWidget *parentWidget =
|
||||||
|
+ GTK_WIDGET(gtk_window_get_transient_for(GTK_WINDOW(mShell)));
|
||||||
|
+
|
||||||
|
+ if (gCurrentPopupWindows) {
|
||||||
|
+ do {
|
||||||
|
+ GtkWidget *widget = GTK_WIDGET(gCurrentPopupWindows->data);
|
||||||
|
+ if (widget == parentWidget) {
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ nsWindow* window = get_window_for_gtk_widget(widget);
|
||||||
|
+ NS_ASSERTION(window, "Unknown window in popup widget list!");
|
||||||
|
+ window->CloseToplevelWaylandWindow();
|
||||||
|
+
|
||||||
|
+ } while (gCurrentPopupWindows != nullptr);
|
||||||
|
+ }
|
||||||
|
+ gCurrentPopupWindows = g_list_prepend(gCurrentPopupWindows, mShell);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ gtk_widget_show(mShell);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void nsWindow::CloseToplevelWaylandWindow() {
|
||||||
|
+ if (mContainer && moz_container_has_wl_egl_window(mContainer)) {
|
||||||
|
+ // Because wl_egl_window is destroyed on moz_container_unmap(),
|
||||||
|
+ // the current compositor cannot use it anymore. To avoid crash,
|
||||||
|
+ // destroy the compositor & recreate a new compositor on next
|
||||||
|
+ // expose event.
|
||||||
|
+ DestroyLayerManager();
|
||||||
|
+ }
|
||||||
|
+ if (mWindowType == eWindowType_popup) {
|
||||||
|
+ gCurrentPopupWindows = g_list_remove(gCurrentPopupWindows, mShell);
|
||||||
|
+ }
|
||||||
|
+ gtk_widget_hide(mShell);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
void nsWindow::NativeShow(bool aAction) {
|
||||||
|
if (aAction) {
|
||||||
|
// unset our flag now that our window has been shown
|
||||||
|
@@ -3990,51 +4046,55 @@ void nsWindow::NativeShow(bool aAction)
|
||||||
|
SetUserTimeAndStartupIDForActivatedWindow(mShell);
|
||||||
|
}
|
||||||
|
|
||||||
|
- gtk_widget_show(mShell);
|
||||||
|
+#ifdef MOZ_WAYLAND
|
||||||
|
+ if (!mIsX11Display) {
|
||||||
|
+ OpenToplevelWaylandWindow();
|
||||||
|
+ } else
|
||||||
|
+#endif
|
||||||
|
+ {
|
||||||
|
+ gtk_widget_show(mShell);
|
||||||
|
+ }
|
||||||
|
} else if (mContainer) {
|
||||||
|
gtk_widget_show(GTK_WIDGET(mContainer));
|
||||||
|
} else if (mGdkWindow) {
|
||||||
|
gdk_window_show_unraised(mGdkWindow);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
-#ifdef MOZ_WAYLAND
|
||||||
|
- if (mContainer && moz_container_has_wl_egl_window(mContainer)) {
|
||||||
|
- // Because wl_egl_window is destroyed on moz_container_unmap(),
|
||||||
|
- // the current compositor cannot use it anymore. To avoid crash,
|
||||||
|
- // destroy the compositor & recreate a new compositor on next
|
||||||
|
- // expose event.
|
||||||
|
- DestroyLayerManager();
|
||||||
|
- }
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
if (mIsTopLevel) {
|
||||||
|
- // Workaround window freezes on GTK versions before 3.21.2 by
|
||||||
|
- // ensuring that configure events get dispatched to windows before
|
||||||
|
- // they are unmapped. See bug 1225044.
|
||||||
|
- if (gtk_check_version(3, 21, 2) != nullptr && mPendingConfigures > 0) {
|
||||||
|
- GtkAllocation allocation;
|
||||||
|
- gtk_widget_get_allocation(GTK_WIDGET(mShell), &allocation);
|
||||||
|
-
|
||||||
|
- GdkEventConfigure event;
|
||||||
|
- PodZero(&event);
|
||||||
|
- event.type = GDK_CONFIGURE;
|
||||||
|
- event.window = mGdkWindow;
|
||||||
|
- event.send_event = TRUE;
|
||||||
|
- event.x = allocation.x;
|
||||||
|
- event.y = allocation.y;
|
||||||
|
- event.width = allocation.width;
|
||||||
|
- event.height = allocation.height;
|
||||||
|
-
|
||||||
|
- auto shellClass = GTK_WIDGET_GET_CLASS(mShell);
|
||||||
|
- for (unsigned int i = 0; i < mPendingConfigures; i++) {
|
||||||
|
- Unused << shellClass->configure_event(mShell, &event);
|
||||||
|
+#ifdef MOZ_WAYLAND
|
||||||
|
+ if (!mIsX11Display) {
|
||||||
|
+ CloseToplevelWaylandWindow();
|
||||||
|
+ } else
|
||||||
|
+#endif
|
||||||
|
+ {
|
||||||
|
+ // Workaround window freezes on GTK versions before 3.21.2 by
|
||||||
|
+ // ensuring that configure events get dispatched to windows before
|
||||||
|
+ // they are unmapped. See bug 1225044.
|
||||||
|
+ if (gtk_check_version(3, 21, 2) != nullptr && mPendingConfigures > 0) {
|
||||||
|
+ GtkAllocation allocation;
|
||||||
|
+ gtk_widget_get_allocation(GTK_WIDGET(mShell), &allocation);
|
||||||
|
+
|
||||||
|
+ GdkEventConfigure event;
|
||||||
|
+ PodZero(&event);
|
||||||
|
+ event.type = GDK_CONFIGURE;
|
||||||
|
+ event.window = mGdkWindow;
|
||||||
|
+ event.send_event = TRUE;
|
||||||
|
+ event.x = allocation.x;
|
||||||
|
+ event.y = allocation.y;
|
||||||
|
+ event.width = allocation.width;
|
||||||
|
+ event.height = allocation.height;
|
||||||
|
+
|
||||||
|
+ auto shellClass = GTK_WIDGET_GET_CLASS(mShell);
|
||||||
|
+ for (unsigned int i = 0; i < mPendingConfigures; i++) {
|
||||||
|
+ Unused << shellClass->configure_event(mShell, &event);
|
||||||
|
+ }
|
||||||
|
+ mPendingConfigures = 0;
|
||||||
|
}
|
||||||
|
- mPendingConfigures = 0;
|
||||||
|
- }
|
||||||
|
|
||||||
|
- gtk_widget_hide(mShell);
|
||||||
|
+ gtk_widget_hide(mShell);
|
||||||
|
|
||||||
|
- ClearTransparencyBitmap(); // Release some resources
|
||||||
|
+ ClearTransparencyBitmap(); // Release some resources
|
||||||
|
+ }
|
||||||
|
} else if (mContainer) {
|
||||||
|
gtk_widget_hide(GTK_WIDGET(mContainer));
|
||||||
|
} else if (mGdkWindow) {
|
||||||
|
diff -up firefox-66.0.1/widget/gtk/nsWindow.h.mozilla-1539471 firefox-66.0.1/widget/gtk/nsWindow.h
|
||||||
|
--- firefox-66.0.1/widget/gtk/nsWindow.h.mozilla-1539471 2019-03-28 14:08:42.345128639 +0100
|
||||||
|
+++ firefox-66.0.1/widget/gtk/nsWindow.h 2019-03-28 14:08:42.355128607 +0100
|
||||||
|
@@ -603,6 +603,11 @@ class nsWindow final : public nsBaseWidg
|
||||||
|
|
||||||
|
void ForceTitlebarRedraw();
|
||||||
|
|
||||||
|
+#ifdef MOZ_WAYLAND
|
||||||
|
+ void OpenToplevelWaylandWindow();
|
||||||
|
+ void CloseToplevelWaylandWindow();
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* |mIMContext| takes all IME related stuff.
|
||||||
|
*
|
Loading…
Reference in New Issue
Block a user