From c7eb727220edc4a48423c49811296c953ca44f08 Mon Sep 17 00:00:00 2001 From: Jeff Smith Date: Fri, 26 Oct 2018 00:07:13 -0500 Subject: [PATCH 1/4] Only show cross-hairs when terminal has focus Fixes #1767 --- src/Terminal.ts | 4 ++-- src/xterm.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Terminal.ts b/src/Terminal.ts index e8871462..4674f776 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -1154,9 +1154,9 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II */ public updateCursorStyle(ev: KeyboardEvent): void { if (this.selectionManager && this.selectionManager.shouldColumnSelect(ev)) { - this.element.classList.add('xterm-cursor-crosshair'); + this.element.classList.add('column-select'); } else { - this.element.classList.remove('xterm-cursor-crosshair'); + this.element.classList.remove('column-select'); } } diff --git a/src/xterm.css b/src/xterm.css index 8e129f50..24cd475f 100644 --- a/src/xterm.css +++ b/src/xterm.css @@ -139,7 +139,7 @@ cursor: pointer; } -.xterm.xterm-cursor-crosshair { +.xterm.column-select.focus { /* Column selection mode */ cursor: crosshair; } From 32574a1a09ded40e299cc1c337899535c2b8889b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 23 Nov 2018 09:05:07 -0800 Subject: [PATCH 2/4] Move Clipboard to ui/ Belong here as it interacts with DOM Part of #1507 --- src/Terminal.ts | 2 +- src/{handlers => ui}/Clipboard.test.ts | 0 src/{handlers => ui}/Clipboard.ts | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename src/{handlers => ui}/Clipboard.test.ts (100%) rename src/{handlers => ui}/Clipboard.ts (100%) diff --git a/src/Terminal.ts b/src/Terminal.ts index 38eb3d5b..fea32c48 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -29,7 +29,7 @@ import { Buffer, MAX_BUFFER_SIZE, DEFAULT_ATTR, NULL_CELL_CODE, NULL_CELL_WIDTH, import { CompositionHelper } from './CompositionHelper'; import { EventEmitter } from './common/EventEmitter'; import { Viewport } from './Viewport'; -import { rightClickHandler, moveTextAreaUnderMouseCursor, pasteHandler, copyHandler } from './handlers/Clipboard'; +import { rightClickHandler, moveTextAreaUnderMouseCursor, pasteHandler, copyHandler } from './ui/Clipboard'; import { C0 } from './common/data/EscapeSequences'; import { InputHandler } from './InputHandler'; import { Renderer } from './renderer/Renderer'; diff --git a/src/handlers/Clipboard.test.ts b/src/ui/Clipboard.test.ts similarity index 100% rename from src/handlers/Clipboard.test.ts rename to src/ui/Clipboard.test.ts diff --git a/src/handlers/Clipboard.ts b/src/ui/Clipboard.ts similarity index 100% rename from src/handlers/Clipboard.ts rename to src/ui/Clipboard.ts From f4a522516c4f1c766ffd1609b7b13bc11ca33583 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 24 Nov 2018 07:03:52 -0800 Subject: [PATCH 3/4] Remove shared/ folder We changed plans from moving web worker compatible code to shared/ to enforcing layers using core/, common/, ui/ and public/. This change moves files back from the shared/ dir to clean up the codebase. Part of #1507 --- src/AccessibilityManager.ts | 2 +- src/SelectionManager.ts | 2 +- src/Terminal.ts | 2 +- .../utils/Browser.ts => core/Platform.ts} | 0 src/renderer/ColorManager.ts | 3 +-- src/renderer/Types.ts | 18 +++++++++++---- src/renderer/atlas/CharAtlasCache.ts | 2 +- .../atlas/CharAtlasGenerator.ts | 4 ++-- src/renderer/atlas/CharAtlasUtils.ts | 3 +-- src/renderer/atlas/DynamicCharAtlas.ts | 9 ++++---- src/renderer/atlas/NoneCharAtlas.ts | 3 +-- src/renderer/atlas/StaticCharAtlas.ts | 5 ++--- src/renderer/atlas/Types.ts | 18 +++++++++++++++ src/shared/Types.ts | 18 --------------- src/shared/atlas/Types.ts | 22 ------------------- src/utils/TestUtils.test.ts | 2 +- 16 files changed, 48 insertions(+), 65 deletions(-) rename src/{shared/utils/Browser.ts => core/Platform.ts} (100%) rename src/{shared => renderer}/atlas/CharAtlasGenerator.ts (97%) delete mode 100644 src/shared/Types.ts delete mode 100644 src/shared/atlas/Types.ts diff --git a/src/AccessibilityManager.ts b/src/AccessibilityManager.ts index 1a2de1d7..fa0121ad 100644 --- a/src/AccessibilityManager.ts +++ b/src/AccessibilityManager.ts @@ -5,7 +5,7 @@ import * as Strings from './Strings'; import { ITerminal, IBuffer } from './Types'; -import { isMac } from './shared/utils/Browser'; +import { isMac } from './core/Platform'; import { RenderDebouncer } from './ui/RenderDebouncer'; import { addDisposableDomListener } from './ui/Lifecycle'; import { Disposable } from './common/Lifecycle'; diff --git a/src/SelectionManager.ts b/src/SelectionManager.ts index 49e21e2c..3dc50271 100644 --- a/src/SelectionManager.ts +++ b/src/SelectionManager.ts @@ -6,7 +6,7 @@ import { ITerminal, ISelectionManager, IBuffer, CharData, IBufferLine } from './Types'; import { XtermListener } from './common/Types'; import { MouseHelper } from './utils/MouseHelper'; -import * as Browser from './shared/utils/Browser'; +import * as Browser from './core/Platform'; import { CharMeasure } from './ui/CharMeasure'; import { EventEmitter } from './common/EventEmitter'; import { SelectionModel } from './SelectionModel'; diff --git a/src/Terminal.ts b/src/Terminal.ts index 8e89c9ca..e898f816 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -36,7 +36,7 @@ import { Renderer } from './renderer/Renderer'; import { Linkifier } from './Linkifier'; import { SelectionManager } from './SelectionManager'; import { CharMeasure } from './ui/CharMeasure'; -import * as Browser from './shared/utils/Browser'; +import * as Browser from './core/Platform'; import { addDisposableDomListener } from './ui/Lifecycle'; import * as Strings from './Strings'; import { MouseHelper } from './utils/MouseHelper'; diff --git a/src/shared/utils/Browser.ts b/src/core/Platform.ts similarity index 100% rename from src/shared/utils/Browser.ts rename to src/core/Platform.ts diff --git a/src/renderer/ColorManager.ts b/src/renderer/ColorManager.ts index d169f266..8a463670 100644 --- a/src/renderer/ColorManager.ts +++ b/src/renderer/ColorManager.ts @@ -3,8 +3,7 @@ * @license MIT */ -import { IColorManager } from './Types'; -import { IColor, IColorSet } from '../shared/Types'; +import { IColorManager, IColor, IColorSet } from './Types'; import { ITheme } from 'xterm'; const DEFAULT_FOREGROUND = fromHex('#ffffff'); diff --git a/src/renderer/Types.ts b/src/renderer/Types.ts index 824304ed..f2271f95 100644 --- a/src/renderer/Types.ts +++ b/src/renderer/Types.ts @@ -5,7 +5,6 @@ import { ITerminal, CharacterJoinerHandler } from '../Types'; import { IEventEmitter, ITheme, IDisposable } from 'xterm'; -import { IColorSet } from '../shared/Types'; /** * Flags used to render terminal text properly. @@ -48,9 +47,6 @@ export interface IColorManager { colors: IColorSet; } -// TODO: We should probably rewrite the imports for IColorSet, but there's a lot of them -export { IColorSet }; - export interface IRenderDimensions { scaledCharWidth: number; scaledCharHeight: number; @@ -134,3 +130,17 @@ export interface ICharacterJoinerRegistry { deregisterCharacterJoiner(joinerId: number): boolean; getJoinedCharacters(row: number): [number, number][]; } + +export interface IColor { + css: string; + rgba: number; // 32-bit int with rgba in each byte +} + +export interface IColorSet { + foreground: IColor; + background: IColor; + cursor: IColor; + cursorAccent: IColor; + selection: IColor; + ansi: IColor[]; +} diff --git a/src/renderer/atlas/CharAtlasCache.ts b/src/renderer/atlas/CharAtlasCache.ts index eee93d6c..3cb0e1cd 100644 --- a/src/renderer/atlas/CharAtlasCache.ts +++ b/src/renderer/atlas/CharAtlasCache.ts @@ -5,12 +5,12 @@ import { ITerminal } from '../../Types'; import { IColorSet } from '../Types'; -import { ICharAtlasConfig } from '../../shared/atlas/Types'; import { generateConfig, configEquals } from './CharAtlasUtils'; import BaseCharAtlas from './BaseCharAtlas'; import DynamicCharAtlas from './DynamicCharAtlas'; import NoneCharAtlas from './NoneCharAtlas'; import StaticCharAtlas from './StaticCharAtlas'; +import { ICharAtlasConfig } from './Types'; const charAtlasImplementations = { 'none': NoneCharAtlas, diff --git a/src/shared/atlas/CharAtlasGenerator.ts b/src/renderer/atlas/CharAtlasGenerator.ts similarity index 97% rename from src/shared/atlas/CharAtlasGenerator.ts rename to src/renderer/atlas/CharAtlasGenerator.ts index f78a6d41..03ab7b95 100644 --- a/src/shared/atlas/CharAtlasGenerator.ts +++ b/src/renderer/atlas/CharAtlasGenerator.ts @@ -4,9 +4,9 @@ */ import { FontWeight } from 'xterm'; -import { CHAR_ATLAS_CELL_SPACING, ICharAtlasConfig } from './Types'; +import { isFirefox, isSafari } from '../../core/Platform'; import { IColor } from '../Types'; -import { isFirefox, isSafari } from '../utils/Browser'; +import { ICharAtlasConfig, CHAR_ATLAS_CELL_SPACING } from './Types'; declare const Promise: any; diff --git a/src/renderer/atlas/CharAtlasUtils.ts b/src/renderer/atlas/CharAtlasUtils.ts index c504f77e..5b1add39 100644 --- a/src/renderer/atlas/CharAtlasUtils.ts +++ b/src/renderer/atlas/CharAtlasUtils.ts @@ -5,8 +5,7 @@ import { ITerminal } from '../../Types'; import { IColorSet } from '../Types'; -import { ICharAtlasConfig } from '../../shared/atlas/Types'; -import { DEFAULT_COLOR } from './Types'; +import { DEFAULT_COLOR, ICharAtlasConfig } from './Types'; export function generateConfig(scaledCharWidth: number, scaledCharHeight: number, terminal: ITerminal, colors: IColorSet): ICharAtlasConfig { // null out some fields that don't matter diff --git a/src/renderer/atlas/DynamicCharAtlas.ts b/src/renderer/atlas/DynamicCharAtlas.ts index b6b323f0..72010768 100644 --- a/src/renderer/atlas/DynamicCharAtlas.ts +++ b/src/renderer/atlas/DynamicCharAtlas.ts @@ -3,14 +3,13 @@ * @license MIT */ -import { DIM_OPACITY, IGlyphIdentifier, INVERTED_DEFAULT_COLOR } from './Types'; -import { ICharAtlasConfig } from '../../shared/atlas/Types'; -import { IColor } from '../../shared/Types'; +import { DIM_OPACITY, IGlyphIdentifier, INVERTED_DEFAULT_COLOR, ICharAtlasConfig } from './Types'; import BaseCharAtlas from './BaseCharAtlas'; import { DEFAULT_ANSI_COLORS } from '../ColorManager'; -import { clearColor } from '../../shared/atlas/CharAtlasGenerator'; +import { clearColor } from './CharAtlasGenerator'; import LRUMap from './LRUMap'; -import { isFirefox, isSafari } from '../../shared/utils/Browser'; +import { isFirefox, isSafari } from '../../core/Platform'; +import { IColor } from '../Types'; // In practice we're probably never going to exhaust a texture this large. For debugging purposes, // however, it can be useful to set this to a really tiny value, to verify that LRU eviction works. diff --git a/src/renderer/atlas/NoneCharAtlas.ts b/src/renderer/atlas/NoneCharAtlas.ts index 1cbc9eea..308e3075 100644 --- a/src/renderer/atlas/NoneCharAtlas.ts +++ b/src/renderer/atlas/NoneCharAtlas.ts @@ -5,8 +5,7 @@ * A dummy CharAtlas implementation that always fails to draw characters. */ -import { IGlyphIdentifier } from './Types'; -import { ICharAtlasConfig } from '../../shared/atlas/Types'; +import { IGlyphIdentifier, ICharAtlasConfig } from './Types'; import BaseCharAtlas from './BaseCharAtlas'; export default class NoneCharAtlas extends BaseCharAtlas { diff --git a/src/renderer/atlas/StaticCharAtlas.ts b/src/renderer/atlas/StaticCharAtlas.ts index 8dc8be74..b54c833e 100644 --- a/src/renderer/atlas/StaticCharAtlas.ts +++ b/src/renderer/atlas/StaticCharAtlas.ts @@ -3,9 +3,8 @@ * @license MIT */ -import { DIM_OPACITY, IGlyphIdentifier, DEFAULT_COLOR } from './Types'; -import { CHAR_ATLAS_CELL_SPACING, ICharAtlasConfig } from '../../shared/atlas/Types'; -import { generateStaticCharAtlasTexture } from '../../shared/atlas/CharAtlasGenerator'; +import { DIM_OPACITY, IGlyphIdentifier, DEFAULT_COLOR, ICharAtlasConfig, CHAR_ATLAS_CELL_SPACING } from './Types'; +import { generateStaticCharAtlasTexture } from './CharAtlasGenerator'; import BaseCharAtlas from './BaseCharAtlas'; import { is256Color } from './CharAtlasUtils'; diff --git a/src/renderer/atlas/Types.ts b/src/renderer/atlas/Types.ts index 76cfd07d..38923b2f 100644 --- a/src/renderer/atlas/Types.ts +++ b/src/renderer/atlas/Types.ts @@ -3,10 +3,15 @@ * @license MIT */ +import { FontWeight } from 'xterm'; +import { IColorSet } from '../Types'; + export const DEFAULT_COLOR = 256; export const INVERTED_DEFAULT_COLOR = 257; export const DIM_OPACITY = 0.5; +export const CHAR_ATLAS_CELL_SPACING = 1; + export interface IGlyphIdentifier { chars: string; code: number; @@ -16,3 +21,16 @@ export interface IGlyphIdentifier { dim: boolean; italic: boolean; } + +export interface ICharAtlasConfig { + type: 'none' | 'static' | 'dynamic'; + devicePixelRatio: number; + fontSize: number; + fontFamily: string; + fontWeight: FontWeight; + fontWeightBold: FontWeight; + scaledCharWidth: number; + scaledCharHeight: number; + allowTransparency: boolean; + colors: IColorSet; +} diff --git a/src/shared/Types.ts b/src/shared/Types.ts deleted file mode 100644 index 0cded8a8..00000000 --- a/src/shared/Types.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2017 The xterm.js authors. All rights reserved. - * @license MIT - */ - -export interface IColor { - css: string; - rgba: number; // 32-bit int with rgba in each byte -} - -export interface IColorSet { - foreground: IColor; - background: IColor; - cursor: IColor; - cursorAccent: IColor; - selection: IColor; - ansi: IColor[]; -} diff --git a/src/shared/atlas/Types.ts b/src/shared/atlas/Types.ts deleted file mode 100644 index 25eaa716..00000000 --- a/src/shared/atlas/Types.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2017 The xterm.js authors. All rights reserved. - * @license MIT - */ - -import { FontWeight } from 'xterm'; -import { IColorSet } from '../Types'; - -export const CHAR_ATLAS_CELL_SPACING = 1; - -export interface ICharAtlasConfig { - type: 'none' | 'static' | 'dynamic'; - devicePixelRatio: number; - fontSize: number; - fontFamily: string; - fontWeight: FontWeight; - fontWeightBold: FontWeight; - scaledCharWidth: number; - scaledCharHeight: number; - allowTransparency: boolean; - colors: IColorSet; -} diff --git a/src/utils/TestUtils.test.ts b/src/utils/TestUtils.test.ts index a5ef4b9f..10033a33 100644 --- a/src/utils/TestUtils.test.ts +++ b/src/utils/TestUtils.test.ts @@ -7,7 +7,7 @@ import { IColorSet, IRenderer, IRenderDimensions, IColorManager } from '../rende import { IInputHandlingTerminal, IViewport, ICompositionHelper, ITerminal, IBuffer, IBufferSet, IBrowser, ICharMeasure, ISelectionManager, ITerminalOptions, ILinkifier, IMouseHelper, ILinkMatcherOptions, CharacterJoinerHandler, IBufferLine, IBufferStringIterator } from '../Types'; import { ICircularList, XtermListener } from '../common/Types'; import { Buffer } from '../Buffer'; -import * as Browser from '../shared/utils/Browser'; +import * as Browser from '../core/Platform'; import { ITheme, IDisposable, IMarker } from 'xterm'; import { Terminal } from '../Terminal'; From 13175976d02db6695e17c8f60eb54a0142140934 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 24 Nov 2018 07:16:19 -0800 Subject: [PATCH 4/4] Upgrade to typescript 3.1 Bunch of types needed changing in this version, also the IOffscreenCanvas "support" in the canvas renderer was removed as we're moving away from that. --- package.json | 2 +- src/shared/atlas/CharAtlasGenerator.ts | 18 ++---------------- src/ui/ScreenDprMonitor.ts | 2 +- yarn.lock | 8 ++++---- 4 files changed, 8 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index ad763f0b..c84a0164 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "ts-loader": "^4.5.0", "tslint": "^5.9.1", "tslint-consistent-codestyle": "^1.13.0", - "typescript": "3.0", + "typescript": "3.1", "vinyl-buffer": "^1.0.0", "vinyl-source-stream": "^1.1.0", "webpack": "^4.17.1", diff --git a/src/shared/atlas/CharAtlasGenerator.ts b/src/shared/atlas/CharAtlasGenerator.ts index f78a6d41..60138d79 100644 --- a/src/shared/atlas/CharAtlasGenerator.ts +++ b/src/shared/atlas/CharAtlasGenerator.ts @@ -8,22 +8,13 @@ import { CHAR_ATLAS_CELL_SPACING, ICharAtlasConfig } from './Types'; import { IColor } from '../Types'; import { isFirefox, isSafari } from '../utils/Browser'; -declare const Promise: any; - -export interface IOffscreenCanvas { - width: number; - height: number; - getContext(type: '2d', config?: Canvas2DContextAttributes): CanvasRenderingContext2D; - transferToImageBitmap(): ImageBitmap; -} - /** * Generates a char atlas. * @param context The window or worker context. * @param canvasFactory A function to generate a canvas with a width or height. * @param config The config for the new char atlas. */ -export function generateStaticCharAtlasTexture(context: Window, canvasFactory: (width: number, height: number) => HTMLCanvasElement | IOffscreenCanvas, config: ICharAtlasConfig): HTMLCanvasElement | Promise { +export function generateStaticCharAtlasTexture(context: Window, canvasFactory: (width: number, height: number) => HTMLCanvasElement, config: ICharAtlasConfig): HTMLCanvasElement | Promise { const cellWidth = config.scaledCharWidth + CHAR_ATLAS_CELL_SPACING; const cellHeight = config.scaledCharHeight + CHAR_ATLAS_CELL_SPACING; const canvas = canvasFactory( @@ -101,12 +92,7 @@ export function generateStaticCharAtlasTexture(context: Window, canvasFactory: ( // performance (tested on v55). if (!('createImageBitmap' in context) || isFirefox || isSafari) { // Don't attempt to clear background colors if createImageBitmap is not supported - if (canvas instanceof HTMLCanvasElement) { - // Just return the HTMLCanvas if it's a HTMLCanvasElement - return canvas; - } - // Transfer to an ImageBitmap is this is an OffscreenCanvas - return new Promise((r: (bitmap: ImageBitmap) => void) => r(canvas.transferToImageBitmap())); + return canvas; } const charAtlasImageData = ctx.getImageData(0, 0, canvas.width, canvas.height); diff --git a/src/ui/ScreenDprMonitor.ts b/src/ui/ScreenDprMonitor.ts index 9247a032..d66eeb64 100644 --- a/src/ui/ScreenDprMonitor.ts +++ b/src/ui/ScreenDprMonitor.ts @@ -19,7 +19,7 @@ export type ScreenDprListener = (newDevicePixelRatio?: number, oldDevicePixelRat */ export class ScreenDprMonitor extends Disposable { private _currentDevicePixelRatio: number; - private _outerListener: MediaQueryListListener; + private _outerListener: (this: MediaQueryList, ev: MediaQueryListEvent) => any; private _listener: ScreenDprListener; private _resolutionMediaMatchList: MediaQueryList; diff --git a/yarn.lock b/yarn.lock index 267c3bfc..db31bfe1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6716,10 +6716,10 @@ typedarray@^0.0.6, typedarray@~0.0.5: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8" - integrity sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg== +typescript@3.1: + version "3.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" + integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== uglify-es@^3.3.4: version "3.3.9"