1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
diff -up firefox-89.0/widget/gtk/nsWindow.cpp.1705048 firefox-89.0/widget/gtk/nsWindow.cpp
--- firefox-89.0/widget/gtk/nsWindow.cpp.1705048 2021-06-01 10:12:40.671376199 +0200
+++ firefox-89.0/widget/gtk/nsWindow.cpp 2021-06-01 10:13:45.134701718 +0200
@@ -553,6 +553,7 @@ nsWindow::nsWindow() {
mTitlebarBackdropState = false;
mHasAlphaVisual = false;
+ mIsWaylandPanelWindow = false;
mIsPIPWindow = false;
mAlwaysOnTop = false;
@@ -3724,7 +3725,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.mContentStatus != nsEventStatus_eConsumeNoDefault) {
mWindowShouldStartDragging = true;
@@ -4636,8 +4637,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;
}
}
@@ -4664,8 +4666,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);
@@ -4912,6 +4916,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-89.0/widget/gtk/nsWindow.h.1705048 firefox-89.0/widget/gtk/nsWindow.h
--- firefox-89.0/widget/gtk/nsWindow.h.1705048 2021-06-01 10:12:40.671376199 +0200
+++ firefox-89.0/widget/gtk/nsWindow.h 2021-06-01 10:12:40.673376240 +0200
@@ -590,6 +590,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
|