Skip to content

Commit 4948419

Browse files
authored
Merge pull request microsoft#223507 from microsoft/tyriar/210597
Inherit font from terminal for suggest
2 parents 9f6ceb0 + f1845e5 commit 4948419

File tree

7 files changed

+59
-43
lines changed

7 files changed

+59
-43
lines changed

src/vs/workbench/contrib/terminal/browser/terminalConfigurationService.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export class TerminalConfigurationService extends Disposable implements ITermina
1818

1919
protected _fontMetrics: TerminalFontMetrics;
2020

21-
private _config!: Readonly<ITerminalConfiguration>;
21+
protected _config!: Readonly<ITerminalConfiguration>;
2222
get config() { return this._config; }
2323

2424
private readonly _onConfigChanged = new Emitter<void>();
@@ -29,7 +29,7 @@ export class TerminalConfigurationService extends Disposable implements ITermina
2929
) {
3030
super();
3131

32-
this._fontMetrics = this._register(new TerminalFontMetrics(this, _configurationService));
32+
this._fontMetrics = this._register(new TerminalFontMetrics(this, this._configurationService));
3333

3434
this._register(Event.runAndSubscribe(this._configurationService.onDidChangeConfiguration, e => {
3535
if (!e || e.affectsConfiguration(TERMINAL_CONFIG_SECTION)) {
@@ -67,7 +67,7 @@ const enum FontConstants {
6767
MaximumFontSize = 100,
6868
}
6969

70-
class TerminalFontMetrics extends Disposable {
70+
export class TerminalFontMetrics extends Disposable {
7171
private _panelContainer: HTMLElement | undefined;
7272
private _charMeasureElement: HTMLElement | undefined;
7373
private _lastFontMeasurement: ITerminalFont | undefined;
@@ -107,7 +107,7 @@ class TerminalFontMetrics extends Disposable {
107107
getFont(w: Window, xtermCore?: IXtermCore, excludeDimensions?: boolean): ITerminalFont {
108108
const editorConfig = this._configurationService.getValue<IEditorOptions>('editor');
109109

110-
let fontFamily = this._terminalConfigurationService.config.fontFamily || editorConfig.fontFamily || EDITOR_FONT_DEFAULTS.fontFamily;
110+
let fontFamily = this._terminalConfigurationService.config.fontFamily || editorConfig.fontFamily || EDITOR_FONT_DEFAULTS.fontFamily || 'monospace';
111111
let fontSize = clampInt(this._terminalConfigurationService.config.fontSize, FontConstants.MinimumFontSize, FontConstants.MaximumFontSize, EDITOR_FONT_DEFAULTS.fontSize);
112112

113113
// Work around bad font on Fedora/Ubuntu

src/vs/workbench/contrib/terminal/test/browser/terminalConfigurationService.test.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,7 @@ import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configur
1313
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
1414
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
1515
import { ITerminalConfigurationService, LinuxDistro } from 'vs/workbench/contrib/terminal/browser/terminal';
16-
import { TerminalConfigurationService } from 'vs/workbench/contrib/terminal/browser/terminalConfigurationService';
17-
import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices';
18-
19-
class TestTerminalConfigurationService extends TerminalConfigurationService {
20-
get fontMetrics() { return this._fontMetrics; }
21-
}
16+
import { TestTerminalConfigurationService, workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices';
2217

2318
suite('Workbench - TerminalConfigurationService', () => {
2419
const store = ensureNoDisposablesAreLeakedInTestSuite();

src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import type { IPromptInputModel, IPromptInputModelState } from 'vs/platform/term
2121
import { ShellIntegrationOscPs } from 'vs/platform/terminal/common/xterm/shellIntegrationAddon';
2222
import { getListStyles } from 'vs/platform/theme/browser/defaultStyles';
2323
import { activeContrastBorder } from 'vs/platform/theme/common/colorRegistry';
24+
import { ITerminalConfigurationService } from 'vs/workbench/contrib/terminal/browser/terminal';
2425
import type { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private';
2526
import { TerminalStorageKeys } from 'vs/workbench/contrib/terminal/common/terminalStorageKeys';
2627
import { terminalSuggestConfigSection, type ITerminalSuggestConfiguration } from 'vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration';
@@ -141,6 +142,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
141142
private readonly _terminalSuggestWidgetVisibleContextKey: IContextKey<boolean>,
142143
@IConfigurationService private readonly _configurationService: IConfigurationService,
143144
@IInstantiationService private readonly _instantiationService: IInstantiationService,
145+
@ITerminalConfigurationService private readonly _terminalConfigurationService: ITerminalConfigurationService,
144146
) {
145147
super();
146148

@@ -502,6 +504,17 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
502504
SimpleSuggestWidget,
503505
this._panel!,
504506
this._instantiationService.createInstance(PersistedWidgetSize),
507+
() => {
508+
const c = this._terminalConfigurationService.config;
509+
const font = this._terminalConfigurationService.getFont(dom.getActiveWindow());
510+
return {
511+
fontFamily: font.fontFamily,
512+
fontSize: font.fontSize,
513+
lineHeight: Math.ceil(1.5 * font.fontSize),
514+
fontWeight: c.fontWeight.toString(),
515+
letterSpacing: font.letterSpacing
516+
};
517+
},
505518
{}
506519
));
507520
this._suggestWidget.list.style(getListStyles({

src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/termin
1717
import { parseCompletionsFromShell, SuggestAddon } from 'vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon';
1818
import { TerminalSuggestCommandId } from 'vs/workbench/contrib/terminalContrib/suggest/common/terminal.suggest';
1919
import type { ITerminalSuggestConfiguration } from 'vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration';
20-
import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices';
20+
import { workbenchInstantiationService, type TestTerminalConfigurationService } from 'vs/workbench/test/browser/workbenchTestServices';
2121

2222
import { events as macos_bash_echo_simple } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/macos_bash_echo_simple';
2323
import { events as macos_bash_echo_multiline } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/macos_bash_echo_multiline';
@@ -30,6 +30,7 @@ import { events as windows11_pwsh_writehost_multiline_nav_up } from 'vs/workbenc
3030
import { events as windows11_pwsh_writehost_multiline } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_writehost_multiline';
3131
import { importAMDNodeModule } from 'vs/amdX';
3232
import { testRawPwshCompletions } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/testRawPwshCompletions';
33+
import { ITerminalConfigurationService } from 'vs/workbench/contrib/terminal/browser/terminal';
3334

3435
const recordedTestCases: { name: string; events: RecordedSessionEvent[] }[] = [
3536
{ name: 'macos_bash_echo_simple', events: macos_bash_echo_simple as any as RecordedSessionEvent[] },
@@ -70,25 +71,33 @@ suite('Terminal Contrib Suggest Recordings', () => {
7071
let suggestAddon: SuggestAddon;
7172

7273
setup(async () => {
74+
const terminalConfig = {
75+
fontFamily: 'monospace',
76+
fontSize: 12,
77+
fontWeight: 'normal',
78+
letterSpacing: 0,
79+
lineHeight: 1,
80+
integrated: {
81+
suggest: {
82+
enabled: true,
83+
quickSuggestions: true,
84+
suggestOnTriggerCharacters: true,
85+
runOnEnter: 'never',
86+
builtinCompletions: {
87+
pwshCode: true,
88+
pwshGit: true
89+
}
90+
} satisfies ITerminalSuggestConfiguration
91+
}
92+
};
7393
const instantiationService = workbenchInstantiationService({
7494
configurationService: () => new TestConfigurationService({
7595
files: { autoSave: false },
76-
terminal: {
77-
integrated: {
78-
suggest: {
79-
enabled: true,
80-
quickSuggestions: true,
81-
suggestOnTriggerCharacters: true,
82-
runOnEnter: 'never',
83-
builtinCompletions: {
84-
pwshCode: true,
85-
pwshGit: true
86-
}
87-
} satisfies ITerminalSuggestConfiguration
88-
}
89-
}
96+
terminal: terminalConfig
9097
})
9198
}, store);
99+
const terminalConfigurationService = instantiationService.get(ITerminalConfigurationService) as TestTerminalConfigurationService;
100+
terminalConfigurationService.setConfig(terminalConfig as any);
92101
const TerminalCtor = (await importAMDNodeModule<typeof import('@xterm/xterm')>('@xterm/xterm', 'lib/xterm.js')).Terminal;
93102
xterm = store.add(new TerminalCtor({ allowProposedApi: true }));
94103
const shellIntegrationAddon = store.add(new ShellIntegrationAddon('', true, undefined, new NullLogService));

src/vs/workbench/services/suggest/browser/simpleSuggestWidget.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export class SimpleSuggestWidget extends Disposable {
8484
constructor(
8585
private readonly _container: HTMLElement,
8686
private readonly _persistedSize: IPersistedWidgetSizeDelegate,
87+
private readonly _getFontInfo: () => { fontFamily: string; fontSize: number; lineHeight: number; fontWeight: string; letterSpacing: number },
8788
options: IWorkbenchSuggestWidgetOptions,
8889
@IInstantiationService instantiationService: IInstantiationService
8990
) {
@@ -140,7 +141,7 @@ export class SimpleSuggestWidget extends Disposable {
140141
state = undefined;
141142
}));
142143

143-
const renderer = new SimpleSuggestWidgetItemRenderer();
144+
const renderer = new SimpleSuggestWidgetItemRenderer(_getFontInfo);
144145
this._register(renderer);
145146
this._listElement = dom.append(this.element.domNode, $('.tree'));
146147
this._list = this._register(new List('SuggestWidget', this._listElement, {
@@ -503,11 +504,8 @@ export class SimpleSuggestWidget extends Disposable {
503504
}
504505

505506
private _getLayoutInfo() {
506-
const fontInfo = {
507-
lineHeight: 20,
508-
typicalHalfwidthCharacterWidth: 10
509-
}; //this.editor.getOption(EditorOption.fontInfo);
510-
const itemHeight = clamp(fontInfo.lineHeight, 8, 1000);
507+
const fontInfo = this._getFontInfo();
508+
const itemHeight = clamp(Math.ceil(fontInfo.lineHeight), 8, 1000);
511509
const statusBarHeight = 0; //!this.editor.getOption(EditorOption.suggest).showStatusBar || this._state === State.Empty || this._state === State.Loading ? 0 : itemHeight;
512510
const borderWidth = 1; //this._details.widget.borderWidth;
513511
const borderHeight = 2 * borderWidth;
@@ -517,7 +515,7 @@ export class SimpleSuggestWidget extends Disposable {
517515
statusBarHeight,
518516
borderWidth,
519517
borderHeight,
520-
typicalHalfwidthCharacterWidth: fontInfo.typicalHalfwidthCharacterWidth,
518+
typicalHalfwidthCharacterWidth: 10,
521519
verticalPadding: 22,
522520
horizontalPadding: 14,
523521
defaultSize: new dom.Dimension(430, statusBarHeight + 12 * itemHeight + borderHeight)

src/vs/workbench/services/suggest/browser/simpleSuggestWidgetRenderer.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ export class SimpleSuggestWidgetItemRenderer implements IListRenderer<SimpleComp
4949

5050
readonly templateId = 'suggestion';
5151

52+
constructor(private readonly _getFontInfo: () => { fontFamily: string; fontSize: number; lineHeight: number; fontWeight: string; letterSpacing: number }) {
53+
}
54+
5255
dispose(): void {
5356
this._onDidToggleDetails.dispose();
5457
}
@@ -80,15 +83,8 @@ export class SimpleSuggestWidgetItemRenderer implements IListRenderer<SimpleComp
8083
// readMore.title = nls.localize('readMore', "Read More");
8184

8285
const configureFont = () => {
83-
// TODO: Implement
84-
// const options = this._editor.getOptions();
85-
// const fontInfo = options.get(EditorOption.fontInfo);
86-
const fontFamily = 'Hack'; //fontInfo.getMassagedFontFamily();
87-
const fontFeatureSettings = ''; //fontInfo.fontFeatureSettings;
88-
const fontSize = '12'; // = options.get(EditorOption.suggestFontSize) || fontInfo.fontSize;
89-
const lineHeight = '20'; // options.get(EditorOption.suggestLineHeight) || fontInfo.lineHeight;
90-
const fontWeight = 'normal'; //fontInfo.fontWeight;
91-
const letterSpacing = '0'; // fontInfo.letterSpacing;
86+
const fontFeatureSettings = '';
87+
const { fontFamily, fontSize, lineHeight, fontWeight, letterSpacing } = this._getFontInfo();
9288
const fontSizePx = `${fontSize}px`;
9389
const lineHeightPx = `${lineHeight}px`;
9490
const letterSpacingPx = `${letterSpacing}px`;

src/vs/workbench/test/browser/workbenchTestServices.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ import { IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from
124124
import { IExtensionTerminalProfile, IShellLaunchConfig, ITerminalBackend, ITerminalLogService, ITerminalProfile, TerminalIcon, TerminalLocation, TerminalShellType } from 'vs/platform/terminal/common/terminal';
125125
import { ICreateTerminalOptions, IDeserializedTerminalEditorInput, ITerminalConfigurationService, ITerminalEditorService, ITerminalGroup, ITerminalGroupService, ITerminalInstance, ITerminalInstanceService, TerminalEditorLocation } from 'vs/workbench/contrib/terminal/browser/terminal';
126126
import { assertIsDefined, upcast } from 'vs/base/common/types';
127-
import { IRegisterContributedProfileArgs, IShellLaunchConfigResolveOptions, ITerminalProfileProvider, ITerminalProfileResolverService, ITerminalProfileService } from 'vs/workbench/contrib/terminal/common/terminal';
127+
import { IRegisterContributedProfileArgs, IShellLaunchConfigResolveOptions, ITerminalProfileProvider, ITerminalProfileResolverService, ITerminalProfileService, type ITerminalConfiguration } from 'vs/workbench/contrib/terminal/common/terminal';
128128
import { EditorResolverService } from 'vs/workbench/services/editor/browser/editorResolverService';
129129
import { FILE_EDITOR_INPUT_ID } from 'vs/workbench/contrib/files/common/files';
130130
import { IEditorResolverService } from 'vs/workbench/services/editor/common/editorResolverService';
@@ -351,7 +351,7 @@ export function workbenchInstantiationService(
351351
instantiationService.stub(ITerminalInstanceService, new TestTerminalInstanceService());
352352
instantiationService.stub(ITerminalProfileService, new TestTerminalProfileService());
353353
instantiationService.stub(ITerminalProfileResolverService, new TestTerminalProfileResolverService());
354-
instantiationService.stub(ITerminalConfigurationService, disposables.add(instantiationService.createInstance(TerminalConfigurationService)));
354+
instantiationService.stub(ITerminalConfigurationService, disposables.add(instantiationService.createInstance(TestTerminalConfigurationService)));
355355
instantiationService.stub(ITerminalLogService, disposables.add(instantiationService.createInstance(TerminalLogService)));
356356
instantiationService.stub(IEnvironmentVariableService, disposables.add(instantiationService.createInstance(EnvironmentVariableService)));
357357
instantiationService.stub(IElevatedFileService, new BrowserElevatedFileService());
@@ -2073,6 +2073,11 @@ export class TestTerminalProfileResolverService implements ITerminalProfileResol
20732073
createProfileFromShellAndShellArgs(shell?: unknown, shellArgs?: unknown): Promise<string | ITerminalProfile> { throw new Error('Method not implemented.'); }
20742074
}
20752075

2076+
export class TestTerminalConfigurationService extends TerminalConfigurationService {
2077+
get fontMetrics() { return this._fontMetrics; }
2078+
setConfig(config: Partial<ITerminalConfiguration>) { this._config = config as any; }
2079+
}
2080+
20762081
export class TestQuickInputService implements IQuickInputService {
20772082
declare readonly _serviceBrand: undefined;
20782083

0 commit comments

Comments
 (0)