summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiulio Camuffo <giulio.camuffo@jollamobile.com>2015-04-23 21:00:59 +0300
committerGiulio Camuffo <giulio.camuffo@jollamobile.com>2015-07-04 07:31:17 +0000
commitcc694272c201e57e8bffdb770059e51ac998c5f9 (patch)
treeeed86233a9764dc8cdcd19d11c5b26bcec02b7e8
parent05ea6b992f32443df27e38bdc8b21cf970755b57 (diff)
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.cpp29
-rw-r--r--src/client/qwaylandwlshellsurface.cpp3
2 files changed, 17 insertions, 15 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 922b1ee00..b98dd9dae 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 8888dbf4d..f7bdc2c99 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());