summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2018-12-09 10:33:44 +1100
committerMaxime Coste <mawww@kakoune.org>2018-12-09 10:33:44 +1100
commite90e77e5fcff0bc474ed8c75e83dac34c2051824 (patch)
treeb856043a49ca015a51a3a48a5a3fada9e3cee47b /src
parent1875ff51a001a73f89f1273782db03490247238d (diff)
parentc0be01ac0f0b305ee75c473abad1e56e0a04eb71 (diff)
Merge remote-tracking branch 'jeapostrophe/master'
Diffstat (limited to 'src')
-rw-r--r--src/keys.hh4
-rw-r--r--src/ncurses_ui.cc50
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);