    {-# LANGUAGE CPP #-}
    #if __GLASGOW_HASKELL__ >= 703
    {-# LANGUAGE Safe #-}
    #endif
    -- |
    -- Maintainer  : judah.jacobson@gmail.com
    -- Stability   : experimental
    -- Portability : portable (FFI)
    --
    -- The string capabilities in this module are the character sequences
    -- corresponding to user input such as arrow keys and function keys.
    module System.Console.Terminfo.Keys(
                        -- * The keypad
                        -- | The following commands
                        -- turn the keypad on\/off (@smkx@ and @rmkx@).
                        -- They have no effect if those capabilities are not defined.
                        -- For portability between terminals, the keypad should be
                        -- explicitly turned on before accepting user key input.
                        keypadOn,
                        keypadOff,
                        -- * Arrow keys
                        keyUp,
                        keyDown,
                        keyLeft,
                        keyRight,
                        -- * Miscellaneous
                        functionKey,
                        keyBackspace,
                        keyDeleteChar,
                        keyHome,
                        keyEnd,
                        keyPageUp,
                        keyPageDown,
                        keyEnter,
                        ) where

    import System.Console.Terminfo.Base

    keypadOn :: TermStr s => Capability s
    keypadOn = tiGetOutput1 "smkx"

    keypadOff :: TermStr s => Capability s
    keypadOff = tiGetOutput1 "rmkx"

    keyUp :: Capability String
    keyUp = tiGetOutput1 "kcuu1"

    keyDown :: Capability String
    keyDown = tiGetOutput1 "kcud1"

    keyLeft :: Capability String
    keyLeft = tiGetOutput1 "kcub1"

    keyRight :: Capability String
    keyRight = tiGetOutput1 "kcuf1"

    -- | Look up the control sequence for a given function sequence.  For example,
    -- @functionKey 12@ retrieves the @kf12@ capability.
    functionKey :: Int -> Capability String
    functionKey n = tiGetOutput1 ("kf" ++ show n)

    keyBackspace :: Capability String
    keyBackspace = tiGetOutput1 "kbs"

    keyDeleteChar :: Capability String
    keyDeleteChar = tiGetOutput1 "kdch1"

    keyHome :: Capability String
    keyHome = tiGetOutput1 "khome"

    keyEnd :: Capability String
    keyEnd = tiGetOutput1 "kend"

    keyPageUp :: Capability String
    keyPageUp = tiGetOutput1 "kpp"

    keyPageDown :: Capability String
    keyPageDown = tiGetOutput1 "knp"

    keyEnter :: Capability String
    keyEnter = tiGetOutput1 "kent"