summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xW/xW.cpp62
1 files changed, 40 insertions, 22 deletions
diff --git a/xW/xW.cpp b/xW/xW.cpp
index 2eb2f53..e35fec2 100644
--- a/xW/xW.cpp
+++ b/xW/xW.cpp
@@ -1301,6 +1301,32 @@ input_complete()
return true;
}
+static bool
+input_up()
+{
+ auto b = buffer_by_name(g.buffer_current);
+ if (!b || b->history_at < 1)
+ return false;
+
+ if (b->history_at == b->history.size())
+ b->input = window_get_text(g.hwndInput);
+ input_set_contents(b->history.at(--b->history_at));
+ return true;
+}
+
+static bool
+input_down()
+{
+ auto b = buffer_by_name(g.buffer_current);
+ if (!b || b->history_at >= b->history.size())
+ return false;
+
+ input_set_contents(++b->history_at == b->history.size()
+ ? b->input
+ : b->history.at(b->history_at));
+ return true;
+}
+
static boolean
input_wants(const MSG *message)
{
@@ -1332,34 +1358,18 @@ input_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
return lResult;
}
case WM_SYSCHAR:
- {
- auto b = buffer_by_name(g.buffer_current);
- if (!b)
- break;
-
// TODO(p): Emacs-style cursor movement shortcuts.
switch (wParam) {
case 'p':
- {
- if (b->history_at < 1)
- break;
- if (b->history_at == b->history.size())
- b->input = window_get_text(g.hwndInput);
- input_set_contents(b->history.at(--b->history_at));
- return 0;
- }
+ if (input_up())
+ return 0;
+ break;
case 'n':
- {
- if (b->history_at >= b->history.size())
- break;
- input_set_contents(++b->history_at == b->history.size()
- ? b->input
- : b->history.at(b->history_at));
- return 0;
- }
+ if (input_down())
+ return 0;
+ break;
}
break;
- }
case WM_KEYDOWN:
{
HWND scrollable = IsWindowVisible(g.hwndBufferLog)
@@ -1367,6 +1377,14 @@ input_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
: g.hwndBuffer;
switch (wParam) {
+ case VK_UP:
+ if (input_up())
+ return 0;
+ break;
+ case VK_DOWN:
+ if (input_down())
+ return 0;
+ break;
case VK_PRIOR:
SendMessage(scrollable, EM_SCROLL, SB_PAGEUP, 0);
return 0;