From b75ae0f7b13c28e8fa001cd403f2cb3ad6adc95c Mon Sep 17 00:00:00 2001 From: kumaran-14 Date: Fri, 14 Feb 2020 20:00:03 +0530 Subject: [PATCH 1/8] Support alt+Enter key signal by default --- src/InputHandler.ts | 6 ++++++ src/Terminal.ts | 2 +- src/common/TestUtils.test.ts | 1 + src/common/Types.d.ts | 1 + src/common/input/Keyboard.test.ts | 7 ++++++- src/common/input/Keyboard.ts | 8 +++++++- src/common/services/CoreService.ts | 1 + 7 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/InputHandler.ts b/src/InputHandler.ts index fb37f4ab..356f3b3d 100644 --- a/src/InputHandler.ts +++ b/src/InputHandler.ts @@ -1788,6 +1788,9 @@ export class InputHandler extends Disposable implements IInputHandler { case 25: // show cursor this._coreService.isCursorHidden = false; break; + case 1039: + this._coreService.decPrivateModes.altEnterMode = true; + break; case 1048: // alt screen cursor this.saveCursor(); break; @@ -2003,6 +2006,9 @@ export class InputHandler extends Disposable implements IInputHandler { case 25: // hide cursor this._coreService.isCursorHidden = true; break; + case 1039: + this._coreService.decPrivateModes.altEnterMode = false; + break; case 1048: // alt screen cursor this.restoreCursor(); break; diff --git a/src/Terminal.ts b/src/Terminal.ts index 1bcac1f0..0ca1b186 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -1222,7 +1222,7 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp return false; } - const result = evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); + const result = evaluateKeyboardEvent(event, this._coreService.decPrivateModes.altEnterMode, this._coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); this.updateCursorStyle(event); diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index 4d9070cd..b4636ebf 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -59,6 +59,7 @@ export class MockCoreService implements ICoreService { isCursorHidden: boolean = false; isFocused: boolean = false; decPrivateModes: IDecPrivateModes = { + altEnterMode: true, applicationCursorKeys: false, applicationKeypad: false, origin: false, diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index b250b45e..4df53bd4 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -152,6 +152,7 @@ export interface IMarker extends IDisposable { } export interface IDecPrivateModes { + altEnterMode: boolean; applicationCursorKeys: boolean; applicationKeypad: boolean; origin: boolean; diff --git a/src/common/input/Keyboard.test.ts b/src/common/input/Keyboard.test.ts index a304923e..ce492f0c 100644 --- a/src/common/input/Keyboard.test.ts +++ b/src/common/input/Keyboard.test.ts @@ -16,6 +16,7 @@ function testEvaluateKeyboardEvent(partialEvent: { key?: string; type?: string; }, partialOptions: { + altEnterMode?: boolean; applicationCursorMode?: boolean; isMac?: boolean; macOptionIsMeta?: boolean; @@ -30,11 +31,12 @@ function testEvaluateKeyboardEvent(partialEvent: { type: partialEvent.type || '' }; const options = { + altEnterMode: partialOptions.altEnterMode || true, applicationCursorMode: partialOptions.applicationCursorMode || false, isMac: partialOptions.isMac || false, macOptionIsMeta: partialOptions.macOptionIsMeta || false }; - return evaluateKeyboardEvent(event, options.applicationCursorMode, options.isMac, options.macOptionIsMeta); + return evaluateKeyboardEvent(event, options.altEnterMode, options.applicationCursorMode, options.isMac, options.macOptionIsMeta); } describe('Keyboard', () => { @@ -86,6 +88,9 @@ describe('Keyboard', () => { it('should return \\x1b[3;3~ for alt+delete', () => { assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 46 }).key, '\x1b[3;3~'); }); + it('should return \\x1b\\r for alt+enter', () => { + assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 13 }).key, '\x1b\r'); + }); it('should return \\x1b[5D for ctrl+left', () => { assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, keyCode: 37 }).key, '\x1b[1;5D'); // CSI 5 D }); diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index 1bf378c1..34433dea 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -37,6 +37,7 @@ const KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = { export function evaluateKeyboardEvent( ev: IKeyboardEvent, + altEnterMode: boolean, applicationCursorMode: boolean, isMac: boolean, macOptionIsMeta: boolean @@ -103,7 +104,12 @@ export function evaluateKeyboardEvent( break; case 13: // return/enter - result.key = C0.CR; + if (altEnterMode && modifiers === 2) { + result.key = C0.ESC + C0.CR; + } + else { + result.key = C0.CR; + } result.cancel = true; break; case 27: diff --git a/src/common/services/CoreService.ts b/src/common/services/CoreService.ts index df9161e9..1ae906cc 100644 --- a/src/common/services/CoreService.ts +++ b/src/common/services/CoreService.ts @@ -9,6 +9,7 @@ import { IDecPrivateModes, ICharset } from 'common/Types'; import { clone } from 'common/Clone'; const DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({ + altEnterMode: true, applicationCursorKeys: false, applicationKeypad: false, origin: false, From 5896a05ca664adacd5c391c72c64c8ce4cdd33f2 Mon Sep 17 00:00:00 2001 From: kumaran-14 Date: Thu, 20 Feb 2020 00:21:33 +0530 Subject: [PATCH 2/8] Change decset flag to altEscMode --- src/InputHandler.ts | 4 ++-- src/Terminal.ts | 2 +- src/common/TestUtils.test.ts | 2 +- src/common/Types.d.ts | 2 +- src/common/input/Keyboard.ts | 4 ++-- src/common/services/CoreService.ts | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/InputHandler.ts b/src/InputHandler.ts index 356f3b3d..a651440a 100644 --- a/src/InputHandler.ts +++ b/src/InputHandler.ts @@ -1789,7 +1789,7 @@ export class InputHandler extends Disposable implements IInputHandler { this._coreService.isCursorHidden = false; break; case 1039: - this._coreService.decPrivateModes.altEnterMode = true; + this._coreService.decPrivateModes.altEscMode = true; break; case 1048: // alt screen cursor this.saveCursor(); @@ -2007,7 +2007,7 @@ export class InputHandler extends Disposable implements IInputHandler { this._coreService.isCursorHidden = true; break; case 1039: - this._coreService.decPrivateModes.altEnterMode = false; + this._coreService.decPrivateModes.altEscMode = false; break; case 1048: // alt screen cursor this.restoreCursor(); diff --git a/src/Terminal.ts b/src/Terminal.ts index 0ca1b186..60646617 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -1222,7 +1222,7 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp return false; } - const result = evaluateKeyboardEvent(event, this._coreService.decPrivateModes.altEnterMode, this._coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); + const result = evaluateKeyboardEvent(event, this._coreService.decPrivateModes.altEscMode, this._coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); this.updateCursorStyle(event); diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index b4636ebf..2257530c 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -59,7 +59,7 @@ export class MockCoreService implements ICoreService { isCursorHidden: boolean = false; isFocused: boolean = false; decPrivateModes: IDecPrivateModes = { - altEnterMode: true, + altEscMode: true, applicationCursorKeys: false, applicationKeypad: false, origin: false, diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index 4df53bd4..0a2d4252 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -152,7 +152,7 @@ export interface IMarker extends IDisposable { } export interface IDecPrivateModes { - altEnterMode: boolean; + altEscMode: boolean; applicationCursorKeys: boolean; applicationKeypad: boolean; origin: boolean; diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index 34433dea..67b5ee44 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -37,7 +37,7 @@ const KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = { export function evaluateKeyboardEvent( ev: IKeyboardEvent, - altEnterMode: boolean, + altEscMode: boolean, applicationCursorMode: boolean, isMac: boolean, macOptionIsMeta: boolean @@ -104,7 +104,7 @@ export function evaluateKeyboardEvent( break; case 13: // return/enter - if (altEnterMode && modifiers === 2) { + if (altEscMode && modifiers === 2) { result.key = C0.ESC + C0.CR; } else { diff --git a/src/common/services/CoreService.ts b/src/common/services/CoreService.ts index 1ae906cc..c8c77c7d 100644 --- a/src/common/services/CoreService.ts +++ b/src/common/services/CoreService.ts @@ -9,7 +9,7 @@ import { IDecPrivateModes, ICharset } from 'common/Types'; import { clone } from 'common/Clone'; const DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({ - altEnterMode: true, + altEscMode: true, applicationCursorKeys: false, applicationKeypad: false, origin: false, From c9277c3c721d600aa5cfef72e4af9c6e37addc22 Mon Sep 17 00:00:00 2001 From: kumaran-14 Date: Fri, 21 Feb 2020 13:13:46 +0530 Subject: [PATCH 3/8] Remove altEscape DECSET mode and add support for alt+esc key --- src/InputHandler.ts | 6 ------ src/Terminal.ts | 2 +- src/common/TestUtils.test.ts | 1 - src/common/Types.d.ts | 1 - src/common/input/Keyboard.test.ts | 11 ++++++++--- src/common/input/Keyboard.ts | 6 ++++-- 6 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/InputHandler.ts b/src/InputHandler.ts index a651440a..fb37f4ab 100644 --- a/src/InputHandler.ts +++ b/src/InputHandler.ts @@ -1788,9 +1788,6 @@ export class InputHandler extends Disposable implements IInputHandler { case 25: // show cursor this._coreService.isCursorHidden = false; break; - case 1039: - this._coreService.decPrivateModes.altEscMode = true; - break; case 1048: // alt screen cursor this.saveCursor(); break; @@ -2006,9 +2003,6 @@ export class InputHandler extends Disposable implements IInputHandler { case 25: // hide cursor this._coreService.isCursorHidden = true; break; - case 1039: - this._coreService.decPrivateModes.altEscMode = false; - break; case 1048: // alt screen cursor this.restoreCursor(); break; diff --git a/src/Terminal.ts b/src/Terminal.ts index 60646617..1bcac1f0 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -1222,7 +1222,7 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp return false; } - const result = evaluateKeyboardEvent(event, this._coreService.decPrivateModes.altEscMode, this._coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); + const result = evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); this.updateCursorStyle(event); diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index 2257530c..4d9070cd 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -59,7 +59,6 @@ export class MockCoreService implements ICoreService { isCursorHidden: boolean = false; isFocused: boolean = false; decPrivateModes: IDecPrivateModes = { - altEscMode: true, applicationCursorKeys: false, applicationKeypad: false, origin: false, diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index 0a2d4252..b250b45e 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -152,7 +152,6 @@ export interface IMarker extends IDisposable { } export interface IDecPrivateModes { - altEscMode: boolean; applicationCursorKeys: boolean; applicationKeypad: boolean; origin: boolean; diff --git a/src/common/input/Keyboard.test.ts b/src/common/input/Keyboard.test.ts index ce492f0c..0bb0e24c 100644 --- a/src/common/input/Keyboard.test.ts +++ b/src/common/input/Keyboard.test.ts @@ -16,7 +16,6 @@ function testEvaluateKeyboardEvent(partialEvent: { key?: string; type?: string; }, partialOptions: { - altEnterMode?: boolean; applicationCursorMode?: boolean; isMac?: boolean; macOptionIsMeta?: boolean; @@ -31,12 +30,11 @@ function testEvaluateKeyboardEvent(partialEvent: { type: partialEvent.type || '' }; const options = { - altEnterMode: partialOptions.altEnterMode || true, applicationCursorMode: partialOptions.applicationCursorMode || false, isMac: partialOptions.isMac || false, macOptionIsMeta: partialOptions.macOptionIsMeta || false }; - return evaluateKeyboardEvent(event, options.altEnterMode, options.applicationCursorMode, options.isMac, options.macOptionIsMeta); + return evaluateKeyboardEvent(event, options.applicationCursorMode, options.isMac, options.macOptionIsMeta); } describe('Keyboard', () => { @@ -91,6 +89,9 @@ describe('Keyboard', () => { it('should return \\x1b\\r for alt+enter', () => { assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 13 }).key, '\x1b\r'); }); + it('should return \\x1b\\x1b for alt+esc', () => { + assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 27 }).key, '\x1b\x1b'); + }); it('should return \\x1b[5D for ctrl+left', () => { assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, keyCode: 37 }).key, '\x1b[1;5D'); // CSI 5 D }); @@ -146,6 +147,10 @@ describe('Keyboard', () => { it('should return \\x1ba for alt+a', () => { assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 65 }, { isMac: true, macOptionIsMeta: true }).key, '\x1ba'); }); + + it('should return \\x1b\\x1b for alt+enter', () => { + assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 13 }, { isMac: true, macOptionIsMeta: true }).key, '\x1b\r'); + }); }); it('should return \\x1b[5A for alt+up', () => { diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index 67b5ee44..d07ea625 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -37,7 +37,6 @@ const KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = { export function evaluateKeyboardEvent( ev: IKeyboardEvent, - altEscMode: boolean, applicationCursorMode: boolean, isMac: boolean, macOptionIsMeta: boolean @@ -104,7 +103,7 @@ export function evaluateKeyboardEvent( break; case 13: // return/enter - if (altEscMode && modifiers === 2) { + if (ev.altKey) { result.key = C0.ESC + C0.CR; } else { @@ -115,6 +114,9 @@ export function evaluateKeyboardEvent( case 27: // escape result.key = C0.ESC; + if (ev.altKey) { + result.key = C0.ESC + C0.ESC; + } result.cancel = true; break; case 37: From 3ef41f2b1d454fcb07d65ddb99944cc000905547 Mon Sep 17 00:00:00 2001 From: kumaran-14 Date: Fri, 10 Apr 2020 23:19:31 +0530 Subject: [PATCH 4/8] Remove decset modes from coreservices --- src/common/services/CoreService.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/common/services/CoreService.ts b/src/common/services/CoreService.ts index c8c77c7d..df9161e9 100644 --- a/src/common/services/CoreService.ts +++ b/src/common/services/CoreService.ts @@ -9,7 +9,6 @@ import { IDecPrivateModes, ICharset } from 'common/Types'; import { clone } from 'common/Clone'; const DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({ - altEscMode: true, applicationCursorKeys: false, applicationKeypad: false, origin: false, From f61d6320a3a5fcc86a20b485880cc4976ad5e56b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 10 Apr 2020 12:44:39 -0700 Subject: [PATCH 5/8] v4.5.0 --- addons/xterm-addon-search/package.json | 2 +- addons/xterm-addon-serialize/package.json | 2 +- addons/xterm-addon-web-links/package.json | 2 +- addons/xterm-addon-webgl/package.json | 2 +- package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/xterm-addon-search/package.json b/addons/xterm-addon-search/package.json index 1913f177..445f70c9 100644 --- a/addons/xterm-addon-search/package.json +++ b/addons/xterm-addon-search/package.json @@ -1,6 +1,6 @@ { "name": "xterm-addon-search", - "version": "0.5.0", + "version": "0.6.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" diff --git a/addons/xterm-addon-serialize/package.json b/addons/xterm-addon-serialize/package.json index fbf1614e..4b52e814 100644 --- a/addons/xterm-addon-serialize/package.json +++ b/addons/xterm-addon-serialize/package.json @@ -1,6 +1,6 @@ { "name": "xterm-addon-serialize", - "version": "0.1.2", + "version": "0.2.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" diff --git a/addons/xterm-addon-web-links/package.json b/addons/xterm-addon-web-links/package.json index 6167de74..febcfab4 100644 --- a/addons/xterm-addon-web-links/package.json +++ b/addons/xterm-addon-web-links/package.json @@ -1,6 +1,6 @@ { "name": "xterm-addon-web-links", - "version": "0.2.1", + "version": "0.3.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" diff --git a/addons/xterm-addon-webgl/package.json b/addons/xterm-addon-webgl/package.json index ca49e795..7a1a9ee5 100644 --- a/addons/xterm-addon-webgl/package.json +++ b/addons/xterm-addon-webgl/package.json @@ -1,6 +1,6 @@ { "name": "xterm-addon-webgl", - "version": "0.5.1", + "version": "0.6.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" diff --git a/package.json b/package.json index b177851a..df6208c8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "xterm", "description": "Full xterm terminal, in your browser", - "version": "4.4.0", + "version": "4.5.0", "main": "lib/xterm.js", "style": "css/xterm.css", "types": "typings/xterm.d.ts", From ba0dc60b09bb5a8c5f34a33933b209466c2cc238 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 10 Apr 2020 12:53:02 -0700 Subject: [PATCH 6/8] Combine into ternary --- src/common/input/Keyboard.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index d07ea625..fdb777b4 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -103,12 +103,7 @@ export function evaluateKeyboardEvent( break; case 13: // return/enter - if (ev.altKey) { - result.key = C0.ESC + C0.CR; - } - else { - result.key = C0.CR; - } + result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR; result.cancel = true; break; case 27: From 7609a5456ef0374e9e8bba4a0b58d354823afcef Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 10 Apr 2020 14:08:28 -0700 Subject: [PATCH 7/8] Fix most lgtm warnings --- .../xterm-addon-web-links/src/WebLinkProvider.ts | 2 +- addons/xterm-addon-web-links/src/WebLinksAddon.ts | 2 +- addons/xterm-addon-webgl/src/WebglRenderer.api.ts | 5 ----- bin/extract_vtfeatures.js | 14 +++++++------- src/browser/input/MoveToCell.ts | 5 ----- src/common/services/CoreService.ts | 2 +- 6 files changed, 10 insertions(+), 20 deletions(-) diff --git a/addons/xterm-addon-web-links/src/WebLinkProvider.ts b/addons/xterm-addon-web-links/src/WebLinkProvider.ts index 23dc8560..5f6460bf 100644 --- a/addons/xterm-addon-web-links/src/WebLinkProvider.ts +++ b/addons/xterm-addon-web-links/src/WebLinkProvider.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { ILinkProvider, IBufferCellPosition, ILink, Terminal, IBuffer } from 'xterm'; +import { ILinkProvider, IBufferCellPosition, ILink, Terminal } from 'xterm'; export class WebLinkProvider implements ILinkProvider { diff --git a/addons/xterm-addon-web-links/src/WebLinksAddon.ts b/addons/xterm-addon-web-links/src/WebLinksAddon.ts index dbc664a8..4e700b57 100644 --- a/addons/xterm-addon-web-links/src/WebLinksAddon.ts +++ b/addons/xterm-addon-web-links/src/WebLinksAddon.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ILinkMatcherOptions, ITerminalAddon, ILinkProvider, IDisposable } from 'xterm'; +import { Terminal, ILinkMatcherOptions, ITerminalAddon, IDisposable } from 'xterm'; import { WebLinkProvider } from './WebLinkProvider'; const protocolClause = '(https?:\\/\\/)'; diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.api.ts b/addons/xterm-addon-webgl/src/WebglRenderer.api.ts index 591d7fff..daf7f6fc 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.api.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.api.ts @@ -341,10 +341,6 @@ describe('WebGL Renderer Integration Tests', async () => { await writeSync(page, data); for (let y = 0; y < 240 / 16; y++) { for (let x = 0; x < 16; x++) { - const cssColor = COLORS_16_TO_255[y * 16 + x]; - const r = parseInt(cssColor.substr(1, 2), 16); - const g = parseInt(cssColor.substr(3, 2), 16); - const b = parseInt(cssColor.substr(5, 2), 16); await pollFor(page, () => getCellColor(x + 1, y + 1), [0, 0, 0, 255]); } } @@ -670,7 +666,6 @@ describe('WebGL Renderer Integration Tests', async () => { await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { - const i = y * 16 + x; await pollFor(page, () => getCellColor(x + 1, y + 1), [0, 0, 0, 255]); } } diff --git a/bin/extract_vtfeatures.js b/bin/extract_vtfeatures.js index e575aeab..63d09684 100644 --- a/bin/extract_vtfeatures.js +++ b/bin/extract_vtfeatures.js @@ -1,7 +1,7 @@ /** * Copyright (c) 2019 The xterm.js authors. All rights reserved. * @license MIT - * + * * Script to extract vt features documented in docstrings. */ const fs = require('fs'); @@ -265,7 +265,7 @@ To denote the sequences the tables use the same abbreviations as xterm does: function hideDetailSections() { for (let section of document.getElementsByClassName('sequence-details')) section.style.display = 'none'; } - + function decorateDetailLinks() { for (let link of document.getElementsByClassName('link-details')) { link.addEventListener("click", toggleDetails, false); @@ -344,11 +344,11 @@ function applyMacros(s) { return s; } -function replaceStatus(s) { - if (s === 'supported') return ''; - if (s === 'unsupported') return ''; - return s; -} +// function replaceStatus(s) { +// if (s === 'supported') return ''; +// if (s === 'unsupported') return ''; +// return s; +// } function createAnchorSlug(s) { return s.toLowerCase().split(' ').join('-'); diff --git a/src/browser/input/MoveToCell.ts b/src/browser/input/MoveToCell.ts index d8f5a498..25e1844d 100644 --- a/src/browser/input/MoveToCell.ts +++ b/src/browser/input/MoveToCell.ts @@ -105,11 +105,6 @@ function moveToRequestedCol(startX: number, startY: number, targetX: number, tar ).length, sequence(direction, applicationCursor)); } -function moveHorizontallyOnly(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string { - const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor); - return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor)); -} - /** * Utility functions */ diff --git a/src/common/services/CoreService.ts b/src/common/services/CoreService.ts index df9161e9..883266ec 100644 --- a/src/common/services/CoreService.ts +++ b/src/common/services/CoreService.ts @@ -5,7 +5,7 @@ import { ICoreService, ILogService, IOptionsService, IBufferService } from 'common/services/Services'; import { EventEmitter, IEvent } from 'common/EventEmitter'; -import { IDecPrivateModes, ICharset } from 'common/Types'; +import { IDecPrivateModes } from 'common/Types'; import { clone } from 'common/Clone'; const DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({ From 714daba393dfea6ee1a2c4695de6b420b70cba54 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 11 Apr 2020 06:31:58 -0700 Subject: [PATCH 8/8] Fix selection wrapping to end when not beyond viewport This was happening as the devicePixelRatio wasn't being taken into account, the fix was to rely on IRenderService to get the right canvas height. Fixes #2833 --- src/browser/TestUtils.test.ts | 73 ++++++++++++++++++- src/browser/services/SelectionService.test.ts | 13 +++- src/browser/services/SelectionService.ts | 8 +- 3 files changed, 85 insertions(+), 9 deletions(-) diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index 60861112..3e304bcf 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -4,7 +4,9 @@ */ import { IEvent, EventEmitter } from 'common/EventEmitter'; -import { ICharSizeService, IMouseService } from 'browser/services/Services'; +import { ICharSizeService, IMouseService, IRenderService } from 'browser/services/Services'; +import { IRenderDimensions, IRenderer, CharacterJoinerHandler } from 'browser/renderer/Types'; +import { IColorSet } from 'browser/Types'; export class MockCharSizeService implements ICharSizeService { serviceBrand: any; @@ -24,3 +26,72 @@ export class MockMouseService implements IMouseService { throw new Error('Not implemented'); } } + +export class MockRenderService implements IRenderService { + serviceBrand: any; + onDimensionsChange: IEvent = new EventEmitter().event; + onRender: IEvent<{ start: number, end: number }, void> = new EventEmitter<{ start: number, end: number }>().event; + onRefreshRequest: IEvent<{ start: number, end: number}, void> = new EventEmitter<{ start: number, end: number }>().event; + dimensions: IRenderDimensions = { + scaledCharWidth: 0, + scaledCharHeight: 0, + scaledCellWidth: 0, + scaledCellHeight: 0, + scaledCharLeft: 0, + scaledCharTop: 0, + scaledCanvasWidth: 0, + scaledCanvasHeight: 0, + canvasWidth: 0, + canvasHeight: 0, + actualCellWidth: 0, + actualCellHeight: 0 + }; + refreshRows(start: number, end: number): void { + throw new Error('Method not implemented.'); + } + resize(cols: number, rows: number): void { + throw new Error('Method not implemented.'); + } + changeOptions(): void { + throw new Error('Method not implemented.'); + } + setRenderer(renderer: IRenderer): void { + throw new Error('Method not implemented.'); + } + setColors(colors: IColorSet): void { + throw new Error('Method not implemented.'); + } + onDevicePixelRatioChange(): void { + throw new Error('Method not implemented.'); + } + onResize(cols: number, rows: number): void { + throw new Error('Method not implemented.'); + } + onCharSizeChanged(): void { + throw new Error('Method not implemented.'); + } + onBlur(): void { + throw new Error('Method not implemented.'); + } + onFocus(): void { + throw new Error('Method not implemented.'); + } + onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void { + throw new Error('Method not implemented.'); + } + onCursorMove(): void { + throw new Error('Method not implemented.'); + } + clear(): void { + throw new Error('Method not implemented.'); + } + registerCharacterJoiner(handler: CharacterJoinerHandler): number { + throw new Error('Method not implemented.'); + } + deregisterCharacterJoiner(joinerId: number): boolean { + throw new Error('Method not implemented.'); + } + dispose(): void { + throw new Error('Method not implemented.'); + } +} diff --git a/src/browser/services/SelectionService.test.ts b/src/browser/services/SelectionService.test.ts index 62ca3819..cd787531 100644 --- a/src/browser/services/SelectionService.test.ts +++ b/src/browser/services/SelectionService.test.ts @@ -10,16 +10,18 @@ import { IBufferLine } from 'common/Types'; import { MockBufferService, MockOptionsService, MockCoreService } from 'common/TestUtils.test'; import { BufferLine } from 'common/buffer/BufferLine'; import { IBufferService, IOptionsService } from 'common/services/Services'; -import { MockCharSizeService, MockMouseService } from 'browser/TestUtils.test'; +import { MockMouseService, MockRenderService } from 'browser/TestUtils.test'; import { CellData } from 'common/buffer/CellData'; import { IBuffer } from 'common/buffer/Types'; +import { IRenderService } from 'browser/services/Services'; class TestSelectionService extends SelectionService { constructor( bufferService: IBufferService, - optionsService: IOptionsService + optionsService: IOptionsService, + renderService: IRenderService ) { - super(() => {}, null!, null!, new MockCharSizeService(10, 10), bufferService, new MockCoreService(), new MockMouseService(), optionsService); + super(() => {}, null!, null!, bufferService, new MockCoreService(), new MockMouseService(), optionsService, renderService); } public get model(): SelectionModel { return this._model; } @@ -46,7 +48,10 @@ describe('SelectionService', () => { optionsService = new MockOptionsService(); bufferService = new MockBufferService(20, 20, optionsService); buffer = bufferService.buffer; - selectionService = new TestSelectionService(bufferService, optionsService); + const renderService = new MockRenderService(); + renderService.dimensions.canvasHeight = 10 * 20; + renderService.dimensions.canvasWidth = 10 * 20; + selectionService = new TestSelectionService(bufferService, optionsService, renderService); }); function stringToRow(text: string): IBufferLine { diff --git a/src/browser/services/SelectionService.ts b/src/browser/services/SelectionService.ts index f2f46a94..45424d16 100644 --- a/src/browser/services/SelectionService.ts +++ b/src/browser/services/SelectionService.ts @@ -10,7 +10,7 @@ import * as Browser from 'common/Platform'; import { SelectionModel } from 'browser/selection/SelectionModel'; import { CellData } from 'common/buffer/CellData'; import { EventEmitter, IEvent } from 'common/EventEmitter'; -import { ICharSizeService, IMouseService, ISelectionService } from 'browser/services/Services'; +import { ICharSizeService, IMouseService, ISelectionService, IRenderService } from 'browser/services/Services'; import { IBufferService, IOptionsService, ICoreService } from 'common/services/Services'; import { getCoordsRelativeToElement } from 'browser/input/Mouse'; import { moveToCellSequence } from 'browser/input/MoveToCell'; @@ -116,11 +116,11 @@ export class SelectionService implements ISelectionService { private readonly _scrollLines: (amount: number, suppressEvent: boolean) => void, private readonly _element: HTMLElement, private readonly _screenElement: HTMLElement, - @ICharSizeService private readonly _charSizeService: ICharSizeService, @IBufferService private readonly _bufferService: IBufferService, @ICoreService private readonly _coreService: ICoreService, @IMouseService private readonly _mouseService: IMouseService, - @IOptionsService private readonly _optionsService: IOptionsService + @IOptionsService private readonly _optionsService: IOptionsService, + @IRenderService private readonly _renderService: IRenderService ) { // Init listeners this._mouseMoveListener = event => this._onMouseMove(event); @@ -374,7 +374,7 @@ export class SelectionService implements ISelectionService { */ private _getMouseEventScrollAmount(event: MouseEvent): number { let offset = getCoordsRelativeToElement(event, this._screenElement)[1]; - const terminalHeight = this._bufferService.rows * Math.ceil(this._charSizeService.height * this._optionsService.options.lineHeight); + const terminalHeight = this._renderService.dimensions.canvasHeight; if (offset >= 0 && offset <= terminalHeight) { return 0; }