Skip to main content

src/etch@erlang@tty.erl

-module(etch@erlang@tty).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etch/erlang/tty.gleam").
-export([enter_raw/0, exit_raw/0, is_raw_mode/0, window_size/0]).
-export_type([terminal_error/0]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

-type terminal_error() :: could_not_get_window_size |
    failed_to_enter_raw_mode |
    failed_to_exit_raw_mode.

-file("src/etch/erlang/tty.gleam", 18).
?DOC(
    " Enters raw mode.\n"
    "\n"
    " Raw mode is a mode where the terminal does not process input, but instead\n"
    " passes it directly to the application. This means that:\n"
    " - Input is not echoed to the screen\n"
    " - Input is not line-buffered (characters are available immediately)\n"
    " - Some special characters are not processed by the terminal\n"
    "\n"
    " This is necessary for terminal UI applications that need to handle\n"
    " keyboard input and mouse events directly.\n"
).
-spec enter_raw() -> {ok, nil} | {error, terminal_error()}.
enter_raw() ->
    terminal_ffi:enter_raw().

-file("src/etch/erlang/tty.gleam", 28).
?DOC(
    " Exits raw mode.\n"
    "\n"
    " Raw mode is a mode where the terminal does not process input, but instead\n"
    " passes it directly to the application. This means that:\n"
    " - Input is not echoed to the screen\n"
    " - Input is not line-buffered (characters are available immediately)\n"
    " - Some special characters are not processed by the terminal\n"
).
-spec exit_raw() -> {ok, nil} | {error, terminal_error()}.
exit_raw() ->
    terminal_ffi:exit_raw().

-file("src/etch/erlang/tty.gleam", 31).
-spec is_raw_mode() -> boolean().
is_raw_mode() ->
    tty_state:is_raw_mode().

-file("src/etch/erlang/tty.gleam", 35).
?DOC(" Returns current window size.\n").
-spec window_size() -> {ok, {integer(), integer()}} | {error, terminal_error()}.
window_size() ->
    terminal_ffi:window_size().