From 22cca3495ae7658460a2df22c8b11d52aff152a7 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 30 Aug 2022 07:00:33 -0700 Subject: [PATCH 1/2] Expose range on link handler This is needed for proper tooltip positioning Part of #1134 --- src/browser/OscLinkProvider.ts | 32 +++++++++++++++++--------------- typings/xterm.d.ts | 9 ++++++--- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/browser/OscLinkProvider.ts b/src/browser/OscLinkProvider.ts index 38c07106..fdae9b0e 100644 --- a/src/browser/OscLinkProvider.ts +++ b/src/browser/OscLinkProvider.ts @@ -6,6 +6,7 @@ import { ILink, ILinkProvider } from 'browser/Types'; import { CellData } from 'common/buffer/CellData'; import { IBufferService, IOptionsService, IOscLinkService } from 'common/services/Services'; +import { IBufferRange } from 'xterm'; export class OscLinkProvider implements ILinkProvider { constructor( @@ -54,24 +55,25 @@ export class OscLinkProvider implements ILinkProvider { if (finishLink || (currentStart !== -1 && x === lineLength - 1)) { const text = this._oscLinkService.getLinkData(currentLinkId)?.uri; if (text) { + // These ranges are 1-based + const range: IBufferRange = { + start: { + x: currentStart + 1, + y + }, + end: { + // Offset end x if it's a link that ends on the last cell in the line + x: x + (!finishLink && x === lineLength - 1 ? 1 : 0), + y + } + }; // OSC links always use underline and pointer decorations result.push({ text, - // These ranges are 1-based - range: { - start: { - x: currentStart + 1, - y - }, - end: { - // Offset end x if it's a link that ends on the last cell in the line - x: x + (!finishLink && x === lineLength - 1 ? 1 : 0), - y - } - }, - activate: linkHandler?.activate || defaultActivate, - hover: linkHandler?.hover, - leave: linkHandler?.leave + range, + activate: (e, text) => (linkHandler?.activate(e, text, range) || defaultActivate(e, text)), + hover: (e, text) => linkHandler?.hover?.(e, text, range), + leave: (e, text) => linkHandler?.leave?.(e, text, range) }); } finishLink = false; diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts index 2fa17421..bd48afd4 100644 --- a/typings/xterm.d.ts +++ b/typings/xterm.d.ts @@ -1117,8 +1117,9 @@ declare module 'xterm' { * Calls when the link is activated. * @param event The mouse event triggering the callback. * @param text The text of the link. + * @param range The buffer range of the link. */ - activate(event: MouseEvent, text: string): void; + activate(event: MouseEvent, text: string, range: IBufferRange): void; /** * Called when the mouse hovers the link. To use this to create a DOM-based hover tooltip, @@ -1126,15 +1127,17 @@ declare module 'xterm' { * that will cause mouse events to not fall through and activate other links. * @param event The mouse event triggering the callback. * @param text The text of the link. + * @param range The buffer range of the link. */ - hover?(event: MouseEvent, text: string): void; + hover?(event: MouseEvent, text: string, range: IBufferRange): void; /** * Called when the mouse leaves the link. * @param event The mouse event triggering the callback. * @param text The text of the link. + * @param range The buffer range of the link. */ - leave?(event: MouseEvent, text: string): void; + leave?(event: MouseEvent, text: string, range: IBufferRange): void; } /** From c5861d512c41b179fe944c1c032ad13d3a070dc0 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 30 Aug 2022 07:01:23 -0700 Subject: [PATCH 2/2] Import from Types --- src/browser/OscLinkProvider.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/browser/OscLinkProvider.ts b/src/browser/OscLinkProvider.ts index fdae9b0e..9af0cf6f 100644 --- a/src/browser/OscLinkProvider.ts +++ b/src/browser/OscLinkProvider.ts @@ -3,10 +3,9 @@ * @license MIT */ -import { ILink, ILinkProvider } from 'browser/Types'; +import { IBufferRange, ILink, ILinkProvider } from 'browser/Types'; import { CellData } from 'common/buffer/CellData'; import { IBufferService, IOptionsService, IOscLinkService } from 'common/services/Services'; -import { IBufferRange } from 'xterm'; export class OscLinkProvider implements ILinkProvider { constructor(