From e5dd57a1275659cf668dd4263f89bfdca735ad3f Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Mon, 21 Oct 2019 14:40:24 -0700 Subject: [PATCH] add helper function for menubarvisibility fixes #82907 --- src/vs/code/electron-main/window.ts | 9 ++------ src/vs/platform/windows/common/windows.ts | 11 ++++++++++ .../browser/actions/layoutActions.ts | 8 ++++--- src/vs/workbench/browser/layout.ts | 7 +++---- .../parts/activitybar/activitybarPart.ts | 12 ++++++----- .../browser/parts/titlebar/menubarControl.ts | 4 ++-- .../browser/parts/titlebar/titlebarPart.ts | 21 ++++++++++++------- 7 files changed, 43 insertions(+), 29 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index f0fee12327e..d4320215cb9 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -14,7 +14,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv'; import product from 'vs/platform/product/common/product'; -import { IWindowSettings, MenuBarVisibility, IWindowConfiguration, ReadyState, getTitleBarStyle } from 'vs/platform/windows/common/windows'; +import { IWindowSettings, MenuBarVisibility, IWindowConfiguration, ReadyState, getTitleBarStyle, getMenuBarVisibility } from 'vs/platform/windows/common/windows'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { ICodeWindow, IWindowState, WindowMode } from 'vs/platform/windows/electron-main/windows'; @@ -936,12 +936,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { } private getMenuBarVisibility(): MenuBarVisibility { - const windowConfig = this.configurationService.getValue('window'); - if (!windowConfig || !windowConfig.menuBarVisibility) { - return 'default'; - } - - let menuBarVisibility = windowConfig.menuBarVisibility; + let menuBarVisibility = getMenuBarVisibility(this.configurationService, this.environmentService, !!this.config?.extensionDevelopmentPath); if (['visible', 'toggle', 'hidden'].indexOf(menuBarVisibility) < 0) { menuBarVisibility = 'default'; } diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 5f63355e8b0..db5a976d33e 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -65,6 +65,17 @@ export function isFileToOpen(uriToOpen: IWindowOpenable): uriToOpen is IFileToOp export type MenuBarVisibility = 'default' | 'visible' | 'toggle' | 'hidden' | 'compact'; +export function getMenuBarVisibility(configurationService: IConfigurationService, environment: IEnvironmentService, isExtensionDevelopment = environment.isExtensionDevelopment): MenuBarVisibility { + const titleBarStyle = getTitleBarStyle(configurationService, environment, isExtensionDevelopment); + const menuBarVisibility = configurationService.getValue('window.menuBarVisibility'); + + if (titleBarStyle === 'native' && menuBarVisibility === 'compact') { + return 'default'; + } else { + return menuBarVisibility; + } +} + export interface IWindowsConfiguration { window: IWindowSettings; } diff --git a/src/vs/workbench/browser/actions/layoutActions.ts b/src/vs/workbench/browser/actions/layoutActions.ts index 3f237de2aef..944c253c1b2 100644 --- a/src/vs/workbench/browser/actions/layoutActions.ts +++ b/src/vs/workbench/browser/actions/layoutActions.ts @@ -16,13 +16,14 @@ import { IEditorGroupsService, GroupOrientation } from 'vs/workbench/services/ed import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { MenuBarVisibility } from 'vs/platform/windows/common/windows'; +import { getMenuBarVisibility } from 'vs/platform/windows/common/windows'; import { isWindows, isLinux, isWeb } from 'vs/base/common/platform'; import { IsMacNativeContext } from 'vs/workbench/browser/contextkeys'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { InEditorZenModeContext, IsCenteredLayoutContext, EditorAreaVisibleContext } from 'vs/workbench/common/editor'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { SideBarVisibleContext } from 'vs/workbench/common/viewlet'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; const registry = Registry.as(Extensions.WorkbenchActions); const viewCategory = nls.localize('view', "View"); @@ -413,13 +414,14 @@ export class ToggleMenuBarAction extends Action { constructor( id: string, label: string, - @IConfigurationService private readonly configurationService: IConfigurationService + @IConfigurationService private readonly configurationService: IConfigurationService, + @IEnvironmentService private readonly environmentService: IEnvironmentService ) { super(id, label); } run(): Promise { - let currentVisibilityValue = this.configurationService.getValue(ToggleMenuBarAction.menuBarVisibilityKey); + let currentVisibilityValue = getMenuBarVisibility(this.configurationService, this.environmentService); if (typeof currentVisibilityValue !== 'string') { currentVisibilityValue = 'default'; } diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 076d26015f4..84c9cab73a4 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -23,7 +23,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { ITitleService } from 'vs/workbench/services/title/common/titleService'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { LifecyclePhase, StartupKind, ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { MenuBarVisibility, getTitleBarStyle } from 'vs/platform/windows/common/windows'; +import { MenuBarVisibility, getTitleBarStyle, getMenuBarVisibility } from 'vs/platform/windows/common/windows'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService'; @@ -40,7 +40,6 @@ import { assertIsDefined } from 'vs/base/common/types'; import { INotificationService, NotificationsFilter } from 'vs/platform/notification/common/notification'; enum Settings { - MENUBAR_VISIBLE = 'window.menuBarVisibility', ACTIVITYBAR_VISIBLE = 'workbench.activityBar.visible', STATUSBAR_VISIBLE = 'workbench.statusBar.visible', @@ -326,7 +325,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } // Menubar visibility - const newMenubarVisibility = this.configurationService.getValue(Settings.MENUBAR_VISIBLE); + const newMenubarVisibility = getMenuBarVisibility(this.configurationService, this.environmentService); this.setMenubarVisibility(newMenubarVisibility, !!skipLayout); } @@ -373,7 +372,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.state.fullscreen = isFullscreen(); // Menubar visibility - this.state.menuBar.visibility = this.configurationService.getValue(Settings.MENUBAR_VISIBLE); + this.state.menuBar.visibility = getMenuBarVisibility(this.configurationService, this.environmentService); // Activity bar visibility this.state.activityBar.hidden = !this.configurationService.getValue(Settings.ACTIVITYBAR_VISIBLE); diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 0c4380fdcab..eefe022ed80 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -36,8 +36,9 @@ import { Schemas } from 'vs/base/common/network'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { CustomMenubarControl } from 'vs/workbench/browser/parts/titlebar/menubarControl'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { MenuBarVisibility } from 'vs/platform/windows/common/windows'; +import { getMenuBarVisibility } from 'vs/platform/windows/common/windows'; import { isWeb } from 'vs/base/common/platform'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; interface ICachedViewlet { id: string; @@ -89,7 +90,8 @@ export class ActivitybarPart extends Part implements IActivityBarService { @IViewsService private readonly viewsService: IViewsService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IWorkbenchEnvironmentService workbenchEnvironmentService: IWorkbenchEnvironmentService + @IWorkbenchEnvironmentService workbenchEnvironmentService: IWorkbenchEnvironmentService, + @IEnvironmentService private readonly environmentService: IEnvironmentService ) { super(Parts.ACTIVITYBAR_PART, { hasTitle: false }, themeService, storageService, layoutService); @@ -112,7 +114,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { getCompositePinnedAction: (compositeId: string) => this.getCompositeActions(compositeId).pinnedAction, getOnCompositeClickAction: (compositeId: string) => this.instantiationService.createInstance(ToggleViewletAction, assertIsDefined(this.viewletService.getViewlet(compositeId))), getContextMenuActions: () => { - const menuBarVisibility = this.configurationService.getValue('window.menuBarVisibility'); + const menuBarVisibility = getMenuBarVisibility(this.configurationService, this.environmentService); const actions = []; if (menuBarVisibility === 'compact' || (menuBarVisibility === 'hidden' && isWeb)) { @@ -157,7 +159,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { // Register for configuration changes this._register(this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('window.menuBarVisibility')) { - if (this.configurationService.getValue('window.menuBarVisibility') === 'compact') { + if (getMenuBarVisibility(this.configurationService, this.environmentService) === 'compact') { this.installMenubar(); } else { this.uninstallMenubar(); @@ -244,7 +246,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { parent.appendChild(this.content); // Install menubar if compact - if (this.configurationService.getValue('window.menuBarVisibility') === 'compact') { + if (getMenuBarVisibility(this.configurationService, this.environmentService) === 'compact') { this.installMenubar(); } diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index ff4424d9b8d..a35ad251f85 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { IMenuService, MenuId, IMenu, SubmenuItemAction } from 'vs/platform/actions/common/actions'; import { registerThemingParticipant, ITheme, ICssStyleCollector, IThemeService } from 'vs/platform/theme/common/themeService'; -import { MenuBarVisibility, getTitleBarStyle, IWindowOpenable } from 'vs/platform/windows/common/windows'; +import { MenuBarVisibility, getTitleBarStyle, IWindowOpenable, getMenuBarVisibility } from 'vs/platform/windows/common/windows'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IAction, Action } from 'vs/base/common/actions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -472,7 +472,7 @@ export class CustomMenubarControl extends MenubarControl { } private get currentMenubarVisibility(): MenuBarVisibility { - return this.configurationService.getValue('window.menuBarVisibility'); + return getMenuBarVisibility(this.configurationService, this.environmentService); } private get currentDisableMenuBarAltFocus(): boolean { diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index bf4000b474a..d592db4b349 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -8,7 +8,7 @@ import * as resources from 'vs/base/common/resources'; import { Part } from 'vs/workbench/browser/part'; import { ITitleService, ITitleProperties } from 'vs/workbench/services/title/common/titleService'; import { getZoomFactor } from 'vs/base/browser/browser'; -import { MenuBarVisibility, getTitleBarStyle } from 'vs/platform/windows/common/windows'; +import { MenuBarVisibility, getTitleBarStyle, getMenuBarVisibility } from 'vs/platform/windows/common/windows'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { IAction } from 'vs/base/common/actions'; @@ -77,6 +77,7 @@ export class TitlebarPart extends Part implements ITitleService { private menubar?: HTMLElement; private resizer: HTMLElement | undefined; private lastLayoutDimensions: Dimension | undefined; + private titleBarStyle: 'native' | 'custom'; private pendingTitle: string | undefined; @@ -110,6 +111,8 @@ export class TitlebarPart extends Part implements ITitleService { this.contextMenu = this._register(menuService.createMenu(MenuId.TitleBarContext, contextKeyService)); + this.titleBarStyle = getTitleBarStyle(this.configurationService, this.environmentService); + this.registerListeners(); } @@ -138,11 +141,13 @@ export class TitlebarPart extends Part implements ITitleService { this.titleUpdater.schedule(); } - if (event.affectsConfiguration('window.menuBarVisibility')) { - if (this.currentMenubarVisibility === 'compact') { - this.uninstallMenubar(); - } else { - this.installMenubar(); + if (this.titleBarStyle !== 'native') { + if (event.affectsConfiguration('window.menuBarVisibility')) { + if (this.currentMenubarVisibility === 'compact') { + this.uninstallMenubar(); + } else { + this.installMenubar(); + } } } @@ -385,7 +390,7 @@ export class TitlebarPart extends Part implements ITitleService { // Menubar: install a custom menu bar depending on configuration // and when not in activity bar - if (getTitleBarStyle(this.configurationService, this.environmentService) !== 'native' + if (this.titleBarStyle !== 'native' && (!isMacintosh || isWeb) && this.currentMenubarVisibility !== 'compact') { this.installMenubar(); @@ -567,7 +572,7 @@ export class TitlebarPart extends Part implements ITitleService { } private get currentMenubarVisibility(): MenuBarVisibility { - return this.configurationService.getValue('window.menuBarVisibility'); + return getMenuBarVisibility(this.configurationService, this.environmentService); } updateLayout(dimension: Dimension): void { -- GitLab