diff --git a/test/eierpecken.c b/test/eierpecken.c index 18baa41..2469eaf 100644 --- a/test/eierpecken.c +++ b/test/eierpecken.c @@ -791,15 +791,20 @@ _peck_dispatch_ei(struct peck *peck, int lineno) void _peck_dispatch_until_stable(struct peck *peck, int lineno) { - bool eis, ei; + int eis = 0, ei = 0; log_debug(peck, "dispatching until stable (line %d) {\n", lineno); peck_indent(peck); + /* we go two dispatch loops for both ei and EIS before we say it's + * stable. With the DEVICE_REGION/KEYMAP/DONE event split we may + * get events on the wire that don't result in an actual event + * yet, so we can get stuck if we just wait for one. + */ do { - eis = _peck_dispatch_eis(peck, lineno); - ei = _peck_dispatch_ei(peck, lineno); - } while (ei || eis); + eis = _peck_dispatch_eis(peck, lineno) ? 0 : eis + 1; + ei = _peck_dispatch_ei(peck, lineno) ? 0 : ei + 1; + } while (ei <= 2 || eis <= 2); peck_dedent(peck); log_debug(peck, "}\n", lineno);