|
@@ -356,6 +356,124 @@ static Keyboard::Key getKey(KeySym sym)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * Returns the unicode value for the given keycode or zero if the key is not a valid printable character.
|
|
|
|
|
+ */
|
|
|
|
|
+static int getUnicode(Keyboard::Key key)
|
|
|
|
|
+{
|
|
|
|
|
+
|
|
|
|
|
+ switch (key)
|
|
|
|
|
+ {
|
|
|
|
|
+ case Keyboard::KEY_BACKSPACE:
|
|
|
|
|
+ return 0x0008;
|
|
|
|
|
+ case Keyboard::KEY_TAB:
|
|
|
|
|
+ return 0x0009;
|
|
|
|
|
+ case Keyboard::KEY_RETURN:
|
|
|
|
|
+ case Keyboard::KEY_KP_ENTER:
|
|
|
|
|
+ return 0x000A;
|
|
|
|
|
+ case Keyboard::KEY_ESCAPE:
|
|
|
|
|
+ return 0x001B;
|
|
|
|
|
+ case Keyboard::KEY_SPACE:
|
|
|
|
|
+ case Keyboard::KEY_EXCLAM:
|
|
|
|
|
+ case Keyboard::KEY_QUOTE:
|
|
|
|
|
+ case Keyboard::KEY_NUMBER:
|
|
|
|
|
+ case Keyboard::KEY_DOLLAR:
|
|
|
|
|
+ case Keyboard::KEY_PERCENT:
|
|
|
|
|
+ case Keyboard::KEY_CIRCUMFLEX:
|
|
|
|
|
+ case Keyboard::KEY_AMPERSAND:
|
|
|
|
|
+ case Keyboard::KEY_APOSTROPHE:
|
|
|
|
|
+ case Keyboard::KEY_LEFT_PARENTHESIS:
|
|
|
|
|
+ case Keyboard::KEY_RIGHT_PARENTHESIS:
|
|
|
|
|
+ case Keyboard::KEY_ASTERISK:
|
|
|
|
|
+ case Keyboard::KEY_PLUS:
|
|
|
|
|
+ case Keyboard::KEY_COMMA:
|
|
|
|
|
+ case Keyboard::KEY_MINUS:
|
|
|
|
|
+ case Keyboard::KEY_PERIOD:
|
|
|
|
|
+ case Keyboard::KEY_SLASH:
|
|
|
|
|
+ case Keyboard::KEY_ZERO:
|
|
|
|
|
+ case Keyboard::KEY_ONE:
|
|
|
|
|
+ case Keyboard::KEY_TWO:
|
|
|
|
|
+ case Keyboard::KEY_THREE:
|
|
|
|
|
+ case Keyboard::KEY_FOUR:
|
|
|
|
|
+ case Keyboard::KEY_FIVE:
|
|
|
|
|
+ case Keyboard::KEY_SIX:
|
|
|
|
|
+ case Keyboard::KEY_SEVEN:
|
|
|
|
|
+ case Keyboard::KEY_EIGHT:
|
|
|
|
|
+ case Keyboard::KEY_NINE:
|
|
|
|
|
+ case Keyboard::KEY_COLON:
|
|
|
|
|
+ case Keyboard::KEY_SEMICOLON:
|
|
|
|
|
+ case Keyboard::KEY_LESS_THAN:
|
|
|
|
|
+ case Keyboard::KEY_EQUAL:
|
|
|
|
|
+ case Keyboard::KEY_GREATER_THAN:
|
|
|
|
|
+ case Keyboard::KEY_QUESTION:
|
|
|
|
|
+ case Keyboard::KEY_AT:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_A:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_B:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_C:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_D:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_E:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_F:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_G:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_H:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_I:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_J:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_K:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_L:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_M:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_N:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_O:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_P:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_Q:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_R:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_S:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_T:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_U:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_V:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_W:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_X:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_Y:
|
|
|
|
|
+ case Keyboard::KEY_CAPITAL_Z:
|
|
|
|
|
+ case Keyboard::KEY_LEFT_BRACKET:
|
|
|
|
|
+ case Keyboard::KEY_BACK_SLASH:
|
|
|
|
|
+ case Keyboard::KEY_RIGHT_BRACKET:
|
|
|
|
|
+ case Keyboard::KEY_UNDERSCORE:
|
|
|
|
|
+ case Keyboard::KEY_GRAVE:
|
|
|
|
|
+ case Keyboard::KEY_A:
|
|
|
|
|
+ case Keyboard::KEY_B:
|
|
|
|
|
+ case Keyboard::KEY_C:
|
|
|
|
|
+ case Keyboard::KEY_D:
|
|
|
|
|
+ case Keyboard::KEY_E:
|
|
|
|
|
+ case Keyboard::KEY_F:
|
|
|
|
|
+ case Keyboard::KEY_G:
|
|
|
|
|
+ case Keyboard::KEY_H:
|
|
|
|
|
+ case Keyboard::KEY_I:
|
|
|
|
|
+ case Keyboard::KEY_J:
|
|
|
|
|
+ case Keyboard::KEY_K:
|
|
|
|
|
+ case Keyboard::KEY_L:
|
|
|
|
|
+ case Keyboard::KEY_M:
|
|
|
|
|
+ case Keyboard::KEY_N:
|
|
|
|
|
+ case Keyboard::KEY_O:
|
|
|
|
|
+ case Keyboard::KEY_P:
|
|
|
|
|
+ case Keyboard::KEY_Q:
|
|
|
|
|
+ case Keyboard::KEY_R:
|
|
|
|
|
+ case Keyboard::KEY_S:
|
|
|
|
|
+ case Keyboard::KEY_T:
|
|
|
|
|
+ case Keyboard::KEY_U:
|
|
|
|
|
+ case Keyboard::KEY_V:
|
|
|
|
|
+ case Keyboard::KEY_W:
|
|
|
|
|
+ case Keyboard::KEY_X:
|
|
|
|
|
+ case Keyboard::KEY_Y:
|
|
|
|
|
+ case Keyboard::KEY_Z:
|
|
|
|
|
+ case Keyboard::KEY_LEFT_BRACE:
|
|
|
|
|
+ case Keyboard::KEY_BAR:
|
|
|
|
|
+ case Keyboard::KEY_RIGHT_BRACE:
|
|
|
|
|
+ case Keyboard::KEY_TILDE:
|
|
|
|
|
+ return key;
|
|
|
|
|
+ default:
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
extern void print(const char* format, ...)
|
|
extern void print(const char* format, ...)
|
|
|
{
|
|
{
|
|
|
GP_ASSERT(format);
|
|
GP_ASSERT(format);
|
|
@@ -641,9 +759,25 @@ int Platform::enterMessagePump()
|
|
|
|
|
|
|
|
case KeyPress:
|
|
case KeyPress:
|
|
|
{
|
|
{
|
|
|
- KeySym sym = XLookupKeysym(&evt.xkey, 0);
|
|
|
|
|
|
|
+ KeySym sym = XLookupKeysym(&evt.xkey, (evt.xkey.state & shiftDown) ? 1 : 0);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //TempSym needed because XConvertCase operates on two keysyms: One lower and the other upper, we are only interested in the upper case
|
|
|
|
|
+ KeySym tempSym;
|
|
|
|
|
+ if(capsOn && !shiftDown)
|
|
|
|
|
+ XConvertCase(sym, &tempSym, &sym);
|
|
|
|
|
+
|
|
|
Keyboard::Key key = getKey(sym);
|
|
Keyboard::Key key = getKey(sym);
|
|
|
gameplay::Platform::keyEventInternal(gameplay::Keyboard::KEY_PRESS, key);
|
|
gameplay::Platform::keyEventInternal(gameplay::Keyboard::KEY_PRESS, key);
|
|
|
|
|
+
|
|
|
|
|
+ if(key == Keyboard::KEY_CAPS_LOCK)
|
|
|
|
|
+ capsOn = !capsOn;
|
|
|
|
|
+ if(key == Keyboard::KEY_SHIFT)
|
|
|
|
|
+ shiftDown = true;
|
|
|
|
|
+
|
|
|
|
|
+ if(int character = getUnicode(key))
|
|
|
|
|
+ gameplay::Platform::keyEventInternal(gameplay::Keyboard::KEY_CHAR, character);
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
@@ -666,6 +800,9 @@ int Platform::enterMessagePump()
|
|
|
KeySym sym = XLookupKeysym(&evt.xkey, 0);
|
|
KeySym sym = XLookupKeysym(&evt.xkey, 0);
|
|
|
Keyboard::Key key = getKey(sym);
|
|
Keyboard::Key key = getKey(sym);
|
|
|
gameplay::Platform::keyEventInternal(gameplay::Keyboard::KEY_RELEASE, key);
|
|
gameplay::Platform::keyEventInternal(gameplay::Keyboard::KEY_RELEASE, key);
|
|
|
|
|
+
|
|
|
|
|
+ if(key == Keyboard::KEY_SHIFT)
|
|
|
|
|
+ shiftDown = false;
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
|
|
|