From 1b344ce789a82bd873cc96e69c2a86d18cef147b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 20 Jan 2017 23:03:38 -0800 Subject: [PATCH] Implement CAN (Cancel, ^X) This helps partially pass t0014-CAN.in, it won't work 100% however due to the very complex parsing logic of vanilla xterm that gnome-terminal doesn't even seem to match. xterm's source seems to have multiple ignore cases for a set of characters such that an escape sequence like \e!!!!!! prints nothing as the ! continually gets ignored. Our current logic is we ignore the escape sequence immediately in this case and print the !. --- src/Parser.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Parser.ts b/src/Parser.ts index 02028005..5390bd8f 100644 --- a/src/Parser.ts +++ b/src/Parser.ts @@ -74,6 +74,7 @@ escapedStateHandler['%'] = (parser, terminal) => { parser.setState(ParserState.NORMAL); parser.skipNextChar(); }; +escapedStateHandler[C0.CAN] = (parser) => parser.setState(ParserState.NORMAL); const csiParamStateHandler: {[key: string]: (parser: Parser) => void} = {}; csiParamStateHandler['?'] = (parser) => parser.setPrefix('?'); @@ -94,8 +95,9 @@ csiParamStateHandler['"'] = (parser) => parser.setPostfix('"'); csiParamStateHandler[' '] = (parser) => parser.setPostfix(' '); csiParamStateHandler['\''] = (parser) => parser.setPostfix('\''); csiParamStateHandler[';'] = (parser) => parser.finalizeParam(); +csiParamStateHandler[C0.CAN] = (parser) => parser.setState(ParserState.NORMAL); -const csiStateHandler: {[key: string]: (handler: IInputHandler, params: number[], prefix: string, postfix: string) => void} = {}; +const csiStateHandler: {[key: string]: (handler: IInputHandler, params: number[], prefix: string, postfix: string, parser: Parser) => void} = {}; csiStateHandler['@'] = (handler, params, prefix) => handler.insertChars(params); csiStateHandler['A'] = (handler, params, prefix) => handler.cursorUp(params); csiStateHandler['B'] = (handler, params, prefix) => handler.cursorDown(params); @@ -144,6 +146,7 @@ csiStateHandler['q'] = (handler, params, prefix, postfix) => { csiStateHandler['r'] = (handler, params) => handler.setScrollRegion(params); csiStateHandler['s'] = (handler, params) => handler.saveCursor(params); csiStateHandler['u'] = (handler, params) => handler.restoreCursor(params); +csiStateHandler[C0.CAN] = (handler, params, prefix, postfix, parser) => parser.setState(ParserState.NORMAL); // TODO: Many codes/charsets appear to not be supported // See: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html @@ -477,7 +480,7 @@ export class Parser { case ParserState.CSI: if (ch in csiStateHandler) { - csiStateHandler[ch](this._inputHandler, this._terminal.params, this._terminal.prefix, this._terminal.postfix); + csiStateHandler[ch](this._inputHandler, this._terminal.params, this._terminal.prefix, this._terminal.postfix, this); } else { this._terminal.error('Unknown CSI code: %s.', ch); }