diff options
Diffstat (limited to 'xW/xW.cpp')
-rw-r--r-- | xW/xW.cpp | 62 |
1 files changed, 40 insertions, 22 deletions
@@ -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; |