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 commands command_server cursor_ops.ex
Raw

lib/raxol/terminal/commands/command_server/cursor_ops.ex

defmodule Raxol.Terminal.Commands.CommandServer.CursorOps do
@moduledoc false
@compile {:no_warn_undefined, Raxol.Terminal.Commands.CommandServer.Helpers}
alias Raxol.Terminal.Commands.CommandServer.Helpers
alias Raxol.Terminal.Commands.CursorUtils
def handle_cursor_up(emulator, %{params: params}, _context) do
amount = Helpers.get_param(params, 0, 1)
move_cursor(emulator, :up, amount)
end
def handle_cursor_down(emulator, %{params: params}, _context) do
amount = Helpers.get_param(params, 0, 1)
move_cursor(emulator, :down, amount)
end
def handle_cursor_forward(emulator, %{params: params}, _context) do
amount = Helpers.get_param(params, 0, 1)
move_cursor(emulator, :right, amount)
end
def handle_cursor_backward(emulator, %{params: params}, _context) do
amount = Helpers.get_param(params, 0, 1)
move_cursor(emulator, :left, amount)
end
def handle_cursor_next_line(emulator, %{params: params}, _context) do
amount = Helpers.get_param(params, 0, 1)
with {:ok, emulator} <- move_cursor(emulator, :down, amount) do
move_cursor_to_column(emulator, 0)
end
end
def handle_cursor_previous_line(emulator, %{params: params}, _context) do
amount = Helpers.get_param(params, 0, 1)
with {:ok, emulator} <- move_cursor(emulator, :up, amount) do
move_cursor_to_column(emulator, 0)
end
end
def handle_cursor_horizontal_absolute(emulator, %{params: params}, _context) do
col = Helpers.get_param(params, 0, 1) - 1
move_cursor_to_column(emulator, col)
end
def handle_cursor_position(emulator, %{params: params}, _context) do
row = Helpers.get_param(params, 0, 1) - 1
col = Helpers.get_param(params, 1, 1) - 1
Helpers.set_cursor_position(emulator, {row, col})
end
def handle_cursor_vertical_absolute(emulator, %{params: params}, _context) do
row = Helpers.get_param(params, 0, 1) - 1
{_, col} = Helpers.get_cursor_position(emulator)
Helpers.set_cursor_position(emulator, {row, col})
end
defp move_cursor(emulator, direction, amount) do
{row, col} = Helpers.get_cursor_position(emulator)
{new_row, new_col} =
CursorUtils.calculate_new_cursor_position(
{row, col},
direction,
amount,
emulator.width,
emulator.height
)
Helpers.set_cursor_position(emulator, {new_row, new_col})
end
defp move_cursor_to_column(emulator, col) do
{row, _} = Helpers.get_cursor_position(emulator)
clamped_col = max(0, min(col, emulator.width - 1))
Helpers.set_cursor_position(emulator, {row, clamped_col})
end
end