setParams method

void setParams(
  1. List<int> params, {
  2. String? separators,
})

Sets SGR parameter values and optional separators.

If separators is set, it must match params length and should contain separator bytes such as ; and :.

Implementation

void setParams(List<int> params, {String? separators}) {
  _ensureOpen();
  if (separators != null && separators.length != params.length) {
    throw ArgumentError.value(
      separators,
      'separators',
      'Must have same length as params.',
    );
  }

  final paramsPtr = calloc<ffi.Uint16>(params.length);
  ffi.Pointer<ffi.Char> separatorsPtr = ffi.nullptr;
  ffi.Pointer<ffi.Char>? allocatedSeparators;
  try {
    for (var i = 0; i < params.length; i++) {
      final value = params[i];
      if (value < 0 || value > 0xFFFF) {
        throw RangeError.range(value, 0, 0xFFFF, 'params[$i]');
      }
      paramsPtr[i] = value;
    }

    if (separators != null) {
      allocatedSeparators = calloc<ffi.Char>(separators.length);
      for (var i = 0; i < separators.length; i++) {
        final value = separators.codeUnitAt(i);
        if (value > 0xFF) {
          throw RangeError.range(value, 0, 0xFF, 'separators[$i]');
        }
        allocatedSeparators[i] = value;
      }
      separatorsPtr = allocatedSeparators;
    }

    final result = bindings.ghostty_sgr_set_params(
      _handle,
      paramsPtr,
      separatorsPtr,
      params.length,
    );
    _checkResult(result, 'ghostty_sgr_set_params');
  } finally {
    calloc.free(paramsPtr);
    if (allocatedSeparators != null) {
      calloc.free(allocatedSeparators);
    }
  }
}