71 lines
3.0 KiB
Diff
71 lines
3.0 KiB
Diff
|
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
|