summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Dzyubenko <denis.dzyubenko@nokia.com>2011-01-25 09:01:56 (GMT)
committerDenis Dzyubenko <denis.dzyubenko@nokia.com>2011-01-25 10:19:51 (GMT)
commitcdd776a91e65bf5c30cea1bab9823134a3f797d0 (patch)
tree6b306c3b426e8ec54c8e74d0e480fa401d5a08fa
parent7332dd762a406bb94d37e53a0bdd16045760d956 (diff)
downloadQt-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.cpp28
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);
}