diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-04-07 16:37:14 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-04-08 14:17:18 -0300 |
commit | fe38baed3830415bc16b7e6c718a80ebe0c29fff (patch) | |
tree | f100e84d8bd64a28daa7c3cc3e145d6949109b1b /src/os/input.c | |
parent | 1fc7d6a0c514257cee9fb204cb83564b17354c11 (diff) | |
download | rneovim-fe38baed3830415bc16b7e6c718a80ebe0c29fff.tar.gz rneovim-fe38baed3830415bc16b7e6c718a80ebe0c29fff.tar.bz2 rneovim-fe38baed3830415bc16b7e6c718a80ebe0c29fff.zip |
Define special key for asynchronous events
K_EVENT/KE_EVENT are used to signal any loop that reads user input(scattered
across normal.c edit.c , ex_getln.c and message.c) of asynchronous events that
were not initiated by the user.
Representing non-user asynchronous events as special keys has the following
advantages:
- We reuse the normal vim redrawing code. As far as the rest of the code in
edit.c/normal.c is concerned, it's just the user pressing another key.
- Assume less about vim tolerance for "out-of-band" modifications to its
internal state.
- We still have a very complex codebase and it's hard to predict what bugs may
be introduced by these changes. With this we implement asynchronicity in a way
that will be more "natural" to the editor and has less chance of causing
unpredictable behavior.
As the code is refactored, we will be able to treat user input as an 'event
type' and not the other way around(With this we are treating arbitrary events as
a special case of user input).
Diffstat (limited to 'src/os/input.c')
-rw-r--r-- | src/os/input.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/os/input.c b/src/os/input.c index 122600630d..ce1dd69fc0 100644 --- a/src/os/input.c +++ b/src/os/input.c @@ -145,9 +145,18 @@ int os_inchar(char_u *buf, int maxlen, int32_t ms, int tb_change_cnt) } } + // If there are pending events, return the keys directly + if (maxlen >= 3 && event_is_pending()) { + buf[0] = K_SPECIAL; + buf[1] = KS_EXTRA; + buf[2] = KE_EVENT; + return 3; + } + // 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; + } if (result == kInputEof) { read_error_exit(); @@ -174,15 +183,12 @@ void os_breakcheck() // This is a replacement for the old `WaitForChar` function in os_unix.c static InbufPollResult inbuf_poll(int32_t ms) { - if (input_available()) + if (input_available()) { return kInputAvail; + } if (event_poll(ms)) { - if (!got_int && rbuffer.rpos == rbuffer.wpos && eof) { - return kInputEof; - } - - return kInputAvail; + return eof && rbuffer.rpos == rbuffer.wpos ? kInputEof : kInputAvail; } return kInputNone; |