class Termisu::Event::Source::Input

Overview

Terminal input event source.

Wraps Reader and Input::Parser to produce Key and Mouse events via a dedicated polling fiber.

Usage

reader = Termisu::Reader.new(terminal.infd)
parser = Termisu::Input::Parser.new(reader)
input = Termisu::Event::Source::Input.new(reader, parser)

loop = Termisu::Event::Loop.new
loop.add_source(input)
loop.start

while event = loop.output.receive?
  case event
  when Termisu::Event::Key
    break if event.key.escape?
  when Termisu::Event::Mouse
    puts "Click at #{event.x},#{event.y}"
  end
end

Thread Safety

Uses Atomic(Bool) for the running state. Safe to call #start/#stop from different fibers.

Defined in:

termisu/event/source/input.cr

Constant Summary

IDLE_SLEEP = 1.millisecond

Idle sleep when no input is available.

Keeps CPU usage low without introducing long blocking waits that can starve high-frequency timers.

Log = Termisu::Logs::Event
MAX_DRAIN_PER_CYCLE = 64

Maximum events drained per loop iteration.

Prevents a continuous input stream from monopolizing the scheduler while still allowing bursty input to be processed quickly.

Constructors

Instance Method Summary

Instance methods inherited from class Termisu::Event::Source

name : String name, running? : Bool running?, start(output : Channel(Event::Any)) : Nil start, stop : Nil stop

Constructor Detail

def self.new(reader : Termisu::Reader, parser : Termisu::Input::Parser) #

Creates a new input source.

  • reader - Reader instance for raw input
  • parser - Parser instance for escape sequence parsing

[View source]

Instance Method Detail

def name : String #

Returns the source name for identification.


[View source]
def running? : Bool #

Returns true if the input source is currently running.


[View source]
def start(output : Channel(Event::Any)) : Nil #

Starts polling for input events and sending them to the output channel.

Spawns a fiber that drains available input events without blocking and sends them to the channel.

Prevents double-start with compare_and_set.


[View source]
def stop : Nil #

Stops polling for input events.

Sets the running flag to false, causing the fiber to exit on its next iteration. Uses compare_and_set for idempotent stop operations.


[View source]