module Termbox.Bindings.C ( -- * Functions -- ** Initialize / shutdown tb_init, tb_init_fd, tb_init_file, tb_shutdown, -- ** Get\/set input\/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, -- ** Alt modifiers _TB_MOD_ALT, _TB_MOD_MOTION, -- ** 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, -- ** '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\/set the input mode. foreign import capi unsafe "termbox.h tb_select_input_mode" tb_select_input_mode :: CInt -> IO CInt -- | Get\/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 the cursor location, or hide it. 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 Tb_cell = Tb_cell { -- | A unicode character. ch :: {-# UNPACK #-} !Word32, -- | Foreground attribute. fg :: {-# UNPACK #-} !Word16, -- | Background attribute. bg :: {-# UNPACK #-} !Word16 } deriving stock (Eq, Generic, Ord, Show) instance Storable Tb_cell where sizeOf :: Tb_cell -> Int sizeOf _ = 8 alignment :: Tb_cell -> Int alignment _ = 4 peek :: Ptr Tb_cell -> IO Tb_cell peek ptr = Tb_cell <$> Storable.peekByteOff ptr 0 <*> Storable.peekByteOff ptr 4 <*> Storable.peekByteOff ptr 6 poke :: Ptr Tb_cell -> Tb_cell -> IO () poke ptr Tb_cell {ch, fg, bg} = do Storable.pokeByteOff ptr 0 ch Storable.pokeByteOff ptr 4 fg Storable.pokeByteOff ptr 6 bg -- | An event. data Tb_event = Tb_event { type_ :: {-# UNPACK #-} !Word8, mod :: {-# UNPACK #-} !Word8, key :: {-# UNPACK #-} !Word16, ch :: {-# UNPACK #-} !Word32, w :: {-# UNPACK #-} !Int32, h :: {-# UNPACK #-} !Int32, x :: {-# UNPACK #-} !Int32, y :: {-# UNPACK #-} !Int32 } deriving stock (Eq, Generic, Ord, Show) instance Storable Tb_event where sizeOf :: Tb_event -> Int sizeOf _ = 24 alignment :: Tb_event -> Int alignment _ = 4 peek :: Ptr Tb_event -> IO Tb_event peek ptr = Tb_event <$> Storable.peekByteOff ptr 0 <*> Storable.peekByteOff ptr 1 <*> Storable.peekByteOff ptr 2 <*> Storable.peekByteOff ptr 4 <*> Storable.peekByteOff ptr 8 <*> Storable.peekByteOff ptr 12 <*> Storable.peekByteOff ptr 16 <*> Storable.peekByteOff ptr 20 poke :: Ptr Tb_event -> Tb_event -> IO () poke ptr Tb_event {type_, mod, key, ch, w, h, x, y} = do Storable.pokeByteOff ptr 0 type_ Storable.pokeByteOff ptr 1 mod Storable.pokeByteOff ptr 2 key Storable.pokeByteOff ptr 4 ch Storable.pokeByteOff ptr 8 w Storable.pokeByteOff ptr 12 h Storable.pokeByteOff ptr 16 x Storable.pokeByteOff ptr 20 y ------------------------------------------------------------------------------------------------------------------------ -- Constants foreign import capi "termbox.h value TB_BLACK" _TB_BLACK :: Word16 foreign import capi "termbox.h value TB_BLUE" _TB_BLUE :: Word16 foreign import capi "termbox.h value TB_BOLD" _TB_BOLD :: Word16 foreign import capi "termbox.h value TB_CYAN" _TB_CYAN :: Word16 foreign import capi "termbox.h value TB_DEFAULT" _TB_DEFAULT :: Word16 foreign import capi "termbox.h value TB_EFAILED_TO_OPEN_TTY" _TB_EFAILED_TO_OPEN_TTY :: CInt foreign import capi "termbox.h value TB_EPIPE_TRAP_ERROR" _TB_EPIPE_TRAP_ERROR :: CInt foreign import capi "termbox.h value TB_EUNSUPPORTED_TERMINAL" _TB_EUNSUPPORTED_TERMINAL :: CInt foreign import capi "termbox.h value TB_EVENT_KEY" _TB_EVENT_KEY :: Word8 foreign import capi "termbox.h value TB_EVENT_MOUSE" _TB_EVENT_MOUSE :: Word8 foreign import capi "termbox.h value TB_EVENT_RESIZE" _TB_EVENT_RESIZE :: Word8 foreign import capi "termbox.h value TB_GREEN" _TB_GREEN :: Word16 foreign import capi "termbox.h value TB_HIDE_CURSOR" _TB_HIDE_CURSOR :: CInt foreign import capi "termbox.h value TB_INPUT_ALT" _TB_INPUT_ALT :: CInt foreign import capi "termbox.h value TB_INPUT_CURRENT" _TB_INPUT_CURRENT :: CInt foreign import capi "termbox.h value TB_INPUT_ESC" _TB_INPUT_ESC :: CInt foreign import capi "termbox.h value TB_INPUT_MOUSE" _TB_INPUT_MOUSE :: CInt foreign import capi "termbox.h value TB_KEY_ARROW_DOWN" _TB_KEY_ARROW_DOWN :: Word16 foreign import capi "termbox.h value TB_KEY_ARROW_LEFT" _TB_KEY_ARROW_LEFT :: Word16 foreign import capi "termbox.h value TB_KEY_ARROW_RIGHT" _TB_KEY_ARROW_RIGHT :: Word16 foreign import capi "termbox.h value TB_KEY_ARROW_UP" _TB_KEY_ARROW_UP :: Word16 foreign import capi "termbox.h value TB_KEY_BACKSPACE" _TB_KEY_BACKSPACE :: Word16 foreign import capi "termbox.h value TB_KEY_BACKSPACE2" _TB_KEY_BACKSPACE2 :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_2" _TB_KEY_CTRL_2 :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_3" _TB_KEY_CTRL_3 :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_4" _TB_KEY_CTRL_4 :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_5" _TB_KEY_CTRL_5 :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_6" _TB_KEY_CTRL_6 :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_7" _TB_KEY_CTRL_7 :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_8" _TB_KEY_CTRL_8 :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_A" _TB_KEY_CTRL_A :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_B" _TB_KEY_CTRL_B :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_BACKSLASH" _TB_KEY_CTRL_BACKSLASH :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_C" _TB_KEY_CTRL_C :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_D" _TB_KEY_CTRL_D :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_E" _TB_KEY_CTRL_E :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_F" _TB_KEY_CTRL_F :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_G" _TB_KEY_CTRL_G :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_H" _TB_KEY_CTRL_H :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_I" _TB_KEY_CTRL_I :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_J" _TB_KEY_CTRL_J :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_K" _TB_KEY_CTRL_K :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_L" _TB_KEY_CTRL_L :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_LSQ_BRACKET" _TB_KEY_CTRL_LSQ_BRACKET :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_M" _TB_KEY_CTRL_M :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_N" _TB_KEY_CTRL_N :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_O" _TB_KEY_CTRL_O :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_P" _TB_KEY_CTRL_P :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_Q" _TB_KEY_CTRL_Q :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_R" _TB_KEY_CTRL_R :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_RSQ_BRACKET" _TB_KEY_CTRL_RSQ_BRACKET :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_S" _TB_KEY_CTRL_S :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_SLASH" _TB_KEY_CTRL_SLASH :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_T" _TB_KEY_CTRL_T :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_TILDE" _TB_KEY_CTRL_TILDE :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_U" _TB_KEY_CTRL_U :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_UNDERSCORE" _TB_KEY_CTRL_UNDERSCORE :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_V" _TB_KEY_CTRL_V :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_W" _TB_KEY_CTRL_W :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_X" _TB_KEY_CTRL_X :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_Y" _TB_KEY_CTRL_Y :: Word16 foreign import capi "termbox.h value TB_KEY_CTRL_Z" _TB_KEY_CTRL_Z :: Word16 foreign import capi "termbox.h value TB_KEY_DELETE" _TB_KEY_DELETE :: Word16 foreign import capi "termbox.h value TB_KEY_END" _TB_KEY_END :: Word16 foreign import capi "termbox.h value TB_KEY_ENTER" _TB_KEY_ENTER :: Word16 foreign import capi "termbox.h value TB_KEY_ESC" _TB_KEY_ESC :: Word16 foreign import capi "termbox.h value TB_KEY_F1" _TB_KEY_F1 :: Word16 foreign import capi "termbox.h value TB_KEY_F10" _TB_KEY_F10 :: Word16 foreign import capi "termbox.h value TB_KEY_F11" _TB_KEY_F11 :: Word16 foreign import capi "termbox.h value TB_KEY_F12" _TB_KEY_F12 :: Word16 foreign import capi "termbox.h value TB_KEY_F2" _TB_KEY_F2 :: Word16 foreign import capi "termbox.h value TB_KEY_F3" _TB_KEY_F3 :: Word16 foreign import capi "termbox.h value TB_KEY_F4" _TB_KEY_F4 :: Word16 foreign import capi "termbox.h value TB_KEY_F5" _TB_KEY_F5 :: Word16 foreign import capi "termbox.h value TB_KEY_F6" _TB_KEY_F6 :: Word16 foreign import capi "termbox.h value TB_KEY_F7" _TB_KEY_F7 :: Word16 foreign import capi "termbox.h value TB_KEY_F8" _TB_KEY_F8 :: Word16 foreign import capi "termbox.h value TB_KEY_F9" _TB_KEY_F9 :: Word16 foreign import capi "termbox.h value TB_KEY_HOME" _TB_KEY_HOME :: Word16 foreign import capi "termbox.h value TB_KEY_INSERT" _TB_KEY_INSERT :: Word16 foreign import capi "termbox.h value TB_KEY_MOUSE_LEFT" _TB_KEY_MOUSE_LEFT :: Word16 foreign import capi "termbox.h value TB_KEY_MOUSE_MIDDLE" _TB_KEY_MOUSE_MIDDLE :: Word16 foreign import capi "termbox.h value TB_KEY_MOUSE_RELEASE" _TB_KEY_MOUSE_RELEASE :: Word16 foreign import capi "termbox.h value TB_KEY_MOUSE_RIGHT" _TB_KEY_MOUSE_RIGHT :: Word16 foreign import capi "termbox.h value TB_KEY_MOUSE_WHEEL_DOWN" _TB_KEY_MOUSE_WHEEL_DOWN :: Word16 foreign import capi "termbox.h value TB_KEY_MOUSE_WHEEL_UP" _TB_KEY_MOUSE_WHEEL_UP :: Word16 foreign import capi "termbox.h value TB_KEY_PGDN" _TB_KEY_PGDN :: Word16 foreign import capi "termbox.h value TB_KEY_PGUP" _TB_KEY_PGUP :: Word16 foreign import capi "termbox.h value TB_KEY_SPACE" _TB_KEY_SPACE :: Word16 foreign import capi "termbox.h value TB_KEY_TAB" _TB_KEY_TAB :: Word16 foreign import capi "termbox.h value TB_MAGENTA" _TB_MAGENTA :: Word16 foreign import capi "termbox.h value TB_MOD_ALT" _TB_MOD_ALT :: Word8 foreign import capi "termbox.h value TB_MOD_MOTION" _TB_MOD_MOTION :: Word8 foreign import capi "termbox.h value TB_OUTPUT_216" _TB_OUTPUT_216 :: CInt foreign import capi "termbox.h value TB_OUTPUT_256" _TB_OUTPUT_256 :: CInt foreign import capi "termbox.h value TB_OUTPUT_CURRENT" _TB_OUTPUT_CURRENT :: CInt foreign import capi "termbox.h value TB_OUTPUT_GRAYSCALE" _TB_OUTPUT_GRAYSCALE :: CInt foreign import capi "termbox.h value TB_OUTPUT_NORMAL" _TB_OUTPUT_NORMAL :: CInt foreign import capi "termbox.h value TB_RED" _TB_RED :: Word16 foreign import capi "termbox.h value TB_REVERSE" _TB_REVERSE :: Word16 foreign import capi "termbox.h value TB_UNDERLINE" _TB_UNDERLINE :: Word16 foreign import capi "termbox.h value TB_WHITE" _TB_WHITE :: Word16 foreign import capi "termbox.h value TB_YELLOW" _TB_YELLOW :: Word16