ephyr: Process only the last expose or configure available from the server

Delay expose or configure processing until the event queue is empty so
that we don't end up processing a long series of events one at a
time. Expose events already have a check waiting for the last in a
series, this further improves that by discarding multiple
series of events.

Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Keith Packard 2016-06-14 13:45:27 -07:00
parent c17a417945
commit 828887b6f4
1 changed files with 22 additions and 5 deletions

View File

@ -1141,6 +1141,7 @@ static void
ephyrXcbProcessEvents(Bool queued_only)
{
xcb_connection_t *conn = hostx_get_xcbconn();
xcb_generic_event_t *expose = NULL, *configure = NULL;
while (TRUE) {
xcb_generic_event_t *xev = hostx_get_event(queued_only);
@ -1164,7 +1165,9 @@ ephyrXcbProcessEvents(Bool queued_only)
break;
case XCB_EXPOSE:
ephyrProcessExpose(xev);
free(expose);
expose = xev;
xev = NULL;
break;
case XCB_MOTION_NOTIFY:
@ -1188,14 +1191,28 @@ ephyrXcbProcessEvents(Bool queued_only)
break;
case XCB_CONFIGURE_NOTIFY:
ephyrProcessConfigureNotify(xev);
free(configure);
configure = xev;
xev = NULL;
break;
}
if (ephyr_glamor)
ephyr_glamor_process_event(xev);
if (xev) {
if (ephyr_glamor)
ephyr_glamor_process_event(xev);
free(xev);
free(xev);
}
}
if (configure) {
ephyrProcessConfigureNotify(configure);
free(configure);
}
if (expose) {
ephyrProcessExpose(expose);
free(expose);
}
}