diff options
author | Giulio Camuffo <giulio.camuffo@jollamobile.com> | 2015-04-23 21:00:59 +0300 |
---|---|---|
committer | Giulio Camuffo <giulio.camuffo@jollamobile.com> | 2015-07-04 07:31:17 +0000 |
commit | cc694272c201e57e8bffdb770059e51ac998c5f9 (patch) | |
tree | eed86233a9764dc8cdcd19d11c5b26bcec02b7e8 | |
parent | 05ea6b992f32443df27e38bdc8b21cf970755b57 (diff) | |
download | qtwayland-cc694272c201e57e8bffdb770059e51ac998c5f9.tar.gz qtwayland-cc694272c201e57e8bffdb770059e51ac998c5f9.tar.bz2 qtwayland-cc694272c201e57e8bffdb770059e51ac998c5f9.zip |
Fix tooltips without a transient parent
QToolTip has the same problems as QMenu, that is you can create one
without a parent and with a global position. Use the same trick and
use the window that last received an input event as the parent.
Change-Id: I093c8da0d54110903f35670b01dea6fa96abecf4
Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
-rw-r--r-- | src/client/qwaylandwindow.cpp | 29 | ||||
-rw-r--r-- | src/client/qwaylandwlshellsurface.cpp | 3 |
2 files changed, 17 insertions, 15 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp index 922b1ee0..b98dd9da 100644 --- a/src/client/qwaylandwindow.cpp +++ b/src/client/qwaylandwindow.cpp @@ -128,7 +128,7 @@ QWaylandWindow::QWaylandWindow(QWindow *window) if (window->type() != Qt::Popup) { mShellSurface->updateTransientParent(window->transientParent()); } - } else if (mShellSurface) { + } else if (mShellSurface && window->type() != Qt::ToolTip) { mShellSurface->setTopLevel(); } @@ -240,17 +240,18 @@ void QWaylandWindow::setGeometry(const QRect &rect) void QWaylandWindow::setVisible(bool visible) { if (visible) { - if (window()->type() == Qt::Popup) { - QWaylandWindow *parent = transientParent(); - if (!parent) { - // Try with the current focus window. It should be the right one and anyway - // better than having no parent at all. - parent = mDisplay->lastInputWindow(); - } - if (parent) { - QWaylandWlShellSurface *wlshellSurface = qobject_cast<QWaylandWlShellSurface*>(mShellSurface); - if (wlshellSurface) - wlshellSurface->setPopup(parent, mDisplay->lastInputDevice(), mDisplay->lastInputSerial()); + if (mShellSurface) { + if (window()->type() == Qt::Popup) { + QWaylandWindow *parent = transientParent(); + if (parent) { + QWaylandWlShellSurface *wlshellSurface = qobject_cast<QWaylandWlShellSurface*>(mShellSurface); + if (wlshellSurface) + wlshellSurface->setPopup(parent, mDisplay->lastInputDevice(), mDisplay->lastInputSerial()); + } + } else if (window()->type() == Qt::ToolTip) { + if (QWaylandWindow *parent = transientParent()) { + mShellSurface->updateTransientParent(parent->window()); + } } } @@ -609,7 +610,9 @@ QWaylandWindow *QWaylandWindow::transientParent() const // events. return static_cast<QWaylandWindow *>(topLevelWindow(window()->transientParent())->handle()); } - return 0; + // Try with the current focus window. It should be the right one and anyway + // better than having no parent at all. + return mDisplay->lastInputWindow(); } void QWaylandWindow::handleMouse(QWaylandInputDevice *inputDevice, const QWaylandPointerEvent &e) diff --git a/src/client/qwaylandwlshellsurface.cpp b/src/client/qwaylandwlshellsurface.cpp index 8888dbf4..f7bdc2c9 100644 --- a/src/client/qwaylandwlshellsurface.cpp +++ b/src/client/qwaylandwlshellsurface.cpp @@ -159,8 +159,7 @@ void QWaylandWlShellSurface::updateTransientParent(QWindow *parent) // set_transient expects a position relative to the parent QPoint transientPos = m_window->geometry().topLeft(); // this is absolute - QWindow *parentWin = m_window->window()->transientParent(); - transientPos -= parentWin->geometry().topLeft(); + transientPos -= parent->geometry().topLeft(); if (parent_wayland_window->decoration()) { transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left()); transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top()); |