Skip to content

Commit ce01435

Browse files
committed
Use better check for equality that works with floats and make sure the position of a hit test result is always contained in the range
1 parent fcb512b commit ce01435

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

src/vs/editor/browser/controller/mouseTarget.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -495,15 +495,17 @@ export class MouseTargetFactory {
495495
const request = new HitTestRequest(ctx, editorPos, pos, relativePos, target);
496496
try {
497497
const r = MouseTargetFactory._createMouseTarget(ctx, request, false);
498-
// console.log(MouseTarget.toString(r));
499498

500499
if (r.type === MouseTargetType.CONTENT_TEXT) {
501500
// Snap to the nearest soft tab boundary if atomic soft tabs are enabled.
502501
if (ctx.stickyTabStops && r.position !== null) {
503502
const position = MouseTargetFactory._snapToSoftTabBoundary(r.position, ctx.viewModel);
504-
return request.fulfillContentText(position, r.range, r.detail);
503+
const range = EditorRange.fromPositions(position, position).plusRange(r.range);
504+
return request.fulfillContentText(position, range, r.detail);
505505
}
506506
}
507+
508+
// console.log(MouseTarget.toString(r));
507509
return r;
508510
} catch (err) {
509511
// console.log(err);
@@ -782,12 +784,10 @@ export class MouseTargetFactory {
782784
const lineNumber = pos.lineNumber;
783785
const column = pos.column;
784786

785-
const mouseContentHorizontalOffset = Math.floor(request.mouseContentHorizontalOffset);
786-
787787
const lineWidth = ctx.getLineWidth(lineNumber);
788788

789-
if (mouseContentHorizontalOffset > lineWidth) {
790-
const detail = createEmptyContentDataInLines(mouseContentHorizontalOffset - lineWidth);
789+
if (request.mouseContentHorizontalOffset > lineWidth) {
790+
const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);
791791
return request.fulfillContentEmpty(pos, detail);
792792
}
793793

@@ -799,7 +799,7 @@ export class MouseTargetFactory {
799799

800800
const columnHorizontalOffset = visibleRange.left;
801801

802-
if (mouseContentHorizontalOffset === columnHorizontalOffset) {
802+
if (Math.abs(request.mouseContentHorizontalOffset - columnHorizontalOffset) < 1) {
803803
return request.fulfillContentText(pos, null, { mightBeForeignElement: !!injectedText, injectedText });
804804
}
805805

@@ -833,15 +833,15 @@ export class MouseTargetFactory {
833833
for (let i = 1; i < points.length; i++) {
834834
const prev = points[i - 1];
835835
const curr = points[i];
836-
if (prev.offset <= mouseContentHorizontalOffset && mouseContentHorizontalOffset <= curr.offset) {
836+
if (prev.offset <= request.mouseContentHorizontalOffset && request.mouseContentHorizontalOffset <= curr.offset) {
837837
rng = new EditorRange(lineNumber, prev.column, lineNumber, curr.column);
838838

839839
// See https://github.com/microsoft/vscode/issues/152819
840840
// Due to the use of zwj, the browser's hit test result is skewed towards the left
841841
// Here we try to correct that if the mouse horizontal offset is closer to the right than the left
842842

843-
const prevDelta = Math.abs(prev.offset - mouseContentHorizontalOffset);
844-
const nextDelta = Math.abs(curr.offset - mouseContentHorizontalOffset);
843+
const prevDelta = Math.abs(prev.offset - request.mouseContentHorizontalOffset);
844+
const nextDelta = Math.abs(curr.offset - request.mouseContentHorizontalOffset);
845845

846846
pos = (
847847
prevDelta < nextDelta

0 commit comments

Comments
 (0)