//this function translates a passed in scan code to ascii (or maybe unicode?) character values that will be used to get the correct bitmaps for printing characters to the screen extern uint8_t translateKeypress(uint8_t translate) { uint8_t temp = 0; int i = 0; if(translate == 0x58) // caps lock { temp = 0x03; } else if(translate == 0x12) // left shift { ShiftPressed = 1; temp = 0; } else if(translate == 0x59) // right shift { ShiftPressed = 0; temp = 0; } else { switch(translate) { //start special key: enter case 0x5A: // enter temp = 0x01; break; //start special key: backspace case 0x66: // backspace temp = 0x04; break; //start special keys: page up and page down case 0x7D: // page up switch(ShiftPressed) { case 0: for(i = 0; i < 8; i++) { ShiftScreenUp(); } temp = 0; break; case 1: ShiftScreenUp(); temp = 0; break; } break; case 0x7A: // page down switch(ShiftPressed) { case 0: for(i = 0; i < 8; i++) { ShiftScreenDown(); } temp = 0; break; case 1: ShiftScreenDown(); temp = 0; break; } break; //start special keys: arrow keys case 0x6B: // left arrow switch(ShiftPressed) { case 0: MoveCursorLeft(); // left arrow BlinkCursor(); temp = 0; break; case 1: ShiftScreenLeft(); //MoveCursorLeft(); //BlinkCursor(); temp = 0; break; } break; case 0x74: // right arrow switch(ShiftPressed) { case 0: //ShiftScreenRight(); MoveCursorRight(); // right arrow BlinkCursor(); //temp = 1; // quick way to make the right arrow print nothing but not get skipped over when incrementing temp = 0; break; case 1: ShiftScreenRight(); //MoveCursorRight(); //BlinkCursor(); temp = 0; break; } break; case 0x75: // up arrow switch(ShiftPressed) { case 0: MoveCursorUp(); BlinkCursor(); temp = 0; break; case 1: for(i = 0; i < 8; i++) { ShiftScreenUp(); } temp = 0; break; } break; case 0x72: // down arrow switch(ShiftPressed) { case 0: MoveCursorDown(); // down arrow BlinkCursor(); temp = 0; break; case 1: for(i = 0; i < 8; i++) { ShiftScreenDown(); } temp = 0; break; } break; //start keyboard line: esc F1F2F3F4F5F6F7F8F9F10F11F12 case 0x76: // esc temp = 0x02; // temp number for commands will be in range 0x01 - 0x19 break; case 0x05: // F1 temp = 0; //press_F1(); break; case 0x06: // F2 temp = 0; shiftTextLeft(); break; //start keyboard line: `1234567890-= case 0x0E: //` switch(ShiftPressed) { case 0: temp = 0x60; //` break; case 1: temp = 0x7E; //~ break; } break; case 0x16: //1 switch(ShiftPressed) { case 0: temp = 0x31; //1 break; case 1: temp = 0x21; //! break; } break; case 0x1E: //2 switch(ShiftPressed) { case 0: temp = 0x32; //2 break; case 1: temp = 0x40; //@ break; } break; case 0x26: //3 switch(ShiftPressed) { case 0: temp = 0x33; //3 break; case 1: temp = 0x23; //# break; } break; case 0x25: //4 switch(ShiftPressed) { case 0: temp = 0x34; //4 break; case 1: temp = 0x24; //$ break; } break; case 0x2E: //5 switch(ShiftPressed) { case 0: temp = 0x35; //5 break; case 1: temp = 0x25; //% break; } break; case 0x36: //6 switch(ShiftPressed) { case 0: temp = 0x36; //6 break; case 1: temp = 0x5E; //^ break; } break; case 0x3D: //7 switch(ShiftPressed) { case 0: temp = 0x37; //7 break; case 1: temp = 0x26; //& break; } break; case 0x3E: //8 switch(ShiftPressed) { case 0: temp = 0x38; //8 break; case 1: temp = 0x2A; //* break; } break; case 0x46: //9 switch(ShiftPressed) { case 0: temp = 0x39; //9 break; case 1: temp = 0x28; //( break; } break; case 0x45: //0 switch(ShiftPressed) { case 0: temp = 0x30; //0 break; case 1: temp = 0x29; //) break; } break; case 0x4E: //- switch(ShiftPressed) { case 0: temp = 0x2D; //- break; case 1: temp = 0x5F; //_ break; } break; case 0x55: //= switch(ShiftPressed) { case 0: temp = 0x3D; //= break; case 1: temp = 0x2B; //+ break; } break; //start keyboard line: qwertyuiop[] and '\' case 0x15: //q switch(ShiftPressed) { case 0: temp = 0x71; //q break; case 1: temp = 0x51; //Q break; } break; case 0x1D: //w switch(ShiftPressed) { case 0: temp = 0x77; //w break; case 1: temp = 0x57; //W break; } break; case 0x24: //e switch(ShiftPressed) { case 0: temp = 0x65; //e break; case 1: temp = 0x45; //E break; } break; case 0x2D: //r switch(ShiftPressed) { case 0: temp = 0x72; //r break; case 1: temp = 0x52; //R break; } break; case 0x2C: //t switch(ShiftPressed) { case 0: temp = 0x74; //t break; case 1: temp = 0x54; //T break; } break; case 0x35: //y switch(ShiftPressed) { case 0: temp = 0x79; //y break; case 1: temp = 0x59; //Y break; } break; case 0x3C: //u switch(ShiftPressed) { case 0: temp = 0x75; //u break; case 1: temp = 0x55; //U break; } break; case 0x43: //i switch(ShiftPressed) { case 0: temp = 0x69; //i break; case 1: temp = 0x49; //I break; } break; case 0x44: //o switch(ShiftPressed) { case 0: temp = 0x6F; //o break; case 1: temp = 0x4F; //O break; } break; case 0x4D: //p switch(ShiftPressed) { case 0: temp = 0x70; //p break; case 1: temp = 0x50; //P break; } break; case 0x54: //[ switch(ShiftPressed) { case 0: temp = 0x5B; //[ break; case 1: temp = 0x7B; //{ break; } break; case 0x5B: //] switch(ShiftPressed) { case 0: temp = 0x5D; //] break; case 1: temp = 0x7D; //} break; } break; case 0x5D: //"\" switch(ShiftPressed) { case 0: temp = 0x5C; //"\" break; case 1: temp = 0x7C; //| break; } break; //start keyboard line: asdfghjkl;' case 0x1C: //a switch(ShiftPressed) { case 0: temp = 0x61; //a break; case 1: temp = 0x41; //A break; } break; case 0x1B: //s switch(ShiftPressed) { case 0: temp = 0x73; //s break; case 1: temp = 0x53; //S break; } break; case 0x23: //d switch(ShiftPressed) { case 0: temp = 0x64; //d break; case 1: temp = 0x44; //D break; } break; case 0x2B: //f switch(ShiftPressed) { case 0: temp = 0x66; //f break; case 1: temp = 0x46; //F break; } break; case 0x34: //g switch(ShiftPressed) { case 0: temp = 0x67; //g break; case 1: temp = 0x47; //G break; } break; case 0x33: //h switch(ShiftPressed) { case 0: temp = 0x68; //h break; case 1: temp = 0x48; //H break; } break; case 0x3B: //j switch(ShiftPressed) { case 0: temp = 0x6A; //j break; case 1: temp = 0x4A; //J break; } break; case 0x42: //k switch(ShiftPressed) { case 0: temp = 0x6B; //k break; case 1: temp = 0x4B; //K break; } break; case 0x4B: //l switch(ShiftPressed) { case 0: temp = 0x6C; //l break; case 1: temp = 0x4C; //L break; } break; case 0x4C: //NOTE: this is actually a : not a ; but there is no bitmap for ; switch(ShiftPressed) { case 0: temp = 0x3A; //; break; case 1: temp = 0x3A; //: break; } break; case 0x52: //' switch(ShiftPressed) { case 0: temp = 0x27; //' break; case 1: temp = 0x22; //" break; } break; //start keyboard line: zxcvbnm,./ case 0x1A: //z switch(ShiftPressed) { case 0: temp = 0x7A; //z break; case 1: temp = 0x5A; //Z break; } break; case 0x22: //x switch(ShiftPressed) { case 0: temp = 0x78; //x break; case 1: temp = 0x58; //X break; } break; case 0x21: //c switch(ShiftPressed) { case 0: temp = 0x63; //c break; case 1: temp = 0x43; //C break; } break; case 0x2A: //v switch(ShiftPressed) { case 0: temp = 0x76; //v break; case 1: temp = 0x56; //V break; } break; case 0x32: //b switch(ShiftPressed) { case 0: temp = 0x62; //b break; case 1: temp = 0x42; //B break; } break; case 0x31: //n switch(ShiftPressed) { case 0: temp = 0x6E; //n break; case 1: temp = 0x4E; //N break; } break; case 0x3A: //m switch(ShiftPressed) { case 0: temp = 0x6D; //m break; case 1: temp = 0x4D; //M break; } break; case 0x41: //, switch(ShiftPressed) { case 0: temp = 0x2C; //, break; case 1: temp = 0x3C; //< break; } break; case 0x49: //. switch(ShiftPressed) { case 0: temp = 0x2E; //. break; case 1: temp = 0x3E; //> break; } break; case 0x4A: // "/" switch(ShiftPressed) { case 0: temp = 0x2F; // "/" break; case 1: temp = 0x3F; //? break; } break; case 0x29: // space temp = 0x20; break; default: temp = 0x21; } } return temp; }
void TextInputHandler::Update() { if (!m_menu->IsOpen() || IsConsoleOpen()) return; //find first key pressed since last time we checked UInt8 keyCode = 0; for (UInt32 idx = 0; idx <= 0x100; idx++) { if (DI_data.LastBytes[idx] && !m_prevKeyboardState[idx]) { keyCode = idx; break; } } bool bControlPressed = DI_data.LastBytes[DIK_LCONTROL] || DI_data.LastBytes[DIK_RCONTROL]; bool bShifted = DI_data.LastBytes[DIK_LSHIFT] || DI_data.LastBytes[DIK_RSHIFT]; bool bUpdateText = false; if (keyCode) { switch (keyCode) { case DIK_UP: case DIK_DOWN: case DIK_RETURN: { UInt32 cursorAdjust = m_menu->ResolveControlCode(keyCode, m_cursorPos); if (cursorAdjust != -1) { m_cursorPos = cursorAdjust; bUpdateText = true; } break; } case DIK_TAB: m_cursorPos = m_menu->InsertText(m_cursorPos, m_tabChars); bUpdateText = true; break; case DIK_BACK: m_cursorPos = m_menu->DeleteText(m_cursorPos, true, bControlPressed); bUpdateText = true; break; case DIK_DELETE: m_cursorPos = m_menu->DeleteText(m_cursorPos, false, bControlPressed); bUpdateText = true; break; case DIK_LEFT: m_cursorPos = m_menu->SeekPosition(m_cursorPos, true, bControlPressed); bUpdateText = true; break; case DIK_RIGHT: m_cursorPos = m_menu->SeekPosition(m_cursorPos, false, bControlPressed); bUpdateText = true; break; case DIK_HOME: m_cursorPos = m_menu->GetMinPos(); bUpdateText = true; break; case DIK_END: if (m_menu->GetInputLength() > 0) { m_cursorPos = m_menu->GetInputLength(); bUpdateText = true; } break; case DIK_GRAVE: //Console key - don't include in input text case DIK_ESCAPE: break; default: if (bControlPressed) { UInt32 cursorAdjust = -1; if (!m_bControlKeysDisabled) { // give menu a chance to handle the control key cursorAdjust = m_menu->ResolveControlCode(keyCode, m_cursorPos); } if (cursorAdjust == -1) { // menu didn't handle it. Do we have a function script to try instead? if (m_controlHandler) { // invoke the function script, passing in the control key code InternalFunctionCaller caller(m_controlHandler); caller.SetArgs(1, (void*)((UInt32)keyCode)); ScriptToken* result = UserFunctionManager::Call(caller); delete result; // result unused } else { // store it for later retrieval via GetTextInputControlKeyPressed m_lastControlCharPressed = keyCode; } } else { // menu handled, update cursor position accordingly m_cursorPos = cursorAdjust; bUpdateText = true; } } else { char charToInsert = ScancodeToChar(keyCode, bShifted); if (charToInsert) { m_cursorPos = m_menu->InsertChar(m_cursorPos, charToInsert); bUpdateText = true; } } break; } } //store current state of keyboard for next update memcpy(m_prevKeyboardState, DI_data.LastBytes, 256); if (BlinkCursor()) bUpdateText = true; if (bUpdateText) UpdateDisplay(); }
void NativePlayerWnd::CursorTimerFire() { #ifdef EDITTEXT BlinkCursor(); #endif }