summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qevent.cpp5
-rw-r--r--src/gui/kernel/qwindowsysteminterface.h2
-rw-r--r--src/plugins/platforms/android/qandroidplatformopenglwindow.cpp2
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.cpp2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm6
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindow.cpp2
-rw-r--r--src/plugins/platforms/eglfs/qeglfswindow.cpp20
-rw-r--r--src/plugins/platforms/qnx/qqnxwindow.cpp6
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp2
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp16
10 files changed, 43 insertions, 20 deletions
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index a002aad387..1b853411f8 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -1307,7 +1307,8 @@ QMoveEvent::~QMoveEvent()
*/
/*!
- Constructs an expose event for the given \a exposeRegion.
+ Constructs an expose event for the given \a exposeRegion which must be
+ in local coordinates.
*/
QExposeEvent::QExposeEvent(const QRegion &exposeRegion)
: QEvent(Expose)
@@ -1325,7 +1326,7 @@ QExposeEvent::~QExposeEvent()
/*!
\fn const QRegion &QExposeEvent::region() const
- Returns the window area that has been exposed.
+ Returns the window area that has been exposed. The region is given in local coordinates.
*/
/*!
diff --git a/src/gui/kernel/qwindowsysteminterface.h b/src/gui/kernel/qwindowsysteminterface.h
index 1462c62e2b..580f1f86fa 100644
--- a/src/gui/kernel/qwindowsysteminterface.h
+++ b/src/gui/kernel/qwindowsysteminterface.h
@@ -138,6 +138,7 @@ public:
static void handleTouchCancelEvent(QWindow *w, QTouchDevice *device, Qt::KeyboardModifiers mods = Qt::NoModifier);
static void handleTouchCancelEvent(QWindow *w, ulong timestamp, QTouchDevice *device, Qt::KeyboardModifiers mods = Qt::NoModifier);
+ // rect is relative to parent
static void handleGeometryChange(QWindow *w, const QRect &newRect, const QRect &oldRect = QRect());
static void handleCloseEvent(QWindow *w, bool *accepted = 0);
static void handleEnterEvent(QWindow *w, const QPointF &local = QPointF(), const QPointF& global = QPointF());
@@ -150,6 +151,7 @@ public:
static void handleApplicationStateChanged(Qt::ApplicationState newState, bool forcePropagate = false);
+ // region is in local coordinates, do not confuse with geometry which is parent-relative
static void handleExposeEvent(QWindow *tlw, const QRegion &region);
#ifndef QT_NO_DRAGANDDROP
diff --git a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
index 7c39cb718d..d821145973 100644
--- a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
+++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
@@ -86,7 +86,7 @@ void QAndroidPlatformOpenGLWindow::setGeometry(const QRect &rect)
&& rect.height() > 0
&& availableGeometry.width() > 0
&& availableGeometry.height() > 0) {
- QWindowSystemInterface::handleExposeEvent(window(), QRegion(rect));
+ QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), rect.size()));
}
}
diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp
index 529ae0a80d..433461f628 100644
--- a/src/plugins/platforms/android/qandroidplatformscreen.cpp
+++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp
@@ -243,7 +243,7 @@ void QAndroidPlatformScreen::setAvailableGeometry(const QRect &rect)
if (w->handle()) {
QRect geometry = w->handle()->geometry();
if (geometry.width() > 0 && geometry.height() > 0)
- QWindowSystemInterface::handleExposeEvent(w, QRegion(geometry));
+ QWindowSystemInterface::handleExposeEvent(w, QRect(QPoint(0, 0), geometry.size()));
}
}
}
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 29b983cd89..7e22351818 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -516,7 +516,7 @@ void QCocoaWindow::setCocoaGeometry(const QRect &rect)
// call this here: updateGeometry in qnsview.mm is a no-op for this case
QWindowSystemInterface::handleGeometryChange(window(), rect);
- QWindowSystemInterface::handleExposeEvent(window(), rect);
+ QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), rect.size()));
} else if (m_nsWindow) {
NSRect bounds = qt_mac_flipRect(rect);
[m_nsWindow setFrame:[m_nsWindow frameRectForContentRect:bounds] display:YES animate:NO];
@@ -1749,7 +1749,7 @@ void QCocoaWindow::exposeWindow()
m_isExposed = true;
m_exposedGeometry = geometry();
m_exposedDevicePixelRatio = devicePixelRatio();
- QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
+ QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), m_exposedGeometry.size()));
}
}
@@ -1780,7 +1780,7 @@ void QCocoaWindow::updateExposedGeometry()
m_isExposed = true;
m_exposedGeometry = geometry();
m_exposedDevicePixelRatio = devicePixelRatio();
- QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
+ QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), m_exposedGeometry.size()));
}
QWindow *QCocoaWindow::childWindowAt(QPoint windowPoint)
diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.cpp b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
index 670a955bd6..8d7eeb3cd9 100644
--- a/src/plugins/platforms/directfb/qdirectfbwindow.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
@@ -137,7 +137,7 @@ void QDirectFbWindow::setVisible(bool visible)
}
if (window()->isTopLevel() && visible)
- QWindowSystemInterface::handleExposeEvent(window(), window()->geometry());
+ QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), window()->geometry()));
}
void QDirectFbWindow::setWindowFlags(Qt::WindowFlags flags)
diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp
index a0150b7ade..1f67170efc 100644
--- a/src/plugins/platforms/eglfs/qeglfswindow.cpp
+++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp
@@ -98,7 +98,7 @@ void QEglFSWindow::create()
m_flags |= HasNativeWindow;
setGeometry(QRect()); // will become fullscreen
- QWindowSystemInterface::handleExposeEvent(window(), geometry());
+ QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), geometry().size()));
EGLDisplay display = static_cast<QEglFSScreen *>(screen)->display();
QSurfaceFormat platformFormat = QEglFSHooks::hooks()->surfaceFormatFor(window()->requestedFormat());
@@ -168,8 +168,9 @@ void QEglFSWindow::resetSurface()
void QEglFSWindow::setVisible(bool visible)
{
QList<QEGLPlatformWindow *> windows = screen()->windows();
+ QWindow *wnd = window();
- if (window()->type() != Qt::Desktop) {
+ if (wnd->type() != Qt::Desktop) {
if (visible) {
screen()->addWindow(this);
} else {
@@ -180,7 +181,7 @@ void QEglFSWindow::setVisible(bool visible)
}
}
- QWindowSystemInterface::handleExposeEvent(window(), window()->geometry());
+ QWindowSystemInterface::handleExposeEvent(wnd, QRect(QPoint(0, 0), wnd->geometry().size()));
if (visible)
QWindowSystemInterface::flushWindowSystemEvents();
@@ -218,15 +219,17 @@ void QEglFSWindow::requestActivateWindow()
if (window()->type() != Qt::Desktop)
screen()->moveToTop(this);
- QWindowSystemInterface::handleWindowActivated(window());
- QWindowSystemInterface::handleExposeEvent(window(), window()->geometry());
+ QWindow *wnd = window();
+ QWindowSystemInterface::handleWindowActivated(wnd);
+ QWindowSystemInterface::handleExposeEvent(wnd, QRect(QPoint(0, 0), wnd->geometry().size()));
}
void QEglFSWindow::raise()
{
- if (window()->type() != Qt::Desktop) {
+ QWindow *wnd = window();
+ if (wnd->type() != Qt::Desktop) {
screen()->moveToTop(this);
- QWindowSystemInterface::handleExposeEvent(window(), window()->geometry());
+ QWindowSystemInterface::handleExposeEvent(wnd, QRect(QPoint(0, 0), wnd->geometry().size()));
}
}
@@ -237,7 +240,8 @@ void QEglFSWindow::lower()
int idx = windows.indexOf(this);
if (idx > 0) {
screen()->changeWindowIndex(this, idx - 1);
- QWindowSystemInterface::handleExposeEvent(windows.last()->window(), windows.last()->geometry());
+ QWindowSystemInterface::handleExposeEvent(windows.last()->window(),
+ QRect(QPoint(0, 0), windows.last()->geometry().size()));
}
}
}
diff --git a/src/plugins/platforms/qnx/qqnxwindow.cpp b/src/plugins/platforms/qnx/qqnxwindow.cpp
index 5a405f9577..56f17e6d11 100644
--- a/src/plugins/platforms/qnx/qqnxwindow.cpp
+++ b/src/plugins/platforms/qnx/qqnxwindow.cpp
@@ -252,7 +252,7 @@ void QQnxWindow::setGeometry(const QRect &rect)
setGeometryHelper(newGeometry);
if (isExposed())
- QWindowSystemInterface::handleExposeEvent(window(), newGeometry);
+ QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), newGeometry.size()));
}
void QQnxWindow::setGeometryHelper(const QRect &rect)
@@ -306,7 +306,7 @@ void QQnxWindow::setVisible(bool visible)
root->updateVisibility(root->m_visible);
- QWindowSystemInterface::handleExposeEvent(window(), window()->geometry());
+ QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), window()->geometry().size()));
if (visible) {
applyWindowState();
@@ -345,7 +345,7 @@ void QQnxWindow::setExposed(bool exposed)
if (m_exposed != exposed) {
m_exposed = exposed;
- QWindowSystemInterface::handleExposeEvent(window(), window()->geometry());
+ QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), window()->geometry().size()));
}
}
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index c5978c125c..3b54feabbf 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -1389,7 +1389,7 @@ void QWindowsWindow::handleGeometryChange()
// expose events when shrinking, synthesize.
if (!testFlag(OpenGL_ES2) && isExposed()
&& !(m_data.geometry.width() > previousGeometry.width() || m_data.geometry.height() > previousGeometry.height())) {
- fireExpose(QRegion(m_data.geometry), true);
+ fireExpose(QRect(QPoint(0, 0), m_data.geometry.size()), true);
}
if (previousGeometry.topLeft() != m_data.geometry.topLeft()) {
QPlatformScreen *newScreen = screenForGeometry(m_data.geometry);
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index 02f3959802..b4659b7caf 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -164,6 +164,8 @@ public:
{
m_received[event->type()]++;
m_order << event->type();
+ if (event->type() == QEvent::Expose)
+ m_exposeRegion = static_cast<QExposeEvent *>(event)->region();
return QWindow::event(event);
}
@@ -178,9 +180,15 @@ public:
return m_order.indexOf(type);
}
+ QRegion exposeRegion() const
+ {
+ return m_exposeRegion;
+ }
+
private:
QHash<QEvent::Type, int> m_received;
QVector<QEvent::Type> m_order;
+ QRegion m_exposeRegion;
};
void tst_QWindow::eventOrderOnShow()
@@ -358,6 +366,14 @@ void tst_QWindow::isExposed()
QTRY_VERIFY(window.received(QEvent::Expose) > 0);
QTRY_VERIFY(window.isExposed());
+ // This is a top-level window so assuming it is completely exposed, the
+ // expose region must be (0, 0), (width, height). If this is not the case,
+ // the platform plugin is sending expose events with a region in an
+ // incorrect coordinate system.
+ QRect r = window.exposeRegion().boundingRect();
+ r = QRect(window.mapToGlobal(r.topLeft()), r.size());
+ QCOMPARE(r, window.geometry());
+
window.hide();
QCoreApplication::processEvents();