Use wgetch rather than getch to avoid unwanted redraws

This commit is contained in:
Maxime Coste 2015-09-11 00:05:31 +01:00
parent 80726a789b
commit 34d0f63fd9

View File

@ -487,11 +487,11 @@ bool NCursesUI::is_key_available()
{ {
check_resize(); check_resize();
timeout(0); wtimeout(m_window, 0);
const int c = getch(); const int c = wgetch(m_window);
if (c != ERR) if (c != ERR)
ungetch(c); ungetch(c);
timeout(-1); wtimeout(m_window, -1);
return c != ERR; return c != ERR;
} }
@ -499,7 +499,7 @@ Key NCursesUI::get_key()
{ {
check_resize(); check_resize();
const int c = getch(); const int c = wgetch(m_window);
if (c == KEY_MOUSE) if (c == KEY_MOUSE)
{ {
@ -519,7 +519,7 @@ Key NCursesUI::get_key()
{ {
if (c == CTRL('l')) if (c == CTRL('l'))
{ {
redrawwin(m_window); //redrawwin(m_window);
redraw(); redraw();
} }
if (c == CTRL('z')) if (c == CTRL('z'))
@ -531,11 +531,11 @@ Key NCursesUI::get_key()
} }
else if (c == 27) else if (c == 27)
{ {
timeout(0); wtimeout(m_window, 0);
const Codepoint new_c = getch(); const Codepoint new_c = wgetch(m_window);
if (new_c == '[') // potential CSI if (new_c == '[') // potential CSI
{ {
const Codepoint csi_val = getch(); const Codepoint csi_val = wgetch(m_window);
switch (csi_val) switch (csi_val)
{ {
case 'I': return Key::FocusIn; case 'I': return Key::FocusIn;
@ -543,7 +543,7 @@ Key NCursesUI::get_key()
default: break; // nothing default: break; // nothing
} }
} }
timeout(-1); wtimeout(m_window, -1);
if (new_c != ERR) if (new_c != ERR)
{ {
if (new_c > 0 and new_c < 27) if (new_c > 0 and new_c < 27)
@ -580,12 +580,15 @@ Key NCursesUI::get_key()
ungetch(c); ungetch(c);
struct getch_iterator struct getch_iterator
{ {
int operator*() { return getch(); } getch_iterator(WINDOW* win) : window(win) {}
getch_iterator& operator++() { return *this; } int operator*() { return wgetch(window); }
getch_iterator& operator++(int) { return *this; } getch_iterator& operator++() { return *this; }
bool operator== (const getch_iterator&) const { return false; } getch_iterator& operator++(int) { return *this; }
bool operator== (const getch_iterator&) const { return false; }
WINDOW* window;
}; };
return utf8::codepoint(getch_iterator{}, getch_iterator{}); return utf8::codepoint(getch_iterator{m_window}, getch_iterator{m_window});
} }
return Key::Invalid; return Key::Invalid;
} }