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 driver dispatch.ex
Raw

lib/raxol/terminal/driver/dispatch.ex

defmodule Raxol.Terminal.Driver.Dispatch do
@moduledoc """
Event dispatching helpers for Driver: sends events to the dispatcher
and handles initial resize notification.
"""
alias Raxol.Core.Events.Event
alias Raxol.Core.Runtime.Log
alias Raxol.Terminal.ANSI.InputParser
alias Raxol.Terminal.Driver.TerminalSize
alias Raxol.Terminal.Env
@doc """
Sends an event to the dispatcher pid, using direct send in test mode.
"""
def send_event_to_dispatcher(dispatcher_pid, event) do
if Env.test?() do
Log.debug(
"[Driver] Sending event in test mode: #{inspect(event)} to #{inspect(dispatcher_pid)}"
)
send(dispatcher_pid, {:"$gen_cast", {:dispatch, event}})
else
GenServer.cast(dispatcher_pid, {:dispatch, event})
end
end
@doc """
Sends an initial resize event to the dispatcher based on current terminal size.
"""
def send_initial_resize_event(dispatcher_pid) do
{:ok, width, height} = TerminalSize.get_terminal_size()
Log.info("Initial terminal size: #{width}x#{height}")
event = %Event{type: :resize, data: %{width: width, height: height}}
if Env.test?() do
Log.info("[Driver] Sending resize event in test mode: #{inspect(event)}")
send(dispatcher_pid, {:"$gen_cast", {:dispatch, event}})
else
GenServer.cast(dispatcher_pid, {:dispatch, event})
end
end
@doc """
Parses test input data into an Event struct.
"""
def parse_test_input(input_data) when is_binary(input_data) do
Log.debug("[TerminalDriver.parse_test_input] Parsing: #{inspect(input_data)}")
case InputParser.parse(input_data) do
[event | _] -> event
[] -> %Event{type: :unknown_test_input, data: %{raw: input_data}}
end
end
end