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 device_ops.ex
Raw

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