class Termisu::Terminal::Backend

Overview

Low-level terminal I/O combining TTY and Termios state management.

Provides basic terminal operations, managing both the underlying TTY file descriptors and terminal attributes (mode control). Used internally by Terminal for I/O operations.

Example:

backend = Termisu::Terminal::Backend.new
backend.enable_raw_mode
backend.write("Hello, terminal!")
backend.flush
backend.close

# Or use mode switching:
backend.set_mode(Terminal::Mode.cooked)
backend.with_mode(Terminal::Mode.password) { gets }

Defined in:

termisu/terminal/backend.cr

Constructors

Instance Method Summary

Constructor Detail

def self.new #

Creates a new terminal backend, opening /dev/tty for I/O.

Raises IO::Error if the TTY cannot be opened.


[View source]

Instance Method Detail

def close #

Closes the terminal backend, disabling raw mode and closing TTY.


[View source]
def current_mode : Terminal::Mode | Nil #

Returns the current terminal mode, or nil if not yet set.

Delegates to underlying Termios instance.


[View source]
def disable_raw_mode #

Disables raw mode, restoring original terminal attributes.

This method is idempotent - calling it multiple times has no effect if raw mode is already disabled.


[View source]
def enable_raw_mode #

Enables raw mode for the terminal.

Raw mode disables input processing, canonical mode, echo, and signals, allowing direct character-by-character input without line buffering.

This method is idempotent - calling it multiple times has no effect if raw mode is already enabled.


[View source]
def flush #

Flushes the output buffer to the terminal.


[View source]
def infd : Int32 #

[View source]
def outfd : Int32 #

[View source]
def raw_mode? : Bool #

Returns whether raw mode is currently enabled.


[View source]
def read(buffer : Bytes) : Int32 #

Reads data from the terminal into the provided buffer.

Returns the number of bytes read, or 0 on EOF. Raises IO::Error on read failure.


[View source]
def set_mode(mode : Terminal::Mode) #

Sets terminal to specific mode using Terminal::Mode flags.

Updates raw_mode_enabled tracking based on whether mode is raw (none? means no flags set = raw mode).

Parameters:

  • mode: Terminal::Mode flags specifying desired behavior

Example:

backend.set_mode(Terminal::Mode.cooked) # Shell-out mode
backend.set_mode(Terminal::Mode.raw)    # Full TUI control

ameba:disable Naming/AccessorMethodName


[View source]
def size : Tuple(Int32, Int32) #

Returns the terminal size as {width, height}.

Uses the TIOCGWINSZ ioctl to query the terminal dimensions. Raises IO::Error if the size cannot be determined.


[View source]
def with_mode(mode : Terminal::Mode, &) #

Executes a block with specific terminal mode, restoring previous mode after.

This is the RAII pattern for safe mode switching. The previous mode is always restored, even if the block raises an exception.

Parameters:

  • mode: Terminal::Mode to use within the block

Example:

backend.with_mode(Terminal::Mode.cooked) do
  system("vim file.txt")
end
# Previous mode automatically restored

[View source]
def with_raw_mode(&) #

Executes a block with raw mode enabled, ensuring cleanup.

Example:

backend.with_raw_mode do
  # Raw mode operations here
end
# Raw mode automatically disabled

[View source]
def write(data : String) #

Writes data to the terminal output.


[View source]