Skip to content

Commit 7d57de4

Browse files
authored
Merge pull request #214572 from SimonSiefke/feature/font-picker
feature: support font family picker in settings
2 parents da2bbdd + 5d04296 commit 7d57de4

File tree

6 files changed

+62
-4
lines changed

6 files changed

+62
-4
lines changed

src/vs/base/browser/fonts.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { isMacintosh, isWindows } from '../common/platform.js';
6+
import { mainWindow } from './window.js';
7+
import type { IJSONSchemaSnippet } from '../common/jsonSchema.js';
8+
import { isElectron, isMacintosh, isWindows } from '../common/platform.js';
79

810
/**
911
* The best font-family to be used in CSS based on the platform:
@@ -14,3 +16,34 @@ import { isMacintosh, isWindows } from '../common/platform.js';
1416
* Note: this currently does not adjust for different locales.
1517
*/
1618
export const DEFAULT_FONT_FAMILY = isWindows ? '"Segoe WPC", "Segoe UI", sans-serif' : isMacintosh ? '-apple-system, BlinkMacSystemFont, sans-serif' : 'system-ui, "Ubuntu", "Droid Sans", sans-serif';
19+
20+
interface FontData {
21+
readonly family: string;
22+
}
23+
24+
export const getFonts = async (): Promise<string[]> => {
25+
try {
26+
// @ts-ignore
27+
const fonts = await mainWindow.queryLocalFonts() as FontData[];
28+
const fontsArray = [...fonts];
29+
const families = fontsArray.map(font => font.family);
30+
return families;
31+
} catch (error) {
32+
console.error(`Failed to query fonts: ${error}`);
33+
return [];
34+
}
35+
};
36+
37+
38+
export const getFontSnippets = async (): Promise<IJSONSchemaSnippet[]> => {
39+
if (!isElectron) {
40+
return [];
41+
}
42+
const fonts = await getFonts();
43+
const snippets: IJSONSchemaSnippet[] = fonts.map(font => {
44+
return {
45+
body: `${font}`
46+
};
47+
});
48+
return snippets;
49+
};

src/vs/code/electron-main/app.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ export class CodeApplication extends Disposable {
174174

175175
const allowedPermissionsInCore = new Set([
176176
'media',
177+
'font-access',
177178
'local-fonts',
178179
// TODO(deepak1556): Should be removed once migration is complete
179180
// https://github.com/microsoft/vscode/issues/239228

src/vs/editor/common/config/editorConfigurationSchema.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import type { IJSONSchemaSnippet } from '../../../base/common/jsonSchema.js';
67
import { diffEditorDefaultOptions } from './diffEditor.js';
78
import { editorOptionsRegistry } from './editorOptions.js';
89
import { EDITOR_MODEL_DEFAULTS } from '../core/textModelDefaults.js';
@@ -318,3 +319,15 @@ export function isDiffEditorConfigurationKey(key: string): boolean {
318319

319320
const configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
320321
configurationRegistry.registerConfiguration(editorConfiguration);
322+
323+
export async function registerEditorFontConfigurations(getFontSnippets: () => Promise<IJSONSchemaSnippet[]>) {
324+
const editorKeysWithFont = ['editor.fontFamily'];
325+
const fontSnippets = await getFontSnippets();
326+
for (const key of editorKeysWithFont) {
327+
if (
328+
editorConfiguration.properties && editorConfiguration.properties[key]
329+
) {
330+
editorConfiguration.properties[key].defaultSnippets = fontSnippets;
331+
}
332+
}
333+
}

src/vs/workbench/browser/parts/editor/editor.contribution.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ import { DynamicEditorConfigurations } from './editorConfiguration.js';
7272
import { ConfigureEditorAction, ConfigureEditorTabsAction, EditorActionsDefaultAction, EditorActionsTitleBarAction, HideEditorActionsAction, HideEditorTabsAction, ShowMultipleEditorTabsAction, ShowSingleEditorTabAction, ZenHideEditorTabsAction, ZenShowMultipleEditorTabsAction, ZenShowSingleEditorTabAction } from '../../actions/layoutActions.js';
7373
import { ICommandAction } from '../../../../platform/action/common/action.js';
7474
import { EditorContextKeys } from '../../../../editor/common/editorContextKeys.js';
75+
import { getFontSnippets } from '../../../../base/browser/fonts.js';
76+
import { registerEditorFontConfigurations } from '../../../../editor/common/config/editorConfigurationSchema.js';
7577

7678
//#region Editor Registrations
7779

@@ -1102,3 +1104,6 @@ MenuRegistry.appendMenuItem(MenuId.MenubarGoMenu, {
11021104
});
11031105

11041106
//#endregion
1107+
1108+
1109+
registerEditorFontConfigurations(getFontSnippets);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { getFontSnippets } from '../../../../base/browser/fonts.js';
67
import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';
78
import { Schemas } from '../../../../base/common/network.js';
89
import { isIOS, isWindows } from '../../../../base/common/platform.js';
@@ -66,7 +67,7 @@ registerWorkbenchContribution2(RemoteTerminalBackendContribution.ID, RemoteTermi
6667

6768
// Register configurations
6869
registerTerminalPlatformConfiguration();
69-
registerTerminalConfiguration();
70+
registerTerminalConfiguration(getFontSnippets);
7071

7172
// Register editor/dnd contributions
7273
Registry.as<IEditorFactoryRegistry>(EditorExtensions.EditorFactory).registerEditorSerializer(TerminalEditorInput.ID, TerminalInputSerializer);

src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { Codicon } from '../../../../base/common/codicons.js';
7+
import { IJSONSchemaSnippet } from '../../../../base/common/jsonSchema.js';
78
import { isMacintosh, isWindows } from '../../../../base/common/platform.js';
89
import { localize } from '../../../../nls.js';
910
import { ConfigurationScope, Extensions, IConfigurationNode, IConfigurationRegistry } from '../../../../platform/configuration/common/configurationRegistry.js';
@@ -174,7 +175,7 @@ const terminalConfiguration: IConfigurationNode = {
174175
},
175176
[TerminalSettingId.FontFamily]: {
176177
markdownDescription: localize('terminal.integrated.fontFamily', "Controls the font family of the terminal. Defaults to {0}'s value.", '`#editor.fontFamily#`'),
177-
type: 'string'
178+
type: 'string',
178179
},
179180
[TerminalSettingId.FontLigaturesEnabled]: {
180181
markdownDescription: localize('terminal.integrated.fontLigatures.enabled', "Controls whether font ligatures are enabled in the terminal. Ligatures will only work if the configured {0} supports them.", `\`#${TerminalSettingId.FontFamily}#\``),
@@ -643,9 +644,13 @@ const terminalConfiguration: IConfigurationNode = {
643644
}
644645
};
645646

646-
export function registerTerminalConfiguration() {
647+
export async function registerTerminalConfiguration(getFontSnippets: () => Promise<IJSONSchemaSnippet[]>) {
647648
const configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
648649
configurationRegistry.registerConfiguration(terminalConfiguration);
650+
const fontsSnippets = await getFontSnippets();
651+
if (terminalConfiguration.properties) {
652+
terminalConfiguration.properties[TerminalSettingId.FontFamily].defaultSnippets = fontsSnippets;
653+
}
649654
}
650655

651656
Registry.as<IConfigurationMigrationRegistry>(WorkbenchExtensions.ConfigurationMigration)

0 commit comments

Comments
 (0)