Raxol.Terminal.ControlCodes (Raxol Terminal v2.8.0)

Copy Markdown View Source

Handles C0 control codes and simple ESC sequences.

Extracted from Terminal.Emulator for better organization. Relies on Emulator state and ScreenBuffer for actions.

Summary

Functions

The state DECSC saves: cursor position, visibility, style and blink, SGR attributes, charset state and (via mode_manager) origin/autowrap modes.

Handles bell control code.

Handle Backspace (BS)

Handles a C0 control code (0-31) or DEL (127). Delegates to specific handlers based on the codepoint.

Handle Carriage Return (CR)

Handles simple escape sequences (ESC followed by a single byte).

Handles the Horizontal Tab (HT) action.

Handle Line Feed (LF), New Line (NL), Vertical Tab (VT)

Handle Locking Shift 1 Right (LS1R) - ESC ~ Invokes G1 character set into GR

Handle Locking Shift 2 (LS2) - ESC n Invokes G2 character set into GL

Handle Locking Shift 2 Right (LS2R) - ESC } Invokes G2 character set into GR

Handle Locking Shift 3 (LS3) - ESC o Invokes G3 character set into GL

Handle Locking Shift 3 Right (LS3R) - ESC | Invokes G3 character set into GR

Handle Reverse Index (RI) - ESC M

Handles substitute character control code.

Applies a state saved by cursor_save_state/1. scroll_region is deliberately NOT restored -- DECRC does not touch DECSTBM margins on real terminals (see cursor_save_state/1).

The active screen's DECSC saved state, or nil.

Functions

cursor_save_state(emulator)

@spec cursor_save_state(Raxol.Terminal.Emulator.t()) :: map()

The state DECSC saves: cursor position, visibility, style and blink, SGR attributes, charset state and (via mode_manager) origin/autowrap modes.

It does NOT include the DECSTBM scroll region: per VT100/VT510 and xterm, margins are not part of the DECSC/DECRC saved state, so a CSI t;b r emitted inside an ESC 7/ESC 8 bracket survives the restore on real hardware. This emulator used to round-trip scroll_region here, which silently un-set a region established mid-bracket (the adaptive-pin transition emits its DECSTBM inside the seal path's save/restore bracket) -- diverging from every real terminal and invalidating the O2 replay oracle. Pinned by test/harness/adaptive_pin_test.exs's transition replays and the DECRC test in state_stack_test.exs.

handle_bel(emulator)

Handles bell control code.

handle_bs(emulator)

Handle Backspace (BS)

handle_c0(emulator, char_codepoint)

Handles a C0 control code (0-31) or DEL (127). Delegates to specific handlers based on the codepoint.

handle_can(emulator)

handle_cr(emulator)

Handle Carriage Return (CR)

handle_decrc(emulator)

handle_decsc(emulator)

handle_escape(emulator, byte)

Handles simple escape sequences (ESC followed by a single byte).

handle_ht(emulator)

Handles the Horizontal Tab (HT) action.

handle_hts(emulator)

handle_ind(emulator)

handle_lf(emulator)

Handle Line Feed (LF), New Line (NL), Vertical Tab (VT)

handle_ls1r(emulator)

Handle Locking Shift 1 Right (LS1R) - ESC ~ Invokes G1 character set into GR

handle_ls2(emulator)

Handle Locking Shift 2 (LS2) - ESC n Invokes G2 character set into GL

handle_ls2r(emulator)

Handle Locking Shift 2 Right (LS2R) - ESC } Invokes G2 character set into GR

handle_ls3(emulator)

Handle Locking Shift 3 (LS3) - ESC o Invokes G3 character set into GL

handle_ls3r(emulator)

Handle Locking Shift 3 Right (LS3R) - ESC | Invokes G3 character set into GR

handle_nel(emulator)

handle_ri(emulator)

Handle Reverse Index (RI) - ESC M

handle_ris(emulator)

handle_si(emulator)

handle_so(emulator)

handle_sub(emulator)

Handles substitute character control code.

restore_cursor_save_state(emulator, saved_state)

@spec restore_cursor_save_state(Raxol.Terminal.Emulator.t(), map()) ::
  Raxol.Terminal.Emulator.t()

Applies a state saved by cursor_save_state/1. scroll_region is deliberately NOT restored -- DECRC does not touch DECSTBM margins on real terminals (see cursor_save_state/1).

saved_cursor_save_state(emulator)

@spec saved_cursor_save_state(Raxol.Terminal.Emulator.t()) :: map() | nil

The active screen's DECSC saved state, or nil.