add richer ScrollEvent that includes the source

This commit is contained in:
Jakob Schrettenbrunner
2021-01-12 22:32:20 +00:00
parent 5cb048094e
commit 8b2b0f6abc
3 changed files with 39 additions and 15 deletions
+6 -6
View File
@@ -39,7 +39,7 @@ import { MouseZoneManager } from 'browser/MouseZoneManager';
import { AccessibilityManager } from './AccessibilityManager';
import { ITheme, IMarker, IDisposable, ISelectionPosition, ILinkProvider } from 'xterm';
import { DomRenderer } from 'browser/renderer/dom/DomRenderer';
import { IKeyboardEvent, KeyboardResultType, CoreMouseEventType, CoreMouseButton, CoreMouseAction, ITerminalOptions } from 'common/Types';
import { IKeyboardEvent, KeyboardResultType, CoreMouseEventType, CoreMouseButton, CoreMouseAction, ITerminalOptions, ScrollSource } from 'common/Types';
import { evaluateKeyboardEvent } from 'common/input/Keyboard';
import { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';
import { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';
@@ -448,7 +448,7 @@ export class Terminal extends CoreTerminal implements ITerminal {
this._instantiationService.setService(IMouseService, this._mouseService);
this.viewport = this._instantiationService.createInstance(Viewport,
(amount: number, suppressEvent: boolean) => this.scrollLines(amount, suppressEvent),
(amount: number, suppressEvent: boolean) => this.scrollLines(amount, suppressEvent, ScrollSource.VIEWPORT),
this._viewportElement,
this._viewportScrollArea
);
@@ -481,7 +481,7 @@ export class Terminal extends CoreTerminal implements ITerminal {
this.textarea!.select();
}));
this.register(this.onScroll(() => {
this.viewport!.syncScrollArea();
this.viewport!.syncScrollArea();
this._selectionService!.refresh();
}));
this.register(addDisposableDomListener(this._viewportElement, 'scroll', () => this._selectionService!.refresh()));
@@ -836,8 +836,8 @@ export class Terminal extends CoreTerminal implements ITerminal {
}
}
public scrollLines(disp: number, suppressScrollEvent?: boolean): void {
super.scrollLines(disp, suppressScrollEvent);
public scrollLines(disp: number, suppressScrollEvent?: boolean, source = ScrollSource.TERMINAL): void {
super.scrollLines(disp, suppressScrollEvent, source);
this.refresh(0, this.rows - 1);
}
@@ -1168,7 +1168,7 @@ export class Terminal extends CoreTerminal implements ITerminal {
this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));
}
this.refresh(0, this.rows - 1);
this._onScroll.fire(this.buffer.ydisp);
this._onScroll.fire({position: this.buffer.ydisp, source: ScrollSource.TERMINAL });
}
/**
+23 -9
View File
@@ -27,7 +27,7 @@ import { InstantiationService } from 'common/services/InstantiationService';
import { LogService } from 'common/services/LogService';
import { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService';
import { OptionsService } from 'common/services/OptionsService';
import { ITerminalOptions, IDisposable, IBufferLine, IAttributeData, ICoreTerminal } from 'common/Types';
import { ITerminalOptions, IDisposable, IBufferLine, IAttributeData, ICoreTerminal, IKeyboardEvent, IScrollEvent, ScrollSource } from 'common/Types';
import { CoreService } from 'common/services/CoreService';
import { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';
import { CoreMouseService } from 'common/services/CoreMouseService';
@@ -66,8 +66,12 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
public get onLineFeed(): IEvent<void> { return this._onLineFeed.event; }
private _onResize = new EventEmitter<{ cols: number, rows: number }>();
public get onResize(): IEvent<{ cols: number, rows: number }> { return this._onResize.event; }
protected _onScroll = new EventEmitter<number>();
public get onScroll(): IEvent<number> { return this._onScroll.event; }
protected _onScroll = new EventEmitter<IScrollEvent, void>();
/**
* An emitter for legacy on scroll events that just included the position, and not the source.
* Used to maintain API consistency for the onScroll method.
*/
protected _legacyOnScroll?: EventEmitter<number, void>;
public get cols(): number { return this._bufferService.cols; }
public get rows(): number { return this._bufferService.rows; }
@@ -204,17 +208,17 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
// Flag rows that need updating
this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);
this._onScroll.fire(buffer.ydisp);
this._onScroll.fire({position: buffer.ydisp, source: ScrollSource.TERMINAL});
}
/**
* Scroll the display of the terminal
* @param disp The number of lines to scroll down (negative scroll up).
* @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used
* to avoid unwanted events being handled by the viewport when the event was triggered from the
* viewport originally.
* @param suppressScrollEvent Don't emit an onScroll event.
* @param source The source of the scroll action. Emitted as part of the onScroll event
* to avoid cyclic invocations if the event originated from the Viewport.
*/
public scrollLines(disp: number, suppressScrollEvent?: boolean): void {
public scrollLines(disp: number, suppressScrollEvent = false, source = ScrollSource.TERMINAL): void {
const buffer = this._bufferService.buffer;
if (disp < 0) {
if (buffer.ydisp === 0) {
@@ -234,7 +238,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
}
if (!suppressScrollEvent) {
this._onScroll.fire(buffer.ydisp);
this._onScroll.fire({position: buffer.ydisp, source});
}
}
@@ -267,6 +271,16 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
}
}
public get onScroll(): IEvent<number, void> {
if (!this._legacyOnScroll) {
this._legacyOnScroll = new EventEmitter<number, void>();
this.register(this._onScroll.event(ev => {
this._legacyOnScroll?.fire(ev.position);
}));
}
return this._legacyOnScroll.event;
}
/** Add handler for ESC escape sequence. See xterm.d.ts for details. */
public addEscHandler(id: IFunctionIdentifier, callback: () => boolean): IDisposable {
return this._inputHandler.addEscHandler(id, callback);
+10
View File
@@ -42,6 +42,16 @@ export interface IKeyboardEvent {
type: string;
}
export interface IScrollEvent {
position: number;
source: ScrollSource;
}
export const enum ScrollSource {
TERMINAL,
VIEWPORT,
}
export interface ICircularList<T> {
length: number;
maxLength: number;