MODULE = OIS     PACKAGE = OIS::Keyboard

bool
Keyboard::isKeyDown(key)
    KeyCode  key

## This is a bit different than the C++ API,
## but not too much. You create a Perl class that
## implements the OIS::KeyListener interface (two methods),
## then pass an object of that class here.
## Behind the scenes, there is a C++ class PerlOISKeyListener
## that handles calling your Perl code from the C++ callback.
## (perlKeyListener below is instantiated "globally" in OIS.xs.)
void
Keyboard::setEventCallback(keyListener)
    SV * keyListener
  CODE:
    poisKeyListener.setPerlObject(keyListener);
    THIS->setEventCallback(&poisKeyListener);

## hmm, not sure why you would want to get this...
KeyListener *
Keyboard::getEventCallback()

void
Keyboard::setTextTranslation(mode)
    int  mode
  C_ARGS:
    (OIS::Keyboard::TextTranslationMode)mode

int
Keyboard::getTextTranslation()

string
Keyboard::getAsString(kc)
    KeyCode  kc

bool
Keyboard::isModifierDown(mod)
    int  mod
  C_ARGS:
    (OIS::Keyboard::Modifier)mod

## this is not wrapped:
## void OIS::Keyboard::copyKeyStates(char keys[256])


## TextTranslationMode enum
static int
Keyboard::Off()
  ALIAS:
    OIS::Keyboard::Unicode = 1
    OIS::Keyboard::Ascii = 2
  CODE:
    switch (ix) {
        case 0: RETVAL = OIS::Keyboard::Off; break;
        case 1: RETVAL = OIS::Keyboard::Unicode; break;
        case 2: RETVAL = OIS::Keyboard::Ascii; break;
    }
  OUTPUT:
    RETVAL

## Modifier enum
static int
Keyboard::Shift()
  ALIAS:
    OIS::Keyboard::Ctrl = 1
    OIS::Keyboard::Alt = 2
  CODE:
    switch (ix) {
        case 0: RETVAL = OIS::Keyboard::Shift; break;
        case 1: RETVAL = OIS::Keyboard::Ctrl; break;
        case 2: RETVAL = OIS::Keyboard::Alt; break;
    }
  OUTPUT:
    RETVAL

## xxx: surely there is a better way than this...
## (technically, these are in OIS namespace, not OIS::Keyboard)
## KeyCode enum
static int
Keyboard::KC_UNASSIGNED()
  ALIAS:
    OIS::Keyboard::KC_ESCAPE = 1
    OIS::Keyboard::KC_1 = 2
    OIS::Keyboard::KC_2 = 3
    OIS::Keyboard::KC_3 = 4
    OIS::Keyboard::KC_4 = 5
    OIS::Keyboard::KC_5 = 6
    OIS::Keyboard::KC_6 = 7
    OIS::Keyboard::KC_7 = 8
    OIS::Keyboard::KC_8 = 9
    OIS::Keyboard::KC_9 = 10
    OIS::Keyboard::KC_0 = 11
    OIS::Keyboard::KC_MINUS = 12
    OIS::Keyboard::KC_EQUALS = 13
    OIS::Keyboard::KC_BACK = 14
    OIS::Keyboard::KC_TAB = 15
    OIS::Keyboard::KC_Q = 16
    OIS::Keyboard::KC_W = 17
    OIS::Keyboard::KC_E = 18
    OIS::Keyboard::KC_R = 19
    OIS::Keyboard::KC_T = 20
    OIS::Keyboard::KC_Y = 21
    OIS::Keyboard::KC_U = 22
    OIS::Keyboard::KC_I = 23
    OIS::Keyboard::KC_O = 24
    OIS::Keyboard::KC_P = 25
    OIS::Keyboard::KC_LBRACKET = 26
    OIS::Keyboard::KC_RBRACKET = 27
    OIS::Keyboard::KC_RETURN = 28
    OIS::Keyboard::KC_LCONTROL = 29
    OIS::Keyboard::KC_A = 30
    OIS::Keyboard::KC_S = 31
    OIS::Keyboard::KC_D = 32
    OIS::Keyboard::KC_F = 33
    OIS::Keyboard::KC_G = 34
    OIS::Keyboard::KC_H = 35
    OIS::Keyboard::KC_J = 36
    OIS::Keyboard::KC_K = 37
    OIS::Keyboard::KC_L = 38
    OIS::Keyboard::KC_SEMICOLON = 39
    OIS::Keyboard::KC_APOSTROPHE = 40
    OIS::Keyboard::KC_GRAVE = 41
    OIS::Keyboard::KC_LSHIFT = 42
    OIS::Keyboard::KC_BACKSLASH = 43
    OIS::Keyboard::KC_Z = 44
    OIS::Keyboard::KC_X = 45
    OIS::Keyboard::KC_C = 46
    OIS::Keyboard::KC_V = 47
    OIS::Keyboard::KC_B = 48
    OIS::Keyboard::KC_N = 49
    OIS::Keyboard::KC_M = 50
    OIS::Keyboard::KC_COMMA = 51
    OIS::Keyboard::KC_PERIOD = 52
    OIS::Keyboard::KC_SLASH = 53
    OIS::Keyboard::KC_RSHIFT = 54
    OIS::Keyboard::KC_MULTIPLY = 55
    OIS::Keyboard::KC_LMENU = 56
    OIS::Keyboard::KC_SPACE = 57
    OIS::Keyboard::KC_CAPITAL = 58
    OIS::Keyboard::KC_F1 = 59
    OIS::Keyboard::KC_F2 = 60
    OIS::Keyboard::KC_F3 = 61
    OIS::Keyboard::KC_F4 = 62
    OIS::Keyboard::KC_F5 = 63
    OIS::Keyboard::KC_F6 = 64
    OIS::Keyboard::KC_F7 = 65
    OIS::Keyboard::KC_F8 = 66
    OIS::Keyboard::KC_F9 = 67
    OIS::Keyboard::KC_F10 = 68
    OIS::Keyboard::KC_NUMLOCK = 69
    OIS::Keyboard::KC_SCROLL = 70
    OIS::Keyboard::KC_NUMPAD7 = 71
    OIS::Keyboard::KC_NUMPAD8 = 72
    OIS::Keyboard::KC_NUMPAD9 = 73
    OIS::Keyboard::KC_SUBTRACT = 74
    OIS::Keyboard::KC_NUMPAD4 = 75
    OIS::Keyboard::KC_NUMPAD5 = 76
    OIS::Keyboard::KC_NUMPAD6 = 77
    OIS::Keyboard::KC_ADD = 78
    OIS::Keyboard::KC_NUMPAD1 = 79
    OIS::Keyboard::KC_NUMPAD2 = 80
    OIS::Keyboard::KC_NUMPAD3 = 81
    OIS::Keyboard::KC_NUMPAD0 = 82
    OIS::Keyboard::KC_DECIMAL = 83
    OIS::Keyboard::KC_OEM_102 = 84
    OIS::Keyboard::KC_F11 = 85
    OIS::Keyboard::KC_F12 = 86
    OIS::Keyboard::KC_F13 = 87
    OIS::Keyboard::KC_F14 = 88
    OIS::Keyboard::KC_F15 = 89
    OIS::Keyboard::KC_KANA = 90
    OIS::Keyboard::KC_ABNT_C1 = 91
    OIS::Keyboard::KC_CONVERT = 92
    OIS::Keyboard::KC_NOCONVERT = 93
    OIS::Keyboard::KC_YEN = 94
    OIS::Keyboard::KC_ABNT_C2 = 95
    OIS::Keyboard::KC_NUMPADEQUALS = 96
    OIS::Keyboard::KC_PREVTRACK = 97
    OIS::Keyboard::KC_AT = 98
    OIS::Keyboard::KC_COLON = 99
    OIS::Keyboard::KC_UNDERLINE = 100
    OIS::Keyboard::KC_KANJI = 101
    OIS::Keyboard::KC_STOP = 102
    OIS::Keyboard::KC_AX = 103
    OIS::Keyboard::KC_UNLABELED = 104
    OIS::Keyboard::KC_NEXTTRACK = 105
    OIS::Keyboard::KC_NUMPADENTER = 106
    OIS::Keyboard::KC_RCONTROL = 107
    OIS::Keyboard::KC_MUTE = 108
    OIS::Keyboard::KC_CALCULATOR = 109
    OIS::Keyboard::KC_PLAYPAUSE = 110
    OIS::Keyboard::KC_MEDIASTOP = 111
    OIS::Keyboard::KC_VOLUMEDOWN = 112
    OIS::Keyboard::KC_VOLUMEUP = 113
    OIS::Keyboard::KC_WEBHOME = 114
    OIS::Keyboard::KC_NUMPADCOMMA = 115
    OIS::Keyboard::KC_DIVIDE = 116
    OIS::Keyboard::KC_SYSRQ = 117
    OIS::Keyboard::KC_RMENU = 118
    OIS::Keyboard::KC_PAUSE = 119
    OIS::Keyboard::KC_HOME = 120
    OIS::Keyboard::KC_UP = 121
    OIS::Keyboard::KC_PGUP = 122
    OIS::Keyboard::KC_LEFT = 123
    OIS::Keyboard::KC_RIGHT = 124
    OIS::Keyboard::KC_END = 125
    OIS::Keyboard::KC_DOWN = 126
    OIS::Keyboard::KC_PGDOWN = 127
    OIS::Keyboard::KC_INSERT = 128
    OIS::Keyboard::KC_DELETE = 129
    OIS::Keyboard::KC_LWIN = 130
    OIS::Keyboard::KC_RWIN = 131
    OIS::Keyboard::KC_APPS = 132
    OIS::Keyboard::KC_POWER = 133
    OIS::Keyboard::KC_SLEEP = 134
    OIS::Keyboard::KC_WAKE = 135
    OIS::Keyboard::KC_WEBSEARCH = 136
    OIS::Keyboard::KC_WEBFAVORITES = 137
    OIS::Keyboard::KC_WEBREFRESH = 138
    OIS::Keyboard::KC_WEBSTOP = 139
    OIS::Keyboard::KC_WEBFORWARD = 140
    OIS::Keyboard::KC_WEBBACK = 141
    OIS::Keyboard::KC_MYCOMPUTER = 142
    OIS::Keyboard::KC_MAIL = 143
    OIS::Keyboard::KC_MEDIASELECT = 144
  CODE:
    switch (ix) {
        case 0: RETVAL = OIS::KC_UNASSIGNED; break;
        case 1: RETVAL = OIS::KC_ESCAPE; break;
        case 2: RETVAL = OIS::KC_1; break;
        case 3: RETVAL = OIS::KC_2; break;
        case 4: RETVAL = OIS::KC_3; break;
        case 5: RETVAL = OIS::KC_4; break;
        case 6: RETVAL = OIS::KC_5; break;
        case 7: RETVAL = OIS::KC_6; break;
        case 8: RETVAL = OIS::KC_7; break;
        case 9: RETVAL = OIS::KC_8; break;
        case 10: RETVAL = OIS::KC_9; break;
        case 11: RETVAL = OIS::KC_0; break;
        case 12: RETVAL = OIS::KC_MINUS; break;
        case 13: RETVAL = OIS::KC_EQUALS; break;
        case 14: RETVAL = OIS::KC_BACK; break;
        case 15: RETVAL = OIS::KC_TAB; break;
        case 16: RETVAL = OIS::KC_Q; break;
        case 17: RETVAL = OIS::KC_W; break;
        case 18: RETVAL = OIS::KC_E; break;
        case 19: RETVAL = OIS::KC_R; break;
        case 20: RETVAL = OIS::KC_T; break;
        case 21: RETVAL = OIS::KC_Y; break;
        case 22: RETVAL = OIS::KC_U; break;
        case 23: RETVAL = OIS::KC_I; break;
        case 24: RETVAL = OIS::KC_O; break;
        case 25: RETVAL = OIS::KC_P; break;
        case 26: RETVAL = OIS::KC_LBRACKET; break;
        case 27: RETVAL = OIS::KC_RBRACKET; break;
        case 28: RETVAL = OIS::KC_RETURN; break;
        case 29: RETVAL = OIS::KC_LCONTROL; break;
        case 30: RETVAL = OIS::KC_A; break;
        case 31: RETVAL = OIS::KC_S; break;
        case 32: RETVAL = OIS::KC_D; break;
        case 33: RETVAL = OIS::KC_F; break;
        case 34: RETVAL = OIS::KC_G; break;
        case 35: RETVAL = OIS::KC_H; break;
        case 36: RETVAL = OIS::KC_J; break;
        case 37: RETVAL = OIS::KC_K; break;
        case 38: RETVAL = OIS::KC_L; break;
        case 39: RETVAL = OIS::KC_SEMICOLON; break;
        case 40: RETVAL = OIS::KC_APOSTROPHE; break;
        case 41: RETVAL = OIS::KC_GRAVE; break;
        case 42: RETVAL = OIS::KC_LSHIFT; break;
        case 43: RETVAL = OIS::KC_BACKSLASH; break;
        case 44: RETVAL = OIS::KC_Z; break;
        case 45: RETVAL = OIS::KC_X; break;
        case 46: RETVAL = OIS::KC_C; break;
        case 47: RETVAL = OIS::KC_V; break;
        case 48: RETVAL = OIS::KC_B; break;
        case 49: RETVAL = OIS::KC_N; break;
        case 50: RETVAL = OIS::KC_M; break;
        case 51: RETVAL = OIS::KC_COMMA; break;
        case 52: RETVAL = OIS::KC_PERIOD; break;
        case 53: RETVAL = OIS::KC_SLASH; break;
        case 54: RETVAL = OIS::KC_RSHIFT; break;
        case 55: RETVAL = OIS::KC_MULTIPLY; break;
        case 56: RETVAL = OIS::KC_LMENU; break;
        case 57: RETVAL = OIS::KC_SPACE; break;
        case 58: RETVAL = OIS::KC_CAPITAL; break;
        case 59: RETVAL = OIS::KC_F1; break;
        case 60: RETVAL = OIS::KC_F2; break;
        case 61: RETVAL = OIS::KC_F3; break;
        case 62: RETVAL = OIS::KC_F4; break;
        case 63: RETVAL = OIS::KC_F5; break;
        case 64: RETVAL = OIS::KC_F6; break;
        case 65: RETVAL = OIS::KC_F7; break;
        case 66: RETVAL = OIS::KC_F8; break;
        case 67: RETVAL = OIS::KC_F9; break;
        case 68: RETVAL = OIS::KC_F10; break;
        case 69: RETVAL = OIS::KC_NUMLOCK; break;
        case 70: RETVAL = OIS::KC_SCROLL; break;
        case 71: RETVAL = OIS::KC_NUMPAD7; break;
        case 72: RETVAL = OIS::KC_NUMPAD8; break;
        case 73: RETVAL = OIS::KC_NUMPAD9; break;
        case 74: RETVAL = OIS::KC_SUBTRACT; break;
        case 75: RETVAL = OIS::KC_NUMPAD4; break;
        case 76: RETVAL = OIS::KC_NUMPAD5; break;
        case 77: RETVAL = OIS::KC_NUMPAD6; break;
        case 78: RETVAL = OIS::KC_ADD; break;
        case 79: RETVAL = OIS::KC_NUMPAD1; break;
        case 80: RETVAL = OIS::KC_NUMPAD2; break;
        case 81: RETVAL = OIS::KC_NUMPAD3; break;
        case 82: RETVAL = OIS::KC_NUMPAD0; break;
        case 83: RETVAL = OIS::KC_DECIMAL; break;
        case 84: RETVAL = OIS::KC_OEM_102; break;
        case 85: RETVAL = OIS::KC_F11; break;
        case 86: RETVAL = OIS::KC_F12; break;
        case 87: RETVAL = OIS::KC_F13; break;
        case 88: RETVAL = OIS::KC_F14; break;
        case 89: RETVAL = OIS::KC_F15; break;
        case 90: RETVAL = OIS::KC_KANA; break;
        case 91: RETVAL = OIS::KC_ABNT_C1; break;
        case 92: RETVAL = OIS::KC_CONVERT; break;
        case 93: RETVAL = OIS::KC_NOCONVERT; break;
        case 94: RETVAL = OIS::KC_YEN; break;
        case 95: RETVAL = OIS::KC_ABNT_C2; break;
        case 96: RETVAL = OIS::KC_NUMPADEQUALS; break;
        case 97: RETVAL = OIS::KC_PREVTRACK; break;
        case 98: RETVAL = OIS::KC_AT; break;
        case 99: RETVAL = OIS::KC_COLON; break;
        case 100: RETVAL = OIS::KC_UNDERLINE; break;
        case 101: RETVAL = OIS::KC_KANJI; break;
        case 102: RETVAL = OIS::KC_STOP; break;
        case 103: RETVAL = OIS::KC_AX; break;
        case 104: RETVAL = OIS::KC_UNLABELED; break;
        case 105: RETVAL = OIS::KC_NEXTTRACK; break;
        case 106: RETVAL = OIS::KC_NUMPADENTER; break;
        case 107: RETVAL = OIS::KC_RCONTROL; break;
        case 108: RETVAL = OIS::KC_MUTE; break;
        case 109: RETVAL = OIS::KC_CALCULATOR; break;
        case 110: RETVAL = OIS::KC_PLAYPAUSE; break;
        case 111: RETVAL = OIS::KC_MEDIASTOP; break;
        case 112: RETVAL = OIS::KC_VOLUMEDOWN; break;
        case 113: RETVAL = OIS::KC_VOLUMEUP; break;
        case 114: RETVAL = OIS::KC_WEBHOME; break;
        case 115: RETVAL = OIS::KC_NUMPADCOMMA; break;
        case 116: RETVAL = OIS::KC_DIVIDE; break;
        case 117: RETVAL = OIS::KC_SYSRQ; break;
        case 118: RETVAL = OIS::KC_RMENU; break;
        case 119: RETVAL = OIS::KC_PAUSE; break;
        case 120: RETVAL = OIS::KC_HOME; break;
        case 121: RETVAL = OIS::KC_UP; break;
        case 122: RETVAL = OIS::KC_PGUP; break;
        case 123: RETVAL = OIS::KC_LEFT; break;
        case 124: RETVAL = OIS::KC_RIGHT; break;
        case 125: RETVAL = OIS::KC_END; break;
        case 126: RETVAL = OIS::KC_DOWN; break;
        case 127: RETVAL = OIS::KC_PGDOWN; break;
        case 128: RETVAL = OIS::KC_INSERT; break;
        case 129: RETVAL = OIS::KC_DELETE; break;
        case 130: RETVAL = OIS::KC_LWIN; break;
        case 131: RETVAL = OIS::KC_RWIN; break;
        case 132: RETVAL = OIS::KC_APPS; break;
        case 133: RETVAL = OIS::KC_POWER; break;
        case 134: RETVAL = OIS::KC_SLEEP; break;
        case 135: RETVAL = OIS::KC_WAKE; break;
        case 136: RETVAL = OIS::KC_WEBSEARCH; break;
        case 137: RETVAL = OIS::KC_WEBFAVORITES; break;
        case 138: RETVAL = OIS::KC_WEBREFRESH; break;
        case 139: RETVAL = OIS::KC_WEBSTOP; break;
        case 140: RETVAL = OIS::KC_WEBFORWARD; break;
        case 141: RETVAL = OIS::KC_WEBBACK; break;
        case 142: RETVAL = OIS::KC_MYCOMPUTER; break;
        case 143: RETVAL = OIS::KC_MAIL; break;
        case 144: RETVAL = OIS::KC_MEDIASELECT; break;
    }
  OUTPUT:
    RETVAL