diff --git a/src/browser/Terminal.ts b/src/browser/Terminal.ts index 4afca04c..2cd9bf99 100644 --- a/src/browser/Terminal.ts +++ b/src/browser/Terminal.ts @@ -699,8 +699,7 @@ export class Terminal extends CoreTerminal implements ITerminal { }, wheel: (ev: WheelEvent) => { sendEvent(ev); - ev.preventDefault(); - return this.cancel(ev); + return this.cancel(ev, true); }, mousedrag: (ev: MouseEvent) => { // deal only with move while a button is held @@ -795,33 +794,31 @@ export class Terminal extends CoreTerminal implements ITerminal { })); this.register(addDisposableDomListener(el, 'wheel', (ev: WheelEvent) => { - if (!requestedEvents.wheel) { + // do nothing, if app side handles wheel itself + if (requestedEvents.wheel) return; + + if (!this.buffer.hasScrollback) { // Convert wheel events into up/down events when the buffer does not have scrollback, this // enables scrolling in apps hosted in the alt buffer such as vim or tmux. - if (!this.buffer.hasScrollback) { - const amount = this.viewport!.getLinesScrolled(ev); + const amount = this.viewport!.getLinesScrolled(ev); - // Do nothing if there's no vertical scroll - if (amount === 0) { - return; - } - - // Construct and send sequences - const sequence = C0.ESC + (this.coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B'); - let data = ''; - for (let i = 0; i < Math.abs(amount); i++) { - data += sequence; - } - this.coreService.triggerDataEvent(data, true); + // Do nothing if there's no vertical scroll + if (amount === 0) { + return; } - return; - } - }, { passive: true })); - // allow wheel scrolling in - // the shell for example - this.register(addDisposableDomListener(el, 'wheel', (ev: WheelEvent) => { - if (requestedEvents.wheel) return; + // Construct and send sequences + const sequence = C0.ESC + (this.coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B'); + let data = ''; + for (let i = 0; i < Math.abs(amount); i++) { + data += sequence; + } + this.coreService.triggerDataEvent(data, true); + return this.cancel(ev, true); + } + + // normal viewport scrolling + // conditionally stop event, if the viewport still had rows to scroll within if (!this.viewport!.onWheel(ev)) { return this.cancel(ev); }