summaryrefslogtreecommitdiffstats
path: root/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
diff options
context:
space:
mode:
authorDavid Edmundson <davidedmundson@kde.org>2018-11-09 15:00:21 +0000
committerDavid Edmundson <davidedmundson@kde.org>2018-11-14 19:52:45 +0000
commit2b79a41096a0d626659f5647743005a963c3fe7d (patch)
tree3f21aee928ed2b91271d85cd6c0d65aefd85b4cb /src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
parent52876056ff3dcda97f93932bc8c6e1c0fbce9d5e (diff)
Client: Don't require an input device for non-grabbing popups
It's valid to create a non-grabbing XDG-popup, such as a tooltip, before an input event. The current guard should only apply for grabbing popups, otherwise tooltips created early are turned into XDG-toplevels resulting in incorrect positioning. Change-Id: I5bb59a68964ef2375c81e8b4e1a73361b9d2cbcc Reviewed-by: Johan Helsing <johan.helsing@qt.io>
Diffstat (limited to 'src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp')
-rw-r--r--src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp b/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
index 3d3af6929..ea0315c4e 100644
--- a/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
+++ b/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
@@ -199,8 +199,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) {
@@ -304,19 +306,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
@@ -332,8 +327,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_topmostPopup;
+
+ 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)