writeChar method

void writeChar(
  1. int codePoint
)

Writes a single character to the _terminal. Escape sequences or special characters are not interpreted and directly added to the buffer.

See also: Terminal.writeChar

Implementation

void writeChar(int codePoint) {
  codePoint = charset.translate(codePoint);

  final cellWidth = unicodeV11.wcwidth(codePoint);
  if (terminal.graphemeClusterMode &&
      (codePoint == 0xFE0E || codePoint == 0xFE0F)) {
    if (_previousSupportsEmojiVariation() &&
        _resizePreviousGrapheme(codePoint)) {
      _addCombiningCharacter(codePoint);
    }
    return;
  }
  if (cellWidth == 0) {
    if (!terminal.graphemeClusterMode || _joinsPreviousGrapheme(codePoint)) {
      _addCombiningCharacter(codePoint);
    }
    return;
  }
  if (cellWidth < 0) return;
  if (terminal.graphemeClusterMode && _joinRegionalIndicator(codePoint)) {
    return;
  }
  if (terminal.graphemeClusterMode && _joinsPreviousGrapheme(codePoint)) {
    if (cellWidth == 2 && !_setPreviousGraphemeWidth(2)) return;
    _addCombiningCharacter(codePoint);
    return;
  }

  final rightLimit = _rightLimit;

  if (_cursorX >= rightLimit) {
    if (terminal.autoWrapMode) {
      _wrapInput();
    } else {
      _cursorX = rightLimit - 1;
    }
  }

  if (cellWidth > rightLimit - _marginLeft) {
    _cursorX = rightLimit;
    return;
  }

  if (cellWidth == 2 && _cursorX == rightLimit - 1) {
    if (!terminal.autoWrapMode) {
      _cursorX = rightLimit;
      return;
    }

    currentLine.setCell(_cursorX, 0, 1, terminal.cursor);
    _cursorX = rightLimit;
    _wrapInput();
  }

  final line = currentLine;
  if (terminal.insertMode) {
    line.insertCells(_cursorX, cellWidth, terminal.cursor);
  }
  if (!terminal.insertMode) {
    line.clearWideCellAt(_cursorX, terminal.cursor);
    if (cellWidth == 2) {
      line.clearWideCellAt(_cursorX + 1, terminal.cursor);
    }
  }
  line.setCell(_cursorX, codePoint, cellWidth, terminal.cursor);

  if (cellWidth == 2) {
    line.setCell(_cursorX + 1, 0, 0, terminal.cursor);
  }

  _cursorX += cellWidth;
}