aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/ds/arm9/source/touchkeyboard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/platform/ds/arm9/source/touchkeyboard.cpp')
-rw-r--r--backends/platform/ds/arm9/source/touchkeyboard.cpp626
1 files changed, 626 insertions, 0 deletions
diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp
new file mode 100644
index 0000000000..d3e8a61077
--- /dev/null
+++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp
@@ -0,0 +1,626 @@
+/* ScummVMDS - Scumm Interpreter DS Port
+ * Copyright (C) 2002-2004 The ScummVM project and Neil Millstone
+ *
+ * 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.
+ *
+ */
+#include <NDS.h>
+#include "touchkeyboard.h"
+#include "keyboard_raw.h"
+#include "keyboard_pal_raw.h"
+#include "dsmain.h"
+#include "osystem_ds.h"
+
+namespace DS {
+
+struct key_data {
+ char keyNum;
+ char x, y;
+ int character;
+ bool pressed;
+};
+
+#define DS_NUM_KEYS 60
+#define DS_SHIFT 0
+#define DS_BACKSPACE 8
+#define DS_RETURN 13
+#define DS_CAPSLOCK 1
+
+
+key_data keys[DS_NUM_KEYS] = {
+ // Key number x y character
+
+ // 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'},
+ {45, 23, 0, SDLK_MINUS},
+ {50, 25, 0, SDLK_EQUALS},
+ {52, 27, 0, SDLK_BACKSPACE},
+
+ // 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'},
+ {43, 24, 2, SDLK_LEFTBRACKET},
+ {44, 26, 2, SDLK_RIGHTBRACKET},
+
+ // 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'},
+ {42, 23, 4, SDLK_SEMICOLON},
+ {41, 25, 4, SDLK_QUOTE},
+ {46, 27, 4, SDLK_RETURN},
+
+ // 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'},
+ {38, 20, 6, SDLK_COMMA},
+ {39, 22, 6, SDLK_PERIOD},
+ {40, 24, 6, SDLK_SLASH},
+
+ // Space bar
+ {47, 9, 8, SDLK_SPACE},
+ {48, 11, 8, SDLK_SPACE},
+ {48, 13, 8, SDLK_SPACE},
+ {48, 15, 8, SDLK_SPACE},
+ {48, 17, 8, SDLK_SPACE},
+ {49, 19, 8, SDLK_SPACE},
+
+ // Cursor arrows
+ {52, 27, 8, SDLK_LEFT},
+ {54, 29, 8, SDLK_DOWN},
+ {53, 31, 8, SDLK_RIGHT},
+ {51, 29, 6, SDLK_UP},
+
+ // Close button
+ {56, 30, 0, SDLK_UNKNOWN},
+
+};
+
+int keyboardX;
+int keyboardY;
+
+int mapBase;
+int tileBase;
+
+bool shiftState;
+bool capsLockState;
+
+bool closed;
+
+void restoreVRAM(int tileBase, int mapBase, u16* saveSpace) {
+ for (int r = 0; r < 32 * 32; r++) {
+ ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = *saveSpace++;
+ }
+
+ for (int r = 0; r < 4096; r++) {
+ ((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r] = *saveSpace++;
+ }
+}
+
+void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) {
+
+
+ for (int r = 0; r < 32 * 32; r++) {
+// *saveSpace++ = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r];
+ ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = 127;
+ }
+
+ for (int r = 0; r < 4096; r++) {
+// *saveSpace++ = ((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r];
+ ((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r] = ((u16 *) (keyboard_raw))[r];
+ }
+
+ for (int r = 0; r < 16; r++) {
+ BG_PALETTE_SUB[r] = ((u16 *) (keyboard_pal_raw))[r];
+ }
+
+ for (int r = 0; r < 16; r++) {
+ int col = ((u16 *) (keyboard_pal_raw))[r];
+
+ int red = col & 0x001F;
+ int green = (col & 0x03E0) >> 5;
+ int blue = (col & 0x7C00) >> 10;
+
+ red = (red * 8) / 16;
+ green = (green * 8) / 16;
+ blue = (blue * 8) / 16;
+
+ BG_PALETTE_SUB[16 + r] = red | (green << 5) | (blue << 10);
+ }
+
+ keyboardX = -2;
+ keyboardY = 2;
+
+ mapBase = mapBase;
+ tileBase = tileBase;
+
+ shiftState = false;
+ capsLockState = false;
+
+ int x = keyboardX;
+ int y = keyboardY;
+
+ u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase));
+
+ for (int r = 0; r < DS_NUM_KEYS; r++) {
+ base[(y + keys[r].y) * 32 + x + keys[r].x] = keys[r].keyNum * 2;
+ base[(y + keys[r].y) * 32 + x + keys[r].x + 1] = keys[r].keyNum * 2 + 1;
+
+ base[(y + keys[r].y + 1) * 32 + x + keys[r].x] = 128 + keys[r].keyNum * 2;
+ base[(y + keys[r].y + 1) * 32 + x + keys[r].x + 1] = 128 + keys[r].keyNum * 2 + 1;
+
+ keys[r].pressed = false;
+ }
+
+ closed = false;
+}
+
+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;
+ }
+}
+
+void addKeyboardEvents() {
+ if (DS::getPenDown()) {
+ int x = IPC->touchXpx;
+ int y = IPC->touchYpx;
+
+ int tx = (x >> 3) - keyboardX;
+ int ty = (y >> 3) - keyboardY;
+
+// consolePrintf("x=%d y=%d\n", tx, ty);
+
+ for (int r = 0; r < DS_NUM_KEYS; r++) {
+ if (( (tx >= keys[r].x) && (tx <= keys[r].x + 1)) &&
+ (ty >= keys[r].y) && (ty <= keys[r].y + 1)) {
+ OSystem_DS* system = OSystem_DS::instance();
+ OSystem::Event event;
+
+// consolePrintf("Key: %d\n", r);
+ if ((keys[r].character == SDLK_UNKNOWN)) {
+ // Close button
+ DS::closed = true;
+ } else if ((keys[r].character >= '0') && (keys[r].character <= '9')) {
+ event.kbd.ascii = keys[r].character;
+ event.kbd.keycode = 0;
+
+ } else if ((keys[r].character >= 'A') && (keys[r].character <= 'Z')) {
+
+ if ((!DS::shiftState) && (!DS::capsLockState)) {
+ event.kbd.ascii = keys[r].character + 32; // Make key lowercase.
+ } else {
+ event.kbd.ascii = keys[r].character;
+ }
+
+ event.kbd.keycode = event.kbd.ascii;
+ } else {
+ event.kbd.ascii = keys[r].character;
+ event.kbd.keycode = keys[r].character;
+ }
+
+
+
+ //event.kbd.keycode = keys[r].character;
+ //event.kbd.ascii = keys[r].character;
+ event.type = OSystem::EVENT_KEYDOWN;
+ event.kbd.flags = 0;
+ system->addEvent(event);
+
+ event.type = OSystem::EVENT_KEYUP;
+ system->addEvent(event);
+
+ switch (keys[r].character) {
+ case DS_SHIFT: {
+ DS::shiftState = !DS::shiftState;
+ DS::setKeyHighlight(r, DS::shiftState);
+ break;
+ }
+
+ case DS_CAPSLOCK: {
+ DS::capsLockState = !DS::capsLockState;
+ DS::setKeyHighlight(r, DS::capsLockState);
+ break;
+ }
+
+ default: {
+ DS::setKeyHighlight(r, true);
+ keys[r].pressed = true;
+
+ 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;
+ }
+ }
+
+ }
+ }
+ }
+
+ if (DS::getPenReleased()) {
+ for (int r = 0; r < DS_NUM_KEYS; r++) {
+ if (keys[r].pressed) {
+ DS::setKeyHighlight(r, false);
+ keys[r].pressed = false;
+ }
+ }
+ }
+}
+
+}
+
+/* ScummVMDS - Scumm Interpreter DS Port
+ * Copyright (C) 2002-2004 The ScummVM project and Neil Millstone
+ *
+ * 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.
+ *
+ */
+#include <NDS.h>
+#include "touchkeyboard.h"
+#include "keyboard_raw.h"
+#include "keyboard_pal_raw.h"
+#include "dsmain.h"
+#include "osystem_ds.h"
+
+namespace DS {
+
+struct key_data {
+ char keyNum;
+ char x, y;
+ int character;
+ bool pressed;
+};
+
+#define DS_NUM_KEYS 60
+#define DS_SHIFT 0
+#define DS_BACKSPACE 8
+#define DS_RETURN 13
+#define DS_CAPSLOCK 1
+
+
+key_data keys[DS_NUM_KEYS] = {
+ // Key number x y character
+
+ // 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'},
+ {45, 23, 0, SDLK_MINUS},
+ {50, 25, 0, SDLK_EQUALS},
+ {52, 27, 0, SDLK_BACKSPACE},
+
+ // 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'},
+ {43, 24, 2, SDLK_LEFTBRACKET},
+ {44, 26, 2, SDLK_RIGHTBRACKET},
+
+ // 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'},
+ {42, 23, 4, SDLK_SEMICOLON},
+ {41, 25, 4, SDLK_QUOTE},
+ {46, 27, 4, SDLK_RETURN},
+
+ // 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'},
+ {38, 20, 6, SDLK_COMMA},
+ {39, 22, 6, SDLK_PERIOD},
+ {40, 24, 6, SDLK_SLASH},
+
+ // Space bar
+ {47, 9, 8, SDLK_SPACE},
+ {48, 11, 8, SDLK_SPACE},
+ {48, 13, 8, SDLK_SPACE},
+ {48, 15, 8, SDLK_SPACE},
+ {48, 17, 8, SDLK_SPACE},
+ {49, 19, 8, SDLK_SPACE},
+
+ // Cursor arrows
+ {52, 27, 8, SDLK_LEFT},
+ {54, 29, 8, SDLK_DOWN},
+ {53, 31, 8, SDLK_RIGHT},
+ {51, 29, 6, SDLK_UP},
+
+ // Close button
+ {56, 30, 0, SDLK_UNKNOWN},
+
+};
+
+int keyboardX;
+int keyboardY;
+
+int mapBase;
+int tileBase;
+
+bool shiftState;
+bool capsLockState;
+
+bool closed;
+
+void restoreVRAM(int tileBase, int mapBase, u16* saveSpace) {
+ for (int r = 0; r < 32 * 32; r++) {
+ ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = *saveSpace++;
+ }
+
+ for (int r = 0; r < 4096; r++) {
+ ((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r] = *saveSpace++;
+ }
+}
+
+void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) {
+
+
+ for (int r = 0; r < 32 * 32; r++) {
+// *saveSpace++ = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r];
+ ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = 127;
+ }
+
+ for (int r = 0; r < 4096; r++) {
+// *saveSpace++ = ((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r];
+ ((u16 *) CHAR_BASE_BLOCK_SUB(tileBase))[r] = ((u16 *) (keyboard_raw))[r];
+ }
+
+ for (int r = 0; r < 16; r++) {
+ BG_PALETTE_SUB[r] = ((u16 *) (keyboard_pal_raw))[r];
+ }
+
+ for (int r = 0; r < 16; r++) {
+ int col = ((u16 *) (keyboard_pal_raw))[r];
+
+ int red = col & 0x001F;
+ int green = (col & 0x03E0) >> 5;
+ int blue = (col & 0x7C00) >> 10;
+
+ red = (red * 8) / 16;
+ green = (green * 8) / 16;
+ blue = (blue * 8) / 16;
+
+ BG_PALETTE_SUB[16 + r] = red | (green << 5) | (blue << 10);
+ }
+
+ keyboardX = -2;
+ keyboardY = 2;
+
+ mapBase = mapBase;
+ tileBase = tileBase;
+
+ shiftState = false;
+ capsLockState = false;
+
+ int x = keyboardX;
+ int y = keyboardY;
+
+ u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase));
+
+ for (int r = 0; r < DS_NUM_KEYS; r++) {
+ base[(y + keys[r].y) * 32 + x + keys[r].x] = keys[r].keyNum * 2;
+ base[(y + keys[r].y) * 32 + x + keys[r].x + 1] = keys[r].keyNum * 2 + 1;
+
+ base[(y + keys[r].y + 1) * 32 + x + keys[r].x] = 128 + keys[r].keyNum * 2;
+ base[(y + keys[r].y + 1) * 32 + x + keys[r].x + 1] = 128 + keys[r].keyNum * 2 + 1;
+
+ keys[r].pressed = false;
+ }
+
+ closed = false;
+}
+
+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;
+ }
+}
+
+void addKeyboardEvents() {
+ if (DS::getPenDown()) {
+ int x = IPC->touchXpx;
+ int y = IPC->touchYpx;
+
+ int tx = (x >> 3) - keyboardX;
+ int ty = (y >> 3) - keyboardY;
+
+// consolePrintf("x=%d y=%d\n", tx, ty);
+
+ for (int r = 0; r < DS_NUM_KEYS; r++) {
+ if (( (tx >= keys[r].x) && (tx <= keys[r].x + 1)) &&
+ (ty >= keys[r].y) && (ty <= keys[r].y + 1)) {
+ OSystem_DS* system = OSystem_DS::instance();
+ OSystem::Event event;
+
+// consolePrintf("Key: %d\n", r);
+ if ((keys[r].character == SDLK_UNKNOWN)) {
+ // Close button
+ DS::closed = true;
+ } else if ((keys[r].character >= '0') && (keys[r].character <= '9')) {
+ event.kbd.ascii = keys[r].character;
+ event.kbd.keycode = 0;
+
+ } else if ((keys[r].character >= 'A') && (keys[r].character <= 'Z')) {
+
+ if ((!DS::shiftState) && (!DS::capsLockState)) {
+ event.kbd.ascii = keys[r].character + 32; // Make key lowercase.
+ } else {
+ event.kbd.ascii = keys[r].character;
+ }
+
+ event.kbd.keycode = event.kbd.ascii;
+ } else {
+ event.kbd.ascii = keys[r].character;
+ event.kbd.keycode = keys[r].character;
+ }
+
+
+
+ //event.kbd.keycode = keys[r].character;
+ //event.kbd.ascii = keys[r].character;
+ event.type = OSystem::EVENT_KEYDOWN;
+ event.kbd.flags = 0;
+ system->addEvent(event);
+
+ event.type = OSystem::EVENT_KEYUP;
+ system->addEvent(event);
+
+ switch (keys[r].character) {
+ case DS_SHIFT: {
+ DS::shiftState = !DS::shiftState;
+ DS::setKeyHighlight(r, DS::shiftState);
+ break;
+ }
+
+ case DS_CAPSLOCK: {
+ DS::capsLockState = !DS::capsLockState;
+ DS::setKeyHighlight(r, DS::capsLockState);
+ break;
+ }
+
+ default: {
+ DS::setKeyHighlight(r, true);
+ keys[r].pressed = true;
+
+ 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;
+ }
+ }
+
+ }
+ }
+ }
+
+ if (DS::getPenReleased()) {
+ for (int r = 0; r < DS_NUM_KEYS; r++) {
+ if (keys[r].pressed) {
+ DS::setKeyHighlight(r, false);
+ keys[r].pressed = false;
+ }
+ }
+ }
+}
+
+}
+