summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-11-17 03:03:06 +0100
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-11-17 03:03:06 +0100
commit00ee14a9456a1d69d3e352ebe41b5f2cf019c166 (patch)
treefcf9983b71288986e63466be5979bd4e92f4e3b3
parent9c321ec34a8c52ce8ae418e962be1b5e7462ccf4 (diff)
parenta7b3894416eb38b3a02e20284a23c8b887d81516 (diff)
Merge remote-tracking branch 'origin/5.12' into dev
-rw-r--r--src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp36
-rw-r--r--src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6_p.h5
-rw-r--r--src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp36
-rw-r--r--src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h5
4 files changed, 48 insertions, 34 deletions
diff --git a/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp b/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
index 05c86e733..947388535 100644
--- a/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
+++ b/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
@@ -181,14 +181,14 @@ QWaylandXdgSurfaceV6::Popup::~Popup()
if (m_grabbing) {
auto *shell = m_xdgSurface->m_shell;
- Q_ASSERT(shell->m_topmostPopup == this);
- shell->m_topmostPopup = m_parent->m_popup;
+ Q_ASSERT(shell->m_topmostGrabbingPopup == this);
+ shell->m_topmostGrabbingPopup = m_parent->m_popup;
}
}
void QWaylandXdgSurfaceV6::Popup::grab(QWaylandInputDevice *seat, uint serial)
{
- m_xdgSurface->m_shell->m_topmostPopup = this;
+ m_xdgSurface->m_shell->m_topmostGrabbingPopup = this;
zxdg_popup_v6::grab(seat->wl_seat(), serial);
m_grabbing = true;
}
@@ -208,8 +208,10 @@ QWaylandXdgSurfaceV6::QWaylandXdgSurfaceV6(QWaylandXdgShellV6 *shell, ::zxdg_sur
Qt::WindowType type = window->window()->type();
auto *transientParent = window->transientParent();
- if ((type == Qt::Popup || type == Qt::ToolTip) && transientParent && display->lastInputDevice()) {
- setPopup(transientParent, display->lastInputDevice(), display->lastInputSerial(), type == Qt::Popup);
+ if (type == Qt::ToolTip && transientParent) {
+ setPopup(transientParent);
+ } else if (type == Qt::Popup && transientParent && display->lastInputDevice()) {
+ setGrabPopup(transientParent, display->lastInputDevice(), display->lastInputSerial());
} else {
setToplevel();
if (transientParent) {
@@ -307,19 +309,12 @@ void QWaylandXdgSurfaceV6::setToplevel()
m_toplevel = new Toplevel(this);
}
-void QWaylandXdgSurfaceV6::setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial, bool grab)
+void QWaylandXdgSurfaceV6::setPopup(QWaylandWindow *parent)
{
Q_ASSERT(!m_toplevel && !m_popup);
auto parentXdgSurface = static_cast<QWaylandXdgSurfaceV6 *>(parent->shellSurface());
- auto *top = m_shell->m_topmostPopup;
- if (grab && top && top->m_xdgSurface != parentXdgSurface) {
- qCWarning(lcQpaWayland) << "setPopup called for a surface that was not the topmost popup, positions might be off.";
- parentXdgSurface = top->m_xdgSurface;
- parent = top->m_xdgSurface->m_window;
- }
-
auto positioner = new QtWayland::zxdg_positioner_v6(m_shell->create_positioner());
// set_popup expects a position relative to the parent
QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
@@ -335,8 +330,19 @@ void QWaylandXdgSurfaceV6::setPopup(QWaylandWindow *parent, QWaylandInputDevice
m_popup = new Popup(this, parentXdgSurface, positioner);
positioner->destroy();
delete positioner;
- if (grab)
- m_popup->grab(device, serial);
+}
+
+void QWaylandXdgSurfaceV6::setGrabPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial)
+{
+ auto parentXdgSurface = static_cast<QWaylandXdgSurfaceV6 *>(parent->shellSurface());
+ auto *top = m_shell->m_topmostGrabbingPopup;
+
+ if (top && top->m_xdgSurface != parentXdgSurface) {
+ qCWarning(lcQpaWayland) << "setGrabPopup called for a surface that was not the topmost popup, positions might be off.";
+ parent = top->m_xdgSurface->m_window;
+ }
+ setPopup(parent);
+ m_popup->grab(device, serial);
}
void QWaylandXdgSurfaceV6::zxdg_surface_v6_configure(uint32_t serial)
diff --git a/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6_p.h b/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6_p.h
index d1dacd560..5a2867379 100644
--- a/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6_p.h
+++ b/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6_p.h
@@ -131,7 +131,8 @@ private:
};
void setToplevel();
- void setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial, bool grab);
+ void setPopup(QWaylandWindow *parent);
+ void setGrabPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial);
QWaylandXdgShellV6 *m_shell = nullptr;
QWaylandWindow *m_window = nullptr;
@@ -155,7 +156,7 @@ public:
private:
void zxdg_shell_v6_ping(uint32_t serial) override;
- QWaylandXdgSurfaceV6::Popup *m_topmostPopup = nullptr;
+ QWaylandXdgSurfaceV6::Popup *m_topmostGrabbingPopup = nullptr;
friend class QWaylandXdgSurfaceV6;
};
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
index 9ecd4e624..34cad810a 100644
--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
+++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
@@ -209,14 +209,14 @@ QWaylandXdgSurface::Popup::~Popup()
if (m_grabbing) {
auto *shell = m_xdgSurface->m_shell;
- Q_ASSERT(shell->m_topmostPopup == this);
- shell->m_topmostPopup = m_parent->m_popup;
+ Q_ASSERT(shell->m_topmostGrabbingPopup == this);
+ shell->m_topmostGrabbingPopup = m_parent->m_popup;
}
}
void QWaylandXdgSurface::Popup::grab(QWaylandInputDevice *seat, uint serial)
{
- m_xdgSurface->m_shell->m_topmostPopup = this;
+ m_xdgSurface->m_shell->m_topmostGrabbingPopup = this;
xdg_popup::grab(seat->wl_seat(), serial);
m_grabbing = true;
}
@@ -236,8 +236,10 @@ QWaylandXdgSurface::QWaylandXdgSurface(QWaylandXdgShell *shell, ::xdg_surface *s
Qt::WindowType type = window->window()->type();
auto *transientParent = window->transientParent();
- if ((type == Qt::Popup || type == Qt::ToolTip) && transientParent && display->lastInputDevice()) {
- setPopup(transientParent, display->lastInputDevice(), display->lastInputSerial(), type == Qt::Popup);
+ if (type == Qt::ToolTip && transientParent) {
+ setPopup(transientParent);
+ } else if (type == Qt::Popup && transientParent && display->lastInputDevice()) {
+ setGrabPopup(transientParent, display->lastInputDevice(), display->lastInputSerial());
} else {
setToplevel();
if (transientParent) {
@@ -341,19 +343,12 @@ void QWaylandXdgSurface::setToplevel()
m_toplevel = new Toplevel(this);
}
-void QWaylandXdgSurface::setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial, bool grab)
+void QWaylandXdgSurface::setPopup(QWaylandWindow *parent)
{
Q_ASSERT(!m_toplevel && !m_popup);
auto parentXdgSurface = static_cast<QWaylandXdgSurface *>(parent->shellSurface());
- auto *top = m_shell->m_topmostPopup;
- if (grab && top && top->m_xdgSurface != parentXdgSurface) {
- qCWarning(lcQpaWayland) << "setPopup called for a surface that was not the topmost popup, positions might be off.";
- parentXdgSurface = top->m_xdgSurface;
- parent = top->m_xdgSurface->m_window;
- }
-
auto positioner = new QtWayland::xdg_positioner(m_shell->create_positioner());
// set_popup expects a position relative to the parent
QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
@@ -369,8 +364,19 @@ void QWaylandXdgSurface::setPopup(QWaylandWindow *parent, QWaylandInputDevice *d
m_popup = new Popup(this, parentXdgSurface, positioner);
positioner->destroy();
delete positioner;
- if (grab)
- m_popup->grab(device, serial);
+}
+
+void QWaylandXdgSurface::setGrabPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial)
+{
+ auto parentXdgSurface = static_cast<QWaylandXdgSurface *>(parent->shellSurface());
+ auto *top = m_shell->m_topmostGrabbingPopup;
+
+ if (top && top->m_xdgSurface != parentXdgSurface) {
+ qCWarning(lcQpaWayland) << "setGrabPopup called for a surface that was not the topmost popup, positions might be off.";
+ parent = top->m_xdgSurface->m_window;
+ }
+ setPopup(parent);
+ m_popup->grab(device, serial);
}
void QWaylandXdgSurface::xdg_surface_configure(uint32_t serial)
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
index 902dfaa21..1dc1def23 100644
--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
+++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
@@ -138,7 +138,8 @@ private:
};
void setToplevel();
- void setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial, bool grab);
+ void setPopup(QWaylandWindow *parent);
+ void setGrabPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial);
QWaylandXdgShell *m_shell = nullptr;
QWaylandWindow *m_window = nullptr;
@@ -169,7 +170,7 @@ private:
QWaylandDisplay *m_display = nullptr;
QScopedPointer<QWaylandXdgDecorationManagerV1> m_xdgDecorationManager;
- QWaylandXdgSurface::Popup *m_topmostPopup = nullptr;
+ QWaylandXdgSurface::Popup *m_topmostGrabbingPopup = nullptr;
friend class QWaylandXdgSurface;
};