diff --git a/src/InputHandler.ts b/src/InputHandler.ts index a7023083..780627ad 100644 --- a/src/InputHandler.ts +++ b/src/InputHandler.ts @@ -903,7 +903,8 @@ export class InputHandler implements IInputHandler { this._terminal.vt200Mouse = params[0] === 1000; this._terminal.normalMouse = params[0] > 1000; this._terminal.mouseEvents = true; - this._terminal.element.style.cursor = 'default'; + this._terminal.element.classList.add('enable-mouse-events'); + this._terminal.selectionManager.disable(); this._terminal.log('Binding to mouse events.'); break; case 1004: // send focusin/focusout events @@ -1096,7 +1097,8 @@ export class InputHandler implements IInputHandler { this._terminal.vt200Mouse = false; this._terminal.normalMouse = false; this._terminal.mouseEvents = false; - this._terminal.element.style.cursor = ''; + this._terminal.element.classList.remove('enable-mouse-events'); + this._terminal.selectionManager.enable(); break; case 1004: // send focusin/focusout events this._terminal.sendFocus = false; diff --git a/src/SelectionManager.ts b/src/SelectionManager.ts index 284772c9..c2f472a0 100644 --- a/src/SelectionManager.ts +++ b/src/SelectionManager.ts @@ -13,7 +13,11 @@ export class SelectionManager extends EventEmitter { private _selectionStart: [number, number]; private _selectionEnd: [number, number]; + private _bufferTrimListener: any; private _mouseMoveListener: EventListener; + private _mouseDownListener: EventListener; + private _mouseUpListener: EventListener; + private _dblClickListener: EventListener; constructor( private _terminal: ITerminal, @@ -23,16 +27,41 @@ export class SelectionManager extends EventEmitter { private _charMeasure: CharMeasure ) { super(); - this._attachListeners(); + this._initListeners(); + this.enable(); } - private _attachListeners() { + private _initListeners() { + this._bufferTrimListener = (amount: number) => this._onTrim(amount); this._mouseMoveListener = event => this._onMouseMove(event); + this._mouseDownListener = event => this._onMouseDown(event); + this._mouseUpListener = event => this._onMouseUp(event); + this._dblClickListener = event => this._onDblClick(event); + } - this._buffer.on('trim', amount => this._onTrim(amount)); - this._rowContainer.addEventListener('mousedown', event => this._onMouseDown(event)); - this._rowContainer.addEventListener('mouseup', event => this._onMouseUp(event)); - this._rowContainer.addEventListener('dblclick', event => this._onDblclick(event)); + /** + * Disables the selection manager. This is useful for when terminal mouse + * are enabled. + */ + public disable() { + this._selectionStart = null; + this._selectionEnd = null; + this.refresh(); + this._buffer.off('trim', this._bufferTrimListener); + this._rowContainer.removeEventListener('mousedown', this._mouseDownListener); + this._rowContainer.removeEventListener('mouseup', this._mouseUpListener); + this._rowContainer.removeEventListener('dblclick', this._dblClickListener); + this._rowContainer.removeEventListener('mousemove', this._mouseMoveListener); + } + + /** + * Enable the selection manager. + */ + public enable() { + this._buffer.on('trim', this._bufferTrimListener); + this._rowContainer.addEventListener('mousedown', this._mouseDownListener); + this._rowContainer.addEventListener('mouseup', this._mouseUpListener); + this._rowContainer.addEventListener('dblclick', this._dblClickListener); } public get selectionText(): string { @@ -148,7 +177,7 @@ export class SelectionManager extends EventEmitter { this._rowContainer.removeEventListener('mousemove', this._mouseMoveListener); } - private _onDblclick(event: MouseEvent) { + private _onDblClick(event: MouseEvent) { const coords = this._getMouseBufferCoords(event); if (coords) { this._selectWordAt(coords); diff --git a/src/xterm.css b/src/xterm.css index 602cc132..8b082bb4 100644 --- a/src/xterm.css +++ b/src/xterm.css @@ -181,6 +181,11 @@ left: -9999em; } +.terminal.enable-mouse-events { + /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */ + cursor: default; +} + .terminal .xterm-selection { position: absolute; top: 0;