module System.Terminal.Emulator.KeyboardInput
  ( KeyboardState (..),
    initialKeyboardState,
    KeyPress (..),
    KeyModifiers (..),
    SpecialKey (..),
  )
where

data KeyboardState = KeyboardState
  { keyboardState_DECPAM :: !Bool,
    keyboardState_DECCKM :: !Bool,
    -- | Set using Keyboard Action Mode (KAM)
    keyboardState_Locked :: !Bool,
    -- | Set using Automatic Newline / Normal Linefeed (LNM)
    keyboardState_CRLF :: !Bool
  }
  deriving (Show, Eq, Ord)

initialKeyboardState :: KeyboardState
initialKeyboardState =
  KeyboardState
    { keyboardState_DECPAM = False,
      keyboardState_DECCKM = False,
      keyboardState_Locked = False,
      keyboardState_CRLF = False
    }

data KeyPress
  = -- | The char must be a plain-old regular "visible" character (or ' ').
  Specifically , you should not put ' \n ' or ' \b ' ( use ' SpecialKey ' for
    -- that)
    KeyPress_Char !Char !KeyModifiers
  | Used for a key press of a ' SpecialKey ' . If a ' SpecialKey ' does n't
  exist ( for example " Ctrl " , or " CapsLock " ) then no ' KeyPress ' event
    -- should be generated
    KeyPress_SpecialKey !SpecialKey !KeyModifiers
  deriving (Eq, Ord, Show)

data KeyModifiers = KeyModifiers
  { shift :: !Bool,
    ctrl :: !Bool,
    alt :: !Bool,
    capsLock :: !Bool
  }
  deriving (Eq, Ord, Show)

data SpecialKey
  = SpecialKey_Escape
  | SpecialKey_F1
  | SpecialKey_F2
  | SpecialKey_F3
  | SpecialKey_F4
  | SpecialKey_F5
  | SpecialKey_F6
  | SpecialKey_F7
  | SpecialKey_F8
  | SpecialKey_F9
  | SpecialKey_F10
  | SpecialKey_F11
  | SpecialKey_F12
  | SpecialKey_Insert
  | SpecialKey_Delete
  | SpecialKey_Home
  | SpecialKey_End
  | SpecialKey_PageUp
  | SpecialKey_PageDown
  | SpecialKey_Tab
  | SpecialKey_Enter
  | SpecialKey_Backspace
  | SpecialKey_ArrowLeft
  | SpecialKey_ArrowRight
  | SpecialKey_ArrowUp
  | SpecialKey_ArrowDown
  deriving (Eq, Ord, Show)

 | Set using Keyboard Action Mode (KAM)
 | Set using Automatic Newline / Normal Linefeed (LNM)
 | The char must be a plain-old regular "visible" character (or ' ').
 that)
 should be generated
module System.Terminal.Emulator.KeyboardInput
  ( KeyboardState (..),
    initialKeyboardState,
    KeyPress (..),
    KeyModifiers (..),
    SpecialKey (..),
  )
where

data KeyboardState = KeyboardState
  { keyboardState_DECPAM :: !Bool,
    keyboardState_DECCKM :: !Bool,
    keyboardState_Locked :: !Bool,
    keyboardState_CRLF :: !Bool
  }
  deriving (Show, Eq, Ord)

initialKeyboardState :: KeyboardState
initialKeyboardState =
  KeyboardState
    { keyboardState_DECPAM = False,
      keyboardState_DECCKM = False,
      keyboardState_Locked = False,
      keyboardState_CRLF = False
    }

data KeyPress
  Specifically , you should not put ' \n ' or ' \b ' ( use ' SpecialKey ' for
    KeyPress_Char !Char !KeyModifiers
  | Used for a key press of a ' SpecialKey ' . If a ' SpecialKey ' does n't
  exist ( for example " Ctrl " , or " CapsLock " ) then no ' KeyPress ' event
    KeyPress_SpecialKey !SpecialKey !KeyModifiers
  deriving (Eq, Ord, Show)

data KeyModifiers = KeyModifiers
  { shift :: !Bool,
    ctrl :: !Bool,
    alt :: !Bool,
    capsLock :: !Bool
  }
  deriving (Eq, Ord, Show)

data SpecialKey
  = SpecialKey_Escape
  | SpecialKey_F1
  | SpecialKey_F2
  | SpecialKey_F3
  | SpecialKey_F4
  | SpecialKey_F5
  | SpecialKey_F6
  | SpecialKey_F7
  | SpecialKey_F8
  | SpecialKey_F9
  | SpecialKey_F10
  | SpecialKey_F11
  | SpecialKey_F12
  | SpecialKey_Insert
  | SpecialKey_Delete
  | SpecialKey_Home
  | SpecialKey_End
  | SpecialKey_PageUp
  | SpecialKey_PageDown
  | SpecialKey_Tab
  | SpecialKey_Enter
  | SpecialKey_Backspace
  | SpecialKey_ArrowLeft
  | SpecialKey_ArrowRight
  | SpecialKey_ArrowUp
  | SpecialKey_ArrowDown
  deriving (Eq, Ord, Show)
