summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb/qxcbwindow.cpp
diff options
context:
space:
mode:
authorBłażej Szczygieł <spaz16@wp.pl>2016-01-13 13:17:43 +0100
committerBłażej Szczygieł <spaz16@wp.pl>2016-01-13 19:02:29 +0000
commita9c0a83207599599c2ff67ff00fc7e0cc638a870 (patch)
treefdfe0d605fd83c03cd8900ebd83d53811cda1a58 /src/plugins/platforms/xcb/qxcbwindow.cpp
parentb8bee40726fc93db9a025324712de6fff6a084d5 (diff)
xcb: Don't duplicate expose events
Use ExposeCompressor for mapping the window to prevent duplicating expose event when window is mapped. Remove sending expose event from configure notivy event. Change-Id: I6836c06047ffebd65775aa8aca90750afba6efe8 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbwindow.cpp')
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp37
1 files changed, 16 insertions, 21 deletions
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 4e4a0cdaef..c6eb5aa66b 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -1885,6 +1885,17 @@ private:
bool m_pending;
};
+bool QXcbWindow::compressExposeEvent(QRegion &exposeRegion)
+{
+ ExposeCompressor compressor(m_window, &exposeRegion);
+ xcb_generic_event_t *filter = 0;
+ do {
+ filter = connection()->checkEvent(compressor);
+ free(filter);
+ } while (filter);
+ return compressor.pending();
+}
+
bool QXcbWindow::handleGenericEvent(xcb_generic_event_t *event, long *result)
{
return QWindowSystemInterface::handleNativeEvent(window(),
@@ -1902,15 +1913,10 @@ void QXcbWindow::handleExposeEvent(const xcb_expose_event_t *event)
else
m_exposeRegion |= rect;
- ExposeCompressor compressor(m_window, &m_exposeRegion);
- xcb_generic_event_t *filter = 0;
- do {
- filter = connection()->checkEvent(compressor);
- free(filter);
- } while (filter);
+ bool pending = compressExposeEvent(m_exposeRegion);
// if count is non-zero there are more expose events pending
- if (event->count == 0 || !compressor.pending()) {
+ if (event->count == 0 || !pending) {
QWindowSystemInterface::handleExposeEvent(window(), m_exposeRegion);
m_exposeRegion = QRegion();
}
@@ -1997,10 +2003,6 @@ void QXcbWindow::handleConfigureNotifyEvent(const xcb_configure_notify_event_t *
}
}
- // The original geometry requested by setGeometry() might be different
- // from what we end up with after applying window constraints.
- QRect requestedGeometry = geometry();
-
const QRect actualGeometry = QRect(pos, QSize(event->width, event->height));
QPlatformScreen *newScreen = parent() ? parent()->screen() : screenForGeometry(actualGeometry);
if (!newScreen)
@@ -2021,15 +2023,6 @@ void QXcbWindow::handleConfigureNotifyEvent(const xcb_configure_notify_event_t *
// will make the comparison later.
QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->screen());
- // For expose events we have no way of telling QGuiApplication to used the locally
- // cached version of the previous state, so we may in some situations end up with
- // an additional expose event.
- QRect previousGeometry = requestedGeometry != actualGeometry ?
- requestedGeometry : qt_window_private(window())->geometry;
-
- if (m_mapped && actualGeometry.size() != previousGeometry.size())
- QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(), actualGeometry.size()));
-
if (m_usingSyncProtocol && m_syncState == SyncReceived)
m_syncState = SyncAndConfigureReceived;
@@ -2096,7 +2089,9 @@ void QXcbWindow::handleMapNotifyEvent(const xcb_map_notify_event_t *event)
if (m_deferredActivation)
requestActivateWindow();
- QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(), geometry().size()));
+ QRegion exposeRegion = QRect(QPoint(), geometry().size());
+ compressExposeEvent(exposeRegion);
+ QWindowSystemInterface::handleExposeEvent(window(), exposeRegion);
}
}