listenToKeystrokes method

Stream<void>? listenToKeystrokes({
  1. required Event onExit,
  2. required Event onEscape,
  3. Map<String, Event>? customStrokes,
})

listens to keystrokes

Implementation

Stream<void>? listenToKeystrokes({
  required Event onExit,
  required Event onEscape,
  Map<String, Event>? customStrokes,
}) {
  if (!stdin.hasTerminal) {
    return null;
  }

  stdin
    ..lineMode = false
    ..echoMode = false;

  _stream ??= stdin.asBroadcastStream();

  final strokes = {
    'q': onExit,
    // escape key
    0x1b: onEscape,
    ...?customStrokes,
  };

  return _stream!.asyncMap((event) {
    if (event.isEmpty) return;

    logger.detail('Received keyboard event: $event');
    final key = utf8.decode(event);
    logger.detail('Key pressed: $key');

    final stroke =
        strokes[key] ?? strokes[key.toLowerCase()] ?? strokes[event.first];

    stroke?.call();

    return;
  });
}