diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 88eaf2d8b6144c49931bdd431a92e136fe82b81b..719e1e7f6be2a159c1435eea988bbde3e616dbfe 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -18,7 +18,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { parseArgs } from 'vs/platform/environment/node/argv'; import product from 'vs/platform/node/product'; import { getCommonHTTPHeaders } from 'vs/platform/environment/node/http'; -import { IWindowSettings } from 'vs/platform/windows/common/windows'; +import { IWindowSettings, MenuBarVisibility } from 'vs/platform/windows/common/windows'; export interface IWindowState { width?: number; @@ -120,7 +120,7 @@ export enum ReadyState { interface IConfiguration { window: { - menuBarVisibility: 'visible' | 'toggle' | 'hidden'; + menuBarVisibility: MenuBarVisibility; }; } @@ -149,7 +149,7 @@ export class VSCodeWindow implements IVSCodeWindow { private _extensionDevelopmentPath: string; private _isExtensionTestHost: boolean; private windowState: IWindowState; - private currentMenuBarVisibility: 'visible' | 'toggle' | 'hidden'; + private currentMenuBarVisibility: MenuBarVisibility; private currentWindowMode: WindowMode; private whenReadyCallbacks: TValueCallback[]; @@ -677,30 +677,37 @@ export class VSCodeWindow implements IVSCodeWindow { this.win.setFullScreen(willBeFullScreen); // respect configured menu bar visibility or default to toggle if not set - this.setMenuBarVisibility(this.getMenuBarVisibility(this.configurationService.getConfiguration(), willBeFullScreen ? 'toggle' : 'visible'), false); + this.setMenuBarVisibility(this.currentMenuBarVisibility, false); } - private getMenuBarVisibility(configuration: IConfiguration, fallback: 'visible' | 'toggle' | 'hidden' = 'visible'): 'visible' | 'toggle' | 'hidden' { + private getMenuBarVisibility(configuration: IConfiguration): MenuBarVisibility { const windowConfig = this.configurationService.getConfiguration('window'); if (!windowConfig || !windowConfig.menuBarVisibility) { - return fallback; + return 'default'; } let menuBarVisibility = windowConfig.menuBarVisibility; if (['visible', 'toggle', 'hidden'].indexOf(menuBarVisibility) < 0) { - menuBarVisibility = fallback; + menuBarVisibility = 'default'; } return menuBarVisibility; } - public setMenuBarVisibility(visibility: 'visible' | 'toggle' | 'hidden', notify: boolean = true): void { + public setMenuBarVisibility(visibility: MenuBarVisibility, notify: boolean = true): void { if (platform.isMacintosh) { return; // ignore for macOS platform } + const isFullscreen = this.win.isFullScreen(); + switch (visibility) { + case ('default'): + this.win.setMenuBarVisibility(!isFullscreen); + this.win.setAutoHideMenuBar(isFullscreen); + break; + case ('visible'): this.win.setMenuBarVisibility(true); this.win.setAutoHideMenuBar(false); diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 07de6fed6fe4b87c8f01f2d43a609945fcbe4235..3a39e150544217b9a8ab6dd4ec6d9c7d25d2e9cc 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -84,6 +84,8 @@ export interface IWindowService { unmaximizeWindow(): TPromise; } +export type MenuBarVisibility = 'default' | 'visible' | 'toggle' | 'hidden'; + export interface IWindowSettings { openFilesInNewWindow: 'on' | 'off' | 'default'; openFoldersInNewWindow: 'on' | 'off' | 'default'; @@ -92,6 +94,6 @@ export interface IWindowSettings { zoomLevel: number; titleBarStyle: 'native' | 'custom'; autoDetectHighContrast: boolean; - menuBarVisibility: 'visible' | 'toggle' | 'hidden'; + menuBarVisibility: MenuBarVisibility; newWindowDimensions: 'default' | 'inherit' | 'maximized' | 'fullscreen'; -} +} \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index 7415b45f4a0b5ea9d879fb17532471a99e12a573..4edeb96b2e00b0ea8365d927f5a275443c05a587 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -9,7 +9,7 @@ import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; import { IWindowIPCService } from 'vs/workbench/services/window/electron-browser/windowService'; -import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; +import { IWindowService, IWindowsService, MenuBarVisibility } from 'vs/platform/windows/common/windows'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import nls = require('vs/nls'); import product from 'vs/platform/node/product'; @@ -183,16 +183,16 @@ export class ToggleMenuBarAction extends Action { } public run(): TPromise { - let currentVisibilityValue = this.configurationService.lookup<'visible' | 'toggle' | 'hidden'>(ToggleMenuBarAction.menuBarVisibilityKey).value; - if (typeof (currentVisibilityValue) !== 'string') { - currentVisibilityValue = 'visible'; + let currentVisibilityValue = this.configurationService.lookup(ToggleMenuBarAction.menuBarVisibilityKey).value; + if (typeof currentVisibilityValue !== 'string') { + currentVisibilityValue = 'default'; } let newVisibilityValue: string; - if (currentVisibilityValue === 'visible') { + if (currentVisibilityValue === 'visible' || currentVisibilityValue === 'default') { newVisibilityValue = 'toggle'; } else { - newVisibilityValue = 'visible'; + newVisibilityValue = 'default'; } this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleMenuBarAction.menuBarVisibilityKey, value: newVisibilityValue }).then(null, error => { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 13826229d1d180d678858409a2f6c2df7ae7b056..326a6d9ec0031a6bda55152a5a62a1076d86c500 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -235,9 +235,9 @@ Note that there can still be cases where this setting is ignored (e.g. when usin if (platform.isWindows || platform.isLinux) { properties['window.menuBarVisibility'] = { 'type': 'string', - 'enum': ['visible', 'toggle', 'hidden'], - 'default': 'visible', - 'description': nls.localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that a single press of the alt key will show and hide the menu bar.") + 'enum': ['default', 'visible', 'toggle', 'hidden'], + 'default': 'default', + 'description': nls.localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. By default, the menu bar will be visible, unless the window is full screen.") }; }