@@ -495,6 +495,16 @@ export class MouseTargetFactory {
495
495
const request = new HitTestRequest ( ctx , editorPos , pos , relativePos , target ) ;
496
496
try {
497
497
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
+
498
508
// console.log(MouseTarget.toString(r));
499
509
return r ;
500
510
} catch ( err ) {
@@ -789,7 +799,7 @@ export class MouseTargetFactory {
789
799
790
800
const columnHorizontalOffset = visibleRange . left ;
791
801
792
- if ( request . mouseContentHorizontalOffset === columnHorizontalOffset ) {
802
+ if ( Math . abs ( request . mouseContentHorizontalOffset - columnHorizontalOffset ) < 1 ) {
793
803
return request . fulfillContentText ( pos , null , { mightBeForeignElement : ! ! injectedText , injectedText } ) ;
794
804
}
795
805
@@ -818,11 +828,13 @@ export class MouseTargetFactory {
818
828
const spanNodeClientRect = spanNode . getBoundingClientRect ( ) ;
819
829
const mouseIsOverSpanNode = ( spanNodeClientRect . left <= mouseCoordinates . clientX && mouseCoordinates . clientX <= spanNodeClientRect . right ) ;
820
830
831
+ let rng : EditorRange | null = null ;
832
+
821
833
for ( let i = 1 ; i < points . length ; i ++ ) {
822
834
const prev = points [ i - 1 ] ;
823
835
const curr = points [ i ] ;
824
836
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 ) ;
826
838
827
839
// See https://github.com/microsoft/vscode/issues/152819
828
840
// Due to the use of zwj, the browser's hit test result is skewed towards the left
@@ -831,16 +843,17 @@ export class MouseTargetFactory {
831
843
const prevDelta = Math . abs ( prev . offset - request . mouseContentHorizontalOffset ) ;
832
844
const nextDelta = Math . abs ( curr . offset - request . mouseContentHorizontalOffset ) ;
833
845
834
- const resultPos = (
846
+ pos = (
835
847
prevDelta < nextDelta
836
848
? new Position ( lineNumber , prev . column )
837
849
: new Position ( lineNumber , curr . column )
838
850
) ;
839
851
840
- return request . fulfillContentText ( resultPos , rng , { mightBeForeignElement : ! mouseIsOverSpanNode || ! ! injectedText , injectedText } ) ;
852
+ break ;
841
853
}
842
854
}
843
- return request . fulfillContentText ( pos , null , { mightBeForeignElement : ! mouseIsOverSpanNode || ! ! injectedText , injectedText } ) ;
855
+
856
+ return request . fulfillContentText ( pos , rng , { mightBeForeignElement : ! mouseIsOverSpanNode || ! ! injectedText , injectedText } ) ;
844
857
}
845
858
846
859
/**
@@ -999,10 +1012,6 @@ export class MouseTargetFactory {
999
1012
result = new ContentHitTestResult ( normalizedPosition , result . spanNode , injectedText ) ;
1000
1013
}
1001
1014
}
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
- }
1006
1015
return result ;
1007
1016
}
1008
1017
}
0 commit comments