Skip to content

Commit 61e40d1

Browse files
authored
Merge pull request microsoft#166749 from microsoft/alex/pr-157543
Fix mouse testing around sticky tabs
2 parents 107d3ab + ce01435 commit 61e40d1

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,16 @@ export class MouseTargetFactory {
495495
const request = new HitTestRequest(ctx, editorPos, pos, relativePos, target);
496496
try {
497497
const r = MouseTargetFactory._createMouseTarget(ctx, request, false);
498+
499+
if (r.type === MouseTargetType.CONTENT_TEXT) {
500+
// Snap to the nearest soft tab boundary if atomic soft tabs are enabled.
501+
if (ctx.stickyTabStops && r.position !== null) {
502+
const position = MouseTargetFactory._snapToSoftTabBoundary(r.position, ctx.viewModel);
503+
const range = EditorRange.fromPositions(position, position).plusRange(r.range);
504+
return request.fulfillContentText(position, range, r.detail);
505+
}
506+
}
507+
498508
// console.log(MouseTarget.toString(r));
499509
return r;
500510
} catch (err) {
@@ -789,7 +799,7 @@ export class MouseTargetFactory {
789799

790800
const columnHorizontalOffset = visibleRange.left;
791801

792-
if (request.mouseContentHorizontalOffset === columnHorizontalOffset) {
802+
if (Math.abs(request.mouseContentHorizontalOffset - columnHorizontalOffset) < 1) {
793803
return request.fulfillContentText(pos, null, { mightBeForeignElement: !!injectedText, injectedText });
794804
}
795805

@@ -818,11 +828,13 @@ export class MouseTargetFactory {
818828
const spanNodeClientRect = spanNode.getBoundingClientRect();
819829
const mouseIsOverSpanNode = (spanNodeClientRect.left <= mouseCoordinates.clientX && mouseCoordinates.clientX <= spanNodeClientRect.right);
820830

831+
let rng: EditorRange | null = null;
832+
821833
for (let i = 1; i < points.length; i++) {
822834
const prev = points[i - 1];
823835
const curr = points[i];
824836
if (prev.offset <= request.mouseContentHorizontalOffset && request.mouseContentHorizontalOffset <= curr.offset) {
825-
const rng = new EditorRange(lineNumber, prev.column, lineNumber, curr.column);
837+
rng = new EditorRange(lineNumber, prev.column, lineNumber, curr.column);
826838

827839
// See https://github.com/microsoft/vscode/issues/152819
828840
// Due to the use of zwj, the browser's hit test result is skewed towards the left
@@ -831,16 +843,17 @@ export class MouseTargetFactory {
831843
const prevDelta = Math.abs(prev.offset - request.mouseContentHorizontalOffset);
832844
const nextDelta = Math.abs(curr.offset - request.mouseContentHorizontalOffset);
833845

834-
const resultPos = (
846+
pos = (
835847
prevDelta < nextDelta
836848
? new Position(lineNumber, prev.column)
837849
: new Position(lineNumber, curr.column)
838850
);
839851

840-
return request.fulfillContentText(resultPos, rng, { mightBeForeignElement: !mouseIsOverSpanNode || !!injectedText, injectedText });
852+
break;
841853
}
842854
}
843-
return request.fulfillContentText(pos, null, { mightBeForeignElement: !mouseIsOverSpanNode || !!injectedText, injectedText });
855+
856+
return request.fulfillContentText(pos, rng, { mightBeForeignElement: !mouseIsOverSpanNode || !!injectedText, injectedText });
844857
}
845858

846859
/**
@@ -999,10 +1012,6 @@ export class MouseTargetFactory {
9991012
result = new ContentHitTestResult(normalizedPosition, result.spanNode, injectedText);
10001013
}
10011014
}
1002-
// Snap to the nearest soft tab boundary if atomic soft tabs are enabled.
1003-
if (result.type === HitTestResultType.Content && ctx.stickyTabStops) {
1004-
result = new ContentHitTestResult(this._snapToSoftTabBoundary(result.position, ctx.viewModel), result.spanNode, result.injectedText);
1005-
}
10061015
return result;
10071016
}
10081017
}

0 commit comments

Comments
 (0)