From 8d9d1c60ecf2e757731ae03c045b7ea905732905 Mon Sep 17 00:00:00 2001 From: Přemysl Eric Janouch
Date: Thu, 27 Jul 2023 16:33:36 +0200 Subject: xW: make Up/Down go through input history The input field isn't multiline, so this doesn't pose an issue. Otherwise, we'd have to check if we're on the top line first. --- xW/xW.cpp | 62 ++++++++++++++++++++++++++++++++++++++++---------------------- 1 file 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; -- cgit v1.2.3-70-g09d2