linux - cleanup from custom title experiment (#241379)

This commit is contained in:
Benjamin Pasero
2025-02-21 09:48:25 +01:00
committed by GitHub
parent 47121560fd
commit cdca876177
10 changed files with 9 additions and 115 deletions
+1 -9
View File
@@ -83,7 +83,7 @@ import { NativeURLService } from '../../platform/url/common/urlService.js';
import { ElectronURLListener } from '../../platform/url/electron-main/electronUrlListener.js';
import { IWebviewManagerService } from '../../platform/webview/common/webviewManagerService.js';
import { WebviewMainService } from '../../platform/webview/electron-main/webviewMainService.js';
import { isFolderToOpen, isWorkspaceToOpen, IWindowOpenable, TitlebarStyle, overrideDefaultTitlebarStyle } from '../../platform/window/common/window.js';
import { isFolderToOpen, isWorkspaceToOpen, IWindowOpenable } from '../../platform/window/common/window.js';
import { IWindowsMainService, OpenContext } from '../../platform/windows/electron-main/windows.js';
import { ICodeWindow } from '../../platform/window/electron-main/window.js';
import { WindowsMainService } from '../../platform/windows/electron-main/windowsMainService.js';
@@ -599,14 +599,6 @@ export class CodeApplication extends Disposable {
// Services
const appInstantiationService = await this.initServices(machineId, sqmId, devDeviceId, sharedProcessReady);
// Linux (stable only): custom title default style override
if (isLinux && this.productService.quality === 'stable') {
const titleBarDefaultStyleOverride = this.stateService.getItem('window.titleBarStyleOverride');
if (titleBarDefaultStyleOverride === TitlebarStyle.CUSTOM) {
overrideDefaultTitlebarStyle(titleBarDefaultStyleOverride);
}
}
// Auth Handler
appInstantiationService.invokeFunction(accessor => accessor.get(IProxyAuthService));
-3
View File
@@ -110,9 +110,6 @@ export interface ICommonNativeHostService {
*/
focusWindow(options?: INativeHostOptions & { force?: boolean }): Promise<void>;
// Titlebar default style override
overrideDefaultTitlebarStyle(style: 'custom' | undefined): Promise<void>;
// Dialogs
showMessageBox(options: MessageBoxOptions & INativeHostOptions): Promise<MessageBoxReturnValue>;
showSaveDialog(options: SaveDialogOptions & INativeHostOptions): Promise<SaveDialogReturnValue>;
@@ -48,7 +48,6 @@ import { IConfigurationService } from '../../configuration/common/configuration.
import { IProxyAuthService } from './auth.js';
import { AuthInfo, Credentials, IRequestService } from '../../request/common/request.js';
import { randomPath } from '../../../base/common/extpath.js';
import { IStateService } from '../../state/node/state.js';
export interface INativeHostMainService extends AddFirstParameterToFunctions<ICommonNativeHostService, Promise<unknown> /* only methods, not events */, number | undefined /* window ID */> { }
@@ -71,8 +70,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain
@IConfigurationService private readonly configurationService: IConfigurationService,
@IRequestService private readonly requestService: IRequestService,
@IProxyAuthService private readonly proxyAuthService: IProxyAuthService,
@IInstantiationService private readonly instantiationService: IInstantiationService,
@IStateService private readonly stateService: IStateService
@IInstantiationService private readonly instantiationService: IInstantiationService
) {
super();
}
@@ -313,14 +311,6 @@ export class NativeHostMainService extends Disposable implements INativeHostMain
this.themeMainService.saveWindowSplash(windowId, window?.openedWorkspace, splash);
}
async overrideDefaultTitlebarStyle(windowId: number | undefined, style: 'custom' | undefined): Promise<void> {
if (style === 'custom') {
this.stateService.setItem('window.titleBarStyleOverride', style);
} else {
this.stateService.removeItem('window.titleBarStyleOverride');
}
}
//#endregion
+2 -13
View File
@@ -6,7 +6,7 @@
import { VSBuffer } from '../../../base/common/buffer.js';
import { IStringDictionary } from '../../../base/common/collections.js';
import { PerformanceMark } from '../../../base/common/performance.js';
import { isLinux, isMacintosh, isNative, isWeb } from '../../../base/common/platform.js';
import { isMacintosh, isNative, isWeb } from '../../../base/common/platform.js';
import { URI, UriComponents, UriDto } from '../../../base/common/uri.js';
import { ISandboxConfiguration } from '../../../base/parts/sandbox/common/sandboxTypes.js';
import { IConfigurationService } from '../../configuration/common/configuration.js';
@@ -15,7 +15,6 @@ import { NativeParsedArgs } from '../../environment/common/argv.js';
import { FileType } from '../../files/common/files.js';
import { ILoggerResource, LogLevel } from '../../log/common/log.js';
import { PolicyDefinition, PolicyValue } from '../../policy/common/policy.js';
import product from '../../product/common/product.js';
import { IPartsSplash } from '../../theme/common/themeService.js';
import { IUserDataProfile } from '../../userDataProfile/common/userDataProfile.js';
import { IAnyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from '../../workspace/common/workspace.js';
@@ -186,11 +185,6 @@ export const enum CustomTitleBarVisibility {
NEVER = 'never',
}
export let titlebarStyleDefaultOverride: 'custom' | undefined = undefined;
export function overrideDefaultTitlebarStyle(style: 'custom'): void {
titlebarStyleDefaultOverride = style;
}
export function hasCustomTitlebar(configurationService: IConfigurationService, titleBarStyle?: TitlebarStyle): boolean {
// Returns if it possible to have a custom title bar in the curren session
// Does not imply that the title bar is visible
@@ -228,11 +222,7 @@ export function getTitleBarStyle(configurationService: IConfigurationService): T
}
}
if (titlebarStyleDefaultOverride === 'custom') {
return TitlebarStyle.CUSTOM;
}
return isLinux && product.quality === 'stable' ? TitlebarStyle.NATIVE : TitlebarStyle.CUSTOM; // default to custom on all OS except Linux stable (for now)
return TitlebarStyle.CUSTOM; // default to custom on all OS
}
export const DEFAULT_CUSTOM_TITLEBAR_HEIGHT = 35; // includes space for command center
@@ -392,7 +382,6 @@ export interface INativeWindowConfiguration extends IWindowConfiguration, Native
autoDetectHighContrast?: boolean;
autoDetectColorScheme?: boolean;
isCustomZoomLevel?: boolean;
overrideDefaultTitlebarStyle?: 'custom';
perfMarks: PerformanceMark[];
@@ -37,7 +37,7 @@ import product from '../../product/common/product.js';
import { IProtocolMainService } from '../../protocol/electron-main/protocol.js';
import { getRemoteAuthority } from '../../remote/common/remoteHosts.js';
import { IStateService } from '../../state/node/state.js';
import { IAddRemoveFoldersRequest, INativeOpenFileRequest, INativeWindowConfiguration, IOpenEmptyWindowOptions, IPath, IPathsToWaitFor, isFileToOpen, isFolderToOpen, isWorkspaceToOpen, IWindowOpenable, IWindowSettings, titlebarStyleDefaultOverride } from '../../window/common/window.js';
import { IAddRemoveFoldersRequest, INativeOpenFileRequest, INativeWindowConfiguration, IOpenEmptyWindowOptions, IPath, IPathsToWaitFor, isFileToOpen, isFolderToOpen, isWorkspaceToOpen, IWindowOpenable, IWindowSettings } from '../../window/common/window.js';
import { CodeWindow } from './windowImpl.js';
import { IOpenConfiguration, IOpenEmptyConfiguration, IWindowsCountChangedEvent, IWindowsMainService, OpenContext, getLastFocused } from './windows.js';
import { findWindowOnExtensionDevelopmentPath, findWindowOnFile, findWindowOnWorkspaceOrFolder } from './windowsFinder.js';
@@ -1506,7 +1506,6 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
autoDetectHighContrast: windowConfig?.autoDetectHighContrast ?? true,
autoDetectColorScheme: windowConfig?.autoDetectColorScheme ?? false,
overrideDefaultTitlebarStyle: titlebarStyleDefaultOverride,
accessibilitySupport: app.accessibilitySupportEnabled,
colorScheme: this.themeMainService.getColorScheme(),
policiesData: this.policyService.serialize(),
+1 -3
View File
@@ -15,8 +15,6 @@ import { Schemas } from '../../base/common/network.js';
import { EditorInput } from './editor/editorInput.js';
import { IEditorResolverService } from '../services/editor/common/editorResolverService.js';
import { DEFAULT_EDITOR_ASSOCIATION } from './editor.js';
import { isLinux } from '../../base/common/platform.js';
import product from '../../platform/product/common/product.js';
//#region < --- Workbench --- >
@@ -111,7 +109,7 @@ export const StatusBarFocused = new RawContextKey<boolean>('statusBarFocused', f
//#region < --- Title Bar --- >
export const TitleBarStyleContext = new RawContextKey<string>('titleBarStyle', isLinux && product.quality === 'stable' ? 'native' : 'custom', localize('titleBarStyle', "Style of the window title bar"));
export const TitleBarStyleContext = new RawContextKey<string>('titleBarStyle', 'custom', localize('titleBarStyle', "Style of the window title bar"));
export const TitleBarVisibleContext = new RawContextKey<boolean>('titleBarVisible', false, localize('titleBarVisible', "Whether the title bar is visible"));
//#endregion
@@ -28,9 +28,6 @@ import { NativeWindow } from './window.js';
import { ModifierKeyEmitter } from '../../base/browser/dom.js';
import { applicationConfigurationNodeBase, securityConfigurationNodeBase } from '../common/configuration.js';
import { MAX_ZOOM_LEVEL, MIN_ZOOM_LEVEL } from '../../platform/window/electron-sandbox/window.js';
import product from '../../platform/product/common/product.js';
import { registerWorkbenchContribution2, WorkbenchPhase } from '../common/contributions.js';
import { LinuxCustomTitlebarExperiment } from './parts/titlebar/titlebarPart.js';
// Actions
(function registerActions(): void {
@@ -235,7 +232,7 @@ import { LinuxCustomTitlebarExperiment } from './parts/titlebar/titlebarPart.js'
'window.titleBarStyle': {
'type': 'string',
'enum': ['native', 'custom'],
'default': isLinux && product.quality === 'stable' ? 'native' : 'custom',
'default': 'custom',
'scope': ConfigurationScope.APPLICATION,
'description': localize('titleBarStyle', "Adjust the appearance of the window title bar to be native by the OS or custom. On Linux and Windows, this setting also affects the application and context menu appearances. Changes require a full restart to apply."),
},
@@ -247,7 +244,7 @@ import { LinuxCustomTitlebarExperiment } from './parts/titlebar/titlebarPart.js'
localize(`window.customTitleBarVisibility.windowed`, "Hide custom titlebar in full screen. When not in full screen, automatically change custom title bar visibility."),
localize(`window.customTitleBarVisibility.never`, "Hide custom titlebar when {0} is set to `native`.", '`#window.titleBarStyle#`'),
],
'default': isLinux && product.quality === 'stable' ? 'never' : 'auto',
'default': 'auto',
'scope': ConfigurationScope.APPLICATION,
'markdownDescription': localize('window.customTitleBarVisibility', "Adjust when the custom title bar should be shown. The custom title bar can be hidden when in full screen mode with `windowed`. The custom title bar can only be hidden in non full screen mode with `never` when {0} is set to `native`.", '`#window.titleBarStyle#`'),
},
@@ -418,6 +415,3 @@ import { LinuxCustomTitlebarExperiment } from './parts/titlebar/titlebarPart.js'
jsonRegistry.registerSchema(argvDefinitionFileSchemaId, schema);
})();
// Workbench Contributions
registerWorkbenchContribution2(LinuxCustomTitlebarExperiment.ID, LinuxCustomTitlebarExperiment, WorkbenchPhase.Eventually);
@@ -45,7 +45,7 @@ import { WorkspaceTrustEnablementService, WorkspaceTrustManagementService } from
import { IWorkspaceTrustEnablementService, IWorkspaceTrustManagementService } from '../../platform/workspace/common/workspaceTrust.js';
import { safeStringify } from '../../base/common/objects.js';
import { IUtilityProcessWorkerWorkbenchService, UtilityProcessWorkerWorkbenchService } from '../services/utilityProcess/electron-sandbox/utilityProcessWorkerWorkbenchService.js';
import { isBigSurOrNewer, isCI, isLinux, isMacintosh } from '../../base/common/platform.js';
import { isBigSurOrNewer, isCI, isMacintosh } from '../../base/common/platform.js';
import { Schemas } from '../../base/common/network.js';
import { DiskFileSystemProvider } from '../services/files/electron-sandbox/diskFileSystemProvider.js';
import { FileUserDataProvider } from '../../platform/userData/common/fileUserDataProvider.js';
@@ -61,8 +61,6 @@ import { ElectronRemoteResourceLoader } from '../../platform/remote/electron-san
import { IConfigurationService } from '../../platform/configuration/common/configuration.js';
import { applyZoom } from '../../platform/window/electron-sandbox/window.js';
import { mainWindow } from '../../base/browser/window.js';
import { Registry } from '../../platform/registry/common/platform.js';
import { IConfigurationRegistry, Extensions } from '../../platform/configuration/common/configurationRegistry.js';
export class DesktopMain extends Disposable {
@@ -81,17 +79,6 @@ export class DesktopMain extends Disposable {
// Apply fullscreen early if configured
setFullscreen(!!this.configuration.fullscreen, mainWindow);
// Apply custom title override to defaults if any
if (isLinux && product.quality === 'stable' && this.configuration.overrideDefaultTitlebarStyle === 'custom') {
const configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
configurationRegistry.registerDefaultConfigurations([{
overrides: {
'window.titleBarStyle': 'custom',
'window.customTitleBarVisibility': 'auto'
}
}]);
}
}
private reviveUris() {
@@ -24,10 +24,6 @@ import { IEditorGroupsContainer, IEditorGroupsService } from '../../../services/
import { IEditorService } from '../../../services/editor/common/editorService.js';
import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';
import { CodeWindow, mainWindow } from '../../../../base/browser/window.js';
import { IProductService } from '../../../../platform/product/common/productService.js';
import { IWorkbenchContribution } from '../../../common/contributions.js';
import { IWorkbenchAssignmentService } from '../../../services/assignment/common/assignmentService.js';
import { Disposable } from '../../../../base/common/lifecycle.js';
export class NativeTitlebarPart extends BrowserTitlebarPart {
@@ -284,50 +280,3 @@ export class NativeTitleService extends BrowserTitleService {
return this.instantiationService.createInstance(AuxiliaryNativeTitlebarPart, container, editorGroupsContainer, this.mainPart);
}
}
export class LinuxCustomTitlebarExperiment extends Disposable implements IWorkbenchContribution {
static readonly ID = 'workbench.contrib.linuxCustomTitlebarExperiment';
private readonly treatment = this.assignmentService.getTreatment('config.window.experimentalTitleBarStyle');
constructor(
@IProductService productService: IProductService,
@IConfigurationService private readonly configurationService: IConfigurationService,
@INativeHostService private readonly nativeHostService: INativeHostService,
@IWorkbenchAssignmentService private readonly assignmentService: IWorkbenchAssignmentService
) {
super();
if (isLinux && productService.quality === 'stable') {
this.handleDefaultTitlebarStyle(); // TODO@bpasero remove me eventually once settled
}
}
private handleDefaultTitlebarStyle(): void {
this.updateDefaultTitlebarStyle();
this._register(this.configurationService.onDidChangeConfiguration(e => {
if (e.affectsConfiguration('window.titleBarStyle')) {
this.updateDefaultTitlebarStyle();
}
}));
}
private async updateDefaultTitlebarStyle(): Promise<void> {
const titleBarStyle = this.configurationService.inspect('window.titleBarStyle');
let titleBarStyleOverride: 'custom' | undefined;
if (titleBarStyle.applicationValue || titleBarStyle.userValue) {
// configured by user or application: clear override
titleBarStyleOverride = undefined;
} else {
// not configured: set override if experiment is active
const value = await this.treatment;
if (value === 'custom') {
titleBarStyleOverride = 'custom';
}
}
await this.nativeHostService.overrideDefaultTitlebarStyle(titleBarStyleOverride);
}
}
@@ -159,7 +159,6 @@ export class TestNativeHostService implements INativeHostService {
async windowsGetStringRegKey(hive: 'HKEY_CURRENT_USER' | 'HKEY_LOCAL_MACHINE' | 'HKEY_CLASSES_ROOT' | 'HKEY_USERS' | 'HKEY_CURRENT_CONFIG', path: string, name: string): Promise<string | undefined> { return undefined; }
async profileRenderer(): Promise<any> { throw new Error(); }
async getScreenshot(): Promise<ArrayBufferLike | undefined> { return undefined; }
async overrideDefaultTitlebarStyle(style: 'native' | 'custom' | undefined): Promise<void> { }
}
export class TestExtensionTipsService extends AbstractNativeExtensionTipsService {