packages feed

vty-windows-0.1.0.0: src/Graphics/Vty/Platform/Windows/Input/Terminfo/ANSIVT.hs

-- | Input mappings for Windows terminals 
-- pulled directly from https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#input-sequences
module Graphics.Vty.Platform.Windows.Input.Terminfo.ANSIVT
  ( classifyTable
  )
where

import Graphics.Vty.Input.Events

-- | Encoding for all special keys
classifyTable :: [ClassifyMap]
classifyTable =
    [ cursorKeysMap
    , numpadAndF5ToF12
    , functionKeys1To4
    ]

-- | Encoding for cursor keys.
cursorKeysMap :: ClassifyMap
cursorKeysMap =
  [("\ESC[" ++ prefix mods ++ infx ++ name, EvKey key mods)
    | (name, key) <-
        [ ("A", KUp)
        , ("B", KDown)
        , ("C", KRight)
        , ("D", KLeft)
        , ("F", KEnd)
        , ("H", KHome)
        ]
    , (infx, mods) <- modMap
  ]
  where
    prefix mods = if null mods then "" else "1"

-- | encoding for numpad keys and F5 through F12
numpadAndF5ToF12 :: ClassifyMap
numpadAndF5ToF12 =
  [ ("\ESC[" ++ name ++ infx ++ "~", EvKey key mods)
    | (name, key) <-
        [ ("2", KIns)
        , ("3", KDel)
        , ("5", KPageUp)
        , ("6", KPageDown)
        , ("15", KFun 5)
        , ("17", KFun 6)
        , ("18", KFun 7)
        , ("19", KFun 8)
        , ("20", KFun 9)
        , ("21", KFun 10)
        , ("23", KFun 11)
        , ("24", KFun 12)
        ]
    , (infx, mods) <- modMap
  ]

-- | encoding for F1 through F4
functionKeys1To4 :: ClassifyMap
functionKeys1To4 =
  [ ("\ESC" ++ prefix mods ++ infx ++ name, EvKey key mods)
  | (name, key) <-
      [ ("P", KFun 1),
        ("Q", KFun 2),
        ("R", KFun 3),
        ("S", KFun 4)
      ]
  , (infx, mods) <- modMap
  ]
  where
    prefix mods = if null mods then "O" else "[1"

modMap :: [(String, [Modifier])]
modMap =
  [ ("", []),
    (";2", [MShift]),
    (";3", [MMeta]),
    (";4", [MMeta, MShift]),
    (";5", [MCtrl]),
    (";6", [MCtrl, MShift]),
    (";7", [MMeta, MCtrl]),
    (";8", [MMeta, MCtrl, MShift])
  ]