fix(tui): stop swallowing escape during cell size detection closes #2661
This commit is contained in:
81
packages/tui/test/tui-cell-size-input.test.ts
Normal file
81
packages/tui/test/tui-cell-size-input.test.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
import assert from "node:assert";
|
||||
import { describe, it } from "node:test";
|
||||
import { getCellDimensions, resetCapabilitiesCache, setCellDimensions } from "../src/terminal-image.js";
|
||||
import { type Component, TUI } from "../src/tui.js";
|
||||
import { VirtualTerminal } from "./virtual-terminal.js";
|
||||
|
||||
class InputRecorder implements Component {
|
||||
readonly inputs: string[] = [];
|
||||
|
||||
render(): string[] {
|
||||
return [""];
|
||||
}
|
||||
|
||||
handleInput(data: string): void {
|
||||
this.inputs.push(data);
|
||||
}
|
||||
|
||||
invalidate(): void {}
|
||||
}
|
||||
|
||||
function withImageTerminal<T>(fn: () => T): T {
|
||||
const prevTermProgram = process.env.TERM_PROGRAM;
|
||||
const prevTerm = process.env.TERM;
|
||||
const prevGhosttyResourcesDir = process.env.GHOSTTY_RESOURCES_DIR;
|
||||
|
||||
process.env.TERM_PROGRAM = "ghostty";
|
||||
delete process.env.TERM;
|
||||
delete process.env.GHOSTTY_RESOURCES_DIR;
|
||||
resetCapabilitiesCache();
|
||||
|
||||
try {
|
||||
return fn();
|
||||
} finally {
|
||||
if (prevTermProgram === undefined) delete process.env.TERM_PROGRAM;
|
||||
else process.env.TERM_PROGRAM = prevTermProgram;
|
||||
if (prevTerm === undefined) delete process.env.TERM;
|
||||
else process.env.TERM = prevTerm;
|
||||
if (prevGhosttyResourcesDir === undefined) delete process.env.GHOSTTY_RESOURCES_DIR;
|
||||
else process.env.GHOSTTY_RESOURCES_DIR = prevGhosttyResourcesDir;
|
||||
resetCapabilitiesCache();
|
||||
}
|
||||
}
|
||||
|
||||
describe("TUI cell size responses", () => {
|
||||
it("forwards bare escape even when a cell size query was sent at startup", () => {
|
||||
withImageTerminal(() => {
|
||||
const terminal = new VirtualTerminal(80, 24);
|
||||
const tui = new TUI(terminal);
|
||||
const recorder = new InputRecorder();
|
||||
|
||||
tui.setFocus(recorder);
|
||||
tui.start();
|
||||
|
||||
terminal.sendInput("\x1b");
|
||||
|
||||
assert.deepStrictEqual(recorder.inputs, ["\x1b"]);
|
||||
tui.stop();
|
||||
});
|
||||
});
|
||||
|
||||
it("consumes cell size responses and still forwards later user input", () => {
|
||||
withImageTerminal(() => {
|
||||
setCellDimensions({ widthPx: 9, heightPx: 18 });
|
||||
|
||||
const terminal = new VirtualTerminal(80, 24);
|
||||
const tui = new TUI(terminal);
|
||||
const recorder = new InputRecorder();
|
||||
|
||||
tui.setFocus(recorder);
|
||||
tui.start();
|
||||
|
||||
terminal.sendInput("\x1b[6;20;10t");
|
||||
assert.deepStrictEqual(recorder.inputs, []);
|
||||
assert.deepStrictEqual(getCellDimensions(), { widthPx: 10, heightPx: 20 });
|
||||
|
||||
terminal.sendInput("q");
|
||||
assert.deepStrictEqual(recorder.inputs, ["q"]);
|
||||
tui.stop();
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user