cursorPosition property

Coordinate? get cursorPosition

Returns the current cursor position as a coordinate.

Warning: Linux and macOS terminals report their cursor position by posting an escape sequence to stdin in response to a request. However, if there is lots of other keyboard input at the same time, some terminals may interleave that input in the response. There is no easy way around this; the recommendation is therefore to use this call before reading keyboard input, to get an original offset, and then track the local cursor independently based on keyboard input.

Implementation

Coordinate? get cursorPosition {
  rawMode = true;
  stdout.write(ansiDeviceStatusReportCursorPosition);
  // returns a Cursor Position Report result in the form <ESC>[24;80R
  // which we have to parse apart, unfortunately
  var result = '';
  var i = 0;

  // avoid infinite loop if we're getting a bad result
  while (i < 16) {
    final readByte = stdin.readByteSync();

    if (readByte == -1) break; // headless console may not report back

    // ignore: use_string_buffers
    result += String.fromCharCode(readByte);
    if (result.endsWith('R')) break;
    i++;
  }
  rawMode = false;

  if (result.isEmpty || result[0] != '\x1b') {
    print(' result: $result  result.length: ${result.length}');
    return null;
  }

  result = result.substring(2, result.length - 1);
  final coords = result.split(';');

  if (coords.length != 2) {
    print(' coords.length: ${coords.length}');
    return null;
  }
  if ((int.tryParse(coords[0]) != null) &&
      (int.tryParse(coords[1]) != null)) {
    return Coordinate(int.parse(coords[0]) - 1, int.parse(coords[1]) - 1);
  } else {
    print(' coords[0]: ${coords[0]}   coords[1]: ${coords[1]}');
    return null;
  }
}
set cursorPosition (Coordinate? cursor)

Sets the cursor to a specific coordinate.

Coordinates are measured from the top left of the screen, and are zero-based.

Implementation

set cursorPosition(Coordinate? cursor) {
  if (cursor != null) {
    if (Platform.isWindows) {
      final winTermlib = _termlib as TermLibWindows;
      winTermlib.setCursorPosition(cursor.col, cursor.row);
    } else {
      stdout.write(ansiCursorPosition(cursor.row + 1, cursor.col + 1));
    }
  }
}