writeChar method
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;
}