mirror of
https://github.com/neovim/neovim.git
synced 2025-09-30 15:08:35 +00:00
input: Refactor to ensure user input has higher priority
This commit is contained in:
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user