Packages

Multi-surface application runtime for Elixir. One TEA module renders to terminal, browser (LiveView), SSH, and MCP (agents). 30+ widgets, flexbox + CSS grid, AI agent runtime, distributed swarm with CRDTs, time-travel debugging, session recording, sandboxed REPL, and agentic commerce.

Current section

Files

Jump to
raxol lib termbox2_nif lib termbox2_nif.ex
Raw

lib/termbox2_nif/lib/termbox2_nif.ex

defmodule :termbox2_nif do
@moduledoc """
Termbox2 NIF for Elixir - A terminal UI library.
"""
@on_load :load_nif
def load_nif do
# Try raxol app's priv directory first (since termbox2_nif is part of raxol)
priv_dir =
case :code.priv_dir(:raxol) do
{:error, _} ->
# Fallback to termbox2_nif app priv directory
case :code.priv_dir(:termbox2_nif) do
{:error, _} ->
# Final fallback: construct path relative to current module
case :code.which(__MODULE__) do
:non_existing ->
# Development fallback
Path.join([File.cwd!(), "priv"])
path ->
path
|> List.to_string()
|> Path.dirname()
|> Path.dirname()
|> Path.dirname()
|> Path.join("priv")
end
dir ->
List.to_string(dir)
end
dir ->
List.to_string(dir)
end
nif_path = Path.join(priv_dir, "termbox2_nif")
case :erlang.load_nif(String.to_charlist(nif_path), 0) do
:ok ->
:ok
{:error, reason} ->
{:error, reason}
end
end
@doc """
Initialize the termbox2 library.
Returns 0 on success, -1 on error.
"""
def tb_init, do: :erlang.nif_error(:nif_not_loaded)
@doc """
Shutdown the termbox2 library.
"""
def tb_shutdown, do: :erlang.nif_error(:nif_not_loaded)
@doc """
Get the width of the terminal.
"""
def tb_width, do: :erlang.nif_error(:nif_not_loaded)
@doc """
Get the height of the terminal.
"""
def tb_height, do: :erlang.nif_error(:nif_not_loaded)
@doc """
Clear the terminal.
"""
def tb_clear, do: :erlang.nif_error(:nif_not_loaded)
@doc """
Present the changes to the terminal.
"""
def tb_present, do: :erlang.nif_error(:nif_not_loaded)
@doc """
Set the cursor position.
"""
def tb_set_cursor(_x, _y), do: :erlang.nif_error(:nif_not_loaded)
@doc """
Hide the cursor.
Returns 0 on success, -1 on error.
"""
def tb_hide_cursor, do: :erlang.nif_error(:nif_not_loaded)
@doc """
Set a cell in the terminal.
Returns 0 on success, -1 on error.
"""
def tb_set_cell(_x, _y, _ch, _fg, _bg), do: :erlang.nif_error(:nif_not_loaded)
@doc """
Set the input mode.
Returns the previous mode.
"""
def tb_set_input_mode(_mode), do: :erlang.nif_error(:nif_not_loaded)
@doc """
Set the output mode.
Returns the previous mode.
"""
def tb_set_output_mode(_mode), do: :erlang.nif_error(:nif_not_loaded)
@doc """
Print a string at the specified position.
Returns 0 on success, -1 on error.
"""
def tb_print(_x, _y, _fg, _bg, _str), do: :erlang.nif_error(:nif_not_loaded)
@doc """
Set the terminal title.
Returns {:ok, "set"} on success, {:error, reason} on failure.
"""
def tb_set_title(_title), do: :erlang.nif_error(:nif_not_loaded)
@doc """
Set the terminal window position.
Returns {:ok, "set"} on success, {:error, reason} on failure.
"""
def tb_set_position(_x, _y), do: :erlang.nif_error(:nif_not_loaded)
end