module Termbox.Bindings.C
  ( -- * Functions

    -- ** Initialize / shutdown
    tb_init,
    tb_init_fd,
    tb_init_file,
    tb_shutdown,

    -- ** Get or set the input or output mode
    tb_select_input_mode,
    tb_select_output_mode,

    -- ** Get terminal dimensions
    tb_width,
    tb_height,

    -- ** Poll for events
    tb_peek_event,
    tb_poll_event,

    -- ** Set a cell
    tb_set_cursor,
    tb_put_cell,
    tb_change_cell,
    tb_cell_buffer,

    -- ** Clear and synchronize the back buffer
    tb_clear,
    tb_set_clear_attributes,
    tb_present,

    -- * Objects
    Tb_cell (..),
    Tb_event (..),

    -- * Constants

    -- ** Keys
    _TB_KEY_ARROW_DOWN,
    _TB_KEY_ARROW_LEFT,
    _TB_KEY_ARROW_RIGHT,
    _TB_KEY_ARROW_UP,
    _TB_KEY_BACKSPACE,
    _TB_KEY_BACKSPACE2,
    _TB_KEY_CTRL_2,
    _TB_KEY_CTRL_3,
    _TB_KEY_CTRL_4,
    _TB_KEY_CTRL_5,
    _TB_KEY_CTRL_6,
    _TB_KEY_CTRL_7,
    _TB_KEY_CTRL_8,
    _TB_KEY_CTRL_A,
    _TB_KEY_CTRL_B,
    _TB_KEY_CTRL_BACKSLASH,
    _TB_KEY_CTRL_C,
    _TB_KEY_CTRL_D,
    _TB_KEY_CTRL_E,
    _TB_KEY_CTRL_F,
    _TB_KEY_CTRL_G,
    _TB_KEY_CTRL_H,
    _TB_KEY_CTRL_I,
    _TB_KEY_CTRL_J,
    _TB_KEY_CTRL_K,
    _TB_KEY_CTRL_L,
    _TB_KEY_CTRL_LSQ_BRACKET,
    _TB_KEY_CTRL_M,
    _TB_KEY_CTRL_N,
    _TB_KEY_CTRL_O,
    _TB_KEY_CTRL_P,
    _TB_KEY_CTRL_Q,
    _TB_KEY_CTRL_R,
    _TB_KEY_CTRL_RSQ_BRACKET,
    _TB_KEY_CTRL_S,
    _TB_KEY_CTRL_SLASH,
    _TB_KEY_CTRL_T,
    _TB_KEY_CTRL_TILDE,
    _TB_KEY_CTRL_U,
    _TB_KEY_CTRL_UNDERSCORE,
    _TB_KEY_CTRL_V,
    _TB_KEY_CTRL_W,
    _TB_KEY_CTRL_X,
    _TB_KEY_CTRL_Y,
    _TB_KEY_CTRL_Z,
    _TB_KEY_DELETE,
    _TB_KEY_END,
    _TB_KEY_ENTER,
    _TB_KEY_ESC,
    _TB_KEY_F1,
    _TB_KEY_F10,
    _TB_KEY_F11,
    _TB_KEY_F12,
    _TB_KEY_F2,
    _TB_KEY_F3,
    _TB_KEY_F4,
    _TB_KEY_F5,
    _TB_KEY_F6,
    _TB_KEY_F7,
    _TB_KEY_F8,
    _TB_KEY_F9,
    _TB_KEY_HOME,
    _TB_KEY_INSERT,
    _TB_KEY_MOUSE_LEFT,
    _TB_KEY_MOUSE_MIDDLE,
    _TB_KEY_MOUSE_RELEASE,
    _TB_KEY_MOUSE_RIGHT,
    _TB_KEY_MOUSE_WHEEL_DOWN,
    _TB_KEY_MOUSE_WHEEL_UP,
    _TB_KEY_PGDN,
    _TB_KEY_PGUP,
    _TB_KEY_SPACE,
    _TB_KEY_TAB,

    -- ** Colors
    _TB_DEFAULT,
    _TB_BLACK,
    _TB_BLUE,
    _TB_CYAN,
    _TB_GREEN,
    _TB_MAGENTA,
    _TB_RED,
    _TB_WHITE,
    _TB_YELLOW,

    -- ** Attributes
    _TB_BOLD,
    _TB_REVERSE,
    _TB_UNDERLINE,

    -- ** Event types
    _TB_EVENT_KEY,
    _TB_EVENT_MOUSE,
    _TB_EVENT_RESIZE,

    -- ** Event modifiers
    _TB_MOD_ALT,
    _TB_MOD_MOTION,

    -- ** 'tb_init' error codes
    _TB_EFAILED_TO_OPEN_TTY,
    _TB_EPIPE_TRAP_ERROR,
    _TB_EUNSUPPORTED_TERMINAL,

    -- ** Hide cursor
    _TB_HIDE_CURSOR,

    -- ** Input modes
    _TB_INPUT_CURRENT,
    _TB_INPUT_ALT,
    _TB_INPUT_ESC,
    _TB_INPUT_MOUSE,

    -- ** Output modes
    _TB_OUTPUT_CURRENT,
    _TB_OUTPUT_216,
    _TB_OUTPUT_256,
    _TB_OUTPUT_GRAYSCALE,
    _TB_OUTPUT_NORMAL,
  )
where

import Data.Int (Int32)
import Data.Word (Word16, Word32, Word8)
import Foreign.C.String (CString)
import Foreign.C.Types (CInt (CInt))
import Foreign.Ptr (Ptr)
import Foreign.Storable (Storable)
import qualified Foreign.Storable as Storable
import GHC.Generics (Generic)
import Prelude hiding (mod)

------------------------------------------------------------------------------------------------------------------------
-- Functions

-- | Get a pointer to the back buffer.
foreign import capi unsafe "termbox.h tb_cell_buffer"
  tb_cell_buffer :: IO (Ptr Tb_cell)

-- | Set a cell value in the back buffer.
foreign import capi unsafe "termbox.h tb_change_cell"
  tb_change_cell ::
    -- | x
    CInt ->
    -- | y
    CInt ->
    -- | ch
    Word32 ->
    -- | fg
    Word16 ->
    -- | bg
    Word16 ->
    IO ()

-- | Clear the back buffer.
foreign import capi unsafe "termbox.h tb_clear"
  tb_clear :: IO ()

-- | Get the terminal height.
foreign import capi unsafe "termbox.h tb_height"
  tb_height :: IO CInt

-- | Initialize the @termbox@ library.
foreign import capi unsafe "termbox.h tb_init"
  tb_init :: IO CInt

-- | Initialize the @termbox@ library.
--
-- > tb_init = tb_init_file("/dev/tty")
foreign import capi unsafe "termbox.h tb_init_file"
  tb_init_file :: CString -> IO CInt

-- | Initialize the @termbox@ library.
--
-- > tb_init = tb_init_fd(0)
foreign import capi unsafe "termbox.h tb_init_fd"
  tb_init_fd :: CInt -> IO CInt

-- | Wait up to a number of milliseconds for an event.
foreign import capi interruptible "termbox.h tb_peek_event"
  tb_peek_event :: Ptr Tb_event -> CInt -> IO CInt

-- | Wait for an event.
foreign import capi interruptible "termbox.h tb_poll_event"
  tb_poll_event :: Ptr Tb_event -> IO CInt

-- | Synchronize the back buffer with the terminal.
foreign import capi unsafe "termbox.h tb_present"
  tb_present :: IO ()

-- | Set a cell value in the back buffer.
foreign import capi unsafe "termbox.h tb_put_cell"
  tb_put_cell ::
    -- | x
    CInt ->
    -- | y
    CInt ->
    -- | cell
    Ptr Tb_cell ->
    IO ()

-- | Get or set the input mode.
foreign import capi unsafe "termbox.h tb_select_input_mode"
  tb_select_input_mode :: CInt -> IO CInt

-- | Get or set the output mode.
foreign import capi unsafe "termbox.h tb_select_output_mode"
  tb_select_output_mode :: CInt -> IO CInt

-- | Set the foreground and background attributes that 'tb_clear' clears the back buffer with.
foreign import capi unsafe "termbox.h tb_set_clear_attributes"
  tb_set_clear_attributes ::
    -- | fg
    Word16 ->
    -- | bg
    Word16 ->
    IO ()

-- | Set or hide the cursor location.
foreign import capi unsafe "termbox.h tb_set_cursor"
  tb_set_cursor ::
    -- | x
    CInt ->
    -- | y
    CInt ->
    IO ()

-- | Shutdown the @termbox@ library.
foreign import capi unsafe "termbox.h tb_shutdown"
  tb_shutdown :: IO ()

-- | Get the terminal width.
foreign import capi unsafe "termbox.h tb_width"
  tb_width :: IO CInt

------------------------------------------------------------------------------------------------------------------------
-- Objects

-- | A cell.
data {-# CTYPE "termbox.h" "struct tb_cell" #-} Tb_cell = Tb_cell
  { -- | A unicode character.
    Tb_cell -> Word32
ch :: {-# UNPACK #-} !Word32,
    -- | Foreground attributes.
    Tb_cell -> Word16
fg :: {-# UNPACK #-} !Word16,
    -- | Background attributes.
    Tb_cell -> Word16
bg :: {-# UNPACK #-} !Word16
  }
  deriving stock (Tb_cell -> Tb_cell -> Bool
(Tb_cell -> Tb_cell -> Bool)
-> (Tb_cell -> Tb_cell -> Bool) -> Eq Tb_cell
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Tb_cell -> Tb_cell -> Bool
== :: Tb_cell -> Tb_cell -> Bool
$c/= :: Tb_cell -> Tb_cell -> Bool
/= :: Tb_cell -> Tb_cell -> Bool
Eq, (forall x. Tb_cell -> Rep Tb_cell x)
-> (forall x. Rep Tb_cell x -> Tb_cell) -> Generic Tb_cell
forall x. Rep Tb_cell x -> Tb_cell
forall x. Tb_cell -> Rep Tb_cell x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Tb_cell -> Rep Tb_cell x
from :: forall x. Tb_cell -> Rep Tb_cell x
$cto :: forall x. Rep Tb_cell x -> Tb_cell
to :: forall x. Rep Tb_cell x -> Tb_cell
Generic, Eq Tb_cell
Eq Tb_cell =>
(Tb_cell -> Tb_cell -> Ordering)
-> (Tb_cell -> Tb_cell -> Bool)
-> (Tb_cell -> Tb_cell -> Bool)
-> (Tb_cell -> Tb_cell -> Bool)
-> (Tb_cell -> Tb_cell -> Bool)
-> (Tb_cell -> Tb_cell -> Tb_cell)
-> (Tb_cell -> Tb_cell -> Tb_cell)
-> Ord Tb_cell
Tb_cell -> Tb_cell -> Bool
Tb_cell -> Tb_cell -> Ordering
Tb_cell -> Tb_cell -> Tb_cell
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Tb_cell -> Tb_cell -> Ordering
compare :: Tb_cell -> Tb_cell -> Ordering
$c< :: Tb_cell -> Tb_cell -> Bool
< :: Tb_cell -> Tb_cell -> Bool
$c<= :: Tb_cell -> Tb_cell -> Bool
<= :: Tb_cell -> Tb_cell -> Bool
$c> :: Tb_cell -> Tb_cell -> Bool
> :: Tb_cell -> Tb_cell -> Bool
$c>= :: Tb_cell -> Tb_cell -> Bool
>= :: Tb_cell -> Tb_cell -> Bool
$cmax :: Tb_cell -> Tb_cell -> Tb_cell
max :: Tb_cell -> Tb_cell -> Tb_cell
$cmin :: Tb_cell -> Tb_cell -> Tb_cell
min :: Tb_cell -> Tb_cell -> Tb_cell
Ord, Int -> Tb_cell -> ShowS
[Tb_cell] -> ShowS
Tb_cell -> String
(Int -> Tb_cell -> ShowS)
-> (Tb_cell -> String) -> ([Tb_cell] -> ShowS) -> Show Tb_cell
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Tb_cell -> ShowS
showsPrec :: Int -> Tb_cell -> ShowS
$cshow :: Tb_cell -> String
show :: Tb_cell -> String
$cshowList :: [Tb_cell] -> ShowS
showList :: [Tb_cell] -> ShowS
Show)

instance Storable Tb_cell where
  sizeOf :: Tb_cell -> Int
sizeOf Tb_cell
_ = Int
8
  alignment :: Tb_cell -> Int
alignment Tb_cell
_ = Int
4

  peek :: Ptr Tb_cell -> IO Tb_cell
  peek :: Ptr Tb_cell -> IO Tb_cell
peek Ptr Tb_cell
ptr =
    Word32 -> Word16 -> Word16 -> Tb_cell
Tb_cell
      (Word32 -> Word16 -> Word16 -> Tb_cell)
-> IO Word32 -> IO (Word16 -> Word16 -> Tb_cell)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Tb_cell -> Int -> IO Word32
forall b. Ptr b -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_cell
ptr Int
0
      IO (Word16 -> Word16 -> Tb_cell)
-> IO Word16 -> IO (Word16 -> Tb_cell)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Tb_cell -> Int -> IO Word16
forall b. Ptr b -> Int -> IO Word16
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_cell
ptr Int
4
      IO (Word16 -> Tb_cell) -> IO Word16 -> IO Tb_cell
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Tb_cell -> Int -> IO Word16
forall b. Ptr b -> Int -> IO Word16
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_cell
ptr Int
6

  poke :: Ptr Tb_cell -> Tb_cell -> IO ()
  poke :: Ptr Tb_cell -> Tb_cell -> IO ()
poke Ptr Tb_cell
ptr Tb_cell {Word32
$sel:ch:Tb_cell :: Tb_cell -> Word32
ch :: Word32
ch, Word16
$sel:fg:Tb_cell :: Tb_cell -> Word16
fg :: Word16
fg, Word16
$sel:bg:Tb_cell :: Tb_cell -> Word16
bg :: Word16
bg} = do
    Ptr Tb_cell -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_cell
ptr Int
0 Word32
ch
    Ptr Tb_cell -> Int -> Word16 -> IO ()
forall b. Ptr b -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_cell
ptr Int
4 Word16
fg
    Ptr Tb_cell -> Int -> Word16 -> IO ()
forall b. Ptr b -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_cell
ptr Int
6 Word16
bg

-- | An event.
data {-# CTYPE "termbox.h" "struct tb_event" #-} Tb_event = Tb_event
  { Tb_event -> Word8
type_ :: {-# UNPACK #-} !Word8,
    Tb_event -> Word8
mod :: {-# UNPACK #-} !Word8,
    Tb_event -> Word16
key :: {-# UNPACK #-} !Word16,
    Tb_event -> Word32
ch :: {-# UNPACK #-} !Word32,
    Tb_event -> Int32
w :: {-# UNPACK #-} !Int32,
    Tb_event -> Int32
h :: {-# UNPACK #-} !Int32,
    Tb_event -> Int32
x :: {-# UNPACK #-} !Int32,
    Tb_event -> Int32
y :: {-# UNPACK #-} !Int32
  }
  deriving stock (Tb_event -> Tb_event -> Bool
(Tb_event -> Tb_event -> Bool)
-> (Tb_event -> Tb_event -> Bool) -> Eq Tb_event
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Tb_event -> Tb_event -> Bool
== :: Tb_event -> Tb_event -> Bool
$c/= :: Tb_event -> Tb_event -> Bool
/= :: Tb_event -> Tb_event -> Bool
Eq, (forall x. Tb_event -> Rep Tb_event x)
-> (forall x. Rep Tb_event x -> Tb_event) -> Generic Tb_event
forall x. Rep Tb_event x -> Tb_event
forall x. Tb_event -> Rep Tb_event x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Tb_event -> Rep Tb_event x
from :: forall x. Tb_event -> Rep Tb_event x
$cto :: forall x. Rep Tb_event x -> Tb_event
to :: forall x. Rep Tb_event x -> Tb_event
Generic, Eq Tb_event
Eq Tb_event =>
(Tb_event -> Tb_event -> Ordering)
-> (Tb_event -> Tb_event -> Bool)
-> (Tb_event -> Tb_event -> Bool)
-> (Tb_event -> Tb_event -> Bool)
-> (Tb_event -> Tb_event -> Bool)
-> (Tb_event -> Tb_event -> Tb_event)
-> (Tb_event -> Tb_event -> Tb_event)
-> Ord Tb_event
Tb_event -> Tb_event -> Bool
Tb_event -> Tb_event -> Ordering
Tb_event -> Tb_event -> Tb_event
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Tb_event -> Tb_event -> Ordering
compare :: Tb_event -> Tb_event -> Ordering
$c< :: Tb_event -> Tb_event -> Bool
< :: Tb_event -> Tb_event -> Bool
$c<= :: Tb_event -> Tb_event -> Bool
<= :: Tb_event -> Tb_event -> Bool
$c> :: Tb_event -> Tb_event -> Bool
> :: Tb_event -> Tb_event -> Bool
$c>= :: Tb_event -> Tb_event -> Bool
>= :: Tb_event -> Tb_event -> Bool
$cmax :: Tb_event -> Tb_event -> Tb_event
max :: Tb_event -> Tb_event -> Tb_event
$cmin :: Tb_event -> Tb_event -> Tb_event
min :: Tb_event -> Tb_event -> Tb_event
Ord, Int -> Tb_event -> ShowS
[Tb_event] -> ShowS
Tb_event -> String
(Int -> Tb_event -> ShowS)
-> (Tb_event -> String) -> ([Tb_event] -> ShowS) -> Show Tb_event
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Tb_event -> ShowS
showsPrec :: Int -> Tb_event -> ShowS
$cshow :: Tb_event -> String
show :: Tb_event -> String
$cshowList :: [Tb_event] -> ShowS
showList :: [Tb_event] -> ShowS
Show)

instance Storable Tb_event where
  sizeOf :: Tb_event -> Int
sizeOf Tb_event
_ = Int
24
  alignment :: Tb_event -> Int
alignment Tb_event
_ = Int
4

  peek :: Ptr Tb_event -> IO Tb_event
  peek :: Ptr Tb_event -> IO Tb_event
peek Ptr Tb_event
ptr =
    Word8
-> Word8
-> Word16
-> Word32
-> Int32
-> Int32
-> Int32
-> Int32
-> Tb_event
Tb_event
      (Word8
 -> Word8
 -> Word16
 -> Word32
 -> Int32
 -> Int32
 -> Int32
 -> Int32
 -> Tb_event)
-> IO Word8
-> IO
     (Word8
      -> Word16
      -> Word32
      -> Int32
      -> Int32
      -> Int32
      -> Int32
      -> Tb_event)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Tb_event -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_event
ptr Int
0
      IO
  (Word8
   -> Word16
   -> Word32
   -> Int32
   -> Int32
   -> Int32
   -> Int32
   -> Tb_event)
-> IO Word8
-> IO
     (Word16 -> Word32 -> Int32 -> Int32 -> Int32 -> Int32 -> Tb_event)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Tb_event -> Int -> IO Word8
forall b. Ptr b -> Int -> IO Word8
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_event
ptr Int
1
      IO
  (Word16 -> Word32 -> Int32 -> Int32 -> Int32 -> Int32 -> Tb_event)
-> IO Word16
-> IO (Word32 -> Int32 -> Int32 -> Int32 -> Int32 -> Tb_event)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Tb_event -> Int -> IO Word16
forall b. Ptr b -> Int -> IO Word16
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_event
ptr Int
2
      IO (Word32 -> Int32 -> Int32 -> Int32 -> Int32 -> Tb_event)
-> IO Word32 -> IO (Int32 -> Int32 -> Int32 -> Int32 -> Tb_event)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Tb_event -> Int -> IO Word32
forall b. Ptr b -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_event
ptr Int
4
      IO (Int32 -> Int32 -> Int32 -> Int32 -> Tb_event)
-> IO Int32 -> IO (Int32 -> Int32 -> Int32 -> Tb_event)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Tb_event -> Int -> IO Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_event
ptr Int
8
      IO (Int32 -> Int32 -> Int32 -> Tb_event)
-> IO Int32 -> IO (Int32 -> Int32 -> Tb_event)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Tb_event -> Int -> IO Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_event
ptr Int
12
      IO (Int32 -> Int32 -> Tb_event)
-> IO Int32 -> IO (Int32 -> Tb_event)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Tb_event -> Int -> IO Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_event
ptr Int
16
      IO (Int32 -> Tb_event) -> IO Int32 -> IO Tb_event
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Tb_event -> Int -> IO Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
Storable.peekByteOff Ptr Tb_event
ptr Int
20

  poke :: Ptr Tb_event -> Tb_event -> IO ()
  poke :: Ptr Tb_event -> Tb_event -> IO ()
poke Ptr Tb_event
ptr Tb_event {Word8
$sel:type_:Tb_event :: Tb_event -> Word8
type_ :: Word8
type_, Word8
$sel:mod:Tb_event :: Tb_event -> Word8
mod :: Word8
mod, Word16
$sel:key:Tb_event :: Tb_event -> Word16
key :: Word16
key, Word32
$sel:ch:Tb_event :: Tb_event -> Word32
ch :: Word32
ch, Int32
$sel:w:Tb_event :: Tb_event -> Int32
w :: Int32
w, Int32
$sel:h:Tb_event :: Tb_event -> Int32
h :: Int32
h, Int32
$sel:x:Tb_event :: Tb_event -> Int32
x :: Int32
x, Int32
$sel:y:Tb_event :: Tb_event -> Int32
y :: Int32
y} = do
    Ptr Tb_event -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_event
ptr Int
0 Word8
type_
    Ptr Tb_event -> Int -> Word8 -> IO ()
forall b. Ptr b -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_event
ptr Int
1 Word8
mod
    Ptr Tb_event -> Int -> Word16 -> IO ()
forall b. Ptr b -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_event
ptr Int
2 Word16
key
    Ptr Tb_event -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_event
ptr Int
4 Word32
ch
    Ptr Tb_event -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_event
ptr Int
8 Int32
w
    Ptr Tb_event -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_event
ptr Int
12 Int32
h
    Ptr Tb_event -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_event
ptr Int
16 Int32
x
    Ptr Tb_event -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
Storable.pokeByteOff Ptr Tb_event
ptr Int
20 Int32
y

------------------------------------------------------------------------------------------------------------------------
-- Constants

_TB_KEY_ARROW_DOWN, _TB_KEY_ARROW_LEFT, _TB_KEY_ARROW_RIGHT, _TB_KEY_ARROW_UP, _TB_KEY_BACKSPACE, _TB_KEY_BACKSPACE2, _TB_KEY_CTRL_2, _TB_KEY_CTRL_3, _TB_KEY_CTRL_4, _TB_KEY_CTRL_5, _TB_KEY_CTRL_6, _TB_KEY_CTRL_7, _TB_KEY_CTRL_8, _TB_KEY_CTRL_A, _TB_KEY_CTRL_B, _TB_KEY_CTRL_BACKSLASH, _TB_KEY_CTRL_C, _TB_KEY_CTRL_D, _TB_KEY_CTRL_E, _TB_KEY_CTRL_F, _TB_KEY_CTRL_G, _TB_KEY_CTRL_H, _TB_KEY_CTRL_I, _TB_KEY_CTRL_J, _TB_KEY_CTRL_K, _TB_KEY_CTRL_L, _TB_KEY_CTRL_LSQ_BRACKET, _TB_KEY_CTRL_M, _TB_KEY_CTRL_N, _TB_KEY_CTRL_O, _TB_KEY_CTRL_P, _TB_KEY_CTRL_Q, _TB_KEY_CTRL_R, _TB_KEY_CTRL_RSQ_BRACKET, _TB_KEY_CTRL_S, _TB_KEY_CTRL_SLASH, _TB_KEY_CTRL_T, _TB_KEY_CTRL_TILDE, _TB_KEY_CTRL_U, _TB_KEY_CTRL_UNDERSCORE, _TB_KEY_CTRL_V, _TB_KEY_CTRL_W, _TB_KEY_CTRL_X, _TB_KEY_CTRL_Y, _TB_KEY_CTRL_Z, _TB_KEY_DELETE, _TB_KEY_END, _TB_KEY_ENTER, _TB_KEY_ESC, _TB_KEY_F1, _TB_KEY_F10, _TB_KEY_F11, _TB_KEY_F12, _TB_KEY_F2, _TB_KEY_F3, _TB_KEY_F4, _TB_KEY_F5, _TB_KEY_F6, _TB_KEY_F7, _TB_KEY_F8, _TB_KEY_F9, _TB_KEY_HOME, _TB_KEY_INSERT, _TB_KEY_MOUSE_LEFT, _TB_KEY_MOUSE_MIDDLE, _TB_KEY_MOUSE_RELEASE, _TB_KEY_MOUSE_RIGHT, _TB_KEY_MOUSE_WHEEL_DOWN, _TB_KEY_MOUSE_WHEEL_UP, _TB_KEY_PGDN, _TB_KEY_PGUP, _TB_KEY_SPACE, _TB_KEY_TAB :: Word16
_TB_KEY_ARROW_DOWN :: Word16
_TB_KEY_ARROW_DOWN = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
19
_TB_KEY_ARROW_LEFT :: Word16
_TB_KEY_ARROW_LEFT = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
20
_TB_KEY_ARROW_RIGHT :: Word16
_TB_KEY_ARROW_RIGHT = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
21
_TB_KEY_ARROW_UP :: Word16
_TB_KEY_ARROW_UP = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
18
_TB_KEY_BACKSPACE :: Word16
_TB_KEY_BACKSPACE = Word16
0x08
_TB_KEY_BACKSPACE2 :: Word16
_TB_KEY_BACKSPACE2 = Word16
0x7F
_TB_KEY_CTRL_2 :: Word16
_TB_KEY_CTRL_2 = Word16
0x00
_TB_KEY_CTRL_3 :: Word16
_TB_KEY_CTRL_3 = Word16
0x1B
_TB_KEY_CTRL_4 :: Word16
_TB_KEY_CTRL_4 = Word16
0x1C
_TB_KEY_CTRL_5 :: Word16
_TB_KEY_CTRL_5 = Word16
0x1D
_TB_KEY_CTRL_6 :: Word16
_TB_KEY_CTRL_6 = Word16
0x1E
_TB_KEY_CTRL_7 :: Word16
_TB_KEY_CTRL_7 = Word16
0x1F
_TB_KEY_CTRL_8 :: Word16
_TB_KEY_CTRL_8 = Word16
0x7F
_TB_KEY_CTRL_A :: Word16
_TB_KEY_CTRL_A = Word16
0x01
_TB_KEY_CTRL_B :: Word16
_TB_KEY_CTRL_B = Word16
0x02
_TB_KEY_CTRL_BACKSLASH :: Word16
_TB_KEY_CTRL_BACKSLASH = Word16
0x1C
_TB_KEY_CTRL_C :: Word16
_TB_KEY_CTRL_C = Word16
0x03
_TB_KEY_CTRL_D :: Word16
_TB_KEY_CTRL_D = Word16
0x04
_TB_KEY_CTRL_E :: Word16
_TB_KEY_CTRL_E = Word16
0x05
_TB_KEY_CTRL_F :: Word16
_TB_KEY_CTRL_F = Word16
0x06
_TB_KEY_CTRL_G :: Word16
_TB_KEY_CTRL_G = Word16
0x07
_TB_KEY_CTRL_H :: Word16
_TB_KEY_CTRL_H = Word16
0x08
_TB_KEY_CTRL_I :: Word16
_TB_KEY_CTRL_I = Word16
0x09
_TB_KEY_CTRL_J :: Word16
_TB_KEY_CTRL_J = Word16
0x0A
_TB_KEY_CTRL_K :: Word16
_TB_KEY_CTRL_K = Word16
0x0B
_TB_KEY_CTRL_L :: Word16
_TB_KEY_CTRL_L = Word16
0x0C
_TB_KEY_CTRL_LSQ_BRACKET :: Word16
_TB_KEY_CTRL_LSQ_BRACKET = Word16
0x1B
_TB_KEY_CTRL_M :: Word16
_TB_KEY_CTRL_M = Word16
0x0D
_TB_KEY_CTRL_N :: Word16
_TB_KEY_CTRL_N = Word16
0x0E
_TB_KEY_CTRL_O :: Word16
_TB_KEY_CTRL_O = Word16
0x0F
_TB_KEY_CTRL_P :: Word16
_TB_KEY_CTRL_P = Word16
0x10
_TB_KEY_CTRL_Q :: Word16
_TB_KEY_CTRL_Q = Word16
0x11
_TB_KEY_CTRL_R :: Word16
_TB_KEY_CTRL_R = Word16
0x12
_TB_KEY_CTRL_RSQ_BRACKET :: Word16
_TB_KEY_CTRL_RSQ_BRACKET = Word16
0x1D
_TB_KEY_CTRL_S :: Word16
_TB_KEY_CTRL_S = Word16
0x13
_TB_KEY_CTRL_SLASH :: Word16
_TB_KEY_CTRL_SLASH = Word16
0x1F
_TB_KEY_CTRL_T :: Word16
_TB_KEY_CTRL_T = Word16
0x14
_TB_KEY_CTRL_TILDE :: Word16
_TB_KEY_CTRL_TILDE = Word16
0x00
_TB_KEY_CTRL_U :: Word16
_TB_KEY_CTRL_U = Word16
0x15
_TB_KEY_CTRL_UNDERSCORE :: Word16
_TB_KEY_CTRL_UNDERSCORE = Word16
0x1F
_TB_KEY_CTRL_V :: Word16
_TB_KEY_CTRL_V = Word16
0x16
_TB_KEY_CTRL_W :: Word16
_TB_KEY_CTRL_W = Word16
0x17
_TB_KEY_CTRL_X :: Word16
_TB_KEY_CTRL_X = Word16
0x18
_TB_KEY_CTRL_Y :: Word16
_TB_KEY_CTRL_Y = Word16
0x19
_TB_KEY_CTRL_Z :: Word16
_TB_KEY_CTRL_Z = Word16
0x1A
_TB_KEY_DELETE :: Word16
_TB_KEY_DELETE = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
13
_TB_KEY_END :: Word16
_TB_KEY_END = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
15
_TB_KEY_ENTER :: Word16
_TB_KEY_ENTER = Word16
0x0D
_TB_KEY_ESC :: Word16
_TB_KEY_ESC = Word16
0x1B
_TB_KEY_F1 :: Word16
_TB_KEY_F1 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
0
_TB_KEY_F10 :: Word16
_TB_KEY_F10 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
9
_TB_KEY_F11 :: Word16
_TB_KEY_F11 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
10
_TB_KEY_F12 :: Word16
_TB_KEY_F12 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
11
_TB_KEY_F2 :: Word16
_TB_KEY_F2 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
1
_TB_KEY_F3 :: Word16
_TB_KEY_F3 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
2
_TB_KEY_F4 :: Word16
_TB_KEY_F4 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
3
_TB_KEY_F5 :: Word16
_TB_KEY_F5 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
4
_TB_KEY_F6 :: Word16
_TB_KEY_F6 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
5
_TB_KEY_F7 :: Word16
_TB_KEY_F7 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
6
_TB_KEY_F8 :: Word16
_TB_KEY_F8 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
7
_TB_KEY_F9 :: Word16
_TB_KEY_F9 = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
8
_TB_KEY_HOME :: Word16
_TB_KEY_HOME = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
14
_TB_KEY_INSERT :: Word16
_TB_KEY_INSERT = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
12
_TB_KEY_MOUSE_LEFT :: Word16
_TB_KEY_MOUSE_LEFT = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
22
_TB_KEY_MOUSE_MIDDLE :: Word16
_TB_KEY_MOUSE_MIDDLE = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
24
_TB_KEY_MOUSE_RELEASE :: Word16
_TB_KEY_MOUSE_RELEASE = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
25
_TB_KEY_MOUSE_RIGHT :: Word16
_TB_KEY_MOUSE_RIGHT = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
23
_TB_KEY_MOUSE_WHEEL_DOWN :: Word16
_TB_KEY_MOUSE_WHEEL_DOWN = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
27
_TB_KEY_MOUSE_WHEEL_UP :: Word16
_TB_KEY_MOUSE_WHEEL_UP = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
26
_TB_KEY_PGDN :: Word16
_TB_KEY_PGDN = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
17
_TB_KEY_PGUP :: Word16
_TB_KEY_PGUP = Word16
0xFFFF Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- Word16
16
_TB_KEY_SPACE :: Word16
_TB_KEY_SPACE = Word16
0x20
_TB_KEY_TAB :: Word16
_TB_KEY_TAB = Word16
0x09

_TB_MOD_ALT, _TB_MOD_MOTION :: Word8
_TB_MOD_ALT :: Word8
_TB_MOD_ALT = Word8
0x01
_TB_MOD_MOTION :: Word8
_TB_MOD_MOTION = Word8
0x02

_TB_DEFAULT, _TB_BLACK, _TB_BLUE, _TB_CYAN, _TB_GREEN, _TB_MAGENTA, _TB_RED, _TB_WHITE, _TB_YELLOW :: Word16
_TB_DEFAULT :: Word16
_TB_DEFAULT = Word16
0x00
_TB_BLACK :: Word16
_TB_BLACK = Word16
0x01
_TB_BLUE :: Word16
_TB_BLUE = Word16
0x05
_TB_CYAN :: Word16
_TB_CYAN = Word16
0x07
_TB_GREEN :: Word16
_TB_GREEN = Word16
0x03
_TB_MAGENTA :: Word16
_TB_MAGENTA = Word16
0x06
_TB_RED :: Word16
_TB_RED = Word16
0x02
_TB_WHITE :: Word16
_TB_WHITE = Word16
0x08
_TB_YELLOW :: Word16
_TB_YELLOW = Word16
0x04

_TB_BOLD, _TB_REVERSE, _TB_UNDERLINE :: Word16
_TB_BOLD :: Word16
_TB_BOLD = Word16
0x0100
_TB_REVERSE :: Word16
_TB_REVERSE = Word16
0x0400
_TB_UNDERLINE :: Word16
_TB_UNDERLINE = Word16
0x0200

_TB_EVENT_KEY, _TB_EVENT_MOUSE, _TB_EVENT_RESIZE :: Word8
_TB_EVENT_KEY :: Word8
_TB_EVENT_KEY = Word8
1
_TB_EVENT_MOUSE :: Word8
_TB_EVENT_MOUSE = Word8
3
_TB_EVENT_RESIZE :: Word8
_TB_EVENT_RESIZE = Word8
2

_TB_EFAILED_TO_OPEN_TTY, _TB_EPIPE_TRAP_ERROR, _TB_EUNSUPPORTED_TERMINAL :: CInt
_TB_EFAILED_TO_OPEN_TTY :: CInt
_TB_EFAILED_TO_OPEN_TTY = -CInt
2
_TB_EPIPE_TRAP_ERROR :: CInt
_TB_EPIPE_TRAP_ERROR = -CInt
3
_TB_EUNSUPPORTED_TERMINAL :: CInt
_TB_EUNSUPPORTED_TERMINAL = -CInt
1

_TB_HIDE_CURSOR :: CInt
_TB_HIDE_CURSOR :: CInt
_TB_HIDE_CURSOR = -CInt
1

_TB_INPUT_CURRENT, _TB_INPUT_ALT, _TB_INPUT_ESC, _TB_INPUT_MOUSE :: CInt
_TB_INPUT_CURRENT :: CInt
_TB_INPUT_CURRENT = CInt
0b000
_TB_INPUT_ALT :: CInt
_TB_INPUT_ALT = CInt
0b010
_TB_INPUT_ESC :: CInt
_TB_INPUT_ESC = CInt
0b001
_TB_INPUT_MOUSE :: CInt
_TB_INPUT_MOUSE = CInt
0b100

_TB_OUTPUT_CURRENT, _TB_OUTPUT_216, _TB_OUTPUT_256, _TB_OUTPUT_GRAYSCALE, _TB_OUTPUT_NORMAL :: CInt
_TB_OUTPUT_CURRENT :: CInt
_TB_OUTPUT_CURRENT = CInt
0
_TB_OUTPUT_216 :: CInt
_TB_OUTPUT_216 = CInt
3
_TB_OUTPUT_256 :: CInt
_TB_OUTPUT_256 = CInt
2
_TB_OUTPUT_GRAYSCALE :: CInt
_TB_OUTPUT_GRAYSCALE = CInt
4
_TB_OUTPUT_NORMAL :: CInt
_TB_OUTPUT_NORMAL = CInt
1