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/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