input: Refactor to ensure user input has higher priority

This commit is contained in:
Thiago de Arruda
2014-11-21 12:48:30 -03:00
parent 2c29b20af7
commit e15485c5d6

View File

@@ -84,13 +84,11 @@ void input_stop(void)
// Low level input function. // Low level input function.
int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt) int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt)
{ {
InbufPollResult result; if (rbuffer_pending(input_buffer)) {
return (int)rbuffer_read(input_buffer, (char *)buf, (size_t)maxlen);
if (event_has_deferred()) {
// Return pending event bytes
return push_event_key(buf, maxlen);
} }
InbufPollResult result;
if (ms >= 0) { if (ms >= 0) {
if ((result = inbuf_poll(ms)) == kInputNone) { if ((result = inbuf_poll(ms)) == kInputNone) {
return 0; return 0;
@@ -110,24 +108,27 @@ int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt)
} }
} }
// If there are deferred events, return the keys directly
if (event_has_deferred()) {
return push_event_key(buf, maxlen);
}
// If input was put directly in typeahead buffer bail out here. // If input was put directly in typeahead buffer bail out here.
if (typebuf_changed(tb_change_cnt)) { if (typebuf_changed(tb_change_cnt)) {
return 0; return 0;
} }
if (result == kInputEof) { if (rbuffer_pending(input_buffer)) {
read_error_exit(); // Safe to convert rbuffer_read to int, it will never overflow since we use
return 0; // relatively small buffers.
return (int)rbuffer_read(input_buffer, (char *)buf, (size_t)maxlen);
} }
// Safe to convert rbuffer_read to int, it will never overflow since // If there are deferred events, return the keys directly
// we use relatively small buffers. if (event_has_deferred()) {
return (int)rbuffer_read(input_buffer, (char *)buf, (size_t)maxlen); return push_event_key(buf, maxlen);
}
if (result == kInputEof) {
read_error_exit();
}
return 0;
} }
// Check if a character is available for reading // Check if a character is available for reading
@@ -319,10 +320,9 @@ static int push_event_key(uint8_t *buf, int maxlen)
// Check if there's pending input // Check if there's pending input
static bool input_ready(void) static bool input_ready(void)
{ {
return typebuf_was_filled || // API call filled typeahead return typebuf_was_filled || // API call filled typeahead
event_has_deferred() || // Events must be processed rbuffer_pending(input_buffer) > 0 || // Stdin input
(!embedded_mode && ( event_has_deferred() || // Events must be processed
rbuffer_pending(input_buffer) > 0 || // Stdin input (!embedded_mode && eof); // Stdin closed
eof)); // Stdin closed
} }