2007-05-30 21:56:52 +00:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
2006-07-09 11:47:17 +00:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*
|
|
|
|
*/
|
2006-07-09 14:46:04 +00:00
|
|
|
#include <nds.h>
|
2006-07-09 11:47:17 +00:00
|
|
|
#include "touchkeyboard.h"
|
|
|
|
#include "keyboard_raw.h"
|
|
|
|
#include "keyboard_pal_raw.h"
|
2007-06-30 23:03:03 +00:00
|
|
|
#include "8x8font_tga_raw.h"
|
2006-07-09 11:47:17 +00:00
|
|
|
#include "dsmain.h"
|
|
|
|
#include "osystem_ds.h"
|
|
|
|
|
|
|
|
namespace DS {
|
|
|
|
|
|
|
|
struct key_data {
|
|
|
|
char keyNum;
|
2007-12-21 18:36:40 +00:00
|
|
|
signed char x, y;
|
2006-07-09 11:47:17 +00:00
|
|
|
int character;
|
|
|
|
bool pressed;
|
|
|
|
};
|
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
#define DS_NUM_KEYS 72
|
2007-10-13 15:40:11 +00:00
|
|
|
#define DS_SHIFT 2
|
2006-07-09 11:47:17 +00:00
|
|
|
#define DS_BACKSPACE 8
|
|
|
|
#define DS_RETURN 13
|
|
|
|
#define DS_CAPSLOCK 1
|
|
|
|
|
|
|
|
|
|
|
|
key_data keys[DS_NUM_KEYS] = {
|
|
|
|
// Key number x y character
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
// Numbers
|
|
|
|
{28, 3, 0, '1'},
|
|
|
|
{29, 5, 0, '2'},
|
|
|
|
{30, 7, 0, '3'},
|
|
|
|
{31, 9, 0, '4'},
|
|
|
|
{32, 11, 0, '5'},
|
|
|
|
{33, 13, 0, '6'},
|
|
|
|
{34, 15, 0, '7'},
|
|
|
|
{35, 17, 0, '8'},
|
|
|
|
{36, 19, 0, '9'},
|
|
|
|
{27, 21, 0, '0'},
|
2007-06-22 20:04:44 +00:00
|
|
|
{45, 23, 0, Common::KEYCODE_MINUS},
|
|
|
|
{50, 25, 0, Common::KEYCODE_EQUALS},
|
|
|
|
{52, 27, 0, Common::KEYCODE_BACKSPACE},
|
2006-07-09 11:47:17 +00:00
|
|
|
|
|
|
|
// Top row
|
|
|
|
{'Q'-'A' + 1, 4, 2, 'Q'},
|
|
|
|
{'W'-'A' + 1, 6, 2, 'W'},
|
|
|
|
{'E'-'A' + 1, 8, 2, 'E'},
|
|
|
|
{'R'-'A' + 1, 10, 2, 'R'},
|
|
|
|
{'T'-'A' + 1, 12, 2, 'T'},
|
|
|
|
{'Y'-'A' + 1, 14, 2, 'Y'},
|
|
|
|
{'U'-'A' + 1, 16, 2, 'U'},
|
|
|
|
{'I'-'A' + 1, 18, 2, 'I'},
|
|
|
|
{'O'-'A' + 1, 20, 2, 'O'},
|
|
|
|
{'P'-'A' + 1, 22, 2, 'P'},
|
2007-06-22 20:04:44 +00:00
|
|
|
{43, 24, 2, Common::KEYCODE_LEFTBRACKET},
|
|
|
|
{44, 26, 2, Common::KEYCODE_RIGHTBRACKET},
|
2006-07-09 11:47:17 +00:00
|
|
|
|
|
|
|
// Middle row
|
|
|
|
{55, 3, 4, DS_CAPSLOCK},
|
|
|
|
{'A'-'A' + 1, 5, 4, 'A'},
|
|
|
|
{'S'-'A' + 1, 7, 4, 'S'},
|
|
|
|
{'D'-'A' + 1, 9, 4, 'D'},
|
|
|
|
{'F'-'A' + 1, 11, 4, 'F'},
|
|
|
|
{'G'-'A' + 1, 13, 4, 'G'},
|
|
|
|
{'H'-'A' + 1, 15, 4, 'H'},
|
|
|
|
{'J'-'A' + 1, 17, 4, 'J'},
|
|
|
|
{'K'-'A' + 1, 19, 4, 'K'},
|
|
|
|
{'L'-'A' + 1, 21, 4, 'L'},
|
2007-06-22 20:04:44 +00:00
|
|
|
{42, 23, 4, Common::KEYCODE_SEMICOLON},
|
|
|
|
{41, 25, 4, Common::KEYCODE_QUOTE},
|
|
|
|
{46, 27, 4, Common::KEYCODE_RETURN},
|
2006-07-09 11:47:17 +00:00
|
|
|
|
|
|
|
// Bottom row
|
|
|
|
{51, 4, 6, DS_SHIFT},
|
|
|
|
{'Z'-'A' + 1, 6, 6, 'Z'},
|
|
|
|
{'X'-'A' + 1, 8, 6, 'X'},
|
|
|
|
{'C'-'A' + 1, 10, 6, 'C'},
|
|
|
|
{'V'-'A' + 1, 12, 6, 'V'},
|
|
|
|
{'B'-'A' + 1, 14, 6, 'B'},
|
|
|
|
{'N'-'A' + 1, 16, 6, 'N'},
|
|
|
|
{'M'-'A' + 1, 18, 6, 'M'},
|
2007-06-22 20:04:44 +00:00
|
|
|
{38, 20, 6, Common::KEYCODE_COMMA},
|
|
|
|
{39, 22, 6, Common::KEYCODE_PERIOD},
|
|
|
|
{40, 24, 6, Common::KEYCODE_SLASH},
|
2006-07-09 11:47:17 +00:00
|
|
|
|
|
|
|
// Space bar
|
2007-06-22 20:04:44 +00:00
|
|
|
{47, 9, 8, Common::KEYCODE_SPACE},
|
|
|
|
{48, 11, 8, Common::KEYCODE_SPACE},
|
|
|
|
{48, 13, 8, Common::KEYCODE_SPACE},
|
|
|
|
{48, 15, 8, Common::KEYCODE_SPACE},
|
|
|
|
{48, 17, 8, Common::KEYCODE_SPACE},
|
|
|
|
{49, 19, 8, Common::KEYCODE_SPACE},
|
2006-07-09 11:47:17 +00:00
|
|
|
|
|
|
|
// Cursor arrows
|
2007-06-22 20:04:44 +00:00
|
|
|
{52, 27, 8, Common::KEYCODE_LEFT},
|
|
|
|
{54, 29, 8, Common::KEYCODE_DOWN},
|
|
|
|
{53, 31, 8, Common::KEYCODE_RIGHT},
|
|
|
|
{51, 29, 6, Common::KEYCODE_UP},
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
// Close button
|
2007-06-22 21:16:07 +00:00
|
|
|
{56, 30, 0, Common::KEYCODE_INVALID},
|
2007-12-21 18:36:40 +00:00
|
|
|
|
|
|
|
// Function keys (needed for AGI)
|
|
|
|
{57, 4, -2, Common::KEYCODE_F1},
|
|
|
|
{58, 6, -2, Common::KEYCODE_F2},
|
|
|
|
{59, 8, -2, Common::KEYCODE_F3},
|
|
|
|
{60, 10, -2, Common::KEYCODE_F4},
|
|
|
|
{61, 14, -2, Common::KEYCODE_F5},
|
|
|
|
{62, 16, -2, Common::KEYCODE_F6},
|
|
|
|
{63, 18, -2, Common::KEYCODE_F7},
|
|
|
|
{64, 20, -2, Common::KEYCODE_F8},
|
|
|
|
{65, 24, -2, Common::KEYCODE_F9},
|
|
|
|
{66, 26, -2, Common::KEYCODE_F10},
|
|
|
|
{67, 28, -2, Common::KEYCODE_F11},
|
|
|
|
{68, 30, -2, Common::KEYCODE_F12},
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
int keyboardX;
|
|
|
|
int keyboardY;
|
|
|
|
|
|
|
|
int mapBase;
|
|
|
|
int tileBase;
|
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
u16* baseAddress;
|
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
bool shiftState;
|
|
|
|
bool capsLockState;
|
|
|
|
|
|
|
|
bool closed;
|
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
char autoCompleteWord[NUM_WORDS][32];
|
|
|
|
int autoCompleteCount;
|
|
|
|
|
|
|
|
char autoCompleteBuffer[128];
|
|
|
|
|
|
|
|
int selectedCompletion = -1;
|
|
|
|
int charactersEntered = 0;
|
|
|
|
|
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
void restoreVRAM(int tileBase, int mapBase, u16* saveSpace) {
|
2007-04-06 18:34:53 +00:00
|
|
|
/* for (int r = 0; r < 32 * 32; r++) {
|
2006-07-09 11:47:17 +00:00
|
|
|
((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = *saveSpace++;
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
for (int r = 0; r < 4096; r++) {
|
|
|
|
((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r] = *saveSpace++;
|
2007-04-06 18:34:53 +00:00
|
|
|
}*/
|
2006-07-09 11:47:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) {
|
2007-12-21 18:36:40 +00:00
|
|
|
int keyboardDataSize = 4736 * 2;
|
2006-07-09 11:47:17 +00:00
|
|
|
|
|
|
|
for (int r = 0; r < 32 * 32; r++) {
|
|
|
|
// *saveSpace++ = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r];
|
2007-12-21 18:36:40 +00:00
|
|
|
((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = 0;
|
2006-07-09 11:47:17 +00:00
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
for (int r = 0; r < KEYBOARD_DATA_SIZE / 2; r++) {
|
2006-07-09 11:47:17 +00:00
|
|
|
// *saveSpace++ = ((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r];
|
|
|
|
((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r] = ((u16 *) (keyboard_raw))[r];
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
for (int r = 0; r < 16; r++) {
|
|
|
|
BG_PALETTE_SUB[r] = ((u16 *) (keyboard_pal_raw))[r];
|
|
|
|
}
|
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
// this is the font
|
|
|
|
for (int tile = 0; tile < 94; tile++) {
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
u16* tileAddr = (u16 *) (CHAR_BASE_BLOCK_SUB(tileBase) + ((KEYBOARD_DATA_SIZE) + (tile * 32)));
|
2007-06-30 23:03:03 +00:00
|
|
|
u8* src = ((u8 *) (_8x8font_tga_raw)) + 18 + tile * 8;
|
|
|
|
|
|
|
|
for (int y = 0 ; y < 8; y++) {
|
|
|
|
for (int x = 0; x < 2; x++) {
|
|
|
|
*(tileAddr + (y * 2) + x) =(*(src + (y * 752) + (x * 4) + 0) & 0x0F)
|
2008-01-28 00:14:17 +00:00
|
|
|
| ((*(src + (y * 752) + (x * 4) + 1) & 0x0F) << 4)
|
2007-06-30 23:03:03 +00:00
|
|
|
| ((*(src + (y * 752) + (x * 4) + 2) & 0x0F) << 8)
|
|
|
|
| ((*(src + (y * 752) + (x * 4) + 3) & 0x0F) << 12);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
for (int r = 0; r < 16; r++) {
|
|
|
|
int col = ((u16 *) (keyboard_pal_raw))[r];
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
int red = col & 0x001F;
|
|
|
|
int green = (col & 0x03E0) >> 5;
|
|
|
|
int blue = (col & 0x7C00) >> 10;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
red = (red * 8) / 16;
|
2007-06-30 23:03:03 +00:00
|
|
|
green = (green * 24) / 16;
|
2006-07-09 11:47:17 +00:00
|
|
|
blue = (blue * 8) / 16;
|
2007-06-30 23:03:03 +00:00
|
|
|
|
|
|
|
if (green > 31) green = 31;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
BG_PALETTE_SUB[16 + r] = red | (green << 5) | (blue << 10);
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
keyboardX = -2;
|
2007-12-21 18:36:40 +00:00
|
|
|
keyboardY = 2;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
DS::mapBase = mapBase;
|
|
|
|
DS::tileBase = tileBase;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
shiftState = false;
|
|
|
|
capsLockState = false;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
int x = keyboardX;
|
|
|
|
int y = keyboardY;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase));
|
2007-06-30 23:03:03 +00:00
|
|
|
baseAddress = base;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
for (int r = 0; r < DS_NUM_KEYS; r++) {
|
2007-12-21 18:36:40 +00:00
|
|
|
base[(y + keys[r].y) * 32 + x + keys[r].x] = 10 + keys[r].keyNum * 2;
|
|
|
|
base[(y + keys[r].y) * 32 + x + keys[r].x + 1] = 10 + keys[r].keyNum * 2 + 1;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
base[(y + keys[r].y + 1) * 32 + x + keys[r].x] = 10 + 148 + keys[r].keyNum * 2;
|
|
|
|
base[(y + keys[r].y + 1) * 32 + x + keys[r].x + 1] = 10 + 148 + keys[r].keyNum * 2 + 1;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
keys[r].pressed = false;
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
closed = false;
|
2007-06-30 23:03:03 +00:00
|
|
|
clearAutoComplete();
|
|
|
|
}
|
|
|
|
|
|
|
|
void drawAutoComplete() {
|
|
|
|
|
|
|
|
for (int y = 12; y < 24; y++) {
|
|
|
|
for (int x = 0; x < 32; x++) {
|
2007-12-21 18:36:40 +00:00
|
|
|
baseAddress[y * 32 + x] = 0;
|
2007-06-30 23:03:03 +00:00
|
|
|
}
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
|
|
|
|
for (int r = 0; r < autoCompleteCount; r++) {
|
|
|
|
int y = 12 + (r % 6) * 2;
|
|
|
|
int x = 0 + ((r / 6) * 16);
|
|
|
|
|
|
|
|
for (int p = 0; p < strlen(autoCompleteWord[r]); p++) {
|
|
|
|
char c = autoCompleteWord[r][p];
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
int tile = c - 33 + (KEYBOARD_DATA_SIZE / 32);
|
2007-06-30 23:03:03 +00:00
|
|
|
|
|
|
|
if (selectedCompletion == r) {
|
|
|
|
tile |= 0x1000;
|
|
|
|
}
|
|
|
|
|
2008-01-27 19:47:41 +00:00
|
|
|
baseAddress[y * 32 + x + p] = tile;
|
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2006-07-09 11:47:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool getKeyboardClosed() {
|
|
|
|
return closed;
|
|
|
|
}
|
|
|
|
|
|
|
|
void setKeyHighlight(int key, bool highlight) {
|
|
|
|
u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(DS::mapBase));
|
|
|
|
|
|
|
|
if (highlight) {
|
|
|
|
base[(keyboardY + keys[key].y) * 32 + keyboardX + keys[key].x] |= 0x1000;
|
|
|
|
base[(keyboardY + keys[key].y) * 32 + keyboardX + keys[key].x + 1] |= 0x1000;
|
|
|
|
base[(keyboardY + keys[key].y + 1) * 32 + keyboardX + keys[key].x] |= 0x1000;
|
|
|
|
base[(keyboardY + keys[key].y + 1) * 32 + keyboardX + keys[key].x + 1] |= 0x1000;
|
|
|
|
} else {
|
|
|
|
base[(keyboardY + keys[key].y) * 32 + keyboardX + keys[key].x] &= ~0x1000;
|
|
|
|
base[(keyboardY + keys[key].y) * 32 + keyboardX + keys[key].x + 1] &= ~0x1000;
|
|
|
|
base[(keyboardY + keys[key].y + 1) * 32 + keyboardX + keys[key].x] &= ~0x1000;
|
|
|
|
base[(keyboardY + keys[key].y + 1) * 32 + keyboardX + keys[key].x + 1] &= ~0x1000;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
void addAutoComplete(char* word) {
|
|
|
|
if (autoCompleteCount == NUM_WORDS) return;
|
|
|
|
strcpy(&autoCompleteWord[autoCompleteCount++][0], word);
|
|
|
|
drawAutoComplete();
|
|
|
|
}
|
|
|
|
|
|
|
|
void setCharactersEntered(int count) {
|
|
|
|
charactersEntered = count;
|
|
|
|
}
|
|
|
|
|
|
|
|
void clearAutoComplete() {
|
|
|
|
autoCompleteCount = 0;
|
|
|
|
selectedCompletion = -1;
|
|
|
|
drawAutoComplete();
|
|
|
|
}
|
|
|
|
|
|
|
|
void typeCompletion(int current) {
|
|
|
|
Common::Event event;
|
2008-01-28 00:14:17 +00:00
|
|
|
OSystem_DS* system = OSystem_DS::instance();
|
2007-06-30 23:03:03 +00:00
|
|
|
|
|
|
|
strcat(autoCompleteBuffer, &autoCompleteWord[current][charactersEntered]);
|
|
|
|
strcat(autoCompleteBuffer, " ");
|
|
|
|
|
|
|
|
/* consolePrintf("Typing word: %s\n", autoCompleteWord[current]);
|
|
|
|
|
|
|
|
for (int r = charactersEntered; r < strlen(autoCompleteWord[current]); r++) {
|
|
|
|
event.kbd.keycode = autoCompleteWord[current][r];
|
|
|
|
event.kbd.ascii = autoCompleteWord[current][r];
|
|
|
|
event.type = Common::EVENT_KEYDOWN;
|
|
|
|
event.kbd.flags = 0;
|
|
|
|
system->addEvent(event);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
event.type = Common::EVENT_KEYUP;
|
|
|
|
system->addEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
event.kbd.keycode = ' ';
|
|
|
|
event.kbd.ascii = ' ';
|
|
|
|
|
|
|
|
event.type = Common::EVENT_KEYDOWN;
|
|
|
|
system->addEvent(event);
|
|
|
|
|
|
|
|
event.type = Common::EVENT_KEYUP;
|
|
|
|
system->addEvent(event);*/
|
|
|
|
}
|
|
|
|
|
|
|
|
void updateTypeEvents()
|
|
|
|
{
|
|
|
|
if (autoCompleteBuffer[0] != '\0')
|
|
|
|
{
|
|
|
|
Common::Event event;
|
2008-01-28 00:14:17 +00:00
|
|
|
OSystem_DS* system = OSystem_DS::instance();
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-08-18 11:10:41 +00:00
|
|
|
event.kbd.keycode = (Common::KeyCode) autoCompleteBuffer[0];
|
2007-06-30 23:03:03 +00:00
|
|
|
event.kbd.ascii = autoCompleteBuffer[0];
|
|
|
|
event.type = Common::EVENT_KEYDOWN;
|
|
|
|
event.kbd.flags = 0;
|
|
|
|
system->addEvent(event);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
event.type = Common::EVENT_KEYUP;
|
|
|
|
system->addEvent(event);
|
|
|
|
|
|
|
|
for (int r = 0; r < strlen(autoCompleteBuffer); r++)
|
|
|
|
{
|
|
|
|
autoCompleteBuffer[r] = autoCompleteBuffer[r + 1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
void createKeyEvent(int keyNum, Common::Event& event)
|
|
|
|
{
|
|
|
|
event.kbd.flags = 0;
|
|
|
|
|
|
|
|
if ((keys[keyNum].character >= '0') && (keys[keyNum].character <= '9')) {
|
|
|
|
|
|
|
|
if (!DS::shiftState) {
|
|
|
|
event.kbd.ascii = keys[keyNum].character;
|
|
|
|
event.kbd.keycode = (Common::KeyCode) keys[keyNum].character; //Common::KEYCODE_INVALID;
|
|
|
|
} else {
|
|
|
|
event.kbd.keycode = (Common::KeyCode) (Common::KEYCODE_F1 - (keys[keyNum].character - '1'));
|
|
|
|
event.kbd.ascii = 0;
|
2008-01-27 19:47:41 +00:00
|
|
|
}
|
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
} else if ((keys[keyNum].character >= 'A') && (keys[keyNum].character <= 'Z')) {
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
if ((!DS::shiftState) && (!DS::capsLockState)) {
|
|
|
|
event.kbd.ascii = keys[keyNum].character + 32; // Make key lowercase.
|
|
|
|
} else {
|
|
|
|
event.kbd.ascii = keys[keyNum].character;
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
event.kbd.keycode = (Common::KeyCode) event.kbd.ascii;
|
|
|
|
} else {
|
|
|
|
event.kbd.ascii = keys[keyNum].character;
|
|
|
|
event.kbd.keycode = (Common::KeyCode) keys[keyNum].character;
|
2008-01-27 19:47:41 +00:00
|
|
|
}
|
2007-12-21 18:36:40 +00:00
|
|
|
}
|
2007-06-30 23:03:03 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
void addKeyboardEvents() {
|
2007-06-30 23:03:03 +00:00
|
|
|
updateTypeEvents();
|
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
if (DS::getPenDown()) {
|
|
|
|
int x = IPC->touchXpx;
|
|
|
|
int y = IPC->touchYpx;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-06-30 23:03:03 +00:00
|
|
|
int tx = (x >> 3);
|
|
|
|
int ty = (y >> 3);
|
|
|
|
|
|
|
|
if (ty >= 12) {
|
|
|
|
int current = -1;
|
|
|
|
|
|
|
|
if (tx < 12) {
|
|
|
|
current = (ty - 12) / 2;
|
|
|
|
} else {
|
|
|
|
current = 6 + (ty - 12) / 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (selectedCompletion == current) {
|
|
|
|
typeCompletion(current);
|
|
|
|
} else {
|
|
|
|
selectedCompletion = current;
|
|
|
|
}
|
|
|
|
|
|
|
|
drawAutoComplete();
|
|
|
|
}
|
|
|
|
|
|
|
|
tx -= keyboardX;
|
|
|
|
ty -= keyboardY;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
// consolePrintf("x=%d y=%d\n", tx, ty);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
for (int r = 0; r < DS_NUM_KEYS; r++) {
|
2008-01-27 19:47:41 +00:00
|
|
|
if (( (tx >= keys[r].x) && (tx <= keys[r].x + 1)) &&
|
2006-07-09 11:47:17 +00:00
|
|
|
(ty >= keys[r].y) && (ty <= keys[r].y + 1)) {
|
2008-01-28 00:14:17 +00:00
|
|
|
OSystem_DS* system = OSystem_DS::instance();
|
2007-03-17 19:02:05 +00:00
|
|
|
Common::Event event;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
// consolePrintf("Key: %d\n", r);
|
2007-06-22 21:16:07 +00:00
|
|
|
if ((keys[r].character == Common::KEYCODE_INVALID)) {
|
2006-07-09 11:47:17 +00:00
|
|
|
// Close button
|
|
|
|
DS::closed = true;
|
|
|
|
} else {
|
2007-12-21 18:36:40 +00:00
|
|
|
createKeyEvent(r, event);
|
2008-01-27 19:47:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//event.kbd.keycode = keys[r].character;
|
|
|
|
//event.kbd.ascii = keys[r].character;
|
2007-03-17 19:02:05 +00:00
|
|
|
event.type = Common::EVENT_KEYDOWN;
|
2006-07-09 11:47:17 +00:00
|
|
|
system->addEvent(event);
|
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
// event.type = Common::EVENT_KEYUP;
|
|
|
|
// system->addEvent(event);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
switch (keys[r].character) {
|
|
|
|
case DS_SHIFT: {
|
|
|
|
DS::shiftState = !DS::shiftState;
|
|
|
|
DS::setKeyHighlight(r, DS::shiftState);
|
|
|
|
break;
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
case DS_CAPSLOCK: {
|
|
|
|
DS::capsLockState = !DS::capsLockState;
|
|
|
|
DS::setKeyHighlight(r, DS::capsLockState);
|
|
|
|
break;
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
default: {
|
|
|
|
DS::setKeyHighlight(r, true);
|
|
|
|
keys[r].pressed = true;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
if (DS::shiftState) {
|
|
|
|
DS::shiftState = false;
|
|
|
|
for (int t = 0; t < DS_NUM_KEYS; t++) {
|
|
|
|
if (keys[t].character == DS_SHIFT) {
|
|
|
|
DS::setKeyHighlight(t, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
if (DS::getPenReleased()) {
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
for (int r = 0; r < DS_NUM_KEYS; r++) {
|
|
|
|
if (keys[r].pressed) {
|
|
|
|
DS::setKeyHighlight(r, false);
|
2007-12-21 18:36:40 +00:00
|
|
|
|
2008-01-28 00:14:17 +00:00
|
|
|
OSystem_DS* system = OSystem_DS::instance();
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-12-21 18:36:40 +00:00
|
|
|
Common::Event event;
|
|
|
|
createKeyEvent(r, event);
|
|
|
|
event.type = Common::EVENT_KEYUP;
|
|
|
|
system->addEvent(event);
|
|
|
|
|
2006-07-09 11:47:17 +00:00
|
|
|
keys[r].pressed = false;
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
}
|
2006-07-09 11:47:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|