You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
#include <cstdlib> |
|
#include <cstring> |
|
|
|
#include "platform/ctr/keyboard.h" |
|
#include "utils/utf8.hpp" |
|
|
|
constexpr size_t MAX_TEXT_LENGTH = 255; |
|
|
|
struct vkbdEvent { |
|
devilution::string_view hintText; |
|
devilution::string_view inText; |
|
char *outText; |
|
size_t maxLength; |
|
}; |
|
|
|
static vkbdEvent events[16]; |
|
static int eventCount = 0; |
|
|
|
void ctr_vkbdInput(devilution::string_view hintText, devilution::string_view inText, char *outText, size_t maxLength) |
|
{ |
|
if (eventCount >= sizeof(events)) |
|
return; |
|
|
|
vkbdEvent &event = events[eventCount]; |
|
event.hintText = hintText; |
|
event.inText = inText; |
|
event.outText = outText; |
|
event.maxLength = maxLength; |
|
eventCount++; |
|
} |
|
|
|
void ctr_vkbdFlush() |
|
{ |
|
for (int i = 0; i < eventCount; i++) { |
|
vkbdEvent &event = events[i]; |
|
SwkbdState swkbd; |
|
|
|
swkbdInit(&swkbd, SWKBD_TYPE_WESTERN, 2, MAX_TEXT_LENGTH); |
|
swkbdSetValidation(&swkbd, SWKBD_NOTEMPTY_NOTBLANK, 0, 0); |
|
|
|
// swkbdSetInitialText stores the pointer to the c-string, only copying it when swkbdInputText is called. Need to |
|
// ensure it has a valid null-terminated string until that point. |
|
std::string initialText { event.inText }; |
|
swkbdSetInitialText(&swkbd, initialText.c_str()); |
|
|
|
// swkbdSetHintText copies from the c-string immediately so we can use the output buffer to save a malloc |
|
char mybuf[MAX_TEXT_LENGTH + 1]; |
|
devilution::CopyUtf8(mybuf, event.hintText, sizeof(mybuf)); |
|
swkbdSetHintText(&swkbd, mybuf); |
|
|
|
memset(mybuf, 0, sizeof(mybuf)); |
|
SwkbdButton button = swkbdInputText(&swkbd, mybuf, sizeof(mybuf)); |
|
|
|
if (button == SWKBD_BUTTON_CONFIRM) { |
|
devilution::CopyUtf8(event.outText, mybuf, event.maxLength); |
|
} |
|
} |
|
|
|
eventCount = 0; |
|
}
|
|
|