mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-05 06:59:42 +02:00
Mosh-style write-through prediction: the consumer sends every keystroke unchanged; the addon paints predicted glyphs and reconciles against the parsed buffer. Confirm = cell match + cursor advance (placeholder-safe, repaint-safe); two-pass mismatch cascade with neutral blanks (measured: codex clears its placeholder on first echo); TTL bound; baseY-based line reads; scroll/resize/off-row clears. Zero edits to zerolag-input-addon.ts. Tests: 30 addon-law specs + renderer geometry (fake performance clock for TTL/grace), 6 replay suites running the real algorithm through a real @xterm/headless parser fed by the recorded codex fixtures, and a 500-iteration seeded fuzz with per-op span/record + grid invariants. 227 total, the pre-existing 175 untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
import type { XtermTerminal, CellDimensions } from './types.js';
|
|
|
|
/**
|
|
* Get cell dimensions from the terminal, handling xterm.js v5 (private API)
|
|
* and v7+ (public API).
|
|
*
|
|
* Returns CSS-pixel values. xterm's `device.char` is in device pixels, so
|
|
* we divide by `devicePixelRatio` to stay consistent with `css.cell`.
|
|
*
|
|
* Returns `null` if the terminal is not yet rendered or dimensions are
|
|
* unavailable.
|
|
*/
|
|
export function getCellDimensions(terminal: XtermTerminal): CellDimensions | null {
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
const t = terminal as any;
|
|
const dpr = typeof devicePixelRatio === 'number' && devicePixelRatio > 0 ? devicePixelRatio : 1;
|
|
|
|
// Try v7+ public API first
|
|
if (t.dimensions?.css?.cell) {
|
|
const cellH = t.dimensions.css.cell.height;
|
|
return {
|
|
width: t.dimensions.css.cell.width,
|
|
height: cellH,
|
|
charTop: (t.dimensions?.device?.char?.top ?? 0) / dpr,
|
|
charHeight: (t.dimensions?.device?.char?.height ?? cellH * dpr) / dpr,
|
|
};
|
|
}
|
|
|
|
// Fall back to v5 private API
|
|
try {
|
|
const dims = t._core?._renderService?.dimensions;
|
|
if (dims?.css?.cell) {
|
|
const cellH = dims.css.cell.height;
|
|
return {
|
|
width: dims.css.cell.width,
|
|
height: cellH,
|
|
charTop: (dims.device?.char?.top ?? 0) / dpr,
|
|
charHeight: (dims.device?.char?.height ?? cellH * dpr) / dpr,
|
|
};
|
|
}
|
|
} catch {
|
|
// Private API may throw in some environments
|
|
}
|
|
|
|
return null;
|
|
}
|