Skip to content

HeadlessPresentationAdapter ​

Namespace: Hex1b

Assembly: Hex1b.dll

A presentation adapter that discards output and provides no input. Use this for headless/testing scenarios where no actual terminal I/O is needed.

csharp
public sealed class HeadlessPresentationAdapter : IHex1bTerminalPresentationAdapter, ITerminalReflowProvider, IAsyncDisposable, IDisposable

Inheritance ​

Object → HeadlessPresentationAdapter

Implements ​

Constructors ​

HeadlessPresentationAdapter(int, int, TerminalCapabilities?) ​

Creates a new headless presentation adapter with the specified dimensions.

Parameters:

  • width (Int32): Terminal width in columns.
  • height (Int32): Terminal height in rows.
  • capabilities (TerminalCapabilities): Optional terminal capabilities. Defaults to .
csharp
public HeadlessPresentationAdapter(int width = 80, int height = 24, TerminalCapabilities? capabilities = null)

Properties ​

Capabilities ​

Capability hints that inform optimization strategies.

Returns: TerminalCapabilities

csharp
public TerminalCapabilities Capabilities { get; }

Height ​

Current terminal height in rows.

Returns: Int32

csharp
public int Height { get; }

ReflowEnabled ​

Gets whether reflow is enabled. When false, the terminal uses standard crop-and-extend resize behavior even though the adapter implements this interface. Defaults to true.

Returns: Boolean

csharp
public bool ReflowEnabled { get; }

ShouldClearSoftWrapOnAbsolutePosition ​

Gets whether absolute cursor positioning (CUP, HVP) should clear the flag on the current row's last cell.

Returns: Boolean

csharp
public bool ShouldClearSoftWrapOnAbsolutePosition { get; }

Width ​

Current terminal width in columns.

Returns: Int32

csharp
public int Width { get; }

Methods ​

Dispose() ​

Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.

csharp
public void Dispose()

DisposeAsync() ​

Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources asynchronously.

Returns: ValueTask

A task that represents the asynchronous dispose operation.

csharp
public ValueTask DisposeAsync()

EnterRawModeAsync(CancellationToken) ​

Enter raw mode for proper input capture.

Parameters:

Returns: ValueTask

csharp
public ValueTask EnterRawModeAsync(CancellationToken ct = default)

ExitRawModeAsync(CancellationToken) ​

Exit raw mode and restore normal terminal input handling.

Parameters:

Returns: ValueTask

csharp
public ValueTask ExitRawModeAsync(CancellationToken ct = default)

FlushAsync(CancellationToken) ​

Flush any buffered output immediately.

Parameters:

Returns: ValueTask

csharp
public ValueTask FlushAsync(CancellationToken ct = default)

GetCursorPosition() ​

Gets the current cursor position in the terminal. Returns (0, 0) if the position cannot be determined.

Returns: ValueTuple<Int32, Int32>

A tuple of (Row, Column), both 0-based.

csharp
public (int Row, int Column) GetCursorPosition()

ReadInputAsync(CancellationToken) ​

Receive input (keystrokes, mouse events as ANSI sequences) FROM the user.

Parameters:

Returns: ValueTask<Byte>>

Raw input bytes from the user, or empty when disconnected.

csharp
public ValueTask<ReadOnlyMemory<byte>> ReadInputAsync(CancellationToken ct = default)

Reflow(ReflowContext) ​

Performs reflow of terminal content during a resize operation.

Parameters:

  • context (ReflowContext): The current terminal state including screen buffer, scrollback, and cursor position.

Returns: ReflowResult

The reflowed terminal state with new buffer, scrollback, and cursor position.

csharp
public ReflowResult Reflow(ReflowContext context)

TriggerResize(int, int) ​

Triggers a resize event for testing purposes.

Parameters:

  • width (Int32): New width.
  • height (Int32): New height.
csharp
public void TriggerResize(int width, int height)

WithReflow(ITerminalReflowProvider) ​

Configures the reflow strategy for this adapter and enables reflow. By default, reflow is disabled and resize uses standard crop behavior.

Parameters:

Returns: HeadlessPresentationAdapter

This adapter for fluent chaining.

csharp
public HeadlessPresentationAdapter WithReflow(ITerminalReflowProvider strategy)

WriteOutputAsync(ReadOnlyMemory<byte>, CancellationToken) ​

Write rendered output TO the presentation layer (display).

Parameters:

Returns: ValueTask

csharp
public ValueTask WriteOutputAsync(ReadOnlyMemory<byte> data, CancellationToken ct = default)

Events ​

Disconnected ​

Raised when the presentation layer disconnects (e.g., terminal closed, WebSocket dropped).

Returns: Action

csharp
public event Action? Disconnected

Resized ​

Raised when the presentation layer is resized by the user.

Returns: Action<Int32, Int32>

csharp
public event Action<int, int>? Resized

Remarks ​

The headless adapter satisfies the presentation adapter interface but:

WriteOutputAsync discards all dataReadInputAsync blocks until cancelledRaw mode operations are no-ops

This is useful for:

Unit tests that verify workload behavior without terminal I/OIntegration tests with presentation filters (e.g., asciinema recording)CI/CD environments where no TTY is available

Optionally implements when a reflow strategy is configured via . This enables testing different terminal emulator reflow behaviors in headless mode.

Examples ​

csharp
await Hex1bTerminal.CreateBuilder()
    .WithHex1bApp(ctx => ctx.Text("Hello"))
    .WithHeadless()
    .WithDimensions(80, 24)
    .WithAsciinemaRecording("output.cast")
    .RunAsync();

Released under the MIT License.