summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-09-07 20:22:19 +0200
committerMaxime Coste <frrrwww@gmail.com>2012-09-07 20:22:19 +0200
commit499bb77491858d34b7278e91fd4ac69f9aa3855d (patch)
tree91d06f0b6027ec640d85debd4b219334d3f90a7d
parent287628ec19d42f2ff2323972c2e1e4975b3e146f (diff)
Cleanup Key handling, use symbolic names for function keys
-rw-r--r--src/client.cc37
-rw-r--r--src/keys.hh12
-rw-r--r--src/ncurses.cc25
3 files changed, 47 insertions, 27 deletions
diff --git a/src/client.cc b/src/client.cc
index 84eb14d2..ccefbf76 100644
--- a/src/client.cc
+++ b/src/client.cc
@@ -59,15 +59,16 @@ public:
void on_key(const Key& key, Context& context) override
{
- if (key == Key(Key::Modifiers::Control, 'n') or
- key == Key(Key::Modifiers::Control, 'i') or
+ if (key == Key::Down or
+ key == Key(Key::Modifiers::Control, 'n') or
key == Key(Key::Modifiers::None, 'j'))
{
if (++m_selected >= m_choice_count)
m_selected = 0;
m_client.menu_select(m_selected);
}
- if (key == Key(Key::Modifiers::Control, 'p') or
+ if (key == Key::Up or
+ key == Key(Key::Modifiers::Control, 'p') or
key == Key(Key::Modifiers::None, 'k'))
{
if (--m_selected < 0)
@@ -82,7 +83,7 @@ public:
m_client.reset_normal_mode();
callback(selected, context);
}
- if (key == Key(Key::Modifiers::None, 27))
+ if (key == Key::Escape)
{
m_client.reset_normal_mode();
}
@@ -122,7 +123,7 @@ public:
void on_key(const Key& key, Context& context) override
{
std::vector<String>& history = ms_history[m_prompt];
- if (key == Key(Key::Modifiers::Control, 'm')) // enter
+ if (key == Key{Key::Modifiers::Control, 'm'}) // enter
{
std::vector<String>::iterator it;
while ((it = find(history, m_result)) != history.end())
@@ -137,14 +138,14 @@ public:
callback(result, context);
return;
}
- else if (key == Key(Key::Modifiers::None, 27))
+ else if (key == Key::Escape)
{
m_client.print_status("");
m_client.reset_normal_mode();
return;
}
- else if (key == Key(Key::Modifiers::Control, 'p') or // previous
- key == Key(Key::Modifiers::Control, 'c'))
+ else if (key == Key::Up or
+ key == Key{Key::Modifiers::Control, 'p'})
{
if (m_history_it != history.begin())
{
@@ -166,8 +167,8 @@ public:
} while (it != history.begin());
}
}
- else if (key == Key(Key::Modifiers::Control, 'n') or // next
- key == Key(Key::Modifiers::Control, 'b'))
+ else if (key == Key::Down or // next
+ key == Key{Key::Modifiers::Control, 'n'})
{
if (m_history_it != history.end())
{
@@ -185,17 +186,19 @@ public:
m_cursor_pos = m_result.length();
}
}
- else if (key == Key(Key::Modifiers::Control, 'd'))
+ else if (key == Key::Left or
+ key == Key{Key::Modifiers::Control, 'b'})
{
if (m_cursor_pos > 0)
--m_cursor_pos;
}
- else if (key == Key(Key::Modifiers::Control, 'e'))
+ else if (key == Key::Right or
+ key == Key{Key::Modifiers::Control, 'f'})
{
if (m_cursor_pos < m_result.length())
++m_cursor_pos;
}
- else if (key == Key(Key::Modifiers::Control, 'g')) // backspace
+ else if (key == Key::Backspace)
{
if (m_cursor_pos != 0)
{
@@ -322,9 +325,12 @@ public:
case Key::Modifiers::None:
switch (key.key)
{
- case 27:
+ case Key::Escape:
m_client.reset_normal_mode();
return;
+ case Key::Backspace:
+ m_inserter.erase();
+ break;
default:
m_inserter.insert(String() + key.key);
}
@@ -347,9 +353,6 @@ public:
case 'e':
m_inserter.move_cursors({0, 1});
break;
- case 'g':
- m_inserter.erase();
- break;
}
break;
}
diff --git a/src/keys.hh b/src/keys.hh
index 80593a57..9f13e04a 100644
--- a/src/keys.hh
+++ b/src/keys.hh
@@ -16,6 +16,15 @@ struct Key
Alt = 2,
ControlAlt = 3
};
+ enum NamedKeys : Character
+ {
+ Backspace = 256,
+ Escape,
+ Up,
+ Down,
+ Left,
+ Right,
+ };
Modifiers modifiers;
Character key;
@@ -23,6 +32,9 @@ struct Key
constexpr Key(Modifiers modifiers, Character key)
: modifiers(modifiers), key(key) {}
+ constexpr Key(Character key)
+ : modifiers(Modifiers::None), key(key) {}
+
constexpr bool operator==(const Key& other) const
{ return modifiers == other.modifiers and key == other.key; }
};
diff --git a/src/ncurses.cc b/src/ncurses.cc
index fed44e47..51c17655 100644
--- a/src/ncurses.cc
+++ b/src/ncurses.cc
@@ -164,26 +164,31 @@ void NCursesClient::draw_window(Window& window)
Key NCursesClient::get_key()
{
- char c = getch();
+ const int c = getch();
- Key::Modifiers modifiers = Key::Modifiers::None;
if (c > 0 and c < 27)
{
- modifiers = Key::Modifiers::Control;
- c = c - 1 + 'a';
+ return {Key::Modifiers::Control, c - 1 + 'a'};
}
else if (c == 27)
{
timeout(0);
- char new_c = getch();
+ const int new_c = getch();
timeout(-1);
if (new_c != ERR)
- {
- c = new_c;
- modifiers = Key::Modifiers::Alt;
- }
+ return {Key::Modifiers::Alt, new_c};
+ else
+ return Key::Escape;
+ }
+ else switch (c)
+ {
+ case KEY_BACKSPACE: return Key::Backspace;
+ case KEY_UP: return Key::Up;
+ case KEY_DOWN: return Key::Down;
+ case KEY_LEFT: return Key::Left;
+ case KEY_RIGHT: return Key::Right;
}
- return Key(modifiers, c);
+ return c;
}
void NCursesClient::print_status(const String& status, CharCount cursor_pos)