-- | 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 :: [ClassifyMap]
classifyTable =
    [ ClassifyMap
cursorKeysMap
    , ClassifyMap
numpadAndF5ToF12
    , ClassifyMap
functionKeys1To4
    ]

-- | Encoding for cursor keys.

cursorKeysMap :: ClassifyMap
cursorKeysMap :: ClassifyMap
cursorKeysMap =
  [(String
"\ESC[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Modifier] -> String
forall {t :: * -> *} {a}. Foldable t => t a -> String
prefix [Modifier]
mods String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
infx String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
name, Key -> [Modifier] -> Event
EvKey Key
key [Modifier]
mods)
    | (String
name, Key
key) <-
        [ (String
"A", Key
KUp)
        , (String
"B", Key
KDown)
        , (String
"C", Key
KRight)
        , (String
"D", Key
KLeft)
        , (String
"F", Key
KEnd)
        , (String
"H", Key
KHome)
        ]
    , (String
infx, [Modifier]
mods) <- [(String, [Modifier])]
modMap
  ]
  where
    prefix :: t a -> String
prefix t a
mods = if t a -> Bool
forall a. t a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null t a
mods then String
"" else String
"1"

-- | encoding for numpad keys and F5 through F12

numpadAndF5ToF12 :: ClassifyMap
numpadAndF5ToF12 :: ClassifyMap
numpadAndF5ToF12 =
  [ (String
"\ESC[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
name String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
infx String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"~", Key -> [Modifier] -> Event
EvKey Key
key [Modifier]
mods)
    | (String
name, Key
key) <-
        [ (String
"2", Key
KIns)
        , (String
"3", Key
KDel)
        , (String
"5", Key
KPageUp)
        , (String
"6", Key
KPageDown)
        , (String
"15", Int -> Key
KFun Int
5)
        , (String
"17", Int -> Key
KFun Int
6)
        , (String
"18", Int -> Key
KFun Int
7)
        , (String
"19", Int -> Key
KFun Int
8)
        , (String
"20", Int -> Key
KFun Int
9)
        , (String
"21", Int -> Key
KFun Int
10)
        , (String
"23", Int -> Key
KFun Int
11)
        , (String
"24", Int -> Key
KFun Int
12)
        ]
    , (String
infx, [Modifier]
mods) <- [(String, [Modifier])]
modMap
  ]

-- | encoding for F1 through F4

functionKeys1To4 :: ClassifyMap
functionKeys1To4 :: ClassifyMap
functionKeys1To4 =
  [ (String
"\ESC" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Modifier] -> String
forall {t :: * -> *} {a}. Foldable t => t a -> String
prefix [Modifier]
mods String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
infx String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
name, Key -> [Modifier] -> Event
EvKey Key
key [Modifier]
mods)
  | (String
name, Key
key) <-
      [ (String
"P", Int -> Key
KFun Int
1),
        (String
"Q", Int -> Key
KFun Int
2),
        (String
"R", Int -> Key
KFun Int
3),
        (String
"S", Int -> Key
KFun Int
4)
      ]
  , (String
infx, [Modifier]
mods) <- [(String, [Modifier])]
modMap
  ]
  where
    prefix :: t a -> String
prefix t a
mods = if t a -> Bool
forall a. t a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null t a
mods then String
"O" else String
"[1"

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