diff options
author | Denis Dzyubenko <denis.dzyubenko@nokia.com> | 2011-01-25 09:01:56 (GMT) |
---|---|---|
committer | Denis Dzyubenko <denis.dzyubenko@nokia.com> | 2011-01-25 10:19:51 (GMT) |
commit | cdd776a91e65bf5c30cea1bab9823134a3f797d0 (patch) | |
tree | 6b306c3b426e8ec54c8e74d0e480fa401d5a08fa | |
parent | 7332dd762a406bb94d37e53a0bdd16045760d956 (diff) | |
download | Qt-cdd776a91e65bf5c30cea1bab9823134a3f797d0.zip Qt-cdd776a91e65bf5c30cea1bab9823134a3f797d0.tar.gz Qt-cdd776a91e65bf5c30cea1bab9823134a3f797d0.tar.bz2 |
Improved performance of mapFromGlobal/mapToGlobal on X11
We don't call XTranslateCoordinates anymore, but use the toplevel window
offset that we already store to convert between screen coordinates and
widget coordinates.
Reviewed-by: João Abecasis
-rw-r--r-- | src/gui/kernel/qwidget_x11.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp index 4b59bfc..9893478 100644 --- a/src/gui/kernel/qwidget_x11.cpp +++ b/src/gui/kernel/qwidget_x11.cpp @@ -1316,12 +1316,40 @@ QPoint QWidgetPrivate::mapFromGlobal(const QPoint &pos) const QPoint QWidget::mapToGlobal(const QPoint &pos) const { Q_D(const QWidget); + QPoint offset = data->crect.topLeft(); + const QWidget *w = this; + const QWidget *p = w->parentWidget(); + while (!w->isWindow() && p) { + w = p; + p = p->parentWidget(); + offset += w->data->crect.topLeft(); + } + + const QWidgetPrivate *wd = w->d_func(); + QTLWExtra *tlw = wd->topData(); + if (!tlw->embedded) + return pos + offset; + return d->mapToGlobal(pos); } QPoint QWidget::mapFromGlobal(const QPoint &pos) const { Q_D(const QWidget); + QPoint offset = data->crect.topLeft(); + const QWidget *w = this; + const QWidget *p = w->parentWidget(); + while (!w->isWindow() && p) { + w = p; + p = p->parentWidget(); + offset += w->data->crect.topLeft(); + } + + const QWidgetPrivate *wd = w->d_func(); + QTLWExtra *tlw = wd->topData(); + if (!tlw->embedded) + return pos - offset; + return d->mapFromGlobal(pos); } |