Index: apps/gui/splash.c =================================================================== --- apps/gui/splash.c (revision 21315) +++ apps/gui/splash.c (working copy) @@ -220,7 +220,26 @@ va_end(ap); } if (ticks) - sleep(ticks); + { + int timeout = current_tick+ticks; + while (TIME_BEFORE(current_tick, timeout)) + { + /* Check if any button events have been queued */ + struct queue_event qe; + for (i = 0; i < queue_count(&button_queue); i++) + { + if (queue_peek(&button_queue, i, &qe)) + { + if (!IS_SYSEVENT(qe.id)) /* [TBW] filter scrollwheel events too? */ + { + timeout = current_tick; + break; + } + } + } + sleep(1); + } + } } void splash(int ticks, const char *str) Index: firmware/export/kernel.h =================================================================== --- firmware/export/kernel.h (revision 21315) +++ firmware/export/kernel.h (working copy) @@ -263,7 +263,7 @@ extern bool queue_in_queue_send(struct event_queue *q); #endif /* HAVE_EXTENDED_MESSAGING_AND_NAME */ extern bool queue_empty(const struct event_queue* q); -extern bool queue_peek(struct event_queue *q, struct queue_event *ev); +extern bool queue_peek(struct event_queue *q, int p, struct queue_event *ev); extern void queue_clear(struct event_queue* q); extern void queue_remove_from_head(struct event_queue *q, long id); extern int queue_count(const struct event_queue *q); Index: firmware/kernel.c =================================================================== --- firmware/kernel.c (revision 21315) +++ firmware/kernel.c (working copy) @@ -745,9 +745,11 @@ } } -bool queue_peek(struct event_queue *q, struct queue_event *ev) +#endif /* HAVE_EXTENDED_MESSAGING_AND_NAME */ + +bool queue_peek(struct event_queue *q, int p, struct queue_event *ev) { - if(q->read == q->write) + if (queue_empty(q)) return false; bool have_msg = false; @@ -755,18 +757,17 @@ int oldlevel = disable_irq_save(); corelock_lock(&q->cl); - if(q->read != q->write) - { - *ev = q->events[q->read & QUEUE_LENGTH_MASK]; - have_msg = true; - } + if (p >= queue_count(q)) + return false; + *ev = q->events[(q->read + p) & QUEUE_LENGTH_MASK]; + have_msg = true; + corelock_unlock(&q->cl); restore_irq(oldlevel); return have_msg; } -#endif /* HAVE_EXTENDED_MESSAGING_AND_NAME */ /* Poll queue to see if a message exists - careful in using the result if * queue_remove_from_head is called when messages are posted - possibly use