2009-10-01 01:10:58 +02:00
|
|
|
|
/****************************************************************************
|
|
|
|
|
* libwiigui
|
|
|
|
|
*
|
|
|
|
|
* Tantric 2009
|
|
|
|
|
*
|
|
|
|
|
* gui_keyboard.cpp
|
|
|
|
|
*
|
|
|
|
|
* GUI class definitions
|
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "gui.h"
|
|
|
|
|
#include "../main.h"
|
2010-09-19 22:25:12 +02:00
|
|
|
|
#include "../settings/CSettings.h"
|
2009-10-01 01:10:58 +02:00
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <string.h>
|
2011-01-08 13:35:41 +01:00
|
|
|
|
#include "themes/CTheme.h"
|
2010-11-13 23:34:53 +01:00
|
|
|
|
#include "menu.h"
|
2009-10-01 01:10:58 +02:00
|
|
|
|
/**
|
|
|
|
|
* Constructor for the GuiKeyboard class.
|
|
|
|
|
*/
|
|
|
|
|
//const Key thekeys;
|
2011-09-10 22:08:12 +02:00
|
|
|
|
GuiKeyboard::GuiKeyboard(char * t, u32 max, int minimum, int lang)
|
2010-02-09 11:59:55 +01:00
|
|
|
|
{
|
2011-07-26 00:28:22 +02:00
|
|
|
|
width = 540;
|
|
|
|
|
height = 400;
|
|
|
|
|
shift = 0;
|
|
|
|
|
caps = 0;
|
|
|
|
|
alt = 0;
|
|
|
|
|
alt2 = 0;
|
2011-09-10 22:08:12 +02:00
|
|
|
|
min = minimum;
|
2011-07-26 00:28:22 +02:00
|
|
|
|
int mode = lang;
|
2011-09-10 22:08:12 +02:00
|
|
|
|
textVisible = true;
|
2011-07-26 00:28:22 +02:00
|
|
|
|
selectable = true;
|
|
|
|
|
alignmentHor = ALIGN_CENTRE;
|
|
|
|
|
alignmentVert = ALIGN_MIDDLE;
|
|
|
|
|
kbtextmaxlen = max > sizeof(kbtextstr) ? sizeof(kbtextstr) : max; // limit max up to sizeof(kbtextstr)
|
2011-09-10 22:08:12 +02:00
|
|
|
|
memset(kbtextstr, 0, sizeof(kbtextstr));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
strncpy(kbtextstr, t, kbtextmaxlen); // strncpy is needed to fill the rest with \0
|
|
|
|
|
kbtextstr[sizeof(kbtextstr) - 1] = 0; // terminate with \0
|
|
|
|
|
//QWERTY//
|
|
|
|
|
if (mode == 0)
|
|
|
|
|
{
|
2011-09-10 22:08:12 +02:00
|
|
|
|
Key thekeys[4][11] = {
|
2011-02-06 19:36:32 +01:00
|
|
|
|
{
|
|
|
|
|
{ '1', '!', '\0', '\0' },
|
|
|
|
|
{ '2', '@', '\0', '\0' },
|
|
|
|
|
{ '3', '#', '\0', '\0' },
|
|
|
|
|
{ '4', '$', '\0', '\0' },
|
|
|
|
|
{ '5', '%', '\0', '\0' },
|
2011-09-10 22:08:12 +02:00
|
|
|
|
{ '6', '^', '\0', '\0' },
|
2011-02-06 19:36:32 +01:00
|
|
|
|
{ '7', '&', '\0', '\0' },
|
|
|
|
|
{ '8', '*', '\0', '\0' },
|
|
|
|
|
{ '9', '(', '\0', '\0' },
|
|
|
|
|
{ '0', ')', '\0', '\0' },
|
|
|
|
|
{ '\0', '\0', '\0', '\0' }
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
{ 'q', 'Q', '\0', '\0' },
|
2011-09-10 22:08:12 +02:00
|
|
|
|
{ 'w', 'W', '\0', '\0' },
|
|
|
|
|
{ 'e', 'E', '\0', '\0' },
|
|
|
|
|
{ 'r', 'R', '\0', '\0' },
|
|
|
|
|
{ 't', 'T', '\0', '\0' },
|
|
|
|
|
{ 'y', 'Y', '\0', '\0' },
|
|
|
|
|
{ 'u', 'U', '\0', '\0' },
|
|
|
|
|
{ 'i', 'I', '\0', '\0' },
|
|
|
|
|
{ 'o', 'O', '\0', '\0' },
|
|
|
|
|
{ 'p', 'P', '\0', '\0' },
|
|
|
|
|
{ '-', '_', '\0', '\0' }
|
|
|
|
|
},
|
2011-02-06 19:36:32 +01:00
|
|
|
|
{
|
2011-09-10 22:08:12 +02:00
|
|
|
|
{ 'a', 'A', '\0', '\0' },
|
|
|
|
|
{ 's', 'S', '\0', '\0' },
|
|
|
|
|
{ 'd', 'D', '\0', '\0' },
|
|
|
|
|
{ 'f', 'F', '\0', '\0' },
|
|
|
|
|
{ 'g', 'G', '\0', '\0' },
|
|
|
|
|
{ 'h', 'H', '\0', '\0' },
|
2011-02-06 19:36:32 +01:00
|
|
|
|
{ 'j', 'J', '\0', '\0' },
|
|
|
|
|
{ 'k', 'K', '\0', '\0' },
|
|
|
|
|
{ 'l', 'L', '\0', '\0' },
|
|
|
|
|
{ ':', ';', '\0', '\0' },
|
|
|
|
|
{ '\'', '"', '\0', '\0' }
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
{ 'z', 'Z', '\0', '\0' },
|
|
|
|
|
{ 'x', 'X', '\0', '\0' },
|
|
|
|
|
{ 'c', 'C', '\0', '\0' },
|
|
|
|
|
{ 'v', 'V', '\0', '\0' },
|
2011-09-10 22:08:12 +02:00
|
|
|
|
{ 'b', 'B', '\0', '\0' },
|
|
|
|
|
{ 'n', 'N', '\0', '\0' },
|
2011-02-06 19:36:32 +01:00
|
|
|
|
{ 'm', 'M', '\0', '\0' },
|
2011-09-10 22:08:12 +02:00
|
|
|
|
{ ',', '<', '\0', '\0' },
|
|
|
|
|
{ '.', '>', '\0', '\0' },
|
|
|
|
|
{ '/', '?', '\0', '\0' },
|
|
|
|
|
{ '\0', '\0', '\0', '\0' }
|
2011-02-06 19:36:32 +01:00
|
|
|
|
}
|
|
|
|
|
};
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
memcpy(keys, thekeys, sizeof(thekeys));
|
|
|
|
|
}
|
|
|
|
|
//DVORAK//
|
|
|
|
|
if (mode == 1)
|
|
|
|
|
{
|
2011-09-10 22:08:12 +02:00
|
|
|
|
Key thekeys[4][11] = {
|
2011-02-06 19:36:32 +01:00
|
|
|
|
{
|
2011-09-10 22:08:12 +02:00
|
|
|
|
{ '1', '!', '\0', '\0' },
|
|
|
|
|
{ '2', '@', '\0', '\0' },
|
|
|
|
|
{ '3', '#', '\0', '\0' },
|
|
|
|
|
{ '4', '$', '\0', '\0' },
|
|
|
|
|
{ '5', '%', '\0', '\0' },
|
|
|
|
|
{ '6', '^', '\0', '\0' },
|
|
|
|
|
{ '7', '&', '\0', '\0' },
|
|
|
|
|
{ '8', '*', '\0', '\0' },
|
|
|
|
|
{ '9', '(', '\0', '\0' },
|
|
|
|
|
{ '0', ')', '\0', '\0' },
|
|
|
|
|
{ '\0', '\0', '\0', '\0' }
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
{ '\'', '"', '\0', '\0' },
|
|
|
|
|
{ ',', '<', '\0', '\0' },
|
|
|
|
|
{ '.', '>', '\0', '\0' },
|
|
|
|
|
{ 'p', 'P', '\0', '\0' },
|
|
|
|
|
{ 'y', 'Y', '\0', '\0' },
|
|
|
|
|
{ 'f', 'F', '\0', '\0' },
|
|
|
|
|
{ 'g', 'G', '\0', '\0' },
|
|
|
|
|
{ 'c', 'C', '\0', '\0' },
|
|
|
|
|
{ 'r', 'R', '\0', '\0' },
|
|
|
|
|
{ 'l', 'L', '\0', '\0' },
|
|
|
|
|
{ '/', '?', '\0', '\0' }
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
{ 'a', 'A', 'm', '\0' },
|
|
|
|
|
{ 'o', 'O', 'm', '\0' },
|
|
|
|
|
{ 'e', 'E', 'm', '\0' },
|
|
|
|
|
{ 'u', 'U', 'm', '\0' },
|
|
|
|
|
{ 'i', 'I', 'm', '\0' },
|
|
|
|
|
{ 'd', 'D', 'm', '\0' },
|
|
|
|
|
{ 'h', 'H', 'm', '\0' },
|
|
|
|
|
{ 't', 'T', 'm', '\0' },
|
|
|
|
|
{ 'n', 'N', 'm', '\0' },
|
2011-02-06 19:36:32 +01:00
|
|
|
|
{ 's', 'S', 'm', '\0' },
|
2011-09-10 22:08:12 +02:00
|
|
|
|
{ '-', '_', 'm', '\0' }
|
2011-02-06 19:36:32 +01:00
|
|
|
|
},
|
2011-09-10 22:08:12 +02:00
|
|
|
|
{
|
|
|
|
|
{ ';', ':', '\0', '\0' },
|
|
|
|
|
{ 'q', 'Q', '\0', '\0' },
|
|
|
|
|
{ 'j', 'J', '\0', '\0' },
|
|
|
|
|
{ 'k', 'K', '\0', '\0' },
|
|
|
|
|
{ 'x', 'X', '\0', '\0' },
|
|
|
|
|
{ 'b', 'B', '\0', '\0' },
|
|
|
|
|
{ 'm', 'M', '\0', '\0' },
|
|
|
|
|
{ 'w', 'W', '\0', '\0' },
|
|
|
|
|
{ 'v', 'V', '\0', '\0' },
|
|
|
|
|
{ 'z', 'Z', '\0', '\0' },
|
|
|
|
|
{ '\0', '\0', '\0', '\0' }
|
2011-02-06 19:36:32 +01:00
|
|
|
|
}
|
|
|
|
|
};
|
2011-07-26 00:28:22 +02:00
|
|
|
|
memcpy(keys, thekeys, sizeof(thekeys));
|
|
|
|
|
}
|
|
|
|
|
//QWETRZ//
|
|
|
|
|
if (mode == 2)
|
|
|
|
|
{
|
|
|
|
|
Key thekeys[4][11] = { { { '1', '!', '^', '<EFBFBD>' }, { '2', '"', '<EFBFBD>', '<EFBFBD>' }, { '3', '#', '<EFBFBD>', '<EFBFBD>' }, { '4', '$',
|
|
|
|
|
'<EFBFBD>', '<EFBFBD>' }, { '5', '%', '<EFBFBD>', '<EFBFBD>' }, { '6', '&', '<EFBFBD>', '<EFBFBD>' }, { '7', '/', '<EFBFBD>', '<EFBFBD>' }, { '8', '(', '[',
|
|
|
|
|
'<EFBFBD>' }, { '9', ')', ']', '<EFBFBD>' }, { '0', '=', '<EFBFBD>', '<EFBFBD>' }, { '<EFBFBD>', '?', '\'', '<EFBFBD>' } }, { { 'q', 'Q', '@',
|
|
|
|
|
'<EFBFBD>' }, { 'w', 'W', '\0', '<EFBFBD>' }, { 'e', 'E', '<EFBFBD>', '<EFBFBD>' }, { 'r', 'R', '\0', '<EFBFBD>' },
|
|
|
|
|
{ 't', 'T', '\0', '<EFBFBD>' }, { 'z', 'Z', '\0', '<EFBFBD>' }, { 'u', 'U', '\0', '<EFBFBD>' }, { 'i', 'I', '\0', '<EFBFBD>' }, {
|
|
|
|
|
'o', 'O', '\0', '<EFBFBD>' }, { 'p', 'P', '\0', '<EFBFBD>' }, { '<EFBFBD>', '<EFBFBD>', '\0', '<EFBFBD>' } }, { { 'a', 'A', '\0',
|
|
|
|
|
'<EFBFBD>' }, { 's', 'S', '\0', '<EFBFBD>' }, { 'd', 'D', '\0', '<EFBFBD>' }, { 'f', 'F', '\0', '<EFBFBD>' },
|
|
|
|
|
{ 'g', 'G', '\0', '<EFBFBD>' }, { 'h', 'H', '\0', '<EFBFBD>' }, { 'j', 'J', '\0', '<EFBFBD>' }, { 'k', 'K', '\0', '<EFBFBD>' }, {
|
|
|
|
|
'l', 'L', '\0', '<EFBFBD>' }, { '<EFBFBD>', '<EFBFBD>', '\0', '<EFBFBD>' }, { '<EFBFBD>', '<EFBFBD>', '\0', '<EFBFBD>' } }, { { '<', '>', '|',
|
|
|
|
|
'<EFBFBD>' }, { 'y', 'Y', '\0', '<EFBFBD>' }, { 'x', 'X', '\0', '<EFBFBD>' }, { 'c', 'C', '<EFBFBD>', '<EFBFBD>' },
|
|
|
|
|
{ 'v', 'V', '<EFBFBD>', '<EFBFBD>' }, { 'b', 'B', '\0', '<EFBFBD>' }, { 'n', 'N', '\0', '<EFBFBD>' }, { 'm', 'M', '<EFBFBD>', '<EFBFBD>' }, {
|
|
|
|
|
',', ';', '\0', '<EFBFBD>' }, { '.', ':', '\0', '\0' }, { '-', '_', '\0', '\0' } } };
|
|
|
|
|
memcpy(keys, thekeys, sizeof(thekeys));
|
|
|
|
|
}
|
|
|
|
|
//AZERTY//
|
|
|
|
|
if (mode == 3)
|
|
|
|
|
{
|
|
|
|
|
Key thekeys[4][11] = { { { '1', '&', '<EFBFBD>', '<EFBFBD>' }, { '2', '~', '<EFBFBD>', '<EFBFBD>' }, { '3', '"', '#', '<EFBFBD>' }, { '4', '`',
|
|
|
|
|
'<EFBFBD>', '<EFBFBD>' }, { '5', '(', '[', '<EFBFBD>' }, { '6', '-', '|', '<EFBFBD>' }, { '7', '<EFBFBD>', '<EFBFBD>', '<EFBFBD>' }, { '8', '_', '\'',
|
|
|
|
|
'<EFBFBD>' }, { '9', '+', '^', '<EFBFBD>' }, { '0', '=', '@', '<EFBFBD>' }, { '<EFBFBD>', ')', ']', '<EFBFBD>' } }, {
|
|
|
|
|
{ 'a', 'A', '<EFBFBD>', '<EFBFBD>' }, { 'z', 'Z', '<EFBFBD>', '<EFBFBD>' }, { 'e', 'E', '<EFBFBD>', '<EFBFBD>' }, { 'r', 'R', '<EFBFBD>', '<EFBFBD>' }, { 't',
|
|
|
|
|
'T', '<EFBFBD>', '<EFBFBD>' }, { 'y', 'Y', '<EFBFBD>', '<EFBFBD>' }, { 'u', 'U', '<EFBFBD>', '<EFBFBD>' }, { 'i', 'I', '<EFBFBD>', '<EFBFBD>' }, { 'o',
|
|
|
|
|
'O', '<EFBFBD>', '<EFBFBD>' }, { 'p', 'P', '<EFBFBD>', '<EFBFBD>' }, { '$', '<EFBFBD>', '<EFBFBD>', '<EFBFBD>' } }, { { 'q', 'Q', '<EFBFBD>', '<EFBFBD>' }, {
|
|
|
|
|
's', 'S', '<EFBFBD>', '<EFBFBD>' }, { 'd', 'D', '\0', '<EFBFBD>' }, { 'f', 'F', '<EFBFBD>', '<EFBFBD>' }, { 'g', 'G', '\0', '<EFBFBD>' }, { 'h',
|
|
|
|
|
'H', '\0', '<EFBFBD>' }, { 'j', 'J', '\0', '<EFBFBD>' }, { 'k', 'K', '\0', '<EFBFBD>' }, { 'l', 'L', '\0', '<EFBFBD>' }, { 'm',
|
|
|
|
|
'M', '\0', '<EFBFBD>' }, { '*', '%', '<EFBFBD>', '<EFBFBD>' } }, { { '<', '>', '\0', '<EFBFBD>' }, { 'w', 'W', '\0', '<EFBFBD>' }, { 'x',
|
|
|
|
|
'X', '\0', '<EFBFBD>' }, { 'c', 'C', '<EFBFBD>', '<EFBFBD>' }, { 'v', 'V', '<EFBFBD>', '<EFBFBD>' }, { 'b', 'B', '<EFBFBD>', '<EFBFBD>' }, { 'n', 'N',
|
|
|
|
|
'\0', '<EFBFBD>' }, { '?', ',', '?', '<EFBFBD>' }, { '.', ';', '.', '<EFBFBD>' }, { '/', ':', '/', '<EFBFBD>' }, { '<EFBFBD>', '!', '!',
|
|
|
|
|
'<EFBFBD>' } } };
|
|
|
|
|
memcpy(keys, thekeys, sizeof(thekeys));
|
|
|
|
|
}
|
|
|
|
|
//QWERTY 2//
|
|
|
|
|
if (mode == 4)
|
|
|
|
|
{
|
|
|
|
|
Key thekeys[4][11] = { { { '1', '!', '|', '<EFBFBD>' }, { '2', '"', '@', '<EFBFBD>' }, { '3', '<EFBFBD>', '#', '<EFBFBD>' }, { '4', '$',
|
|
|
|
|
'<EFBFBD>', '<EFBFBD>' }, { '5', '%', '~', '<EFBFBD>' }, { '6', '&', '<EFBFBD>', '<EFBFBD>' }, { '7', '/', '\'', '<EFBFBD>' }, { '8', '(', '[',
|
|
|
|
|
'<EFBFBD>' }, { '9', ')', ']', '<EFBFBD>' }, { '0', '=', '<EFBFBD>', '<EFBFBD>' }, { '<EFBFBD>', '?', '<EFBFBD>', '<EFBFBD>' } }, { { 'q', 'Q', '\0',
|
|
|
|
|
'<EFBFBD>' }, { 'w', 'W', '\0', '<EFBFBD>' }, { 'e', 'E', '<EFBFBD>', '<EFBFBD>' }, { 'r', 'R', '<EFBFBD>', '<EFBFBD>' }, { 't', 'T', '<EFBFBD>', '<EFBFBD>' },
|
|
|
|
|
{ 'y', 'Y', '<EFBFBD>', '<EFBFBD>' }, { 'u', 'U', '<EFBFBD>', '<EFBFBD>' }, { 'i', 'I', '<EFBFBD>', '<EFBFBD>' }, { 'o', 'O', '<EFBFBD>', '<EFBFBD>' }, { 'p',
|
|
|
|
|
'P', '<EFBFBD>', '<EFBFBD>' }, { '+', '*', '\0', '<EFBFBD>' } }, { { 'a', 'A', '^', '<EFBFBD>' }, { 's', 'S', '<EFBFBD>', '<EFBFBD>' }, {
|
|
|
|
|
'd', 'D', '<EFBFBD>', '<EFBFBD>' }, { 'f', 'F', '<EFBFBD>', '<EFBFBD>' }, { 'g', 'G', '<EFBFBD>', '<EFBFBD>' }, { 'h', 'H', '<EFBFBD>', '<EFBFBD>' }, { 'j',
|
|
|
|
|
'J', '<EFBFBD>', '<EFBFBD>' }, { 'k', 'K', '<EFBFBD>', '<EFBFBD>' }, { 'l', 'L', '<EFBFBD>', '\0' }, { '<EFBFBD>', '<EFBFBD>', '+', '\0' }, { '<EFBFBD>', '<EFBFBD>',
|
|
|
|
|
'<EFBFBD>', '\0' } }, { { '<', '>', '\0', '<EFBFBD>' }, { 'z', 'Z', '\0', '<EFBFBD>' }, { 'x', 'X', '\0', '<EFBFBD>' }, { 'c', 'C',
|
|
|
|
|
'<EFBFBD>', '<EFBFBD>' }, { 'v', 'V', '\0', '<EFBFBD>' }, { 'b', 'B', '<EFBFBD>', '<EFBFBD>' }, { 'n', 'N', '\0', '<EFBFBD>' }, { 'm', 'M', '\0',
|
|
|
|
|
'<EFBFBD>' }, { ',', ';', '\0', '<EFBFBD>' }, { '.', ':', '\0', '\0' }, { '-', '_', '\0', '\0' } } };
|
|
|
|
|
memcpy(keys, thekeys, sizeof(thekeys));
|
|
|
|
|
}
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyTextbox = Resources::GetImageData("keyboard_textbox.png");
|
|
|
|
|
keyTextboxImg = new GuiImage(keyTextbox);
|
|
|
|
|
keyTextboxImg->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
|
|
|
keyTextboxImg->SetPosition(0, 40);//(0,0);
|
|
|
|
|
this->Append(keyTextboxImg);
|
2010-09-24 02:48:03 +02:00
|
|
|
|
|
2012-01-08 19:24:46 +01:00
|
|
|
|
kbText = new GuiText(kbtextstr, 20, thColor("r=0 g=0 b=0 a=255 - keyboard text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
kbText->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
|
|
|
kbText->SetPosition(0, 53);//(0, 13);
|
|
|
|
|
this->Append(kbText);
|
2010-09-24 02:48:03 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
key = Resources::GetImageData("keyboard_key.png");
|
|
|
|
|
keyOver = Resources::GetImageData("keyboard_key_over.png");
|
|
|
|
|
keyMedium = Resources::GetImageData("keyboard_mediumkey_over.png");
|
|
|
|
|
keyLarge = Resources::GetImageData("keyboard_largekey_over.png");
|
2010-09-24 02:48:03 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
trigA = new GuiTrigger;
|
|
|
|
|
trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
|
|
|
trigB = new GuiTrigger;
|
|
|
|
|
trigB->SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
2009-10-01 01:10:58 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
int eurocheck = 0;
|
|
|
|
|
if (mode > 1)
|
|
|
|
|
{
|
|
|
|
|
eurocheck = -20;
|
|
|
|
|
}
|
2009-10-01 01:10:58 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyBackImg = new GuiImage(keyMedium);
|
|
|
|
|
keyBackOverImg = new GuiImage(keyMedium);
|
|
|
|
|
if (mode == 3)
|
|
|
|
|
{
|
2012-01-08 19:24:46 +01:00
|
|
|
|
keyBackText = new GuiText("Retour", 20, thColor("r=0 g=0 b=0 a=255 - keyboard key text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2012-01-08 19:24:46 +01:00
|
|
|
|
keyBackText = new GuiText("Back", 20, thColor("r=0 g=0 b=0 a=255 - keyboard key text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
}
|
|
|
|
|
//keyBack = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
|
|
|
|
|
keyBack = new GuiButton(keyBackImg, keyBackOverImg, 0, 3, 11 * 42 + 40 + eurocheck, 0 * 42 + 120, trigA,
|
|
|
|
|
btnSoundOver, btnSoundClick, 1);
|
|
|
|
|
//keyBack->SetImage(keyBackImg);
|
|
|
|
|
//keyBack->SetImageOver(keyBackOverImg);
|
|
|
|
|
keyBack->SetLabel(keyBackText);
|
|
|
|
|
//keyBack->SetSoundOver(btnSoundOver);
|
|
|
|
|
//keyBack->SetSoundClick(btnSoundClick);
|
|
|
|
|
//keyBack->SetTrigger(trigA);
|
|
|
|
|
keyBack->SetTrigger(trigB);
|
|
|
|
|
if (mode > 1)
|
|
|
|
|
{
|
|
|
|
|
keyBack->SetPosition(11 * 42 + 40 + eurocheck, 0 * 42 + 120);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
keyBack->SetPosition(10 * 42 + 40 + eurocheck, 0 * 42 + 120);
|
|
|
|
|
}//(10*42+40, 0*42+80);
|
|
|
|
|
//keyBack->SetEffectGrow();
|
|
|
|
|
this->Append(keyBack);
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyClearImg = new GuiImage(keyMedium);
|
|
|
|
|
keyClearOverImg = new GuiImage(keyMedium);
|
|
|
|
|
if (mode == 3)
|
|
|
|
|
{
|
2012-01-08 19:24:46 +01:00
|
|
|
|
keyClearText = new GuiText("Effacer", 20, thColor("r=0 g=0 b=0 a=255 - keyboard key text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2012-01-08 19:24:46 +01:00
|
|
|
|
keyClearText = new GuiText("Clear", 20, thColor("r=0 g=0 b=0 a=255 - keyboard key text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
}
|
|
|
|
|
keyClear = new GuiButton(keyClearImg, keyClearOverImg, 0, 3, (10 * 42 + 40) + eurocheck, 4 * 42 + 120, trigA,
|
|
|
|
|
btnSoundOver, btnSoundClick, 1);
|
|
|
|
|
//keyClear = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
|
|
|
|
|
//keyClear->SetImage(keyClearImg);
|
|
|
|
|
//keyClear->SetImageOver(keyClearOverImg);
|
|
|
|
|
keyClear->SetLabel(keyClearText);
|
|
|
|
|
//keyClear->SetSoundOver(btnSoundOver);
|
|
|
|
|
//keyClear->SetSoundClick(btnSoundClick);
|
|
|
|
|
//keyClear->SetTrigger(trigA);
|
|
|
|
|
//keyClear->SetPosition((10*42+40)+eurocheck, 4*42+120);//(10*42+40, 0*42+80);
|
|
|
|
|
//keyClear->SetEffectGrow();
|
|
|
|
|
this->Append(keyClear);
|
2010-09-24 02:48:03 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyAltImg = new GuiImage(keyMedium);
|
|
|
|
|
keyAltOverImg = new GuiImage(keyMedium);
|
2012-01-08 19:24:46 +01:00
|
|
|
|
keyAltText = new GuiText("Alt Gr", 20, thColor("r=0 g=0 b=0 a=255 - keyboard key text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyAlt = new GuiButton(keyAltImg, keyAltOverImg, 0, 3, 84 + eurocheck, 4 * 42 + 120, trigA, btnSoundOver,
|
|
|
|
|
btnSoundClick, 1);
|
|
|
|
|
//keyAlt = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
|
|
|
|
|
//keyAlt->SetImage(keyAltImg);
|
|
|
|
|
//keyAlt->SetImageOver(keyAltOverImg);
|
|
|
|
|
keyAlt->SetLabel(keyAltText);
|
|
|
|
|
//keyAlt->SetSoundOver(btnSoundOver);
|
|
|
|
|
//keyAlt->SetSoundClick(btnSoundClick);
|
|
|
|
|
//keyAlt->SetTrigger(trigA);
|
|
|
|
|
//keyAlt->SetPosition(84+eurocheck, 4*42+120);//(10*42+40, 4*42+120);
|
|
|
|
|
//keyAlt->SetEffectGrow();
|
|
|
|
|
if (mode > 1)
|
|
|
|
|
{
|
|
|
|
|
this->Append(keyAlt);
|
|
|
|
|
}
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyAlt2Img = new GuiImage(keyMedium);
|
|
|
|
|
keyAlt2OverImg = new GuiImage(keyMedium);
|
2012-01-08 19:24:46 +01:00
|
|
|
|
keyAlt2Text = new GuiText("Accent", 20, thColor("r=0 g=0 b=0 a=255 - keyboard key text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyAlt2 = new GuiButton(keyAlt2Img, keyAlt2OverImg, 0, 3, (8 * 42 + 40) + eurocheck, 4 * 42 + 120, trigA,
|
|
|
|
|
btnSoundOver, btnSoundClick, 1);
|
|
|
|
|
//keyAlt2 = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
|
|
|
|
|
//keyAlt2->SetImage(keyAlt2Img);
|
|
|
|
|
//keyAlt2->SetImageOver(keyAlt2OverImg);
|
|
|
|
|
keyAlt2->SetLabel(keyAlt2Text);
|
|
|
|
|
//keyAlt2->SetSoundOver(btnSoundOver);
|
|
|
|
|
//keyAlt2->SetSoundClick(btnSoundClick);
|
|
|
|
|
//keyAlt2->SetTrigger(trigA);
|
|
|
|
|
//keyAlt2->SetPosition((8*42+40)+eurocheck, 4*42+120);//(10*42+40, 4*42+120);
|
|
|
|
|
//keyAlt2->SetEffectGrow();
|
|
|
|
|
if (mode > 1)
|
|
|
|
|
{
|
|
|
|
|
this->Append(keyAlt2);
|
|
|
|
|
}
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyCapsImg = new GuiImage(keyMedium);
|
|
|
|
|
keyCapsOverImg = new GuiImage(keyMedium);
|
2012-01-08 19:24:46 +01:00
|
|
|
|
keyCapsText = new GuiText("Caps", 20, thColor("r=0 g=0 b=0 a=255 - keyboard key text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyCaps = new GuiButton(keyCapsImg, keyCapsOverImg, 0, 3, 0 + eurocheck, 2 * 42 + 120, trigA, btnSoundOver,
|
|
|
|
|
btnSoundClick, 1);
|
|
|
|
|
//keyCaps = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
|
|
|
|
|
//keyCaps->SetImage(keyCapsImg);
|
|
|
|
|
//keyCaps->SetImageOver(keyCapsOverImg);
|
|
|
|
|
keyCaps->SetLabel(keyCapsText);
|
|
|
|
|
//keyCaps->SetSoundOver(btnSoundOver);
|
|
|
|
|
//keyCaps->SetSoundClick(btnSoundClick);
|
|
|
|
|
//keyCaps->SetTrigger(trigA);
|
|
|
|
|
//keyCaps->SetPosition(0+eurocheck, 2*42+120);//(0, 2*42+80);
|
|
|
|
|
//keyCaps->SetEffectGrow();
|
|
|
|
|
this->Append(keyCaps);
|
2010-09-24 02:48:03 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyShiftImg = new GuiImage(keyMedium);
|
|
|
|
|
keyShiftOverImg = new GuiImage(keyMedium);
|
2012-01-08 19:24:46 +01:00
|
|
|
|
keyShiftText = new GuiText("Shift", 20, thColor("r=0 g=0 b=0 a=255 - keyboard key text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyShift = new GuiButton(keyShiftImg, keyShiftOverImg, 0, 3, 21 + eurocheck, 3 * 42 + 120, trigA, btnSoundOver,
|
|
|
|
|
btnSoundClick, 1);
|
|
|
|
|
//keyShift = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
|
|
|
|
|
//keyShift->SetImage(keyShiftImg);
|
|
|
|
|
//keyShift->SetImageOver(keyShiftOverImg);
|
|
|
|
|
keyShift->SetLabel(keyShiftText);
|
|
|
|
|
//keyShift->SetSoundOver(btnSoundOver);
|
|
|
|
|
//keyShift->SetSoundClick(btnSoundClick);
|
|
|
|
|
//keyShift->SetTrigger(trigA);
|
|
|
|
|
//keyShift->SetPosition(21+eurocheck, 3*42+120);//(21, 3*42+80);
|
|
|
|
|
//keyShift->SetEffectGrow();
|
|
|
|
|
this->Append(keyShift);
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keySpaceImg = new GuiImage(keyLarge);
|
|
|
|
|
keySpaceOverImg = new GuiImage(keyLarge);
|
|
|
|
|
keySpace = new GuiButton(keySpaceImg, keySpaceOverImg, 2, 3, 0 + eurocheck, 4 * 42 + 120, trigA, btnSoundOver,
|
|
|
|
|
btnSoundClick, 1);
|
|
|
|
|
//keySpace = new GuiButton(keyLarge->GetWidth(), keyLarge->GetHeight());
|
|
|
|
|
//keySpace->SetImage(keySpaceImg);
|
|
|
|
|
//keySpace->SetImageOver(keySpaceOverImg);
|
|
|
|
|
//keySpace->SetSoundOver(btnSoundOver);
|
|
|
|
|
//keySpace->SetSoundClick(btnSoundClick);
|
|
|
|
|
//keySpace->SetTrigger(trigA);
|
|
|
|
|
//keySpace->SetPosition(0+eurocheck, 4*42+120);//(0, 4*42+80);
|
|
|
|
|
//keySpace->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
|
|
|
//keySpace->SetEffectGrow();
|
|
|
|
|
this->Append(keySpace);
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
char txt[2] = { 0, 0 };
|
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
|
|
|
{
|
|
|
|
|
for (int j = 0; j < 11; j++)
|
|
|
|
|
{
|
|
|
|
|
if (keys[i][j].ch != '\0')
|
|
|
|
|
{
|
|
|
|
|
keyImg[i][j] = new GuiImage(key);
|
|
|
|
|
keyImgOver[i][j] = new GuiImage(keyOver);
|
|
|
|
|
txt[0] = keys[i][j].ch;
|
2012-01-08 19:24:46 +01:00
|
|
|
|
keyTxt[i][j] = new GuiText(txt, 20, thColor("r=0 g=0 b=0 a=255 - keyboard key text color"));
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyTxt[i][j]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
|
|
|
keyTxt[i][j]->SetPosition(0, -10);
|
|
|
|
|
keyBtn[i][j] = new GuiButton(keyImg[i][j], keyImgOver[i][j], 0, 3, (j * 42 + 21 * i + 40) + eurocheck,
|
|
|
|
|
i * 42 + 120, trigA, btnSoundOver, btnSoundClick, 1);
|
|
|
|
|
//keyBtn[i][j] = new GuiButton(key->GetWidth(), key->GetHeight());
|
|
|
|
|
//keyBtn[i][j]->SetImage(keyImg[i][j]);
|
|
|
|
|
//keyBtn[i][j]->SetImageOver(keyImgOver[i][j]);
|
|
|
|
|
//keyBtn[i][j]->SetSoundOver(btnSoundOver);
|
|
|
|
|
//keyBtn[i][j]->SetSoundClick(btnSoundClick);
|
|
|
|
|
//keyBtn[i][j]->SetTrigger(trigA);
|
|
|
|
|
keyBtn[i][j]->SetLabel(keyTxt[i][j]);
|
|
|
|
|
//keyBtn[i][j]->SetPosition((j*42+21*i+40)+eurocheck, i*42+120);//SetPosition(j*42+21*i+40, i*42+80);
|
|
|
|
|
//keyBtn[i][j]->SetEffectGrow();
|
|
|
|
|
this->Append(keyBtn[i][j]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-10-01 01:10:58 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Destructor for the GuiKeyboard class.
|
|
|
|
|
*/
|
2010-02-09 11:59:55 +01:00
|
|
|
|
GuiKeyboard::~GuiKeyboard()
|
|
|
|
|
{
|
2011-07-26 00:28:22 +02:00
|
|
|
|
delete kbText;
|
|
|
|
|
delete keyTextbox;
|
|
|
|
|
delete keyTextboxImg;
|
|
|
|
|
delete keyCapsText;
|
|
|
|
|
delete keyCapsImg;
|
|
|
|
|
delete keyCapsOverImg;
|
|
|
|
|
delete keyCaps;
|
|
|
|
|
delete keyShiftText;
|
|
|
|
|
delete keyShiftImg;
|
|
|
|
|
delete keyShiftOverImg;
|
|
|
|
|
delete keyShift;
|
|
|
|
|
if (keyAlt)
|
|
|
|
|
{
|
|
|
|
|
delete keyAlt;
|
|
|
|
|
}
|
|
|
|
|
if (keyAlt2)
|
|
|
|
|
{
|
|
|
|
|
delete keyAlt2;
|
|
|
|
|
}
|
|
|
|
|
delete keyBackText;
|
|
|
|
|
delete keyBackImg;
|
|
|
|
|
delete keyBackOverImg;
|
|
|
|
|
delete keyBack;
|
|
|
|
|
delete keySpaceImg;
|
|
|
|
|
delete keySpaceOverImg;
|
|
|
|
|
delete keySpace;
|
|
|
|
|
delete key;
|
|
|
|
|
delete keyOver;
|
|
|
|
|
delete keyMedium;
|
|
|
|
|
delete keyLarge;
|
|
|
|
|
delete trigA;
|
|
|
|
|
delete trigB;
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
|
|
|
{
|
|
|
|
|
for (int j = 0; j < 11; j++)
|
|
|
|
|
{
|
|
|
|
|
if (keys[i][j].ch != '\0')
|
|
|
|
|
{
|
|
|
|
|
delete keyImg[i][j];
|
|
|
|
|
delete keyImgOver[i][j];
|
|
|
|
|
delete keyTxt[i][j];
|
|
|
|
|
delete keyBtn[i][j];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-10-01 01:10:58 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-09-10 22:08:12 +02:00
|
|
|
|
void GuiKeyboard::SetDisplayText(const char *text)
|
|
|
|
|
{
|
|
|
|
|
if(!text || textVisible)
|
|
|
|
|
{
|
|
|
|
|
kbText->SetText(text);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
std::string asterix(strlen(text), '*');
|
|
|
|
|
kbText->SetText(asterix.c_str());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
|
void GuiKeyboard::Update(GuiTrigger * t)
|
2010-02-09 11:59:55 +01:00
|
|
|
|
{
|
2011-07-26 00:28:22 +02:00
|
|
|
|
LOCK( this );
|
|
|
|
|
if (_elements.size() == 0 || (state == STATE_DISABLED && parentElement)) return;
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
for (u8 i = 0; i < _elements.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_elements.at(i)->Update(t);
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
bool changedShiftKey = false;
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
if (keySpace->GetState() == STATE_CLICKED)
|
|
|
|
|
{
|
|
|
|
|
if (strlen(kbtextstr) < kbtextmaxlen - 1) // -1 --> kbtextmaxlen means with terminating '\0'
|
|
|
|
|
{
|
|
|
|
|
kbtextstr[strlen(kbtextstr)] = ' ';
|
2011-09-10 22:08:12 +02:00
|
|
|
|
SetDisplayText(kbtextstr);
|
2011-07-26 00:28:22 +02:00
|
|
|
|
}
|
|
|
|
|
keySpace->SetState(STATE_SELECTED, t->chan);
|
|
|
|
|
}
|
|
|
|
|
else if (keyBack->GetState() == STATE_CLICKED)
|
|
|
|
|
{
|
2011-09-10 22:08:12 +02:00
|
|
|
|
if (strlen(kbtextstr) > min)
|
2011-07-26 00:28:22 +02:00
|
|
|
|
{
|
|
|
|
|
kbtextstr[strlen(kbtextstr) - 1] = 0;
|
2011-09-10 22:08:12 +02:00
|
|
|
|
SetDisplayText(kbtextstr);
|
2011-07-26 00:28:22 +02:00
|
|
|
|
}
|
|
|
|
|
keyBack->SetState(STATE_SELECTED, t->chan);
|
|
|
|
|
}
|
|
|
|
|
else if (keyClear->GetState() == STATE_CLICKED)
|
|
|
|
|
{
|
2011-09-10 22:08:12 +02:00
|
|
|
|
while (strlen(kbtextstr) > min)
|
2011-07-26 00:28:22 +02:00
|
|
|
|
{
|
|
|
|
|
kbtextstr[strlen(kbtextstr) - 1] = 0;
|
|
|
|
|
}
|
2011-09-10 22:08:12 +02:00
|
|
|
|
SetDisplayText(kbtextstr);
|
2011-07-26 00:28:22 +02:00
|
|
|
|
keyClear->SetState(STATE_SELECTED, t->chan);
|
|
|
|
|
}
|
|
|
|
|
else if (keyShift->GetState() == STATE_CLICKED)
|
|
|
|
|
{
|
|
|
|
|
changedShiftKey = true;
|
|
|
|
|
shift ^= 1;
|
|
|
|
|
if (alt) alt ^= 1;
|
|
|
|
|
if (alt2) alt2 ^= 1;
|
|
|
|
|
keyShift->SetState(STATE_SELECTED, t->chan);
|
|
|
|
|
}
|
|
|
|
|
else if (keyAlt->GetState() == STATE_CLICKED)
|
|
|
|
|
{
|
|
|
|
|
changedShiftKey = true;
|
|
|
|
|
alt ^= 1;
|
|
|
|
|
if (shift) shift ^= 1;
|
|
|
|
|
if (alt2) alt2 ^= 1;
|
|
|
|
|
keyAlt->SetState(STATE_SELECTED, t->chan);
|
|
|
|
|
}
|
|
|
|
|
else if (keyAlt2->GetState() == STATE_CLICKED)
|
|
|
|
|
{
|
|
|
|
|
changedShiftKey = true;
|
|
|
|
|
alt2 ^= 1;
|
|
|
|
|
if (shift) shift ^= 1;
|
|
|
|
|
if (alt) alt ^= 1;
|
|
|
|
|
keyAlt2->SetState(STATE_SELECTED, t->chan);
|
|
|
|
|
}
|
|
|
|
|
else if (keyCaps->GetState() == STATE_CLICKED)
|
|
|
|
|
{
|
|
|
|
|
changedShiftKey = true;
|
|
|
|
|
caps ^= 1;
|
|
|
|
|
keyCaps->SetState(STATE_SELECTED, t->chan);
|
|
|
|
|
}
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
bool update = false;
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
char txt[2] = { 0, 0 };
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
update = false;
|
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
|
|
|
{
|
|
|
|
|
for (int j = 0; j < 11; j++)
|
|
|
|
|
{
|
|
|
|
|
if (keys[i][j].ch != '\0')
|
|
|
|
|
{
|
|
|
|
|
if (shift || caps)
|
|
|
|
|
txt[0] = keys[i][j].chShift;
|
|
|
|
|
else if (alt)
|
|
|
|
|
txt[0] = keys[i][j].chalt;
|
|
|
|
|
else if (alt2)
|
|
|
|
|
txt[0] = keys[i][j].chalt2;
|
|
|
|
|
else txt[0] = keys[i][j].ch;
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
if (changedShiftKey) // change text only if needed
|
|
|
|
|
keyTxt[i][j]->SetText(txt);
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
if (keyBtn[i][j]->GetState() == STATE_CLICKED)
|
|
|
|
|
{
|
|
|
|
|
if (strlen(kbtextstr) < kbtextmaxlen - 1) // -1 --> kbtextmaxlen means with term. '\0'
|
|
|
|
|
{
|
|
|
|
|
kbtextstr[strlen(kbtextstr)] = txt[0];
|
2011-09-10 22:08:12 +02:00
|
|
|
|
SetDisplayText(kbtextstr);
|
2011-07-26 00:28:22 +02:00
|
|
|
|
}
|
|
|
|
|
keyBtn[i][j]->SetState(STATE_SELECTED, t->chan);
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
|
if (shift || alt || alt2)
|
|
|
|
|
{
|
|
|
|
|
if (shift) shift ^= 1;
|
|
|
|
|
if (alt) alt ^= 1;
|
|
|
|
|
if (alt2) alt2 ^= 1;
|
|
|
|
|
update = true;
|
|
|
|
|
changedShiftKey = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} while (update);
|
2009-10-01 01:10:58 +02:00
|
|
|
|
}
|