# `Raxol.Terminal.ControlCodes`
[🔗](https://github.com/DROOdotFOO/raxol/blob/v2.8.0/lib/raxol/terminal/control_codes.ex#L1)

Handles C0 control codes and simple ESC sequences.

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

# `cursor_save_state`

```elixir
@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`

Handles bell control code.

# `handle_bs`

Handle Backspace (BS)

# `handle_c0`

```elixir
@spec handle_c0(Raxol.Terminal.Emulator.t(), non_neg_integer()) ::
  Raxol.Terminal.Emulator.t()
```

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

# `handle_can`

```elixir
@spec handle_can(Raxol.Terminal.Emulator.t()) :: Raxol.Terminal.Emulator.t()
```

# `handle_cr`

Handle Carriage Return (CR)

# `handle_decrc`

```elixir
@spec handle_decrc(Raxol.Terminal.Emulator.t()) :: Raxol.Terminal.Emulator.t()
```

# `handle_decsc`

```elixir
@spec handle_decsc(Raxol.Terminal.Emulator.t()) :: Raxol.Terminal.Emulator.t()
```

# `handle_escape`

```elixir
@spec handle_escape(Raxol.Terminal.Emulator.t(), integer()) ::
  Raxol.Terminal.Emulator.t()
```

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

# `handle_ht`

Handles the Horizontal Tab (HT) action.

# `handle_hts`

```elixir
@spec handle_hts(Raxol.Terminal.Emulator.t()) :: Raxol.Terminal.Emulator.t()
```

# `handle_ind`

```elixir
@spec handle_ind(Raxol.Terminal.Emulator.t()) :: Raxol.Terminal.Emulator.t()
```

# `handle_lf`

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

# `handle_ls1r`

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

# `handle_ls2`

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

# `handle_ls2r`

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

# `handle_ls3`

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

# `handle_ls3r`

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

# `handle_nel`

```elixir
@spec handle_nel(Raxol.Terminal.Emulator.t()) :: Raxol.Terminal.Emulator.t()
```

# `handle_ri`

Handle Reverse Index (RI) - ESC M

# `handle_ris`

```elixir
@spec handle_ris(Raxol.Terminal.Emulator.t()) :: Raxol.Terminal.Emulator.t()
```

# `handle_si`

```elixir
@spec handle_si(Raxol.Terminal.Emulator.t()) :: Raxol.Terminal.Emulator.t()
```

# `handle_so`

```elixir
@spec handle_so(Raxol.Terminal.Emulator.t()) :: Raxol.Terminal.Emulator.t()
```

# `handle_sub`

Handles substitute character control code.

# `restore_cursor_save_state`

```elixir
@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`

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

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

---

*Consult [api-reference.md](api-reference.md) for complete listing*
