Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 private static void AddMapping(ImlacKey key, byte normal, byte shifted)
 {
     _keyMappings.Add(key, new ImlacKeyMapping(key, normal, shifted));
 }
Esempio n. 4
0
 public ImlacKeyMapping(ImlacKey key, byte normal, byte shifted)
 {
     Key         = key;
     NormalCode  = normal;
     ShiftedCode = shifted;
 }