diff --git a/src/video/gltouchkbd.c b/src/video/gltouchkbd.c index bb3216af..cb6f9ec3 100644 --- a/src/video/gltouchkbd.c +++ b/src/video/gltouchkbd.c @@ -21,14 +21,17 @@ #define MODEL_DEPTH -1/32.f #define KBD_TEMPLATE_COLS 10 -#define KBD_TEMPLATE_ROWS 4 +#define KBD_TEMPLATE_ROWS 7 + +#define ROW_WITH_ADJACENTS (KBD_TEMPLATE_ROWS-1) +#define _ROWOFF 3 // actual keyboard row offset // HACK NOTE FIXME TODO : interpolated pixel adjustment still necessary ... #define KBD_FB_WIDTH ((KBD_TEMPLATE_COLS * FONT80_WIDTH_PIXELS) + INTERPOLATED_PIXEL_ADJUSTMENT) #define KBD_FB_HEIGHT (KBD_TEMPLATE_ROWS * FONT_HEIGHT_PIXELS) #define KBD_OBJ_W 2.0 -#define KBD_OBJ_H 1.0 +#define KBD_OBJ_H 1.75 HUD_CLASS(GLModelHUDKeyboard, char *pixelsAlt; // alternate color pixels @@ -37,10 +40,14 @@ HUD_CLASS(GLModelHUDKeyboard, static bool isAvailable = false; // Were there any OpenGL/memory errors on gltouchkbd initialization? static bool isEnabled = true; // Does player want touchkbd enabled? static bool ownsScreen = true; // Does the touchkbd currently own the screen to the exclusion? +static bool allowLowercase = true; // show lowercase keyboard static float minAlphaWhenOwnsScreen = 1/4.f; static float minAlpha = 1/4.f; static char kbdTemplateUCase[KBD_TEMPLATE_ROWS][KBD_TEMPLATE_COLS+1] = { + " . ", + "@ . . @ ", + " . ", "QWERTYUIOP", " ASDFGHJKL", "@ ZXCVBNM@", @@ -48,6 +55,9 @@ static char kbdTemplateUCase[KBD_TEMPLATE_ROWS][KBD_TEMPLATE_COLS+1] = { }; static char kbdTemplateLCase[KBD_TEMPLATE_ROWS][KBD_TEMPLATE_COLS+1] = { + " . ", + "@ . . @ ", + " . ", "qwertyuiop", " asdfghjkl", "@ zxcvbnm@", @@ -55,6 +65,9 @@ static char kbdTemplateLCase[KBD_TEMPLATE_ROWS][KBD_TEMPLATE_COLS+1] = { }; static char kbdTemplateAlt1[KBD_TEMPLATE_ROWS][KBD_TEMPLATE_COLS+1] = { + " . ", + "@ . . @ ", + " . ", "1234567890", "@#%&*/-+()", "$?!\"'`:;,X", @@ -62,6 +75,9 @@ static char kbdTemplateAlt1[KBD_TEMPLATE_ROWS][KBD_TEMPLATE_COLS+1] = { }; static char kbdTemplateAlt2[KBD_TEMPLATE_ROWS][KBD_TEMPLATE_COLS+1] = { + " . ", + "@ . . @ ", + " . ", "~=_<>{}[]|", "@#%&*/-+()", "$?!\"'`:;,X", @@ -113,24 +129,18 @@ static inline void _switch_keyboard(GLModel *parent, char *template) { glhud_setupDefault(parent); } -static inline void _switch_to_alt_keyboard(void) { +static inline void _switch_to_next_keyboard(void) { GLModelHUDKeyboard *hudKeyboard = (GLModelHUDKeyboard *)kbd.model->custom; - if (hudKeyboard->tpl[0] == 'Q' || hudKeyboard->tpl[0] == 'q') { - _switch_keyboard(kbd.model, kbdTemplateAlt1[0]); - } else if (hudKeyboard->tpl[0] == '1') { - _switch_keyboard(kbd.model, kbdTemplateAlt2[0]); - } else { + char c = hudKeyboard->tpl[_ROWOFF*(KBD_TEMPLATE_COLS+1)]; + if (c == 'q') { _switch_keyboard(kbd.model, kbdTemplateUCase[0]); - } -} - -static inline void _switch_to_alpha_keyboard(void) { - GLModelHUDKeyboard *hudKeyboard = (GLModelHUDKeyboard *)kbd.model->custom; - if (hudKeyboard->tpl[0] == 'Q') { - caps_lock = false; + } else if (c == 'Q') { + _switch_keyboard(kbd.model, kbdTemplateAlt1[0]); + } else if (c == '1') { + _switch_keyboard(kbd.model, kbdTemplateAlt2[0]); + } else if (allowLowercase) { _switch_keyboard(kbd.model, kbdTemplateLCase[0]); } else { - caps_lock = true; _switch_keyboard(kbd.model, kbdTemplateUCase[0]); } } @@ -191,7 +201,7 @@ static void _rerender_character(int col, int row, uint8_t *fb) { } static inline void _rerender_adjacents(int col, int row, uint8_t *fb) { - if (row != 3) { + if (row != ROW_WITH_ADJACENTS) { return; } if ((col == 0) || (col == 3) || (col == 4) || (col == 8)) { @@ -241,7 +251,7 @@ static inline void _tap_key_at_point(float x, float y) { int row = kbd.selectedRow; if ((col >= 0) && (row >= 0)) { _rerender_character(col, row, hudKeyboard->pixels); - if (row == 3) { + if (row == ROW_WITH_ADJACENTS) { _rerender_adjacents(col, row, hudKeyboard->pixels); } } @@ -259,7 +269,7 @@ static inline void _tap_key_at_point(float x, float y) { if ((col >= 0) && (row >= 0)) { _rerender_character(col, row, hudKeyboard->pixelsAlt); - if (row == 3) { + if (row == ROW_WITH_ADJACENTS) { _rerender_adjacents(col, row, hudKeyboard->pixelsAlt); } } @@ -267,27 +277,17 @@ static inline void _tap_key_at_point(float x, float y) { kbd.selectedRow = row; // handle key + joy_button0 = 0x0; + joy_button1 = 0x0; bool isASCII = false; switch (key) { case ICONTEXT_LOWERCASE: - key = -1; - _switch_to_alpha_keyboard(); - break; - case ICONTEXT_UPPERCASE: - key = -1; - _switch_to_alpha_keyboard(); - break; - case ICONTEXT_SHOWALT1: - key = -1; - _switch_to_alt_keyboard(); - break; - case ICONTEXT_SHOWALT2: key = -1; - _switch_to_alt_keyboard(); + _switch_to_next_keyboard(); break; case ICONTEXT_NONACTIONABLE: @@ -303,10 +303,33 @@ static inline void _tap_key_at_point(float x, float y) { key = SCODE_TAB; break; + case MOUSETEXT_LEFT: case ICONTEXT_BACKSPACE: key = SCODE_L; break; + case MOUSETEXT_RIGHT: + key = SCODE_R; + break; + + case MOUSETEXT_UP: + key = SCODE_U; + break; + + case MOUSETEXT_DOWN: + key = SCODE_D; + break; + + case MOUSETEXT_OPENAPPLE: + joy_button0 = 0x80; + key = -1; + break; + + case MOUSETEXT_CLOSEDAPPLE: + joy_button1 = 0x80; + key = -1; + break; + case ICONTEXT_LEFTSPACE: case ICONTEXT_MIDSPACE: case ICONTEXT_RIGHTSPACE: @@ -332,62 +355,101 @@ static inline void _tap_key_at_point(float x, float y) { static void _setup_touchkbd_hud(GLModel *parent) { GLModelHUDKeyboard *hudKeyboard = (GLModelHUDKeyboard *)parent->custom; - kbdTemplateUCase[1][0] = ICONTEXT_NONACTIONABLE; - kbdTemplateLCase[1][0] = ICONTEXT_NONACTIONABLE; + for (unsigned int i=0; i<_ROWOFF; i++) { + for (unsigned int j=0; jtplWidth = KBD_TEMPLATE_COLS; hudKeyboard->tplHeight = KBD_TEMPLATE_ROWS; @@ -500,7 +562,7 @@ static void gltouchkbd_reshape(int w, int h) { } if (h > touchport.height) { touchport.height = h; - touchport.kbdY = h * (KBD_OBJ_H/2.f); + touchport.kbdY = h * (1.f - (KBD_OBJ_H/2.f)); touchport.kbdYMax = h; }