diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2023-07-27 16:33:36 +0200 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2023-07-27 16:35:54 +0200 |
commit | 8d9d1c60ecf2e757731ae03c045b7ea905732905 (patch) | |
tree | b30a436320000d57f4178111ca00ef1803c98d06 | |
parent | 8c1464822bd35440f1802bf5ec64e4518aa17e67 (diff) | |
download | xK-8d9d1c60ecf2e757731ae03c045b7ea905732905.tar.gz xK-8d9d1c60ecf2e757731ae03c045b7ea905732905.tar.xz xK-8d9d1c60ecf2e757731ae03c045b7ea905732905.zip |
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.
-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; |