diff -up firefox-88.0/widget/gtk/nsWindow.cpp.1705048 firefox-88.0/widget/gtk/nsWindow.cpp --- firefox-88.0/widget/gtk/nsWindow.cpp.1705048 2021-05-04 15:43:16.039586526 +0200 +++ firefox-88.0/widget/gtk/nsWindow.cpp 2021-05-04 15:47:26.358614462 +0200 @@ -553,6 +553,7 @@ nsWindow::nsWindow() { mTitlebarBackdropState = false; mHasAlphaVisual = false; + mIsWaylandPanelWindow = false; mIsPIPWindow = false; mAlwaysOnTop = false; @@ -3713,7 +3714,7 @@ void nsWindow::OnButtonPressEvent(GdkEve LayoutDeviceIntPoint refPoint = GdkEventCoordsToDevicePixels(aEvent->x, aEvent->y); - if (mDraggableRegion.Contains(refPoint.x, refPoint.y) && + if ((mIsWaylandPanelWindow || mDraggableRegion.Contains(refPoint.x, refPoint.y)) && domButton == MouseButton::ePrimary && eventStatus != nsEventStatus_eConsumeNoDefault) { mWindowShouldStartDragging = true; @@ -4614,8 +4615,9 @@ nsresult nsWindow::Create(nsIWidget* aPa // as a workaround. mWindowType = eWindowType_toplevel; } else if (mWindowType == eWindowType_popup && !aNativeParent && !aParent) { - // Workaround for Wayland where the popup windows always need to have - // parent window. For example webrtc ui is a popup window without parent. + // mIsWaylandPanelWindow is a special toplevel window on Wayland which + // emulates X11 popup window without parent. + mIsWaylandPanelWindow = true; mWindowType = eWindowType_toplevel; } } @@ -4642,8 +4644,10 @@ nsresult nsWindow::Create(nsIWidget* aPa // popup window position. GtkWindowType type = GTK_WINDOW_TOPLEVEL; if (mWindowType == eWindowType_popup) { - type = (mIsX11Display && aInitData->mNoAutoHide) ? GTK_WINDOW_TOPLEVEL - : GTK_WINDOW_POPUP; + type = GTK_WINDOW_POPUP; + if (GdkIsX11Display() && aInitData->mNoAutoHide) { + type = GTK_WINDOW_TOPLEVEL; + } } mShell = gtk_window_new(type); @@ -4890,6 +4894,10 @@ nsresult nsWindow::Create(nsIWidget* aPa } #endif + if (mIsWaylandPanelWindow) { + gtk_window_set_decorated(GTK_WINDOW(mShell), false); + } + if (mWindowType == eWindowType_popup) { // gdk does not automatically set the cursor for "temporary" // windows, which are what gtk uses for popups. diff -up firefox-88.0/widget/gtk/nsWindow.h.1705048 firefox-88.0/widget/gtk/nsWindow.h --- firefox-88.0/widget/gtk/nsWindow.h.1705048 2021-05-04 15:43:16.041586502 +0200 +++ firefox-88.0/widget/gtk/nsWindow.h 2021-05-04 15:45:01.703331956 +0200 @@ -591,6 +591,10 @@ class nsWindow final : public nsBaseWidg LayoutDeviceIntRegion mDraggableRegion; // It's PictureInPicture window. bool mIsPIPWindow; + // It's undecorated popup utility window, without resizers/titlebar, + // movable by mouse. Used on Wayland as a workaround for popups without + // parent (for instance WebRTC sharing indicator). + bool mIsWaylandPanelWindow; bool mAlwaysOnTop; #ifdef ACCESSIBILITY