module Termbox.Bindings.Hs ( -- * Functions -- ** Initialize / shutdown tb_init, tb_init_fd, tb_init_file, Termbox.Bindings.C.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, -- ** Style a color tb_attr, -- ** Set a cell tb_set_cursor, tb_put_cell, tb_change_cell, -- ** Clear and synchronize the back buffer Termbox.Bindings.C.tb_clear, tb_set_clear_attributes, Termbox.Bindings.C.tb_present, -- * Types Tb_attr ( Tb_attr, TB_BOLD, TB_REVERSE, TB_UNDERLINE ), Tb_cell (..), Tb_color ( Tb_color, TB_DEFAULT, TB_BLACK, TB_BLUE, TB_CYAN, TB_GREEN, TB_MAGENTA, TB_RED, TB_WHITE, TB_YELLOW ), Tb_event (..), Tb_event_mod ( Tb_event_mod, TB_MOD_ALT, TB_MOD_MOTION ), Tb_event_type ( TB_EVENT_KEY, TB_EVENT_MOUSE, TB_EVENT_RESIZE ), Tb_init_error ( TB_EFAILED_TO_OPEN_TTY, TB_EPIPE_TRAP_ERROR, TB_EUNSUPPORTED_TERMINAL ), Tb_input_mode ( TB_INPUT_CURRENT, TB_INPUT_ALT, TB_INPUT_ESC, TB_INPUT_MOUSE ), Tb_key ( 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 ), Tb_output_mode ( TB_OUTPUT_CURRENT, TB_OUTPUT_216, TB_OUTPUT_256, TB_OUTPUT_GRAYSCALE, TB_OUTPUT_NORMAL ), ) where import Data.Bits ((.|.)) import qualified Data.Char as Char import Data.Coerce (coerce) import Data.Int (Int32) import Data.Word (Word16, Word32, Word8) import Foreign.C.String (withCString) import Foreign.C.Types (CInt) import Foreign.Marshal.Alloc (alloca) import qualified Foreign.Storable as Storable import System.Posix.Types (Fd (Fd)) import GHC.Generics (Generic) import qualified Termbox.Bindings.C import Prelude hiding (mod) ------------------------------------------------------------------------------------------------------------------------ -- Functions -- | Set the attribute of a color. tb_attr :: Tb_attr -> Tb_color -> Tb_color tb_attr = coerce ((.|.) :: Word16 -> Word16 -> Word16) -- | Set a cell value in the back buffer. tb_change_cell :: -- | x Int -> -- | y Int -> -- | ch Char -> -- | fg Tb_color -> -- | bg Tb_color -> IO () tb_change_cell cx cy c (Tb_color foreground) (Tb_color background) = Termbox.Bindings.C.tb_change_cell (intToCInt cx) (intToCInt cy) (charToWord32 c) foreground background -- | Get the terminal height. tb_height :: IO Int tb_height = cintToInt <$> Termbox.Bindings.C.tb_height -- | Initialize the @termbox@ library. tb_init :: IO (Either Tb_init_error ()) tb_init = do code <- Termbox.Bindings.C.tb_init pure if code == 0 then Right () else Left (Tb_init_error code) -- | Initialize the @termbox@ library. -- -- > tb_init = tb_init_fd(0) tb_init_fd :: Fd -> IO (Either Tb_init_error ()) tb_init_fd (Fd fd) = do code <- Termbox.Bindings.C.tb_init_fd fd pure if code == 0 then Right () else Left (Tb_init_error code) -- | Initialize the @termbox@ library. -- -- > tb_init = tb_init_file("/dev/tty") tb_init_file :: FilePath -> IO (Either Tb_init_error ()) tb_init_file file = do code <- withCString file \c_file -> Termbox.Bindings.C.tb_init_file c_file pure if code == 0 then Right () else Left (Tb_init_error code) -- | Wait up to a number of milliseconds for an event. tb_peek_event :: Int -> IO (Either () (Maybe Tb_event)) tb_peek_event timeout = alloca \c_event -> do result <- Termbox.Bindings.C.tb_peek_event c_event (intToCInt timeout) if result < 0 then pure (Left ()) else if result == 0 then pure (Right Nothing) else Right . Just . ceventToEvent <$> Storable.peek c_event -- | Wait for an event. tb_poll_event :: IO (Either () Tb_event) tb_poll_event = alloca \c_event -> do result <- Termbox.Bindings.C.tb_poll_event c_event if result < 0 then pure (Left ()) else Right . ceventToEvent <$> Storable.peek c_event -- | Set a cell value in the back buffer. tb_put_cell :: -- | x Int -> -- | y Int -> -- | cell Tb_cell -> IO () tb_put_cell cx cy cell = alloca \c_cell -> do Storable.poke c_cell (cellToCCell cell) Termbox.Bindings.C.tb_put_cell (intToCInt cx) (intToCInt cy) c_cell -- | Get\/set the input mode. tb_select_input_mode :: Tb_input_mode -> IO Tb_input_mode tb_select_input_mode = coerce Termbox.Bindings.C.tb_select_input_mode -- | Get\/set the output mode. tb_select_output_mode :: Tb_output_mode -> IO Tb_output_mode tb_select_output_mode = coerce Termbox.Bindings.C.tb_select_output_mode -- | Set the foreground and background attributes that 'tb_clear' clears the back buffer with. tb_set_clear_attributes :: -- | fg Tb_color -> -- | bg Tb_color -> IO () tb_set_clear_attributes (Tb_color foreground) (Tb_color background) = Termbox.Bindings.C.tb_set_clear_attributes foreground background -- | Set the cursor location, or hide it. tb_set_cursor :: -- | x, y Maybe (Int, Int) -> IO () tb_set_cursor = \case Nothing -> Termbox.Bindings.C.tb_set_cursor Termbox.Bindings.C._TB_HIDE_CURSOR Termbox.Bindings.C._TB_HIDE_CURSOR Just (cx, cy) -> Termbox.Bindings.C.tb_set_cursor (intToCInt cx) (intToCInt cy) -- | Get the terminal width. tb_width :: IO Int tb_width = cintToInt <$> Termbox.Bindings.C.tb_width ------------------------------------------------------------------------------------------------------------------------ -- Types -- | An attribute. newtype Tb_attr = Tb_attr Word16 deriving stock (Eq, Ord, Show) instance Semigroup Tb_attr where Tb_attr cx <> Tb_attr cy = Tb_attr (cx .|. cy) pattern TB_BOLD :: Tb_attr pattern TB_BOLD <- ((== Tb_attr Termbox.Bindings.C._TB_BOLD) -> True) where TB_BOLD = Tb_attr Termbox.Bindings.C._TB_BOLD pattern TB_REVERSE :: Tb_attr pattern TB_REVERSE <- ((== Tb_attr Termbox.Bindings.C._TB_REVERSE) -> True) where TB_REVERSE = Tb_attr Termbox.Bindings.C._TB_REVERSE pattern TB_UNDERLINE :: Tb_attr pattern TB_UNDERLINE <- ((== Tb_attr Termbox.Bindings.C._TB_UNDERLINE) -> True) where TB_UNDERLINE = Tb_attr Termbox.Bindings.C._TB_UNDERLINE -- | A cell. data Tb_cell = Tb_cell { -- | A unicode character. ch :: {-# UNPACK #-} !Char, -- | Foreground attribute. fg :: {-# UNPACK #-} !Tb_attr, -- | Background attribute. bg :: {-# UNPACK #-} !Tb_attr } deriving stock (Eq, Generic, Ord, Show) cellToCCell :: Tb_cell -> Termbox.Bindings.C.Tb_cell cellToCCell Tb_cell {ch, fg = Tb_attr fg, bg = Tb_attr bg} = Termbox.Bindings.C.Tb_cell { ch = charToWord32 ch, fg, bg } {-# INLINE cellToCCell #-} -- | A color. newtype Tb_color = Tb_color Word16 deriving stock (Eq, Ord) deriving newtype (Num, Show) pattern TB_DEFAULT :: Tb_color pattern TB_DEFAULT <- ((== Tb_color Termbox.Bindings.C._TB_DEFAULT) -> True) where TB_DEFAULT = Tb_color Termbox.Bindings.C._TB_DEFAULT pattern TB_BLACK :: Tb_color pattern TB_BLACK <- ((== Tb_color Termbox.Bindings.C._TB_BLACK) -> True) where TB_BLACK = Tb_color Termbox.Bindings.C._TB_BLACK pattern TB_BLUE :: Tb_color pattern TB_BLUE <- ((== Tb_color Termbox.Bindings.C._TB_BLUE) -> True) where TB_BLUE = Tb_color Termbox.Bindings.C._TB_BLUE pattern TB_CYAN :: Tb_color pattern TB_CYAN <- ((== Tb_color Termbox.Bindings.C._TB_CYAN) -> True) where TB_CYAN = Tb_color Termbox.Bindings.C._TB_CYAN pattern TB_GREEN :: Tb_color pattern TB_GREEN <- ((== Tb_color Termbox.Bindings.C._TB_GREEN) -> True) where TB_GREEN = Tb_color Termbox.Bindings.C._TB_GREEN pattern TB_MAGENTA :: Tb_color pattern TB_MAGENTA <- ((== Tb_color Termbox.Bindings.C._TB_MAGENTA) -> True) where TB_MAGENTA = Tb_color Termbox.Bindings.C._TB_MAGENTA pattern TB_RED :: Tb_color pattern TB_RED <- ((== Tb_color Termbox.Bindings.C._TB_RED) -> True) where TB_RED = Tb_color Termbox.Bindings.C._TB_RED pattern TB_WHITE :: Tb_color pattern TB_WHITE <- ((== Tb_color Termbox.Bindings.C._TB_WHITE) -> True) where TB_WHITE = Tb_color Termbox.Bindings.C._TB_WHITE pattern TB_YELLOW :: Tb_color pattern TB_YELLOW <- ((== Tb_color Termbox.Bindings.C._TB_YELLOW) -> True) where TB_YELLOW = Tb_color Termbox.Bindings.C._TB_YELLOW -- | An event. data Tb_event = Tb_event { type_ :: {-# UNPACK #-} !Tb_event_type, mod :: {-# UNPACK #-} !Tb_event_mod, key :: {-# UNPACK #-} !Tb_key, ch :: {-# UNPACK #-} !Char, w :: {-# UNPACK #-} !Int32, h :: {-# UNPACK #-} !Int32, x :: {-# UNPACK #-} !Int32, y :: {-# UNPACK #-} !Int32 } deriving stock (Eq, Generic, Ord, Show) ceventToEvent :: Termbox.Bindings.C.Tb_event -> Tb_event ceventToEvent Termbox.Bindings.C.Tb_event {type_, mod, key, ch, w, h, x, y} = Tb_event { type_ = Tb_event_type type_, mod = Tb_event_mod mod, key = Tb_key key, ch = word32ToChar ch, w, h, x, y } {-# INLINE ceventToEvent #-} -- | An event modifier. newtype Tb_event_mod = Tb_event_mod Word8 deriving stock (Eq, Ord, Show) pattern TB_MOD_ALT :: Tb_event_mod pattern TB_MOD_ALT <- ((== Tb_event_mod Termbox.Bindings.C._TB_MOD_ALT) -> True) where TB_MOD_ALT = Tb_event_mod Termbox.Bindings.C._TB_MOD_ALT pattern TB_MOD_MOTION :: Tb_event_mod pattern TB_MOD_MOTION <- ((== Tb_event_mod Termbox.Bindings.C._TB_MOD_MOTION) -> True) where TB_MOD_MOTION = Tb_event_mod Termbox.Bindings.C._TB_MOD_MOTION -- | An event type. newtype Tb_event_type = Tb_event_type Word8 deriving stock (Eq, Ord) instance Show Tb_event_type where show = \case TB_EVENT_KEY -> "TB_EVENT_KEY" TB_EVENT_MOUSE -> "TB_EVENT_MOUSE" TB_EVENT_RESIZE -> "TB_EVENT_RESIZE" pattern TB_EVENT_KEY :: Tb_event_type pattern TB_EVENT_KEY <- ((== Tb_event_type Termbox.Bindings.C._TB_EVENT_KEY) -> True) where TB_EVENT_KEY = Tb_event_type Termbox.Bindings.C._TB_EVENT_KEY pattern TB_EVENT_MOUSE :: Tb_event_type pattern TB_EVENT_MOUSE <- ((== Tb_event_type Termbox.Bindings.C._TB_EVENT_MOUSE) -> True) where TB_EVENT_MOUSE = Tb_event_type Termbox.Bindings.C._TB_EVENT_MOUSE pattern TB_EVENT_RESIZE :: Tb_event_type pattern TB_EVENT_RESIZE <- ((== Tb_event_type Termbox.Bindings.C._TB_EVENT_RESIZE) -> True) where TB_EVENT_RESIZE = Tb_event_type Termbox.Bindings.C._TB_EVENT_RESIZE {-# COMPLETE TB_EVENT_KEY, TB_EVENT_MOUSE, TB_EVENT_RESIZE #-} -- | A 'tb_init' error. newtype Tb_init_error = Tb_init_error CInt deriving stock (Eq, Ord) instance Show Tb_init_error where show = \case TB_EFAILED_TO_OPEN_TTY -> "TB_EFAILED_TO_OPEN_TTY" TB_EPIPE_TRAP_ERROR -> "TB_EPIPE_TRAP_ERROR" TB_EUNSUPPORTED_TERMINAL -> "TB_EUNSUPPORTED_TERMINAL" pattern TB_EFAILED_TO_OPEN_TTY :: Tb_init_error pattern TB_EFAILED_TO_OPEN_TTY <- ((== Tb_init_error Termbox.Bindings.C._TB_EFAILED_TO_OPEN_TTY) -> True) where TB_EFAILED_TO_OPEN_TTY = Tb_init_error Termbox.Bindings.C._TB_EFAILED_TO_OPEN_TTY pattern TB_EPIPE_TRAP_ERROR :: Tb_init_error pattern TB_EPIPE_TRAP_ERROR <- ((== Tb_init_error Termbox.Bindings.C._TB_EPIPE_TRAP_ERROR) -> True) where TB_EPIPE_TRAP_ERROR = Tb_init_error Termbox.Bindings.C._TB_EPIPE_TRAP_ERROR pattern TB_EUNSUPPORTED_TERMINAL :: Tb_init_error pattern TB_EUNSUPPORTED_TERMINAL <- ((== Tb_init_error Termbox.Bindings.C._TB_EUNSUPPORTED_TERMINAL) -> True) where TB_EUNSUPPORTED_TERMINAL = Tb_init_error Termbox.Bindings.C._TB_EUNSUPPORTED_TERMINAL {-# COMPLETE TB_EFAILED_TO_OPEN_TTY, TB_EPIPE_TRAP_ERROR, TB_EUNSUPPORTED_TERMINAL #-} -- | The input mode. newtype Tb_input_mode = Tb_input_mode CInt deriving stock (Eq, Ord) instance Show Tb_input_mode where show = \case TB_INPUT_CURRENT -> "TB_INPUT_CURRENT" TB_INPUT_ALT -> "TB_INPUT_ALT" TB_INPUT_ESC -> "TB_INPUT_ESC" TB_INPUT_MOUSE -> "TB_INPUT_MOUSE" pattern TB_INPUT_CURRENT :: Tb_input_mode pattern TB_INPUT_CURRENT <- ((== Tb_input_mode Termbox.Bindings.C._TB_INPUT_CURRENT) -> True) where TB_INPUT_CURRENT = Tb_input_mode Termbox.Bindings.C._TB_INPUT_CURRENT pattern TB_INPUT_ALT :: Tb_input_mode pattern TB_INPUT_ALT <- ((== Tb_input_mode Termbox.Bindings.C._TB_INPUT_ALT) -> True) where TB_INPUT_ALT = Tb_input_mode Termbox.Bindings.C._TB_INPUT_ALT pattern TB_INPUT_ESC :: Tb_input_mode pattern TB_INPUT_ESC <- ((== Tb_input_mode Termbox.Bindings.C._TB_INPUT_ESC) -> True) where TB_INPUT_ESC = Tb_input_mode Termbox.Bindings.C._TB_INPUT_ESC pattern TB_INPUT_MOUSE :: Tb_input_mode pattern TB_INPUT_MOUSE <- ((== Tb_input_mode Termbox.Bindings.C._TB_INPUT_MOUSE) -> True) where TB_INPUT_MOUSE = Tb_input_mode Termbox.Bindings.C._TB_INPUT_MOUSE {-# COMPLETE TB_INPUT_CURRENT, TB_INPUT_ALT, TB_INPUT_ESC, TB_INPUT_MOUSE #-} newtype Tb_key = Tb_key Word16 deriving stock (Eq, Ord) instance Show Tb_key where show = \case TB_KEY_F1 -> "TB_KEY_F1" TB_KEY_F2 -> "TB_KEY_F2" TB_KEY_F3 -> "TB_KEY_F3" TB_KEY_F4 -> "TB_KEY_F4" TB_KEY_F5 -> "TB_KEY_F5" TB_KEY_F6 -> "TB_KEY_F6" TB_KEY_F7 -> "TB_KEY_F7" TB_KEY_F8 -> "TB_KEY_F8" TB_KEY_F9 -> "TB_KEY_F9" TB_KEY_F10 -> "TB_KEY_F10" TB_KEY_F11 -> "TB_KEY_F11" TB_KEY_F12 -> "TB_KEY_F12" TB_KEY_INSERT -> "TB_KEY_INSERT" TB_KEY_DELETE -> "TB_KEY_DELETE" TB_KEY_HOME -> "TB_KEY_HOME" TB_KEY_END -> "TB_KEY_END" TB_KEY_PGUP -> "TB_KEY_PGUP" TB_KEY_PGDN -> "TB_KEY_PGDN" TB_KEY_ARROW_UP -> "TB_KEY_ARROW_UP" TB_KEY_ARROW_DOWN -> "TB_KEY_ARROW_DOWN" TB_KEY_ARROW_LEFT -> "TB_KEY_ARROW_LEFT" TB_KEY_ARROW_RIGHT -> "TB_KEY_ARROW_RIGHT" TB_KEY_MOUSE_LEFT -> "TB_KEY_MOUSE_LEFT" TB_KEY_MOUSE_RIGHT -> "TB_KEY_MOUSE_RIGHT" TB_KEY_MOUSE_MIDDLE -> "TB_KEY_MOUSE_MIDDLE" TB_KEY_MOUSE_RELEASE -> "TB_KEY_MOUSE_RELEASE" TB_KEY_MOUSE_WHEEL_UP -> "TB_KEY_MOUSE_WHEEL_UP" TB_KEY_MOUSE_WHEEL_DOWN -> "TB_KEY_MOUSE_WHEEL_DOWN" TB_KEY_CTRL_TILDE -> "TB_KEY_CTRL_TILDE" TB_KEY_CTRL_A -> "TB_KEY_CTRL_A" TB_KEY_CTRL_B -> "TB_KEY_CTRL_B" TB_KEY_CTRL_C -> "TB_KEY_CTRL_C" TB_KEY_CTRL_D -> "TB_KEY_CTRL_D" TB_KEY_CTRL_E -> "TB_KEY_CTRL_E" TB_KEY_CTRL_F -> "TB_KEY_CTRL_F" TB_KEY_CTRL_G -> "TB_KEY_CTRL_G" TB_KEY_BACKSPACE -> "TB_KEY_BACKSPACE" TB_KEY_TAB -> "TB_KEY_TAB" TB_KEY_CTRL_J -> "TB_KEY_CTRL_J" TB_KEY_CTRL_K -> "TB_KEY_CTRL_K" TB_KEY_CTRL_L -> "TB_KEY_CTRL_L" TB_KEY_ENTER -> "TB_KEY_ENTER" TB_KEY_CTRL_N -> "TB_KEY_CTRL_N" TB_KEY_CTRL_O -> "TB_KEY_CTRL_O" TB_KEY_CTRL_P -> "TB_KEY_CTRL_P" TB_KEY_CTRL_Q -> "TB_KEY_CTRL_Q" TB_KEY_CTRL_R -> "TB_KEY_CTRL_R" TB_KEY_CTRL_S -> "TB_KEY_CTRL_S" TB_KEY_CTRL_T -> "TB_KEY_CTRL_T" TB_KEY_CTRL_U -> "TB_KEY_CTRL_U" TB_KEY_CTRL_V -> "TB_KEY_CTRL_V" TB_KEY_CTRL_W -> "TB_KEY_CTRL_W" TB_KEY_CTRL_X -> "TB_KEY_CTRL_X" TB_KEY_CTRL_Y -> "TB_KEY_CTRL_Y" TB_KEY_CTRL_Z -> "TB_KEY_CTRL_Z" TB_KEY_ESC -> "TB_KEY_ESC" TB_KEY_CTRL_4 -> "TB_KEY_CTRL_4" TB_KEY_CTRL_5 -> "TB_KEY_CTRL_5" TB_KEY_CTRL_6 -> "TB_KEY_CTRL_6" TB_KEY_CTRL_7 -> "TB_KEY_CTRL_7" TB_KEY_SPACE -> "TB_KEY_SPACE" TB_KEY_BACKSPACE2 -> "TB_KEY_BACKSPACE2" k -> error ("Unknown key: " ++ show k) pattern TB_KEY_ARROW_DOWN :: Tb_key pattern TB_KEY_ARROW_DOWN <- ((== Tb_key Termbox.Bindings.C._TB_KEY_ARROW_DOWN) -> True) where TB_KEY_ARROW_DOWN = Tb_key Termbox.Bindings.C._TB_KEY_ARROW_DOWN pattern TB_KEY_ARROW_LEFT :: Tb_key pattern TB_KEY_ARROW_LEFT <- ((== Tb_key Termbox.Bindings.C._TB_KEY_ARROW_LEFT) -> True) where TB_KEY_ARROW_LEFT = Tb_key Termbox.Bindings.C._TB_KEY_ARROW_LEFT pattern TB_KEY_ARROW_RIGHT :: Tb_key pattern TB_KEY_ARROW_RIGHT <- ((== Tb_key Termbox.Bindings.C._TB_KEY_ARROW_RIGHT) -> True) where TB_KEY_ARROW_RIGHT = Tb_key Termbox.Bindings.C._TB_KEY_ARROW_RIGHT pattern TB_KEY_ARROW_UP :: Tb_key pattern TB_KEY_ARROW_UP <- ((== Tb_key Termbox.Bindings.C._TB_KEY_ARROW_UP) -> True) where TB_KEY_ARROW_UP = Tb_key Termbox.Bindings.C._TB_KEY_ARROW_UP pattern TB_KEY_BACKSPACE :: Tb_key pattern TB_KEY_BACKSPACE <- ((== Tb_key Termbox.Bindings.C._TB_KEY_BACKSPACE) -> True) where TB_KEY_BACKSPACE = Tb_key Termbox.Bindings.C._TB_KEY_BACKSPACE pattern TB_KEY_BACKSPACE2 :: Tb_key pattern TB_KEY_BACKSPACE2 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_BACKSPACE2) -> True) where TB_KEY_BACKSPACE2 = Tb_key Termbox.Bindings.C._TB_KEY_BACKSPACE2 pattern TB_KEY_CTRL_2 :: Tb_key pattern TB_KEY_CTRL_2 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_2) -> True) where TB_KEY_CTRL_2 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_2 pattern TB_KEY_CTRL_3 :: Tb_key pattern TB_KEY_CTRL_3 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_3) -> True) where TB_KEY_CTRL_3 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_3 pattern TB_KEY_CTRL_4 :: Tb_key pattern TB_KEY_CTRL_4 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_4) -> True) where TB_KEY_CTRL_4 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_4 pattern TB_KEY_CTRL_5 :: Tb_key pattern TB_KEY_CTRL_5 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_5) -> True) where TB_KEY_CTRL_5 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_5 pattern TB_KEY_CTRL_6 :: Tb_key pattern TB_KEY_CTRL_6 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_6) -> True) where TB_KEY_CTRL_6 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_6 pattern TB_KEY_CTRL_7 :: Tb_key pattern TB_KEY_CTRL_7 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_7) -> True) where TB_KEY_CTRL_7 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_7 pattern TB_KEY_CTRL_8 :: Tb_key pattern TB_KEY_CTRL_8 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_8) -> True) where TB_KEY_CTRL_8 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_8 pattern TB_KEY_CTRL_A :: Tb_key pattern TB_KEY_CTRL_A <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_A) -> True) where TB_KEY_CTRL_A = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_A pattern TB_KEY_CTRL_B :: Tb_key pattern TB_KEY_CTRL_B <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_B) -> True) where TB_KEY_CTRL_B = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_B pattern TB_KEY_CTRL_BACKSLASH :: Tb_key pattern TB_KEY_CTRL_BACKSLASH <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_BACKSLASH) -> True) where TB_KEY_CTRL_BACKSLASH = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_BACKSLASH pattern TB_KEY_CTRL_C :: Tb_key pattern TB_KEY_CTRL_C <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_C) -> True) where TB_KEY_CTRL_C = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_C pattern TB_KEY_CTRL_D :: Tb_key pattern TB_KEY_CTRL_D <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_D) -> True) where TB_KEY_CTRL_D = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_D pattern TB_KEY_CTRL_E :: Tb_key pattern TB_KEY_CTRL_E <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_E) -> True) where TB_KEY_CTRL_E = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_E pattern TB_KEY_CTRL_F :: Tb_key pattern TB_KEY_CTRL_F <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_F) -> True) where TB_KEY_CTRL_F = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_F pattern TB_KEY_CTRL_G :: Tb_key pattern TB_KEY_CTRL_G <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_G) -> True) where TB_KEY_CTRL_G = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_G pattern TB_KEY_CTRL_H :: Tb_key pattern TB_KEY_CTRL_H <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_H) -> True) where TB_KEY_CTRL_H = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_H pattern TB_KEY_CTRL_I :: Tb_key pattern TB_KEY_CTRL_I <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_I) -> True) where TB_KEY_CTRL_I = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_I pattern TB_KEY_CTRL_J :: Tb_key pattern TB_KEY_CTRL_J <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_J) -> True) where TB_KEY_CTRL_J = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_J pattern TB_KEY_CTRL_K :: Tb_key pattern TB_KEY_CTRL_K <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_K) -> True) where TB_KEY_CTRL_K = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_K pattern TB_KEY_CTRL_L :: Tb_key pattern TB_KEY_CTRL_L <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_L) -> True) where TB_KEY_CTRL_L = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_L pattern TB_KEY_CTRL_LSQ_BRACKET :: Tb_key pattern TB_KEY_CTRL_LSQ_BRACKET <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_LSQ_BRACKET) -> True) where TB_KEY_CTRL_LSQ_BRACKET = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_LSQ_BRACKET pattern TB_KEY_CTRL_M :: Tb_key pattern TB_KEY_CTRL_M <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_M) -> True) where TB_KEY_CTRL_M = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_M pattern TB_KEY_CTRL_N :: Tb_key pattern TB_KEY_CTRL_N <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_N) -> True) where TB_KEY_CTRL_N = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_N pattern TB_KEY_CTRL_O :: Tb_key pattern TB_KEY_CTRL_O <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_O) -> True) where TB_KEY_CTRL_O = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_O pattern TB_KEY_CTRL_P :: Tb_key pattern TB_KEY_CTRL_P <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_P) -> True) where TB_KEY_CTRL_P = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_P pattern TB_KEY_CTRL_Q :: Tb_key pattern TB_KEY_CTRL_Q <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Q) -> True) where TB_KEY_CTRL_Q = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Q pattern TB_KEY_CTRL_R :: Tb_key pattern TB_KEY_CTRL_R <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_R) -> True) where TB_KEY_CTRL_R = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_R pattern TB_KEY_CTRL_RSQ_BRACKET :: Tb_key pattern TB_KEY_CTRL_RSQ_BRACKET <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_RSQ_BRACKET) -> True) where TB_KEY_CTRL_RSQ_BRACKET = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_RSQ_BRACKET pattern TB_KEY_CTRL_S :: Tb_key pattern TB_KEY_CTRL_S <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_S) -> True) where TB_KEY_CTRL_S = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_S pattern TB_KEY_CTRL_SLASH :: Tb_key pattern TB_KEY_CTRL_SLASH <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_SLASH) -> True) where TB_KEY_CTRL_SLASH = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_SLASH pattern TB_KEY_CTRL_T :: Tb_key pattern TB_KEY_CTRL_T <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_T) -> True) where TB_KEY_CTRL_T = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_T pattern TB_KEY_CTRL_TILDE :: Tb_key pattern TB_KEY_CTRL_TILDE <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_TILDE) -> True) where TB_KEY_CTRL_TILDE = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_TILDE pattern TB_KEY_CTRL_U :: Tb_key pattern TB_KEY_CTRL_U <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_U) -> True) where TB_KEY_CTRL_U = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_U pattern TB_KEY_CTRL_UNDERSCORE :: Tb_key pattern TB_KEY_CTRL_UNDERSCORE <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_UNDERSCORE) -> True) where TB_KEY_CTRL_UNDERSCORE = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_UNDERSCORE pattern TB_KEY_CTRL_V :: Tb_key pattern TB_KEY_CTRL_V <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_V) -> True) where TB_KEY_CTRL_V = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_V pattern TB_KEY_CTRL_W :: Tb_key pattern TB_KEY_CTRL_W <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_W) -> True) where TB_KEY_CTRL_W = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_W pattern TB_KEY_CTRL_X :: Tb_key pattern TB_KEY_CTRL_X <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_X) -> True) where TB_KEY_CTRL_X = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_X pattern TB_KEY_CTRL_Y :: Tb_key pattern TB_KEY_CTRL_Y <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Y) -> True) where TB_KEY_CTRL_Y = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Y pattern TB_KEY_CTRL_Z :: Tb_key pattern TB_KEY_CTRL_Z <- ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Z) -> True) where TB_KEY_CTRL_Z = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Z pattern TB_KEY_DELETE :: Tb_key pattern TB_KEY_DELETE <- ((== Tb_key Termbox.Bindings.C._TB_KEY_DELETE) -> True) where TB_KEY_DELETE = Tb_key Termbox.Bindings.C._TB_KEY_DELETE pattern TB_KEY_END :: Tb_key pattern TB_KEY_END <- ((== Tb_key Termbox.Bindings.C._TB_KEY_END) -> True) where TB_KEY_END = Tb_key Termbox.Bindings.C._TB_KEY_END pattern TB_KEY_ENTER :: Tb_key pattern TB_KEY_ENTER <- ((== Tb_key Termbox.Bindings.C._TB_KEY_ENTER) -> True) where TB_KEY_ENTER = Tb_key Termbox.Bindings.C._TB_KEY_ENTER pattern TB_KEY_ESC :: Tb_key pattern TB_KEY_ESC <- ((== Tb_key Termbox.Bindings.C._TB_KEY_ESC) -> True) where TB_KEY_ESC = Tb_key Termbox.Bindings.C._TB_KEY_ESC pattern TB_KEY_F1 :: Tb_key pattern TB_KEY_F1 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F1) -> True) where TB_KEY_F1 = Tb_key Termbox.Bindings.C._TB_KEY_F1 pattern TB_KEY_F10 :: Tb_key pattern TB_KEY_F10 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F10) -> True) where TB_KEY_F10 = Tb_key Termbox.Bindings.C._TB_KEY_F10 pattern TB_KEY_F11 :: Tb_key pattern TB_KEY_F11 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F11) -> True) where TB_KEY_F11 = Tb_key Termbox.Bindings.C._TB_KEY_F11 pattern TB_KEY_F12 :: Tb_key pattern TB_KEY_F12 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F12) -> True) where TB_KEY_F12 = Tb_key Termbox.Bindings.C._TB_KEY_F12 pattern TB_KEY_F2 :: Tb_key pattern TB_KEY_F2 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F2) -> True) where TB_KEY_F2 = Tb_key Termbox.Bindings.C._TB_KEY_F2 pattern TB_KEY_F3 :: Tb_key pattern TB_KEY_F3 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F3) -> True) where TB_KEY_F3 = Tb_key Termbox.Bindings.C._TB_KEY_F3 pattern TB_KEY_F4 :: Tb_key pattern TB_KEY_F4 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F4) -> True) where TB_KEY_F4 = Tb_key Termbox.Bindings.C._TB_KEY_F4 pattern TB_KEY_F5 :: Tb_key pattern TB_KEY_F5 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F5) -> True) where TB_KEY_F5 = Tb_key Termbox.Bindings.C._TB_KEY_F5 pattern TB_KEY_F6 :: Tb_key pattern TB_KEY_F6 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F6) -> True) where TB_KEY_F6 = Tb_key Termbox.Bindings.C._TB_KEY_F6 pattern TB_KEY_F7 :: Tb_key pattern TB_KEY_F7 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F7) -> True) where TB_KEY_F7 = Tb_key Termbox.Bindings.C._TB_KEY_F7 pattern TB_KEY_F8 :: Tb_key pattern TB_KEY_F8 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F8) -> True) where TB_KEY_F8 = Tb_key Termbox.Bindings.C._TB_KEY_F8 pattern TB_KEY_F9 :: Tb_key pattern TB_KEY_F9 <- ((== Tb_key Termbox.Bindings.C._TB_KEY_F9) -> True) where TB_KEY_F9 = Tb_key Termbox.Bindings.C._TB_KEY_F9 pattern TB_KEY_HOME :: Tb_key pattern TB_KEY_HOME <- ((== Tb_key Termbox.Bindings.C._TB_KEY_HOME) -> True) where TB_KEY_HOME = Tb_key Termbox.Bindings.C._TB_KEY_HOME pattern TB_KEY_INSERT :: Tb_key pattern TB_KEY_INSERT <- ((== Tb_key Termbox.Bindings.C._TB_KEY_INSERT) -> True) where TB_KEY_INSERT = Tb_key Termbox.Bindings.C._TB_KEY_INSERT pattern TB_KEY_MOUSE_LEFT :: Tb_key pattern TB_KEY_MOUSE_LEFT <- ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_LEFT) -> True) where TB_KEY_MOUSE_LEFT = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_LEFT pattern TB_KEY_MOUSE_MIDDLE :: Tb_key pattern TB_KEY_MOUSE_MIDDLE <- ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_MIDDLE) -> True) where TB_KEY_MOUSE_MIDDLE = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_MIDDLE pattern TB_KEY_MOUSE_RELEASE :: Tb_key pattern TB_KEY_MOUSE_RELEASE <- ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_RELEASE) -> True) where TB_KEY_MOUSE_RELEASE = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_RELEASE pattern TB_KEY_MOUSE_RIGHT :: Tb_key pattern TB_KEY_MOUSE_RIGHT <- ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_RIGHT) -> True) where TB_KEY_MOUSE_RIGHT = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_RIGHT pattern TB_KEY_MOUSE_WHEEL_DOWN :: Tb_key pattern TB_KEY_MOUSE_WHEEL_DOWN <- ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_WHEEL_DOWN) -> True) where TB_KEY_MOUSE_WHEEL_DOWN = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_WHEEL_DOWN pattern TB_KEY_MOUSE_WHEEL_UP :: Tb_key pattern TB_KEY_MOUSE_WHEEL_UP <- ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_WHEEL_UP) -> True) where TB_KEY_MOUSE_WHEEL_UP = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_WHEEL_UP pattern TB_KEY_PGDN :: Tb_key pattern TB_KEY_PGDN <- ((== Tb_key Termbox.Bindings.C._TB_KEY_PGDN) -> True) where TB_KEY_PGDN = Tb_key Termbox.Bindings.C._TB_KEY_PGDN pattern TB_KEY_PGUP :: Tb_key pattern TB_KEY_PGUP <- ((== Tb_key Termbox.Bindings.C._TB_KEY_PGUP) -> True) where TB_KEY_PGUP = Tb_key Termbox.Bindings.C._TB_KEY_PGUP pattern TB_KEY_SPACE :: Tb_key pattern TB_KEY_SPACE <- ((== Tb_key Termbox.Bindings.C._TB_KEY_SPACE) -> True) where TB_KEY_SPACE = Tb_key Termbox.Bindings.C._TB_KEY_SPACE pattern TB_KEY_TAB :: Tb_key pattern TB_KEY_TAB <- ((== Tb_key Termbox.Bindings.C._TB_KEY_TAB) -> True) where TB_KEY_TAB = Tb_key Termbox.Bindings.C._TB_KEY_TAB -- | The output mode. newtype Tb_output_mode = Tb_output_mode CInt deriving stock (Eq, Ord) instance Show Tb_output_mode where show = \case TB_OUTPUT_CURRENT -> "TB_OUTPUT_CURRENT" TB_OUTPUT_216 -> "TB_OUTPUT_216" TB_OUTPUT_256 -> "TB_OUTPUT_256" TB_OUTPUT_GRAYSCALE -> "TB_OUTPUT_GRAYSCALE" TB_OUTPUT_NORMAL -> "TB_OUTPUT_NORMAL" pattern TB_OUTPUT_CURRENT :: Tb_output_mode pattern TB_OUTPUT_CURRENT <- ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_CURRENT) -> True) where TB_OUTPUT_CURRENT = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_CURRENT pattern TB_OUTPUT_216 :: Tb_output_mode pattern TB_OUTPUT_216 <- ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_216) -> True) where TB_OUTPUT_216 = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_216 pattern TB_OUTPUT_256 :: Tb_output_mode pattern TB_OUTPUT_256 <- ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_256) -> True) where TB_OUTPUT_256 = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_256 pattern TB_OUTPUT_GRAYSCALE :: Tb_output_mode pattern TB_OUTPUT_GRAYSCALE <- ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_GRAYSCALE) -> True) where TB_OUTPUT_GRAYSCALE = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_GRAYSCALE pattern TB_OUTPUT_NORMAL :: Tb_output_mode pattern TB_OUTPUT_NORMAL <- ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_NORMAL) -> True) where TB_OUTPUT_NORMAL = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_NORMAL {-# COMPLETE TB_OUTPUT_CURRENT, TB_OUTPUT_216, TB_OUTPUT_256, TB_OUTPUT_GRAYSCALE, TB_OUTPUT_NORMAL #-} -- charToWord32 :: Char -> Word32 charToWord32 = fromIntegral @Int @Word32 . Char.ord {-# INLINE charToWord32 #-} word32ToChar :: Word32 -> Char word32ToChar = Char.chr . fromIntegral @Word32 @Int {-# INLINE word32ToChar #-} cintToInt :: CInt -> Int cintToInt = fromIntegral {-# INLINE cintToInt #-} intToCInt :: Int -> CInt intToCInt = fromIntegral {-# INLINE intToCInt #-}