private void SdlKeyDown(SDL_Keycode key, bool repeat) { switch (key) { case SDL_Keycode.SDLK_LSHIFT: case SDL_Keycode.SDLK_RSHIFT: _keyModifiers |= ImlacKeyModifiers.Shift; break; case SDL_Keycode.SDLK_LCTRL: case SDL_Keycode.SDLK_RCTRL: _keyModifiers |= ImlacKeyModifiers.Ctrl; break; case SDL_Keycode.SDLK_LALT: case SDL_Keycode.SDLK_RALT: _keyModifiers |= ImlacKeyModifiers.Rept; break; default: UpdateDataSwitches(key, true /* key down */); if (key == SDL_Keycode.SDLK_INSERT && !repeat) { FullScreenToggle(); break; } // If this is a repeated keystroke, we'll only log it if // the Repeat key (Alt) is being held down. if (repeat && (_keyModifiers & ImlacKeyModifiers.Rept) == 0) { break; } _keyLatchedLock.EnterWriteLock(); if (!_keyLatched) { ImlacKey newCode = TranslateKeyCode(key); // Only latch valid keys. if (newCode != ImlacKey.Invalid) { _keyLatched = true; _latchedKeyCode = newCode; } } _keyLatchedLock.ExitWriteLock(); break; } }
private ushort GetScancodeForCurrentKey() { ushort scanCode = 0; ImlacKey key = _system.Display.Key; ImlacKeyModifiers modifiers = _system.Display.KeyModifiers; if (key != ImlacKey.Invalid) { Trace.Log(LogType.Keyboard, "Keypress is {0}", key); scanCode = (modifiers & ImlacKeyModifiers.Shift) != 0 ? _keyMappings[key].ShiftedCode : _keyMappings[key].NormalCode; if (scanCode == 0) { // no code for shifted key, just use normal one. scanCode = _keyMappings[key].NormalCode; } // bit 8 is always set scanCode = (ushort)(scanCode | 0x80); // // The Repeat, Control, and Shift keys correspond to bits 5, 6, and 7 of the // scancode returned. // if ((modifiers & ImlacKeyModifiers.Rept) != 0) { scanCode |= 0x400; } if ((modifiers & ImlacKeyModifiers.Ctrl) != 0) { scanCode |= 0x200; } if ((modifiers & ImlacKeyModifiers.Shift) != 0) { scanCode |= 0x100; } Trace.Log(LogType.Keyboard, "Final keycode is {0}", Helpers.ToOctal(scanCode)); } else { scanCode = 0; } return(scanCode); }
private static void AddMapping(ImlacKey key, byte normal, byte shifted) { _keyMappings.Add(key, new ImlacKeyMapping(key, normal, shifted)); }
public ImlacKeyMapping(ImlacKey key, byte normal, byte shifted) { Key = key; NormalCode = normal; ShiftedCode = shifted; }