diff --git a/src/window.cpp b/src/window.cpp index 579df9eb..44e23c6d 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -35,6 +35,21 @@ namespace { +struct ScopedWindowTimeout +{ + ScopedWindowTimeout(WINDOW *w, int init_timeout, int term_timeout) + : m_w(w), m_term_timeout(term_timeout) { + wtimeout(w, init_timeout); + } + ~ScopedWindowTimeout() { + wtimeout(m_w, m_term_timeout); + } + +private: + WINDOW *m_w; + int m_term_timeout; +}; + namespace rl { bool aborted; @@ -678,6 +693,7 @@ int Window::getInputChar() # if NCURSES_SEQUENCE_ESCAPING return wgetch(m_window); # else + ScopedWindowTimeout swt(m_window, 0, m_window_timeout); int key = wgetch(m_window); if (!m_escape_terminal_sequences || key != KEY_ESCAPE) return key; @@ -858,6 +874,8 @@ int Window::getInputChar() return ERR; } break; + case ERR: + return KEY_ESCAPE; default: m_input_queue.push(key); return KEY_ESCAPE;