call method

  1. @override
String? call(
  1. TerminalKeyboardEvent event
)
override

Implementation

@override
String? call(TerminalKeyboardEvent event) {
  final mode = event.state.kittyKeyboardMode;
  final kittySequenceEnabled = mode &
          (_disambiguateEscapeCodes |
              _reportEventTypes |
              _reportAllKeysAsEscapeCodes) !=
      0;
  if (!kittySequenceEnabled) {
    return null;
  }

  // A release only has an encoding of its own under flag 2. Without it the
  // release would repeat the press sequence, and an agent that enabled
  // flag 1 alone (Cursor, Gemini, Copilot, OpenCode) sees Shift+Enter,
  // Escape or Ctrl+V twice: a doubled newline, and a paste the agent runs
  // itself on top of the bracketed paste the terminal already sent.
  if (event.type == TerminalKeyEventType.release &&
      mode & _reportEventTypes == 0) {
    return null;
  }

  final specialCode = _specialKeyCode(event.key);
  if (specialCode != null) {
    if (!_shouldReportPrivateUseKey(mode)) {
      return null;
    }
    return _sequence(specialCode, event);
  }

  final numpadCode = _numpadKeyCode(event.key);
  if (numpadCode != null) {
    if (!_shouldReportPrivateUseKey(mode)) {
      return null;
    }
    return _sequence(numpadCode, event);
  }

  final functionalSequence = _functionalSequence(event, mode);
  if (functionalSequence != null) {
    return functionalSequence;
  }

  final controlCode = _controlKeyCode(event.key);
  if (controlCode != null && _shouldUseLegacyControlCode(event, mode)) {
    return String.fromCharCode(controlCode);
  }

  if (_shouldEncodeControlKey(event, mode)) {
    if (controlCode != null) {
      return _sequence(controlCode, event);
    }
  }

  final characterCode = _characterKeyCode(event);
  if (characterCode == null) {
    return null;
  }
  if (!_shouldEncodeCharacter(event, mode)) {
    return null;
  }

  var payload = characterCode.toString();
  final reportsAlternateKeys = mode & _reportAlternateKeys != 0;
  final alternateCode = _alternateCharacterCode(event, characterCode);
  if (reportsAlternateKeys && alternateCode != null) {
    payload = '$payload:$alternateCode';
  }

  return _sequence(payload, event);
}