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
Current section
Files
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