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/device_ops.ex
defmodule Raxol.Terminal.Commands.CommandServer.DeviceOps do
@moduledoc false
@compile {:no_warn_undefined, Raxol.Terminal.Commands.CommandServer.Helpers}
require Raxol.Core.Runtime.Log
alias Raxol.Terminal.Commands.CommandServer.Helpers
alias Raxol.Terminal.OutputManager
def handle_device_attributes(
emulator,
%{params: params, intermediates: intermediates},
_context
) do
case {params, intermediates} do
{[], ""} ->
response = generate_primary_da_response()
{:ok, OutputManager.write(emulator, response)}
{[0], ""} ->
response = generate_primary_da_response()
{:ok, OutputManager.write(emulator, response)}
{[], ">"} ->
response = generate_secondary_da_response()
{:ok, OutputManager.write(emulator, response)}
{[0], ">"} ->
response = generate_secondary_da_response()
{:ok, OutputManager.write(emulator, response)}
_ ->
{:ok, emulator}
end
end
def handle_device_status_report(emulator, %{params: params}, _context) do
code = Helpers.get_param(params, 0, 5)
Raxol.Core.Runtime.Log.debug("DSR request: code=#{code}")
response =
case code do
5 -> "\e[0n"
6 -> generate_cursor_position_report(emulator)
_ -> nil
end
Raxol.Core.Runtime.Log.debug("DSR response: #{inspect(response)}")
case response do
nil -> {:ok, emulator}
_ -> {:ok, OutputManager.write(emulator, response)}
end
end
defp generate_primary_da_response, do: "\e[?6c"
defp generate_secondary_da_response, do: "\e[>0;0;0c"
defp generate_cursor_position_report(emulator) do
{row, col} =
case Helpers.get_cursor_position(emulator) do
{r, c} when is_integer(r) and is_integer(c) -> {r, c}
_ -> {0, 0}
end
"\e[#{row + 1};#{col + 1}R"
end
end