diff --git a/fixtures/typings-test/typings-test.ts b/fixtures/typings-test/typings-test.ts index ffe6afd49..90958f83f 100644 --- a/fixtures/typings-test/typings-test.ts +++ b/fixtures/typings-test/typings-test.ts @@ -210,8 +210,8 @@ namespace methods_experimental { t.registerLinkMatcher(/foo/, () => true, { matchIndex: 1, priority: 1, - validationCallback: (uri: string, element: HTMLElement, callback: (isValid: boolean) => void) => { - console.log(uri, element, callback); + validationCallback: (uri: string, callback: (isValid: boolean) => void) => { + console.log(uri, callback); } }); t.deregisterLinkMatcher(1); diff --git a/src/CompositionHelper.test.ts b/src/CompositionHelper.test.ts index 0adb1719a..7d78a259b 100644 --- a/src/CompositionHelper.test.ts +++ b/src/CompositionHelper.test.ts @@ -42,6 +42,16 @@ describe('CompositionHelper', () => { }, handler: (text: string) => { handledText += text; + }, + buffer: { + isCursorInViewport: true + }, + charMeasure: { + height: 10, + width: 10 + }, + options: { + lineHeight: 1 } }; handledText = ''; diff --git a/src/Terminal.test.ts b/src/Terminal.test.ts index 0c333741f..7a44ee81e 100644 --- a/src/Terminal.test.ts +++ b/src/Terminal.test.ts @@ -1,6 +1,6 @@ import { assert, expect } from 'chai'; import { Terminal } from './Terminal'; -import { MockViewport, MockCompositionHelper } from './utils/TestUtils.test'; +import { MockViewport, MockCompositionHelper, MockRenderer } from './utils/TestUtils.test'; import { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX } from './Buffer'; const INIT_COLS = 80; @@ -21,6 +21,7 @@ describe('term.js addons', () => { rows: INIT_ROWS }); term.refresh = () => {}; + (term).renderer = new MockRenderer(); term.viewport = new MockViewport(); (term).compositionHelper = new MockCompositionHelper(); // Force synchronous writes diff --git a/src/Terminal.ts b/src/Terminal.ts index 620340171..cab25b03b 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -44,6 +44,7 @@ import { DEFAULT_ANSI_COLORS } from './renderer/ColorManager'; import { IMouseZoneManager } from './input/Interfaces'; import { MouseZoneManager } from './input/MouseZoneManager'; import { initialize as initializeCharAtlas } from './renderer/CharAtlas'; +import { IRenderer } from './renderer/Interfaces'; // Declare for RequireJS in loadAddon declare var define: any; @@ -184,7 +185,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT private inputHandler: InputHandler; private parser: Parser; - private renderer: Renderer; + private renderer: IRenderer; public selectionManager: SelectionManager; private linkifier: Linkifier; public buffers: BufferSet; diff --git a/src/Viewport.test.ts b/src/Viewport.test.ts index 8a960fc7d..6d23e19a1 100644 --- a/src/Viewport.test.ts +++ b/src/Viewport.test.ts @@ -31,7 +31,8 @@ describe('Viewport', () => { } }, options: { - scrollback: 10 + scrollback: 10, + lineHeight: 1 } }; terminal.buffers = new BufferSet(terminal); diff --git a/src/renderer/Interfaces.ts b/src/renderer/Interfaces.ts index fd94d59d7..f7645abf8 100644 --- a/src/renderer/Interfaces.ts +++ b/src/renderer/Interfaces.ts @@ -1,4 +1,17 @@ -import { ITerminal, ITerminalOptions } from '../Interfaces'; +import { ITerminal, ITerminalOptions, ITheme } from '../Interfaces'; + +export interface IRenderer { + setTheme(theme: ITheme): IColorSet; + onResize(cols: number, rows: number): void; + onCharSizeChanged(charWidth: number, charHeight: number): void; + onBlur(): void; + onFocus(): void; + onSelectionChanged(start: [number, number], end: [number, number]): void; + onCursorMove(): void; + onOptionsChanged(): void; + clear(): void; + queueRefresh(start: number, end: number): void; +} export interface IRenderLayer { /** diff --git a/src/renderer/Renderer.ts b/src/renderer/Renderer.ts index bc0717dc4..6b12188ed 100644 --- a/src/renderer/Renderer.ts +++ b/src/renderer/Renderer.ts @@ -11,9 +11,9 @@ import { SelectionRenderLayer } from './SelectionRenderLayer'; import { CursorRenderLayer } from './CursorRenderLayer'; import { ColorManager } from './ColorManager'; import { BaseRenderLayer } from './BaseRenderLayer'; -import { IRenderLayer, IColorSet } from './Interfaces'; +import { IRenderLayer, IColorSet, IRenderer } from './Interfaces'; -export class Renderer { +export class Renderer implements IRenderer { /** A queue of the rows to be refreshed */ private _refreshRowsQueue: {start: number, end: number}[] = []; private _refreshAnimationFrame = null; diff --git a/src/utils/TestUtils.test.ts b/src/utils/TestUtils.test.ts index 0388e9da1..51f191a83 100644 --- a/src/utils/TestUtils.test.ts +++ b/src/utils/TestUtils.test.ts @@ -2,11 +2,11 @@ * @license MIT */ -import { ITerminal, IBuffer, IBufferSet, IBrowser, ICharMeasure, ISelectionManager, ITerminalOptions, IListenerType, IInputHandlingTerminal, IViewport, ICircularList, ICompositionHelper } from '../Interfaces'; +import { ITerminal, IBuffer, IBufferSet, IBrowser, ICharMeasure, ISelectionManager, ITerminalOptions, IListenerType, IInputHandlingTerminal, IViewport, ICircularList, ICompositionHelper, ITheme } from '../Interfaces'; import { LineData } from '../Types'; import { Buffer } from '../Buffer'; import * as Browser from './Browser'; -import { IColorSet } from '../renderer/Interfaces'; +import { IColorSet, IRenderer } from '../renderer/Interfaces'; export class MockTerminal implements ITerminal { isFocused: boolean; @@ -204,6 +204,19 @@ export class MockBuffer implements IBuffer { } } +export class MockRenderer implements IRenderer { + setTheme(theme: ITheme): IColorSet { return {}; } + onResize(cols: number, rows: number): void {} + onCharSizeChanged(charWidth: number, charHeight: number): void {} + onBlur(): void {} + onFocus(): void {} + onSelectionChanged(start: [number, number], end: [number, number]): void {} + onCursorMove(): void {} + onOptionsChanged(): void {} + clear(): void {} + queueRefresh(start: number, end: number): void {} +} + export class MockViewport implements IViewport { onThemeChanged(colors: IColorSet): void { throw new Error('Method not implemented.'); diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts index d61279785..866021e87 100644 --- a/typings/xterm.d.ts +++ b/typings/xterm.d.ts @@ -131,12 +131,12 @@ interface ILinkMatcherOptions { * A callback that validates an individual link, returning true if valid and * false if invalid. */ - validationCallback?: (uri: string, element: HTMLElement, callback: (isValid: boolean) => void) => void; + validationCallback?: (uri: string, callback: (isValid: boolean) => void) => void; /** * A callback that fired when the mouse hovers over a link. */ - hoverCallback?: LinkMatcherHandler; + hoverCallback?: (event: MouseEvent, uri: string) => boolean | void; /** * The priority of the link matcher, this defines the order in which the link @@ -290,7 +290,7 @@ declare module 'xterm' { * @param options Options for the link matcher. * @return The ID of the new matcher, this can be used to deregister. */ - registerLinkMatcher(regex: RegExp, handler: (event: MouseEvent, uri: string) => boolean | void , options?: ILinkMatcherOptions): number; + registerLinkMatcher(regex: RegExp, handler: (event: MouseEvent, uri: string) => boolean | void, options?: ILinkMatcherOptions): number; /** * (EXPERIMENTAL) Deregisters a link matcher if it has been registered.