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>bb10
parent
b8bee40726
commit
a9c0a83207
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -201,6 +201,8 @@ protected:
|
|||
void doFocusIn();
|
||||
void doFocusOut();
|
||||
|
||||
bool compressExposeEvent(QRegion &exposeRegion);
|
||||
|
||||
void handleButtonPressEvent(int event_x, int event_y, int root_x, int root_y,
|
||||
int detail, Qt::KeyboardModifiers modifiers, xcb_timestamp_t timestamp);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue