    {-# LANGUAGE DeriveDataTypeable #-}
    {-# LANGUAGE DeriveGeneric #-}
    {-# LANGUAGE MultiParamTypeClasses #-}
    {-# LANGUAGE PatternSynonyms #-}

    {-|

    An enumeration of scancodes and keycodes, allowing you to pattern match on keyboard keys.

    This module uses a relatively new GHC feature called @PatternSynonyms@ in order to provide pattern
    matches over the underlying 'Scancode' or 'Keycode'. We do this so that you are also able to
    work with vendor-specific or otherwise unknown codes.

    -}

    module SDL.Input.Keyboard.Codes
           (-- * Scancodes
            -- | Scancodes are codes that correspond to the physical position of a key, independent of the current keyboard layout.
            -- Scancodes are meant to be layout-independent. Think of this as \"the user pressed the Q key as it would be on a US QWERTY keyboard\" regardless of whether this is actually a European keyboard or a Dvorak keyboard or whatever. The scancode is always the same key position.
            -- 'Scancode' makes sense when you want key presses based on their location on a keyboard - for example, the traditional \"WASD\" layout used in first-person shooters.
            Scancode(..),
            pattern ScancodeUnknown,
            pattern ScancodeA,
            pattern ScancodeB,
            pattern ScancodeC,
            pattern ScancodeD,
            pattern ScancodeE,
            pattern ScancodeF,
            pattern ScancodeG,
            pattern ScancodeH,
            pattern ScancodeI,
            pattern ScancodeJ,
            pattern ScancodeK,
            pattern ScancodeL,
            pattern ScancodeM,
            pattern ScancodeN,
            pattern ScancodeO,
            pattern ScancodeP,
            pattern ScancodeQ,
            pattern ScancodeR,
            pattern ScancodeS,
            pattern ScancodeT,
            pattern ScancodeU,
            pattern ScancodeV,
            pattern ScancodeW,
            pattern ScancodeX,
            pattern ScancodeY,
            pattern ScancodeZ,
            pattern Scancode1,
            pattern Scancode2,
            pattern Scancode3,
            pattern Scancode4,
            pattern Scancode5,
            pattern Scancode6,
            pattern Scancode7,
            pattern Scancode8,
            pattern Scancode9,
            pattern Scancode0,
            pattern ScancodeReturn,
            pattern ScancodeEscape,
            pattern ScancodeBackspace,
            pattern ScancodeTab,
            pattern ScancodeSpace,
            pattern ScancodeMinus,
            pattern ScancodeEquals,
            pattern ScancodeLeftBracket,
            pattern ScancodeRightBracket,
            pattern ScancodeBackslash,
            pattern ScancodeNonUSHash,
            pattern ScancodeSemicolon,
            pattern ScancodeApostrophe,
            pattern ScancodeGrave,
            pattern ScancodeComma,
            pattern ScancodePeriod,
            pattern ScancodeSlash,
            pattern ScancodeCapsLock,
            pattern ScancodeF1,
            pattern ScancodeF2,
            pattern ScancodeF3,
            pattern ScancodeF4,
            pattern ScancodeF5,
            pattern ScancodeF6,
            pattern ScancodeF7,
            pattern ScancodeF8,
            pattern ScancodeF9,
            pattern ScancodeF10,
            pattern ScancodeF11,
            pattern ScancodeF12,
            pattern ScancodePrintScreen,
            pattern ScancodeScrollLock,
            pattern ScancodePause,
            pattern ScancodeInsert,
            pattern ScancodeHome,
            pattern ScancodePageUp,
            pattern ScancodeDelete,
            pattern ScancodeEnd,
            pattern ScancodePageDown,
            pattern ScancodeRight,
            pattern ScancodeLeft,
            pattern ScancodeDown,
            pattern ScancodeUp,
            pattern ScancodeNumLockClear,
            pattern ScancodeKPDivide,
            pattern ScancodeKPMultiply,
            pattern ScancodeKPMinus,
            pattern ScancodeKPPlus,
            pattern ScancodeKPEnter,
            pattern ScancodeKP1,
            pattern ScancodeKP2,
            pattern ScancodeKP3,
            pattern ScancodeKP4,
            pattern ScancodeKP5,
            pattern ScancodeKP6,
            pattern ScancodeKP7,
            pattern ScancodeKP8,
            pattern ScancodeKP9,
            pattern ScancodeKP0,
            pattern ScancodeKPPeriod,
            pattern ScancodeNonUSBackslash,
            pattern ScancodeApplication,
            pattern ScancodePower,
            pattern ScancodeKPEquals,
            pattern ScancodeF13,
            pattern ScancodeF14,
            pattern ScancodeF15,
            pattern ScancodeF16,
            pattern ScancodeF17,
            pattern ScancodeF18,
            pattern ScancodeF19,
            pattern ScancodeF20,
            pattern ScancodeF21,
            pattern ScancodeF22,
            pattern ScancodeF23,
            pattern ScancodeF24,
            pattern ScancodeExecute,
            pattern ScancodeHelp,
            pattern ScancodeMenu,
            pattern ScancodeSelect,
            pattern ScancodeStop,
            pattern ScancodeAgain,
            pattern ScancodeUndo,
            pattern ScancodeCut,
            pattern ScancodeCopy,
            pattern ScancodePaste,
            pattern ScancodeFind,
            pattern ScancodeMute,
            pattern ScancodeVolumeUp,
            pattern ScancodeVolumeDown,
            pattern ScancodeKPComma,
            pattern ScancodeKPEqualsAS400,
            pattern ScancodeInternational1,
            pattern ScancodeInternational2,
            pattern ScancodeInternational3,
            pattern ScancodeInternational4,
            pattern ScancodeInternational5,
            pattern ScancodeInternational6,
            pattern ScancodeInternational7,
            pattern ScancodeInternational8,
            pattern ScancodeInternational9,
            pattern ScancodeLang1,
            pattern ScancodeLang2,
            pattern ScancodeLang3,
            pattern ScancodeLang4,
            pattern ScancodeLang5,
            pattern ScancodeLang6,
            pattern ScancodeLang7,
            pattern ScancodeLang8,
            pattern ScancodeLang9,
            pattern ScancodeAltErase,
            pattern ScancodeSysReq,
            pattern ScancodeCancel,
            pattern ScancodeClear,
            pattern ScancodePrior,
            pattern ScancodeReturn2,
            pattern ScancodeSeparator,
            pattern ScancodeOut,
            pattern ScancodeOper,
            pattern ScancodeClearAgain,
            pattern ScancodeCrSel,
            pattern ScancodeExSel,
            pattern ScancodeKP00,
            pattern ScancodeKP000,
            pattern ScancodeThousandsSeparator,
            pattern ScancodeDecimalSeparator,
            pattern ScancodeCurrencyUnit,
            pattern ScancodeCurrencySubunit,
            pattern ScancodeLeftParen,
            pattern ScancodeRightParen,
            pattern ScancodeLeftBrace,
            pattern ScancodeRightBrace,
            pattern ScancodeKPTab,
            pattern ScancodeKPBackspace,
            pattern ScancodeKPA,
            pattern ScancodeKPB,
            pattern ScancodeKPC,
            pattern ScancodeKPD,
            pattern ScancodeKPE,
            pattern ScancodeKPF,
            pattern ScancodeKPXOR,
            pattern ScancodeKPPower,
            pattern ScancodeKPPercent,
            pattern ScancodeKPLess,
            pattern ScancodeKPGreater,
            pattern ScancodeKPAmpersand,
            pattern ScancodeKPDblAmpersand,
            pattern ScancodeKPVerticalBar,
            pattern ScancodeKPDblVerticalBar,
            pattern ScancodeKPColon,
            pattern ScancodeKPHash,
            pattern ScancodeKPSpace,
            pattern ScancodeKPAt,
            pattern ScancodeKPExclam,
            pattern ScancodeKPMemStore,
            pattern ScancodeKPMemRecall,
            pattern ScancodeKPMemClear,
            pattern ScancodeKPMemAdd,
            pattern ScancodeKPMemSubtract,
            pattern ScancodeKPMemMultiply,
            pattern ScancodeKPMemDivide,
            pattern ScancodeKPPlusMinus,
            pattern ScancodeKPClear,
            pattern ScancodeKPClearEntry,
            pattern ScancodeKPBinary,
            pattern ScancodeKPOctal,
            pattern ScancodeKPDecimal,
            pattern ScancodeKPHexadecimal,
            pattern ScancodeLCtrl,
            pattern ScancodeLShift,
            pattern ScancodeLAlt,
            pattern ScancodeLGUI,
            pattern ScancodeRCtrl,
            pattern ScancodeRShift,
            pattern ScancodeRAlt,
            pattern ScancodeRGUI,
            pattern ScancodeMode,
            pattern ScancodeAudioNext,
            pattern ScancodeAudioPrev,
            pattern ScancodeAudioStop,
            pattern ScancodeAudioPlay,
            pattern ScancodeAudioMute,
            pattern ScancodeMediaSelect,
            pattern ScancodeWWW,
            pattern ScancodeMail,
            pattern ScancodeCalculator,
            pattern ScancodeComputer,
            pattern ScancodeACSearch,
            pattern ScancodeACHome,
            pattern ScancodeACBack,
            pattern ScancodeACForward,
            pattern ScancodeACStop,
            pattern ScancodeACRefresh,
            pattern ScancodeACBookmarks,
            pattern ScancodeBrightnessDown,
            pattern ScancodeBrightnessUp,
            pattern ScancodeDisplaySwitch,
            pattern ScancodeKBDIllumToggle,
            pattern ScancodeKBDIllumDown,
            pattern ScancodeKBDIllumUp,
            pattern ScancodeEject,
            pattern ScancodeSleep,
            pattern ScancodeApp1,
            pattern ScancodeApp2,

            -- * Keycode
            -- | Keycodes are layout-dependent codes, in that the code you receive can change for the same physical key depending on the users keyboard layout.
            -- Think of this as "the user pressed the key that is labelled 'Q' on a specific keyboard."
            -- 'Keycode' makes sense when you are anticipating the user to press either keys that match some mneumonic, or they are entering text.
            Keycode(..),
            pattern KeycodeUnknown,
            pattern KeycodeReturn,
            pattern KeycodeEscape,
            pattern KeycodeBackspace,
            pattern KeycodeTab,
            pattern KeycodeSpace,
            pattern KeycodeExclaim,
            pattern KeycodeQuoteDbl,
            pattern KeycodeHash,
            pattern KeycodePercent,
            pattern KeycodeDollar,
            pattern KeycodeAmpersand,
            pattern KeycodeQuote,
            pattern KeycodeLeftParen,
            pattern KeycodeRightParen,
            pattern KeycodeAsterisk,
            pattern KeycodePlus,
            pattern KeycodeComma,
            pattern KeycodeMinus,
            pattern KeycodePeriod,
            pattern KeycodeSlash,
            pattern Keycode0,
            pattern Keycode1,
            pattern Keycode2,
            pattern Keycode3,
            pattern Keycode4,
            pattern Keycode5,
            pattern Keycode6,
            pattern Keycode7,
            pattern Keycode8,
            pattern Keycode9,
            pattern KeycodeColon,
            pattern KeycodeSemicolon,
            pattern KeycodeLess,
            pattern KeycodeEquals,
            pattern KeycodeGreater,
            pattern KeycodeQuestion,
            pattern KeycodeAt,
            pattern KeycodeLeftBracket,
            pattern KeycodeBackslash,
            pattern KeycodeRightBracket,
            pattern KeycodeCaret,
            pattern KeycodeUnderscore,
            pattern KeycodeBackquote,
            pattern KeycodeA,
            pattern KeycodeB,
            pattern KeycodeC,
            pattern KeycodeD,
            pattern KeycodeE,
            pattern KeycodeF,
            pattern KeycodeG,
            pattern KeycodeH,
            pattern KeycodeI,
            pattern KeycodeJ,
            pattern KeycodeK,
            pattern KeycodeL,
            pattern KeycodeM,
            pattern KeycodeN,
            pattern KeycodeO,
            pattern KeycodeP,
            pattern KeycodeQ,
            pattern KeycodeR,
            pattern KeycodeS,
            pattern KeycodeT,
            pattern KeycodeU,
            pattern KeycodeV,
            pattern KeycodeW,
            pattern KeycodeX,
            pattern KeycodeY,
            pattern KeycodeZ,
            pattern KeycodeCapsLock,
            pattern KeycodeF1,
            pattern KeycodeF2,
            pattern KeycodeF3,
            pattern KeycodeF4,
            pattern KeycodeF5,
            pattern KeycodeF6,
            pattern KeycodeF7,
            pattern KeycodeF8,
            pattern KeycodeF9,
            pattern KeycodeF10,
            pattern KeycodeF11,
            pattern KeycodeF12,
            pattern KeycodePrintScreen,
            pattern KeycodeScrollLock,
            pattern KeycodePause,
            pattern KeycodeInsert,
            pattern KeycodeHome,
            pattern KeycodePageUp,
            pattern KeycodeDelete,
            pattern KeycodeEnd,
            pattern KeycodePageDown,
            pattern KeycodeRight,
            pattern KeycodeLeft,
            pattern KeycodeDown,
            pattern KeycodeUp,
            pattern KeycodeNumLockClear,
            pattern KeycodeKPDivide,
            pattern KeycodeKPMultiply,
            pattern KeycodeKPMinus,
            pattern KeycodeKPPlus,
            pattern KeycodeKPEnter,
            pattern KeycodeKP1,
            pattern KeycodeKP2,
            pattern KeycodeKP3,
            pattern KeycodeKP4,
            pattern KeycodeKP5,
            pattern KeycodeKP6,
            pattern KeycodeKP7,
            pattern KeycodeKP8,
            pattern KeycodeKP9,
            pattern KeycodeKP0,
            pattern KeycodeKPPeriod,
            pattern KeycodeApplication,
            pattern KeycodePower,
            pattern KeycodeKPEquals,
            pattern KeycodeF13,
            pattern KeycodeF14,
            pattern KeycodeF15,
            pattern KeycodeF16,
            pattern KeycodeF17,
            pattern KeycodeF18,
            pattern KeycodeF19,
            pattern KeycodeF20,
            pattern KeycodeF21,
            pattern KeycodeF22,
            pattern KeycodeF23,
            pattern KeycodeF24,
            pattern KeycodeExecute,
            pattern KeycodeHelp,
            pattern KeycodeMenu,
            pattern KeycodeSelect,
            pattern KeycodeStop,
            pattern KeycodeAgain,
            pattern KeycodeUndo,
            pattern KeycodeCut,
            pattern KeycodeCopy,
            pattern KeycodePaste,
            pattern KeycodeFind,
            pattern KeycodeMute,
            pattern KeycodeVolumeUp,
            pattern KeycodeVolumeDown,
            pattern KeycodeKPComma,
            pattern KeycodeKPEqualsAS400,
            pattern KeycodeAltErase,
            pattern KeycodeSysReq,
            pattern KeycodeCancel,
            pattern KeycodeClear,
            pattern KeycodePrior,
            pattern KeycodeReturn2,
            pattern KeycodeSeparator,
            pattern KeycodeOut,
            pattern KeycodeOper,
            pattern KeycodeClearAgain,
            pattern KeycodeCrSel,
            pattern KeycodeExSel,
            pattern KeycodeKP00,
            pattern KeycodeKP000,
            pattern KeycodeThousandsSeparator,
            pattern KeycodeDecimalSeparator,
            pattern KeycodeCurrencyUnit,
            pattern KeycodeCurrencySubunit,
            pattern KeycodeKPLeftParen,
            pattern KeycodeKPRightParen,
            pattern KeycodeKPLeftBrace,
            pattern KeycodeKPRightBrace,
            pattern KeycodeKPTab,
            pattern KeycodeKPBackspace,
            pattern KeycodeKPA,
            pattern KeycodeKPB,
            pattern KeycodeKPC,
            pattern KeycodeKPD,
            pattern KeycodeKPE,
            pattern KeycodeKPF,
            pattern KeycodeKPXor,
            pattern KeycodeKPPower,
            pattern KeycodeKPPercent,
            pattern KeycodeKPLess,
            pattern KeycodeKPGreater,
            pattern KeycodeKPAmpersand,
            pattern KeycodeKPDblAmpersand,
            pattern KeycodeKPVerticalBar,
            pattern KeycodeKPDblVerticalBar,
            pattern KeycodeKPColon,
            pattern KeycodeKPHash,
            pattern KeycodeKPSpace,
            pattern KeycodeKPAt,
            pattern KeycodeKPExclam,
            pattern KeycodeKPMemStore,
            pattern KeycodeKPMemRecall,
            pattern KeycodeKPMemClear,
            pattern KeycodeKPMemAdd,
            pattern KeycodeKPMemSubtract,
            pattern KeycodeKPMemMultiply,
            pattern KeycodeKPMemDivide,
            pattern KeycodeKPPlusMinus,
            pattern KeycodeKPClear,
            pattern KeycodeKPClearEntry,
            pattern KeycodeKPBinary,
            pattern KeycodeKPOctal,
            pattern KeycodeKPDecimal,
            pattern KeycodeKPHexadecimal,
            pattern KeycodeLCtrl,
            pattern KeycodeLShift,
            pattern KeycodeLAlt,
            pattern KeycodeLGUI,
            pattern KeycodeRCtrl,
            pattern KeycodeRShift,
            pattern KeycodeRAlt,
            pattern KeycodeRGUI,
            pattern KeycodeMode,
            pattern KeycodeAudioNext,
            pattern KeycodeAudioPrev,
            pattern KeycodeAudioStop,
            pattern KeycodeAudioPlay,
            pattern KeycodeAudioMute,
            pattern KeycodeMediaSelect,
            pattern KeycodeWWW,
            pattern KeycodeMail,
            pattern KeycodeCalculator,
            pattern KeycodeComputer,
            pattern KeycodeACSearch,
            pattern KeycodeACHome,
            pattern KeycodeACBack,
            pattern KeycodeACForward,
            pattern KeycodeACStop,
            pattern KeycodeACRefresh,
            pattern KeycodeACBookmarks,
            pattern KeycodeBrightnessDown,
            pattern KeycodeBrightnessUp,
            pattern KeycodeDisplaySwitch,
            pattern KeycodeKbdIllumToggle,
            pattern KeycodeKbdIllumDown,
            pattern KeycodeKbdIllumUp,
            pattern KeycodeEject,
            pattern KeycodeSleep)

           where

    import GHC.Generics (Generic)
    import Data.Data (Data)
    import Data.Int
    import Data.Typeable
    import Data.Word
    import SDL.Internal.Numbered
    import qualified SDL.Raw.Enum as Raw

    newtype Scancode = Scancode { unwrapScancode :: Word32 }
      deriving (Bounded, Data, Eq, Ord, Read, Generic, Show, Typeable)

    pattern ScancodeUnknown = Scancode Raw.SDL_SCANCODE_UNKNOWN
    pattern ScancodeA = Scancode Raw.SDL_SCANCODE_A
    pattern ScancodeB = Scancode Raw.SDL_SCANCODE_B
    pattern ScancodeC = Scancode Raw.SDL_SCANCODE_C
    pattern ScancodeD = Scancode Raw.SDL_SCANCODE_D
    pattern ScancodeE = Scancode Raw.SDL_SCANCODE_E
    pattern ScancodeF = Scancode Raw.SDL_SCANCODE_F
    pattern ScancodeG = Scancode Raw.SDL_SCANCODE_G
    pattern ScancodeH = Scancode Raw.SDL_SCANCODE_H
    pattern ScancodeI = Scancode Raw.SDL_SCANCODE_I
    pattern ScancodeJ = Scancode Raw.SDL_SCANCODE_J
    pattern ScancodeK = Scancode Raw.SDL_SCANCODE_K
    pattern ScancodeL = Scancode Raw.SDL_SCANCODE_L
    pattern ScancodeM = Scancode Raw.SDL_SCANCODE_M
    pattern ScancodeN = Scancode Raw.SDL_SCANCODE_N
    pattern ScancodeO = Scancode Raw.SDL_SCANCODE_O
    pattern ScancodeP = Scancode Raw.SDL_SCANCODE_P
    pattern ScancodeQ = Scancode Raw.SDL_SCANCODE_Q
    pattern ScancodeR = Scancode Raw.SDL_SCANCODE_R
    pattern ScancodeS = Scancode Raw.SDL_SCANCODE_S
    pattern ScancodeT = Scancode Raw.SDL_SCANCODE_T
    pattern ScancodeU = Scancode Raw.SDL_SCANCODE_U
    pattern ScancodeV = Scancode Raw.SDL_SCANCODE_V
    pattern ScancodeW = Scancode Raw.SDL_SCANCODE_W
    pattern ScancodeX = Scancode Raw.SDL_SCANCODE_X
    pattern ScancodeY = Scancode Raw.SDL_SCANCODE_Y
    pattern ScancodeZ = Scancode Raw.SDL_SCANCODE_Z
    pattern Scancode1 = Scancode Raw.SDL_SCANCODE_1
    pattern Scancode2 = Scancode Raw.SDL_SCANCODE_2
    pattern Scancode3 = Scancode Raw.SDL_SCANCODE_3
    pattern Scancode4 = Scancode Raw.SDL_SCANCODE_4
    pattern Scancode5 = Scancode Raw.SDL_SCANCODE_5
    pattern Scancode6 = Scancode Raw.SDL_SCANCODE_6
    pattern Scancode7 = Scancode Raw.SDL_SCANCODE_7
    pattern Scancode8 = Scancode Raw.SDL_SCANCODE_8
    pattern Scancode9 = Scancode Raw.SDL_SCANCODE_9
    pattern Scancode0 = Scancode Raw.SDL_SCANCODE_0
    pattern ScancodeReturn = Scancode Raw.SDL_SCANCODE_RETURN
    pattern ScancodeEscape = Scancode Raw.SDL_SCANCODE_ESCAPE
    pattern ScancodeBackspace = Scancode Raw.SDL_SCANCODE_BACKSPACE
    pattern ScancodeTab = Scancode Raw.SDL_SCANCODE_TAB
    pattern ScancodeSpace = Scancode Raw.SDL_SCANCODE_SPACE
    pattern ScancodeMinus = Scancode Raw.SDL_SCANCODE_MINUS
    pattern ScancodeEquals = Scancode Raw.SDL_SCANCODE_EQUALS
    pattern ScancodeLeftBracket = Scancode Raw.SDL_SCANCODE_LEFTBRACKET
    pattern ScancodeRightBracket = Scancode Raw.SDL_SCANCODE_RIGHTBRACKET
    pattern ScancodeBackslash = Scancode Raw.SDL_SCANCODE_BACKSLASH
    pattern ScancodeNonUSHash = Scancode Raw.SDL_SCANCODE_NONUSHASH
    pattern ScancodeSemicolon = Scancode Raw.SDL_SCANCODE_SEMICOLON
    pattern ScancodeApostrophe = Scancode Raw.SDL_SCANCODE_APOSTROPHE
    pattern ScancodeGrave = Scancode Raw.SDL_SCANCODE_GRAVE
    pattern ScancodeComma = Scancode Raw.SDL_SCANCODE_COMMA
    pattern ScancodePeriod = Scancode Raw.SDL_SCANCODE_PERIOD
    pattern ScancodeSlash = Scancode Raw.SDL_SCANCODE_SLASH
    pattern ScancodeCapsLock = Scancode Raw.SDL_SCANCODE_CAPSLOCK
    pattern ScancodeF1 = Scancode Raw.SDL_SCANCODE_F1
    pattern ScancodeF2 = Scancode Raw.SDL_SCANCODE_F2
    pattern ScancodeF3 = Scancode Raw.SDL_SCANCODE_F3
    pattern ScancodeF4 = Scancode Raw.SDL_SCANCODE_F4
    pattern ScancodeF5 = Scancode Raw.SDL_SCANCODE_F5
    pattern ScancodeF6 = Scancode Raw.SDL_SCANCODE_F6
    pattern ScancodeF7 = Scancode Raw.SDL_SCANCODE_F7
    pattern ScancodeF8 = Scancode Raw.SDL_SCANCODE_F8
    pattern ScancodeF9 = Scancode Raw.SDL_SCANCODE_F9
    pattern ScancodeF10 = Scancode Raw.SDL_SCANCODE_F10
    pattern ScancodeF11 = Scancode Raw.SDL_SCANCODE_F11
    pattern ScancodeF12 = Scancode Raw.SDL_SCANCODE_F12
    pattern ScancodePrintScreen = Scancode Raw.SDL_SCANCODE_PRINTSCREEN
    pattern ScancodeScrollLock = Scancode Raw.SDL_SCANCODE_SCROLLLOCK
    pattern ScancodePause = Scancode Raw.SDL_SCANCODE_PAUSE
    pattern ScancodeInsert = Scancode Raw.SDL_SCANCODE_INSERT
    pattern ScancodeHome = Scancode Raw.SDL_SCANCODE_HOME
    pattern ScancodePageUp = Scancode Raw.SDL_SCANCODE_PAGEUP
    pattern ScancodeDelete = Scancode Raw.SDL_SCANCODE_DELETE
    pattern ScancodeEnd = Scancode Raw.SDL_SCANCODE_END
    pattern ScancodePageDown = Scancode Raw.SDL_SCANCODE_PAGEDOWN
    pattern ScancodeRight = Scancode Raw.SDL_SCANCODE_RIGHT
    pattern ScancodeLeft = Scancode Raw.SDL_SCANCODE_LEFT
    pattern ScancodeDown = Scancode Raw.SDL_SCANCODE_DOWN
    pattern ScancodeUp = Scancode Raw.SDL_SCANCODE_UP
    pattern ScancodeNumLockClear = Scancode Raw.SDL_SCANCODE_NUMLOCKCLEAR
    pattern ScancodeKPDivide = Scancode Raw.SDL_SCANCODE_KP_DIVIDE
    pattern ScancodeKPMultiply = Scancode Raw.SDL_SCANCODE_KP_MULTIPLY
    pattern ScancodeKPMinus = Scancode Raw.SDL_SCANCODE_KP_MINUS
    pattern ScancodeKPPlus = Scancode Raw.SDL_SCANCODE_KP_PLUS
    pattern ScancodeKPEnter = Scancode Raw.SDL_SCANCODE_KP_ENTER
    pattern ScancodeKP1 = Scancode Raw.SDL_SCANCODE_KP_1
    pattern ScancodeKP2 = Scancode Raw.SDL_SCANCODE_KP_2
    pattern ScancodeKP3 = Scancode Raw.SDL_SCANCODE_KP_3
    pattern ScancodeKP4 = Scancode Raw.SDL_SCANCODE_KP_4
    pattern ScancodeKP5 = Scancode Raw.SDL_SCANCODE_KP_5
    pattern ScancodeKP6 = Scancode Raw.SDL_SCANCODE_KP_6
    pattern ScancodeKP7 = Scancode Raw.SDL_SCANCODE_KP_7
    pattern ScancodeKP8 = Scancode Raw.SDL_SCANCODE_KP_8
    pattern ScancodeKP9 = Scancode Raw.SDL_SCANCODE_KP_9
    pattern ScancodeKP0 = Scancode Raw.SDL_SCANCODE_KP_0
    pattern ScancodeKPPeriod = Scancode Raw.SDL_SCANCODE_KP_PERIOD
    pattern ScancodeNonUSBackslash = Scancode Raw.SDL_SCANCODE_NONUSBACKSLASH
    pattern ScancodeApplication = Scancode Raw.SDL_SCANCODE_APPLICATION
    pattern ScancodePower = Scancode Raw.SDL_SCANCODE_POWER
    pattern ScancodeKPEquals = Scancode Raw.SDL_SCANCODE_KP_EQUALS
    pattern ScancodeF13 = Scancode Raw.SDL_SCANCODE_F13
    pattern ScancodeF14 = Scancode Raw.SDL_SCANCODE_F14
    pattern ScancodeF15 = Scancode Raw.SDL_SCANCODE_F15
    pattern ScancodeF16 = Scancode Raw.SDL_SCANCODE_F16
    pattern ScancodeF17 = Scancode Raw.SDL_SCANCODE_F17
    pattern ScancodeF18 = Scancode Raw.SDL_SCANCODE_F18
    pattern ScancodeF19 = Scancode Raw.SDL_SCANCODE_F19
    pattern ScancodeF20 = Scancode Raw.SDL_SCANCODE_F20
    pattern ScancodeF21 = Scancode Raw.SDL_SCANCODE_F21
    pattern ScancodeF22 = Scancode Raw.SDL_SCANCODE_F22
    pattern ScancodeF23 = Scancode Raw.SDL_SCANCODE_F23
    pattern ScancodeF24 = Scancode Raw.SDL_SCANCODE_F24
    pattern ScancodeExecute = Scancode Raw.SDL_SCANCODE_EXECUTE
    pattern ScancodeHelp = Scancode Raw.SDL_SCANCODE_HELP
    pattern ScancodeMenu = Scancode Raw.SDL_SCANCODE_MENU
    pattern ScancodeSelect = Scancode Raw.SDL_SCANCODE_SELECT
    pattern ScancodeStop = Scancode Raw.SDL_SCANCODE_STOP
    pattern ScancodeAgain = Scancode Raw.SDL_SCANCODE_AGAIN
    pattern ScancodeUndo = Scancode Raw.SDL_SCANCODE_UNDO
    pattern ScancodeCut = Scancode Raw.SDL_SCANCODE_CUT
    pattern ScancodeCopy = Scancode Raw.SDL_SCANCODE_COPY
    pattern ScancodePaste = Scancode Raw.SDL_SCANCODE_PASTE
    pattern ScancodeFind = Scancode Raw.SDL_SCANCODE_FIND
    pattern ScancodeMute = Scancode Raw.SDL_SCANCODE_MUTE
    pattern ScancodeVolumeUp = Scancode Raw.SDL_SCANCODE_VOLUMEUP
    pattern ScancodeVolumeDown = Scancode Raw.SDL_SCANCODE_VOLUMEDOWN
    pattern ScancodeKPComma = Scancode Raw.SDL_SCANCODE_KP_COMMA
    pattern ScancodeKPEqualsAS400 = Scancode Raw.SDL_SCANCODE_KP_EQUALSAS400
    pattern ScancodeInternational1 = Scancode Raw.SDL_SCANCODE_INTERNATIONAL1
    pattern ScancodeInternational2 = Scancode Raw.SDL_SCANCODE_INTERNATIONAL2
    pattern ScancodeInternational3 = Scancode Raw.SDL_SCANCODE_INTERNATIONAL3
    pattern ScancodeInternational4 = Scancode Raw.SDL_SCANCODE_INTERNATIONAL4
    pattern ScancodeInternational5 = Scancode Raw.SDL_SCANCODE_INTERNATIONAL5
    pattern ScancodeInternational6 = Scancode Raw.SDL_SCANCODE_INTERNATIONAL6
    pattern ScancodeInternational7 = Scancode Raw.SDL_SCANCODE_INTERNATIONAL7
    pattern ScancodeInternational8 = Scancode Raw.SDL_SCANCODE_INTERNATIONAL8
    pattern ScancodeInternational9 = Scancode Raw.SDL_SCANCODE_INTERNATIONAL9
    pattern ScancodeLang1 = Scancode Raw.SDL_SCANCODE_LANG1
    pattern ScancodeLang2 = Scancode Raw.SDL_SCANCODE_LANG2
    pattern ScancodeLang3 = Scancode Raw.SDL_SCANCODE_LANG3
    pattern ScancodeLang4 = Scancode Raw.SDL_SCANCODE_LANG4
    pattern ScancodeLang5 = Scancode Raw.SDL_SCANCODE_LANG5
    pattern ScancodeLang6 = Scancode Raw.SDL_SCANCODE_LANG6
    pattern ScancodeLang7 = Scancode Raw.SDL_SCANCODE_LANG7
    pattern ScancodeLang8 = Scancode Raw.SDL_SCANCODE_LANG8
    pattern ScancodeLang9 = Scancode Raw.SDL_SCANCODE_LANG9
    pattern ScancodeAltErase = Scancode Raw.SDL_SCANCODE_ALTERASE
    pattern ScancodeSysReq = Scancode Raw.SDL_SCANCODE_SYSREQ
    pattern ScancodeCancel = Scancode Raw.SDL_SCANCODE_CANCEL
    pattern ScancodeClear = Scancode Raw.SDL_SCANCODE_CLEAR
    pattern ScancodePrior = Scancode Raw.SDL_SCANCODE_PRIOR
    pattern ScancodeReturn2 = Scancode Raw.SDL_SCANCODE_RETURN2
    pattern ScancodeSeparator = Scancode Raw.SDL_SCANCODE_SEPARATOR
    pattern ScancodeOut = Scancode Raw.SDL_SCANCODE_OUT
    pattern ScancodeOper = Scancode Raw.SDL_SCANCODE_OPER
    pattern ScancodeClearAgain = Scancode Raw.SDL_SCANCODE_CLEARAGAIN
    pattern ScancodeCrSel = Scancode Raw.SDL_SCANCODE_CRSEL
    pattern ScancodeExSel = Scancode Raw.SDL_SCANCODE_EXSEL
    pattern ScancodeKP00 = Scancode Raw.SDL_SCANCODE_KP_00
    pattern ScancodeKP000 = Scancode Raw.SDL_SCANCODE_KP_000
    pattern ScancodeThousandsSeparator = Scancode Raw.SDL_SCANCODE_THOUSANDSSEPARATOR
    pattern ScancodeDecimalSeparator = Scancode Raw.SDL_SCANCODE_DECIMALSEPARATOR
    pattern ScancodeCurrencyUnit = Scancode Raw.SDL_SCANCODE_CURRENCYUNIT
    pattern ScancodeCurrencySubunit = Scancode Raw.SDL_SCANCODE_CURRENCYSUBUNIT
    pattern ScancodeLeftParen = Scancode Raw.SDL_SCANCODE_KP_LEFTPAREN
    pattern ScancodeRightParen = Scancode Raw.SDL_SCANCODE_KP_RIGHTPAREN
    pattern ScancodeLeftBrace = Scancode Raw.SDL_SCANCODE_KP_LEFTBRACE
    pattern ScancodeRightBrace = Scancode Raw.SDL_SCANCODE_KP_RIGHTBRACE
    pattern ScancodeKPTab = Scancode Raw.SDL_SCANCODE_KP_TAB
    pattern ScancodeKPBackspace = Scancode Raw.SDL_SCANCODE_KP_BACKSPACE
    pattern ScancodeKPA = Scancode Raw.SDL_SCANCODE_KP_A
    pattern ScancodeKPB = Scancode Raw.SDL_SCANCODE_KP_B
    pattern ScancodeKPC = Scancode Raw.SDL_SCANCODE_KP_C
    pattern ScancodeKPD = Scancode Raw.SDL_SCANCODE_KP_D
    pattern ScancodeKPE = Scancode Raw.SDL_SCANCODE_KP_E
    pattern ScancodeKPF = Scancode Raw.SDL_SCANCODE_KP_F
    pattern ScancodeKPXOR = Scancode Raw.SDL_SCANCODE_KP_XOR
    pattern ScancodeKPPower = Scancode Raw.SDL_SCANCODE_KP_POWER
    pattern ScancodeKPPercent = Scancode Raw.SDL_SCANCODE_KP_PERCENT
    pattern ScancodeKPLess = Scancode Raw.SDL_SCANCODE_KP_LESS
    pattern ScancodeKPGreater = Scancode Raw.SDL_SCANCODE_KP_GREATER
    pattern ScancodeKPAmpersand = Scancode Raw.SDL_SCANCODE_KP_AMPERSAND
    pattern ScancodeKPDblAmpersand = Scancode Raw.SDL_SCANCODE_KP_DBLAMPERSAND
    pattern ScancodeKPVerticalBar = Scancode Raw.SDL_SCANCODE_KP_VERTICALBAR
    pattern ScancodeKPDblVerticalBar = Scancode Raw.SDL_SCANCODE_KP_DBLVERTICALBAR
    pattern ScancodeKPColon = Scancode Raw.SDL_SCANCODE_KP_COLON
    pattern ScancodeKPHash = Scancode Raw.SDL_SCANCODE_KP_HASH
    pattern ScancodeKPSpace = Scancode Raw.SDL_SCANCODE_KP_SPACE
    pattern ScancodeKPAt = Scancode Raw.SDL_SCANCODE_KP_AT
    pattern ScancodeKPExclam = Scancode Raw.SDL_SCANCODE_KP_EXCLAM
    pattern ScancodeKPMemStore = Scancode Raw.SDL_SCANCODE_KP_MEMSTORE
    pattern ScancodeKPMemRecall = Scancode Raw.SDL_SCANCODE_KP_MEMRECALL
    pattern ScancodeKPMemClear = Scancode Raw.SDL_SCANCODE_KP_MEMCLEAR
    pattern ScancodeKPMemAdd = Scancode Raw.SDL_SCANCODE_KP_MEMADD
    pattern ScancodeKPMemSubtract = Scancode Raw.SDL_SCANCODE_KP_MEMSUBTRACT
    pattern ScancodeKPMemMultiply = Scancode Raw.SDL_SCANCODE_KP_MEMMULTIPLY
    pattern ScancodeKPMemDivide = Scancode Raw.SDL_SCANCODE_KP_MEMDIVIDE
    pattern ScancodeKPPlusMinus = Scancode Raw.SDL_SCANCODE_KP_PLUSMINUS
    pattern ScancodeKPClear = Scancode Raw.SDL_SCANCODE_KP_CLEAR
    pattern ScancodeKPClearEntry = Scancode Raw.SDL_SCANCODE_KP_CLEARENTRY
    pattern ScancodeKPBinary = Scancode Raw.SDL_SCANCODE_KP_BINARY
    pattern ScancodeKPOctal = Scancode Raw.SDL_SCANCODE_KP_OCTAL
    pattern ScancodeKPDecimal = Scancode Raw.SDL_SCANCODE_KP_DECIMAL
    pattern ScancodeKPHexadecimal = Scancode Raw.SDL_SCANCODE_KP_HEXADECIMAL
    pattern ScancodeLCtrl = Scancode Raw.SDL_SCANCODE_LCTRL
    pattern ScancodeLShift = Scancode Raw.SDL_SCANCODE_LSHIFT
    pattern ScancodeLAlt = Scancode Raw.SDL_SCANCODE_LALT
    pattern ScancodeLGUI = Scancode Raw.SDL_SCANCODE_LGUI
    pattern ScancodeRCtrl = Scancode Raw.SDL_SCANCODE_RCTRL
    pattern ScancodeRShift = Scancode Raw.SDL_SCANCODE_RSHIFT
    pattern ScancodeRAlt = Scancode Raw.SDL_SCANCODE_RALT
    pattern ScancodeRGUI = Scancode Raw.SDL_SCANCODE_RGUI
    pattern ScancodeMode = Scancode Raw.SDL_SCANCODE_MODE
    pattern ScancodeAudioNext = Scancode Raw.SDL_SCANCODE_AUDIONEXT
    pattern ScancodeAudioPrev = Scancode Raw.SDL_SCANCODE_AUDIOPREV
    pattern ScancodeAudioStop = Scancode Raw.SDL_SCANCODE_AUDIOSTOP
    pattern ScancodeAudioPlay = Scancode Raw.SDL_SCANCODE_AUDIOPLAY
    pattern ScancodeAudioMute = Scancode Raw.SDL_SCANCODE_AUDIOMUTE
    pattern ScancodeMediaSelect = Scancode Raw.SDL_SCANCODE_MEDIASELECT
    pattern ScancodeWWW = Scancode Raw.SDL_SCANCODE_WWW
    pattern ScancodeMail = Scancode Raw.SDL_SCANCODE_MAIL
    pattern ScancodeCalculator = Scancode Raw.SDL_SCANCODE_CALCULATOR
    pattern ScancodeComputer = Scancode Raw.SDL_SCANCODE_COMPUTER
    pattern ScancodeACSearch = Scancode Raw.SDL_SCANCODE_AC_SEARCH
    pattern ScancodeACHome = Scancode Raw.SDL_SCANCODE_AC_HOME
    pattern ScancodeACBack = Scancode Raw.SDL_SCANCODE_AC_BACK
    pattern ScancodeACForward = Scancode Raw.SDL_SCANCODE_AC_FORWARD
    pattern ScancodeACStop = Scancode Raw.SDL_SCANCODE_AC_STOP
    pattern ScancodeACRefresh = Scancode Raw.SDL_SCANCODE_AC_REFRESH
    pattern ScancodeACBookmarks = Scancode Raw.SDL_SCANCODE_AC_BOOKMARKS
    pattern ScancodeBrightnessDown = Scancode Raw.SDL_SCANCODE_BRIGHTNESSDOWN
    pattern ScancodeBrightnessUp = Scancode Raw.SDL_SCANCODE_BRIGHTNESSUP
    pattern ScancodeDisplaySwitch = Scancode Raw.SDL_SCANCODE_DISPLAYSWITCH
    pattern ScancodeKBDIllumToggle = Scancode Raw.SDL_SCANCODE_KBDILLUMTOGGLE
    pattern ScancodeKBDIllumDown = Scancode Raw.SDL_SCANCODE_KBDILLUMDOWN
    pattern ScancodeKBDIllumUp = Scancode Raw.SDL_SCANCODE_KBDILLUMUP
    pattern ScancodeEject = Scancode Raw.SDL_SCANCODE_EJECT
    pattern ScancodeSleep = Scancode Raw.SDL_SCANCODE_SLEEP
    pattern ScancodeApp1 = Scancode Raw.SDL_SCANCODE_APP1
    pattern ScancodeApp2 = Scancode Raw.SDL_SCANCODE_APP2

    instance FromNumber Scancode Word32 where
      fromNumber = Scancode

    instance ToNumber Scancode Word32 where
      toNumber = unwrapScancode

    newtype Keycode = Keycode { unwrapKeycode :: Int32 }
      deriving (Bounded, Data, Eq, Ord, Read, Generic, Show, Typeable)

    pattern KeycodeUnknown = Keycode Raw.SDLK_UNKNOWN
    pattern KeycodeReturn = Keycode Raw.SDLK_RETURN
    pattern KeycodeEscape = Keycode Raw.SDLK_ESCAPE
    pattern KeycodeBackspace = Keycode Raw.SDLK_BACKSPACE
    pattern KeycodeTab = Keycode Raw.SDLK_TAB
    pattern KeycodeSpace = Keycode Raw.SDLK_SPACE
    pattern KeycodeExclaim = Keycode Raw.SDLK_EXCLAIM
    pattern KeycodeQuoteDbl = Keycode Raw.SDLK_QUOTEDBL
    pattern KeycodeHash = Keycode Raw.SDLK_HASH
    pattern KeycodePercent = Keycode Raw.SDLK_PERCENT
    pattern KeycodeDollar = Keycode Raw.SDLK_DOLLAR
    pattern KeycodeAmpersand = Keycode Raw.SDLK_AMPERSAND
    pattern KeycodeQuote = Keycode Raw.SDLK_QUOTE
    pattern KeycodeLeftParen = Keycode Raw.SDLK_LEFTPAREN
    pattern KeycodeRightParen = Keycode Raw.SDLK_RIGHTPAREN
    pattern KeycodeAsterisk = Keycode Raw.SDLK_ASTERISK
    pattern KeycodePlus = Keycode Raw.SDLK_PLUS
    pattern KeycodeComma = Keycode Raw.SDLK_COMMA
    pattern KeycodeMinus = Keycode Raw.SDLK_MINUS
    pattern KeycodePeriod = Keycode Raw.SDLK_PERIOD
    pattern KeycodeSlash = Keycode Raw.SDLK_SLASH
    pattern Keycode0 = Keycode Raw.SDLK_0
    pattern Keycode1 = Keycode Raw.SDLK_1
    pattern Keycode2 = Keycode Raw.SDLK_2
    pattern Keycode3 = Keycode Raw.SDLK_3
    pattern Keycode4 = Keycode Raw.SDLK_4
    pattern Keycode5 = Keycode Raw.SDLK_5
    pattern Keycode6 = Keycode Raw.SDLK_6
    pattern Keycode7 = Keycode Raw.SDLK_7
    pattern Keycode8 = Keycode Raw.SDLK_8
    pattern Keycode9 = Keycode Raw.SDLK_9
    pattern KeycodeColon = Keycode Raw.SDLK_COLON
    pattern KeycodeSemicolon = Keycode Raw.SDLK_SEMICOLON
    pattern KeycodeLess = Keycode Raw.SDLK_LESS
    pattern KeycodeEquals = Keycode Raw.SDLK_EQUALS
    pattern KeycodeGreater = Keycode Raw.SDLK_GREATER
    pattern KeycodeQuestion = Keycode Raw.SDLK_QUESTION
    pattern KeycodeAt = Keycode Raw.SDLK_AT
    pattern KeycodeLeftBracket = Keycode Raw.SDLK_LEFTBRACKET
    pattern KeycodeBackslash = Keycode Raw.SDLK_BACKSLASH
    pattern KeycodeRightBracket = Keycode Raw.SDLK_RIGHTBRACKET
    pattern KeycodeCaret = Keycode Raw.SDLK_CARET
    pattern KeycodeUnderscore = Keycode Raw.SDLK_UNDERSCORE
    pattern KeycodeBackquote = Keycode Raw.SDLK_BACKQUOTE
    pattern KeycodeA = Keycode Raw.SDLK_a
    pattern KeycodeB = Keycode Raw.SDLK_b
    pattern KeycodeC = Keycode Raw.SDLK_c
    pattern KeycodeD = Keycode Raw.SDLK_d
    pattern KeycodeE = Keycode Raw.SDLK_e
    pattern KeycodeF = Keycode Raw.SDLK_f
    pattern KeycodeG = Keycode Raw.SDLK_g
    pattern KeycodeH = Keycode Raw.SDLK_h
    pattern KeycodeI = Keycode Raw.SDLK_i
    pattern KeycodeJ = Keycode Raw.SDLK_j
    pattern KeycodeK = Keycode Raw.SDLK_k
    pattern KeycodeL = Keycode Raw.SDLK_l
    pattern KeycodeM = Keycode Raw.SDLK_m
    pattern KeycodeN = Keycode Raw.SDLK_n
    pattern KeycodeO = Keycode Raw.SDLK_o
    pattern KeycodeP = Keycode Raw.SDLK_p
    pattern KeycodeQ = Keycode Raw.SDLK_q
    pattern KeycodeR = Keycode Raw.SDLK_r
    pattern KeycodeS = Keycode Raw.SDLK_s
    pattern KeycodeT = Keycode Raw.SDLK_t
    pattern KeycodeU = Keycode Raw.SDLK_u
    pattern KeycodeV = Keycode Raw.SDLK_v
    pattern KeycodeW = Keycode Raw.SDLK_w
    pattern KeycodeX = Keycode Raw.SDLK_x
    pattern KeycodeY = Keycode Raw.SDLK_y
    pattern KeycodeZ = Keycode Raw.SDLK_z
    pattern KeycodeCapsLock = Keycode Raw.SDLK_CAPSLOCK
    pattern KeycodeF1 = Keycode Raw.SDLK_F1
    pattern KeycodeF2 = Keycode Raw.SDLK_F2
    pattern KeycodeF3 = Keycode Raw.SDLK_F3
    pattern KeycodeF4 = Keycode Raw.SDLK_F4
    pattern KeycodeF5 = Keycode Raw.SDLK_F5
    pattern KeycodeF6 = Keycode Raw.SDLK_F6
    pattern KeycodeF7 = Keycode Raw.SDLK_F7
    pattern KeycodeF8 = Keycode Raw.SDLK_F8
    pattern KeycodeF9 = Keycode Raw.SDLK_F9
    pattern KeycodeF10 = Keycode Raw.SDLK_F10
    pattern KeycodeF11 = Keycode Raw.SDLK_F11
    pattern KeycodeF12 = Keycode Raw.SDLK_F12
    pattern KeycodePrintScreen = Keycode Raw.SDLK_PRINTSCREEN
    pattern KeycodeScrollLock = Keycode Raw.SDLK_SCROLLLOCK
    pattern KeycodePause = Keycode Raw.SDLK_PAUSE
    pattern KeycodeInsert = Keycode Raw.SDLK_INSERT
    pattern KeycodeHome = Keycode Raw.SDLK_HOME
    pattern KeycodePageUp = Keycode Raw.SDLK_PAGEUP
    pattern KeycodeDelete = Keycode Raw.SDLK_DELETE
    pattern KeycodeEnd = Keycode Raw.SDLK_END
    pattern KeycodePageDown = Keycode Raw.SDLK_PAGEDOWN
    pattern KeycodeRight = Keycode Raw.SDLK_RIGHT
    pattern KeycodeLeft = Keycode Raw.SDLK_LEFT
    pattern KeycodeDown = Keycode Raw.SDLK_DOWN
    pattern KeycodeUp = Keycode Raw.SDLK_UP
    pattern KeycodeNumLockClear = Keycode Raw.SDLK_NUMLOCKCLEAR
    pattern KeycodeKPDivide = Keycode Raw.SDLK_KP_DIVIDE
    pattern KeycodeKPMultiply = Keycode Raw.SDLK_KP_MULTIPLY
    pattern KeycodeKPMinus = Keycode Raw.SDLK_KP_MINUS
    pattern KeycodeKPPlus = Keycode Raw.SDLK_KP_PLUS
    pattern KeycodeKPEnter = Keycode Raw.SDLK_KP_ENTER
    pattern KeycodeKP1 = Keycode Raw.SDLK_KP_1
    pattern KeycodeKP2 = Keycode Raw.SDLK_KP_2
    pattern KeycodeKP3 = Keycode Raw.SDLK_KP_3
    pattern KeycodeKP4 = Keycode Raw.SDLK_KP_4
    pattern KeycodeKP5 = Keycode Raw.SDLK_KP_5
    pattern KeycodeKP6 = Keycode Raw.SDLK_KP_6
    pattern KeycodeKP7 = Keycode Raw.SDLK_KP_7
    pattern KeycodeKP8 = Keycode Raw.SDLK_KP_8
    pattern KeycodeKP9 = Keycode Raw.SDLK_KP_9
    pattern KeycodeKP0 = Keycode Raw.SDLK_KP_0
    pattern KeycodeKPPeriod = Keycode Raw.SDLK_KP_PERIOD
    pattern KeycodeApplication = Keycode Raw.SDLK_APPLICATION
    pattern KeycodePower = Keycode Raw.SDLK_POWER
    pattern KeycodeKPEquals = Keycode Raw.SDLK_KP_EQUALS
    pattern KeycodeF13 = Keycode Raw.SDLK_F13
    pattern KeycodeF14 = Keycode Raw.SDLK_F14
    pattern KeycodeF15 = Keycode Raw.SDLK_F15
    pattern KeycodeF16 = Keycode Raw.SDLK_F16
    pattern KeycodeF17 = Keycode Raw.SDLK_F17
    pattern KeycodeF18 = Keycode Raw.SDLK_F18
    pattern KeycodeF19 = Keycode Raw.SDLK_F19
    pattern KeycodeF20 = Keycode Raw.SDLK_F20
    pattern KeycodeF21 = Keycode Raw.SDLK_F21
    pattern KeycodeF22 = Keycode Raw.SDLK_F22
    pattern KeycodeF23 = Keycode Raw.SDLK_F23
    pattern KeycodeF24 = Keycode Raw.SDLK_F24
    pattern KeycodeExecute = Keycode Raw.SDLK_EXECUTE
    pattern KeycodeHelp = Keycode Raw.SDLK_HELP
    pattern KeycodeMenu = Keycode Raw.SDLK_MENU
    pattern KeycodeSelect = Keycode Raw.SDLK_SELECT
    pattern KeycodeStop = Keycode Raw.SDLK_STOP
    pattern KeycodeAgain = Keycode Raw.SDLK_AGAIN
    pattern KeycodeUndo = Keycode Raw.SDLK_UNDO
    pattern KeycodeCut = Keycode Raw.SDLK_CUT
    pattern KeycodeCopy = Keycode Raw.SDLK_COPY
    pattern KeycodePaste = Keycode Raw.SDLK_PASTE
    pattern KeycodeFind = Keycode Raw.SDLK_FIND
    pattern KeycodeMute = Keycode Raw.SDLK_MUTE
    pattern KeycodeVolumeUp = Keycode Raw.SDLK_VOLUMEUP
    pattern KeycodeVolumeDown = Keycode Raw.SDLK_VOLUMEDOWN
    pattern KeycodeKPComma = Keycode Raw.SDLK_KP_COMMA
    pattern KeycodeKPEqualsAS400 = Keycode Raw.SDLK_KP_EQUALSAS400
    pattern KeycodeAltErase = Keycode Raw.SDLK_ALTERASE
    pattern KeycodeSysReq = Keycode Raw.SDLK_SYSREQ
    pattern KeycodeCancel = Keycode Raw.SDLK_CANCEL
    pattern KeycodeClear = Keycode Raw.SDLK_CLEAR
    pattern KeycodePrior = Keycode Raw.SDLK_PRIOR
    pattern KeycodeReturn2 = Keycode Raw.SDLK_RETURN2
    pattern KeycodeSeparator = Keycode Raw.SDLK_SEPARATOR
    pattern KeycodeOut = Keycode Raw.SDLK_OUT
    pattern KeycodeOper = Keycode Raw.SDLK_OPER
    pattern KeycodeClearAgain = Keycode Raw.SDLK_CLEARAGAIN
    pattern KeycodeCrSel = Keycode Raw.SDLK_CRSEL
    pattern KeycodeExSel = Keycode Raw.SDLK_EXSEL
    pattern KeycodeKP00 = Keycode Raw.SDLK_KP_00
    pattern KeycodeKP000 = Keycode Raw.SDLK_KP_000
    pattern KeycodeThousandsSeparator = Keycode Raw.SDLK_THOUSANDSSEPARATOR
    pattern KeycodeDecimalSeparator = Keycode Raw.SDLK_DECIMALSEPARATOR
    pattern KeycodeCurrencyUnit = Keycode Raw.SDLK_CURRENCYUNIT
    pattern KeycodeCurrencySubunit = Keycode Raw.SDLK_CURRENCYSUBUNIT
    pattern KeycodeKPLeftParen = Keycode Raw.SDLK_KP_LEFTPAREN
    pattern KeycodeKPRightParen = Keycode Raw.SDLK_KP_RIGHTPAREN
    pattern KeycodeKPLeftBrace = Keycode Raw.SDLK_KP_LEFTBRACE
    pattern KeycodeKPRightBrace = Keycode Raw.SDLK_KP_RIGHTBRACE
    pattern KeycodeKPTab = Keycode Raw.SDLK_KP_TAB
    pattern KeycodeKPBackspace = Keycode Raw.SDLK_KP_BACKSPACE
    pattern KeycodeKPA = Keycode Raw.SDLK_KP_A
    pattern KeycodeKPB = Keycode Raw.SDLK_KP_B
    pattern KeycodeKPC = Keycode Raw.SDLK_KP_C
    pattern KeycodeKPD = Keycode Raw.SDLK_KP_D
    pattern KeycodeKPE = Keycode Raw.SDLK_KP_E
    pattern KeycodeKPF = Keycode Raw.SDLK_KP_F
    pattern KeycodeKPXor = Keycode Raw.SDLK_KP_XOR
    pattern KeycodeKPPower = Keycode Raw.SDLK_KP_POWER
    pattern KeycodeKPPercent = Keycode Raw.SDLK_KP_PERCENT
    pattern KeycodeKPLess = Keycode Raw.SDLK_KP_LESS
    pattern KeycodeKPGreater = Keycode Raw.SDLK_KP_GREATER
    pattern KeycodeKPAmpersand = Keycode Raw.SDLK_KP_AMPERSAND
    pattern KeycodeKPDblAmpersand = Keycode Raw.SDLK_KP_DBLAMPERSAND
    pattern KeycodeKPVerticalBar = Keycode Raw.SDLK_KP_VERTICALBAR
    pattern KeycodeKPDblVerticalBar = Keycode Raw.SDLK_KP_DBLVERTICALBAR
    pattern KeycodeKPColon = Keycode Raw.SDLK_KP_COLON
    pattern KeycodeKPHash = Keycode Raw.SDLK_KP_HASH
    pattern KeycodeKPSpace = Keycode Raw.SDLK_KP_SPACE
    pattern KeycodeKPAt = Keycode Raw.SDLK_KP_AT
    pattern KeycodeKPExclam = Keycode Raw.SDLK_KP_EXCLAM
    pattern KeycodeKPMemStore = Keycode Raw.SDLK_KP_MEMSTORE
    pattern KeycodeKPMemRecall = Keycode Raw.SDLK_KP_MEMRECALL
    pattern KeycodeKPMemClear = Keycode Raw.SDLK_KP_MEMCLEAR
    pattern KeycodeKPMemAdd = Keycode Raw.SDLK_KP_MEMADD
    pattern KeycodeKPMemSubtract = Keycode Raw.SDLK_KP_MEMSUBTRACT
    pattern KeycodeKPMemMultiply = Keycode Raw.SDLK_KP_MEMMULTIPLY
    pattern KeycodeKPMemDivide = Keycode Raw.SDLK_KP_MEMDIVIDE
    pattern KeycodeKPPlusMinus = Keycode Raw.SDLK_KP_PLUSMINUS
    pattern KeycodeKPClear = Keycode Raw.SDLK_KP_CLEAR
    pattern KeycodeKPClearEntry = Keycode Raw.SDLK_KP_CLEARENTRY
    pattern KeycodeKPBinary = Keycode Raw.SDLK_KP_BINARY
    pattern KeycodeKPOctal = Keycode Raw.SDLK_KP_OCTAL
    pattern KeycodeKPDecimal = Keycode Raw.SDLK_KP_DECIMAL
    pattern KeycodeKPHexadecimal = Keycode Raw.SDLK_KP_HEXADECIMAL
    pattern KeycodeLCtrl = Keycode Raw.SDLK_LCTRL
    pattern KeycodeLShift = Keycode Raw.SDLK_LSHIFT
    pattern KeycodeLAlt = Keycode Raw.SDLK_LALT
    pattern KeycodeLGUI = Keycode Raw.SDLK_LGUI
    pattern KeycodeRCtrl = Keycode Raw.SDLK_RCTRL
    pattern KeycodeRShift = Keycode Raw.SDLK_RSHIFT
    pattern KeycodeRAlt = Keycode Raw.SDLK_RALT
    pattern KeycodeRGUI = Keycode Raw.SDLK_RGUI
    pattern KeycodeMode = Keycode Raw.SDLK_MODE
    pattern KeycodeAudioNext = Keycode Raw.SDLK_AUDIONEXT
    pattern KeycodeAudioPrev = Keycode Raw.SDLK_AUDIOPREV
    pattern KeycodeAudioStop = Keycode Raw.SDLK_AUDIOSTOP
    pattern KeycodeAudioPlay = Keycode Raw.SDLK_AUDIOPLAY
    pattern KeycodeAudioMute = Keycode Raw.SDLK_AUDIOMUTE
    pattern KeycodeMediaSelect = Keycode Raw.SDLK_MEDIASELECT
    pattern KeycodeWWW = Keycode Raw.SDLK_WWW
    pattern KeycodeMail = Keycode Raw.SDLK_MAIL
    pattern KeycodeCalculator = Keycode Raw.SDLK_CALCULATOR
    pattern KeycodeComputer = Keycode Raw.SDLK_COMPUTER
    pattern KeycodeACSearch = Keycode Raw.SDLK_AC_SEARCH
    pattern KeycodeACHome = Keycode Raw.SDLK_AC_HOME
    pattern KeycodeACBack = Keycode Raw.SDLK_AC_BACK
    pattern KeycodeACForward = Keycode Raw.SDLK_AC_FORWARD
    pattern KeycodeACStop = Keycode Raw.SDLK_AC_STOP
    pattern KeycodeACRefresh = Keycode Raw.SDLK_AC_REFRESH
    pattern KeycodeACBookmarks = Keycode Raw.SDLK_AC_BOOKMARKS
    pattern KeycodeBrightnessDown = Keycode Raw.SDLK_BRIGHTNESSDOWN
    pattern KeycodeBrightnessUp = Keycode Raw.SDLK_BRIGHTNESSUP
    pattern KeycodeDisplaySwitch = Keycode Raw.SDLK_DISPLAYSWITCH
    pattern KeycodeKbdIllumToggle = Keycode Raw.SDLK_KBDILLUMTOGGLE
    pattern KeycodeKbdIllumDown = Keycode Raw.SDLK_KBDILLUMDOWN
    pattern KeycodeKbdIllumUp = Keycode Raw.SDLK_KBDILLUMUP
    pattern KeycodeEject = Keycode Raw.SDLK_EJECT
    pattern KeycodeSleep = Keycode Raw.SDLK_SLEEP

    instance FromNumber Keycode Int32 where
      fromNumber = Keycode

    instance ToNumber Keycode Int32 where
      toNumber = unwrapKeycode