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.
This commit is contained in:
Přemysl Eric Janouch 2023-07-27 16:33:36 +02:00
parent 8c1464822b
commit 8d9d1c60ec
Signed by: p
GPG Key ID: A0420B94F92B9493

View File

@ -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;