Skip to content

Commit da62840

Browse files
committed
Fixes microsoft#32436: Emit whitespace's width for non monospace fonts even if the line contains foreign elements, but they are not placed on the whitespace itself
1 parent 65a7494 commit da62840

2 files changed

Lines changed: 37 additions & 4 deletions

File tree

src/vs/editor/common/viewLayout/viewLineRenderer.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -636,10 +636,13 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
636636
}
637637
}
638638

639-
if (!fontIsMonospace && !containsForeignElements) {
640-
sb.appendASCIIString(' style="width:');
641-
sb.appendASCIIString(String(spaceWidth * partContentCnt));
642-
sb.appendASCIIString('px"');
639+
if (!fontIsMonospace) {
640+
const partIsOnlyWhitespace = (partType === 'vs-whitespace');
641+
if (partIsOnlyWhitespace || !containsForeignElements) {
642+
sb.appendASCIIString(' style="width:');
643+
sb.appendASCIIString(String(spaceWidth * partContentCnt));
644+
sb.appendASCIIString('px"');
645+
}
643646
}
644647
sb.appendASCII(CharCode.GreaterThan);
645648

src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,36 @@ suite('viewLineRenderer.renderLine 2', () => {
10521052
assert.deepEqual(actual.html, expected);
10531053
});
10541054

1055+
test('issue #32436: Non-monospace font + visible whitespace + After decorator causes line to "jump"', () => {
1056+
1057+
let lineContent = '\tbla';
1058+
1059+
let actual = renderViewLine(new RenderLineInput(
1060+
false,
1061+
lineContent,
1062+
false,
1063+
0,
1064+
[createPart(4, 3)],
1065+
[new LineDecoration(2, 3, 'before', true)],
1066+
4,
1067+
10,
1068+
-1,
1069+
'all',
1070+
false,
1071+
true
1072+
));
1073+
1074+
let expected = [
1075+
'<span>',
1076+
'<span class="vs-whitespace" style="width:40px">\u2192\u00a0\u00a0\u00a0</span>',
1077+
'<span class="mtk3 before">b</span>',
1078+
'<span class="mtk3">la</span>',
1079+
'</span>'
1080+
].join('');
1081+
1082+
assert.deepEqual(actual.html, expected);
1083+
});
1084+
10551085
test('issue #30133: Empty lines don\'t render inline decorations', () => {
10561086

10571087
let lineContent = '';

0 commit comments

Comments
 (0)