OpenTUI 0.5.6
Added
- core:
EmbeddedTerminalRenderablerenders terminal output into the layout. Callwrite()to send output to it. It handles focus, key, paste, and mouse input, scrollback, text selection, resize, and the hardware cursor. Options arecols,rows,maxScrollback,selectable,onData,onScreenChange, andonTerminalResize.onDatareceives the encoded bytes for your process, and itssourceargument is"input"or"response".screen()returns the visible text, andgetSelectedText()returns the selection. The renderable does not start or own a process or PTY. It does not send SGR-pixel mouse reports because OpenTUI uses cell coordinates. See Embedded terminal. (#1340) - native: The native library exports the embedded terminal interface. On custom targets that do not support it, the exported functions return an explicit unsupported status. See Embedded terminal. (#1340)
Changed
- core:
OptimizedBuffer.drawPackedBuffer()andOptimizedBuffer.drawSuperSampleBuffer()accept aUint8Arrayas well as a pointer. The parameters are renamed fromdataPtrtodataand frompixelDataPtrtopixelData. See Buffer API. (#1394) - core:
RenderLib.bufferColorMatrix,bufferColorMatrixUniform,bufferDrawGrayscaleBuffer,bufferDrawGrayscaleBufferSupersampled,bufferDrawPackedBuffer, andbufferDrawSuperSampleBufferaccept a typed array as well as a pointer. See FrameBuffer color matrices. (#1394)
Fixed
- core: Typed arrays passed to native calls on Bun no longer risk a stale native address when the array moves into separate
ArrayBufferstorage. (#1394)
API changes#
@opentui/core#
Added
class EmbeddedTerminalRenderable extends Renderableconstructor EmbeddedTerminalRenderable(ctx: RenderContext, options: EmbeddedTerminalOptions)interface EmbeddedTerminalOptions extends RenderableOptions<EmbeddedTerminalRenderable>property RenderLib.createEmbeddedTerminal: (options: { cols: number; rows: number; maxScrollback?: number; }) => EmbeddedTerminalHandleproperty RenderLib.destroyEmbeddedTerminal: (handle: EmbeddedTerminalHandle) => voidproperty RenderLib.embeddedTerminalClearSelection: (handle: EmbeddedTerminalHandle) => voidproperty RenderLib.embeddedTerminalCompose: (handle: EmbeddedTerminalHandle, target: OptimizedBufferHandle, x: number, y: number) => voidproperty RenderLib.embeddedTerminalCursor: (handle: EmbeddedTerminalHandle) => EmbeddedTerminalCursorproperty RenderLib.embeddedTerminalDrainResponses: (handle: EmbeddedTerminalHandle) => Uint8Arrayproperty RenderLib.embeddedTerminalEncodeFocus: (handle: EmbeddedTerminalHandle, focused: boolean) => Uint8Arrayproperty RenderLib.embeddedTerminalEncodeKey: (handle: EmbeddedTerminalHandle, key: EmbeddedTerminalKey) => Uint8Arrayproperty RenderLib.embeddedTerminalEncodeMouse: (handle: EmbeddedTerminalHandle, mouse: EmbeddedTerminalMouse) => Uint8Arrayproperty RenderLib.embeddedTerminalEncodePaste: (handle: EmbeddedTerminalHandle, input: Uint8Array) => Uint8Arrayproperty RenderLib.embeddedTerminalGetSelectedText: (handle: EmbeddedTerminalHandle) => Uint8Arrayproperty RenderLib.embeddedTerminalInvalidate: (handle: EmbeddedTerminalHandle) => voidproperty RenderLib.embeddedTerminalResize: (handle: EmbeddedTerminalHandle, cols: number, rows: number) => voidproperty RenderLib.embeddedTerminalScroll: (handle: EmbeddedTerminalHandle, delta: number) => voidproperty RenderLib.embeddedTerminalSetSelection: (handle: EmbeddedTerminalHandle, start: { x: number; y: number; }, end: { x: number; y: number; }) => voidproperty RenderLib.embeddedTerminalWrite: (handle: EmbeddedTerminalHandle, data: string | Uint8Array) => voidtype EmbeddedTerminalCursor = { x: number; y: number; hasValue: boolean; visible: boolean; blinking: boolean; wideTail: boolean; style: "bar" | "block" | "underline" | "block-hollow"; color?: { r: number; g: number; b: number; }; }type EmbeddedTerminalDataSource = "input" | "response"type EmbeddedTerminalHandle = NativeHandle<"embedded_terminal">type EmbeddedTerminalKey = { action?: "release" | "press" | "repeat"; key?: string; mods?: number; consumedMods?: number; composing?: boolean; text?: string; unshiftedCodepoint?: number; }type EmbeddedTerminalMouse = { action: "press" | "release" | "motion"; button?: "unknown" | "left" | "right" | "middle" | "four" | "five" | "six" | "seven"; mods?: number; x: number; y: number; anyButtonPressed?: boolean; }type EmbeddedTerminalScreen = { text: string; lines: string[]; columns: number; rows: number; cursor: { x: number; y: number; visible: boolean; }; }
Changed
method OptimizedBuffer.drawPackedBuffer(dataPtr: PointerInput, dataLen: number, posX: number, posY: number, terminalWidthCells: number, terminalHeightCells: number): voidmethod OptimizedBuffer.drawPackedBuffer(data: PointerInput | Uint8Array, dataLen: number, posX: number, posY: number, terminalWidthCells: number, terminalHeightCells: number): voidmethod OptimizedBuffer.drawSuperSampleBuffer(x: number, y: number, pixelDataPtr: PointerInput, pixelDataLength: number, format: "bgra8unorm" | "rgba8unorm", alignedBytesPerRow: number): voidmethod OptimizedBuffer.drawSuperSampleBuffer(x: number, y: number, pixelData: PointerInput | Uint8Array, pixelDataLength: number, format: "bgra8unorm" | "rgba8unorm", alignedBytesPerRow: number): voidproperty RenderLib.bufferColorMatrix: (buffer: OptimizedBufferHandle, matrixPtr: Pointer, cellMaskPtr: Pointer, cellMaskCount: number, strength: number, target: TargetChannel) => voidproperty RenderLib.bufferColorMatrix: (buffer: OptimizedBufferHandle, matrix: Pointer | Float32Array, cellMask: Pointer | Float32Array, cellMaskCount: number, strength: number, target: TargetChannel) => voidproperty RenderLib.bufferColorMatrixUniform: (buffer: OptimizedBufferHandle, matrixPtr: Pointer, strength: number, target: TargetChannel) => voidproperty RenderLib.bufferColorMatrixUniform: (buffer: OptimizedBufferHandle, matrix: Pointer | Float32Array, strength: number, target: TargetChannel) => voidproperty RenderLib.bufferDrawGrayscaleBuffer: (buffer: OptimizedBufferHandle, posX: number, posY: number, intensitiesPtr: Pointer, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => voidproperty RenderLib.bufferDrawGrayscaleBuffer: (buffer: OptimizedBufferHandle, posX: number, posY: number, intensities: Pointer | Float32Array, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => voidproperty RenderLib.bufferDrawGrayscaleBufferSupersampled: (buffer: OptimizedBufferHandle, posX: number, posY: number, intensitiesPtr: Pointer, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => voidproperty RenderLib.bufferDrawGrayscaleBufferSupersampled: (buffer: OptimizedBufferHandle, posX: number, posY: number, intensities: Pointer | Float32Array, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => voidproperty RenderLib.bufferDrawPackedBuffer: (buffer: OptimizedBufferHandle, dataPtr: Pointer, dataLen: number, posX: number, posY: number, terminalWidthCells: number, terminalHeightCells: number) => voidproperty RenderLib.bufferDrawPackedBuffer: (buffer: OptimizedBufferHandle, data: Pointer | Uint8Array, dataLen: number, posX: number, posY: number, terminalWidthCells: number, terminalHeightCells: number) => voidproperty RenderLib.bufferDrawSuperSampleBuffer: (buffer: OptimizedBufferHandle, x: number, y: number, pixelDataPtr: Pointer, pixelDataLength: number, format: "bgra8unorm" | "rgba8unorm", alignedBytesPerRow: number) => voidproperty RenderLib.bufferDrawSuperSampleBuffer: (buffer: OptimizedBufferHandle, x: number, y: number, pixelData: Pointer | Uint8Array, pixelDataLength: number, format: "bgra8unorm" | "rgba8unorm", alignedBytesPerRow: number) => void