    -- |
    -- 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
                        ) where

    import System.Console.Terminfo.Base

    keypadOn :: Capability TermOutput
    keypadOn = tiGetOutput1 "smkx"

    keypadOff :: Capability TermOutput
    keypadOff = tiGetOutput1 "rmkx"

    keyUp :: Capability String
    keyUp = tiGetStr "kcuu1"

    keyDown :: Capability String
    keyDown = tiGetStr "kcud1"

    keyLeft :: Capability String
    keyLeft = tiGetStr "kcub1"

    keyRight :: Capability String
    keyRight = tiGetStr "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 = tiGetStr ("kf" ++ show n)

    keyBackspace :: Capability String
    keyBackspace = tiGetStr "kbs"

    keyDeleteChar :: Capability String
    keyDeleteChar = tiGetStr "kdch1"

    keyHome :: Capability String
    keyHome = tiGetStr "khome"

    keyEnd :: Capability String
    keyEnd = tiGetStr "kend"