diff options
| author | Maxime Coste <mawww@kakoune.org> | 2018-12-09 10:33:44 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2018-12-09 10:33:44 +1100 |
| commit | e90e77e5fcff0bc474ed8c75e83dac34c2051824 (patch) | |
| tree | b856043a49ca015a51a3a48a5a3fada9e3cee47b /src | |
| parent | 1875ff51a001a73f89f1273782db03490247238d (diff) | |
| parent | c0be01ac0f0b305ee75c473abad1e56e0a04eb71 (diff) | |
Merge remote-tracking branch 'jeapostrophe/master'
Diffstat (limited to 'src')
| -rw-r--r-- | src/keys.hh | 4 | ||||
| -rw-r--r-- | src/ncurses_ui.cc | 50 |
2 files changed, 51 insertions, 3 deletions
diff --git a/src/keys.hh b/src/keys.hh index a7684f22..57b4fffb 100644 --- a/src/keys.hh +++ b/src/keys.hh @@ -109,6 +109,10 @@ constexpr Key ctrl(Key key) { return { key.modifiers | Key::Modifiers::Control, key.key }; } +constexpr Key shift_alt(Key k) { return shift(alt(k)); } +constexpr Key shift_ctrl(Key k) { return shift(ctrl(k)); } +constexpr Key alt_ctrl(Key k) { return alt(ctrl(k)); } +constexpr Key shift_alt_ctrl(Key k) { return shift(alt(ctrl(k))); } constexpr Codepoint encode_coord(DisplayCoord coord) { return (Codepoint)(((int)coord.line << 16) | ((int)coord.column & 0x0000FFFF)); } diff --git a/src/ncurses_ui.cc b/src/ncurses_ui.cc index aa6b9d7d..bd185aa4 100644 --- a/src/ncurses_ui.cc +++ b/src/ncurses_ui.cc @@ -26,6 +26,7 @@ namespace Kakoune using std::min; using std::max; +using std::function; struct NCursesWin : WINDOW {}; @@ -661,12 +662,55 @@ Optional<Key> NCursesUI::get_next_key() const int new_c = wgetch(m_window); if (new_c == '[') // potential CSI { - const Codepoint csi_val = wgetch(m_window); - switch (csi_val) + const Codepoint c1 = wgetch(m_window); + switch (c1) { case 'I': return {Key::FocusIn}; case 'O': return {Key::FocusOut}; - default: break; // nothing + case '1': + { + const Codepoint c2 = wgetch(m_window); + if (c2 != ';') + { + ungetch(c2); ungetch(c1); + break; + } + + const Codepoint c3 = wgetch(m_window); + function<Key(Key)> f; + switch (c3) + { + case '2': f = shift; break; + case '3': f = alt; break; + case '4': f = shift_alt; break; + case '5': f = ctrl; break; + case '6': f = shift_ctrl; break; + case '7': f = alt_ctrl; break; + case '8': f = shift_alt_ctrl; break; + } + if (!f) + { + ungetch(c3); ungetch(c2); ungetch(c1); + break; + } + + const Codepoint c4 = wgetch(m_window); + switch (c4) + { + case 'A': return f(Key::Up); + case 'B': return f(Key::Down); + case 'C': return f(Key::Right); + case 'D': return f(Key::Left); + case 'H': return f(Key::Home); + case 'F': return f(Key::End); + } + + ungetch(c4); ungetch(c3); ungetch(c2); ungetch(c1); + break; + } + default: + ungetch(c1); + break; } } wtimeout(m_window, -1); |
