Packages

Terminal emulation and driver infrastructure for Raxol. ANSI parsing, screen buffers, command processing, cursor management, input handling, session management, and termbox2 NIF integration.

Current section

Files

Jump to
raxol_terminal lib raxol terminal buffer buffer_manager.ex
Raw

lib/raxol/terminal/buffer/buffer_manager.ex

defmodule Raxol.Terminal.Buffer.BufferManager do
@moduledoc """
Buffer manager for terminal operations.
This module provides a centralized interface for buffer management,
consolidating buffer operations for the terminal renderer.
"""
alias Raxol.Terminal.Buffer.BufferServer
# Delegate to BufferServer for actual implementation
def start_link(opts), do: BufferServer.start_link(opts)
defdelegate set_cell(pid, x, y, cell), to: BufferServer
defdelegate get_cell(pid, x, y), to: BufferServer
defdelegate flush(pid), to: BufferServer
defdelegate batch_operations(pid, operations), to: BufferServer
defdelegate resize(pid, width, height), to: BufferServer
defdelegate get_dimensions(pid), to: BufferServer
defdelegate get_content(pid), to: BufferServer
# Alias for compatibility
def get_size(pid), do: get_dimensions(pid)
# These functions need to be implemented as BufferServer doesn't have them
def clear(pid) do
# Clear by resizing to current dimensions
{width, height} = get_dimensions(pid)
resize(pid, width, height)
end
def update_cursor_position(_pid, _x, _y) do
# BufferServer doesn't manage cursor, just return ok
:ok
end
def get_cursor_position(_pid) do
# Default cursor position
{0, 0}
end
@doc """
Writes text to the buffer at the current cursor position.
This is a simplified interface that writes text character by character
starting at the current cursor position.
"""
@spec write(pid(), String.t()) :: {:ok, pid()}
def write(pid, text) when is_binary(text) do
# Convert string to characters and write each one
text
|> String.graphemes()
|> Enum.with_index()
|> Enum.each(fn {char, index} ->
# Get current cursor position
{x, y} = get_cursor_position(pid)
# Create a basic cell with the character
cell = %{
char: char,
fg: :default,
bg: :default,
attrs: []
}
# Write the cell at the position
set_cell(pid, x + index, y, cell)
end)
# Update cursor position to end of text
{cursor_x, cursor_y} = get_cursor_position(pid)
new_x = cursor_x + String.length(text)
update_cursor_position(pid, new_x, cursor_y)
{:ok, pid}
end
@doc """
Writes text to the buffer at a specific position.
"""
@spec write_at(pid(), non_neg_integer(), non_neg_integer(), String.t()) ::
{:ok, pid()}
def write_at(pid, x, y, text) when is_binary(text) do
# Set cursor position first
update_cursor_position(pid, x, y)
# Then write the text
write(pid, text)
end
end