OSK cleanup, add katakana support

This commit is contained in:
Brad Parker 2016-10-29 19:51:02 -04:00
parent 281335f86f
commit 1a73b1d144
6 changed files with 93 additions and 37 deletions

View File

@ -166,7 +166,7 @@ static bool input_keyboard_line_event(
return false;
}
bool input_keyboard_line_append(char* word)
bool input_keyboard_line_append(const char *word)
{
unsigned len = strlen(word);

View File

@ -77,7 +77,7 @@ typedef struct input_keyboard_ctx_wait
void input_keyboard_event(bool down, unsigned code, uint32_t character,
uint16_t mod, unsigned device);
bool input_keyboard_line_append(char* word);
bool input_keyboard_line_append(const char *word);
/**
* input_keyboard_start_line:

View File

@ -271,7 +271,7 @@ static void mui_draw_text(font_data_t *font, float x, float y, unsigned width, u
menu_display_draw_text(font, msg, width, height, &params);
}
static void mui_render_keyboard(mui_handle_t *mui, char* grid[], unsigned id)
static void mui_render_keyboard(mui_handle_t *mui, const char *grid[], unsigned id)
{
unsigned i, width, height;
float dark[16]= {
@ -456,7 +456,7 @@ static void mui_render_messagebox(mui_handle_t *mui,
}
if (menu_input_dialog_get_display_kb())
mui_render_keyboard(mui, osk_grid, osk_ptr);
mui_render_keyboard(mui, menu_event_get_osk_grid(), menu_event_get_osk_ptr());
end:
string_list_free(list);

View File

@ -686,7 +686,7 @@ static void xmb_messagebox(void *data, const char *message)
strlcpy(xmb->box_message, message, sizeof(xmb->box_message));
}
static void xmb_render_keyboard(xmb_handle_t *xmb, char* grid[], unsigned id)
static void xmb_render_keyboard(xmb_handle_t *xmb, const char *grid[], unsigned id)
{
unsigned i, width, height;
float dark[16]= {
@ -787,7 +787,7 @@ static void xmb_render_messagebox_internal(
}
if (menu_input_dialog_get_display_kb())
xmb_render_keyboard(xmb, osk_grid, osk_ptr);
xmb_render_keyboard(xmb, menu_event_get_osk_grid(), menu_event_get_osk_ptr());
end:
string_list_free(list);

View File

@ -44,6 +44,68 @@
static unsigned char menu_keyboard_key_state[RETROK_LAST];
enum osk_type
{
OSK_TYPE_UNKNOWN = 0U,
OSK_UPPERCASE_LATIN,
OSK_LOWERCASE_LATIN,
OSK_HIRAGANA_PAGE1,
OSK_HIRAGANA_PAGE2,
OSK_KATAKANA_PAGE1,
OSK_KATAKANA_PAGE2,
OSK_TYPE_LAST
};
static enum osk_type osk_idx = OSK_UPPERCASE_LATIN;
static unsigned osk_ptr;
static const char *osk_grid[41];
static const char *uppercase_grid[] = {
"!","@","#","$","%","^","&","*","(",")",
"Q","W","E","R","T","Y","U","I","O","P",
"A","S","D","F","G","H","J","K","L",":",
"Z","X","C","V","B","N","M"," ","<",">"};
static const char *lowercase_grid[] = {
"1","2","3","4","5","6","7","8","9","0",
"q","w","e","r","t","y","u","i","o","p",
"a","s","d","f","g","h","j","k","l",";",
"z","x","c","v","b","n","m"," ",",","."};
static const char *hiragana_page1_grid[] = {
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","",""};
static const char *hiragana_page2_grid[] = {
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","",""};
static const char *katakana_page1_grid[] = {
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","",""};
static const char *katakana_page2_grid[] = {
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","",""};
unsigned menu_event_get_osk_ptr()
{
return osk_ptr;
}
const char** menu_event_get_osk_grid()
{
return osk_grid;
}
static int menu_event_pointer(unsigned *action)
{
const struct retro_keybind *binds[MAX_USERS] = {NULL};
@ -163,40 +225,35 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input)
{
switch (osk_idx)
{
case 0:
case OSK_HIRAGANA_PAGE1:
{
char* grid[] = {"!","@","#","$","%","^","&","*","(",")",
"Q","W","E","R","T","Y","U","I","O","P",
"A","S","D","F","G","H","J","K","L",":",
"Z","X","C","V","B","N","M"," ","<",">"};
memcpy(osk_grid, grid, sizeof(grid));
memcpy(osk_grid, hiragana_page1_grid, sizeof(hiragana_page1_grid));
break;
}
case 1:
case OSK_HIRAGANA_PAGE2:
{
char* grid[] = {"1","2","3","4","5","6","7","8","9","0",
"q","w","e","r","t","y","u","i","o","p",
"a","s","d","f","g","h","j","k","l",";",
"z","x","c","v","b","n","m"," ",",","."};
memcpy(osk_grid, grid, sizeof(grid));
memcpy(osk_grid, hiragana_page2_grid, sizeof(hiragana_page2_grid));
break;
}
case 2:
case OSK_KATAKANA_PAGE1:
{
char* grid[] = {"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","",""};
memcpy(osk_grid, grid, sizeof(grid));
memcpy(osk_grid, katakana_page1_grid, sizeof(katakana_page1_grid));
break;
}
case 3:
case OSK_KATAKANA_PAGE2:
{
char* grid[] = {"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","","",
"","","","","","","","","",""};
memcpy(osk_grid, grid, sizeof(grid));
memcpy(osk_grid, katakana_page2_grid, sizeof(katakana_page2_grid));
break;
}
case OSK_LOWERCASE_LATIN:
{
memcpy(osk_grid, lowercase_grid, sizeof(lowercase_grid));
break;
}
case OSK_UPPERCASE_LATIN:
default:
{
memcpy(osk_grid, uppercase_grid, sizeof(uppercase_grid));
break;
}
}
@ -227,18 +284,18 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input)
if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L))
{
if (osk_idx > 0)
if (osk_idx > OSK_TYPE_UNKNOWN + 1)
osk_idx--;
else
osk_idx = 3;
osk_idx = OSK_TYPE_LAST - 1;
}
if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R))
{
if (osk_idx < 3)
if (osk_idx < OSK_TYPE_LAST - 1)
osk_idx++;
else
osk_idx = 0;
osk_idx = OSK_TYPE_UNKNOWN + 1;
}
if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A))

View File

@ -39,9 +39,8 @@ void menu_event_keyboard_set(bool down, enum retro_key key);
unsigned char menu_event_keyboard_is_set(enum retro_key key);
unsigned osk_ptr;
unsigned osk_idx;
char* osk_grid[41];
unsigned menu_event_get_osk_ptr();
const char** menu_event_get_osk_grid();
RETRO_END_DECLS