diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index fa6ea706b93..24ca5f427f1 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -9,9 +9,11 @@ import * as Platform from 'vs/base/common/platform'; import Event, { Emitter } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; -class ZoomManager { +class WindowManager { - public static INSTANCE = new ZoomManager(); + public static INSTANCE = new WindowManager(); + + private _fullscreen: boolean; private _zoomLevel: number = 0; private _zoomFactor: number = 0; @@ -22,6 +24,9 @@ class ZoomManager { private _onDidChangeZoomLevel: Emitter = new Emitter(); public onDidChangeZoomLevel: Event = this._onDidChangeZoomLevel.event; + private _onDidChangeFullscreen: Emitter = new Emitter(); + public onDidChangeFullscreen: Event = this._onDidChangeFullscreen.event; + public getZoomLevel(): number { return this._zoomLevel; } @@ -62,27 +67,49 @@ class ZoomManager { (ctx).backingStorePixelRatio || 1; return dpr / bsr; } + + public setFullscreen(fullscreen: boolean): void { + if (this._fullscreen === fullscreen) { + return; + } + + this._fullscreen = fullscreen; + this._onDidChangeFullscreen.fire(); + } + + public isFullscreen(): boolean { + return this._fullscreen; + } } /** A zoom index, e.g. 1, 2, 3 */ export function getZoomLevel(): number { - return ZoomManager.INSTANCE.getZoomLevel(); + return WindowManager.INSTANCE.getZoomLevel(); } /** The zoom scale for an index, e.g. 1, 1.2, 1.4 */ export function getZoomFactor(): number { - return ZoomManager.INSTANCE.getZoomFactor(); + return WindowManager.INSTANCE.getZoomFactor(); } export function getPixelRatio(): number { - return ZoomManager.INSTANCE.getPixelRatio(); + return WindowManager.INSTANCE.getPixelRatio(); } export function setZoomLevel(zoomLevel: number): void { - ZoomManager.INSTANCE.setZoomLevel(zoomLevel); + WindowManager.INSTANCE.setZoomLevel(zoomLevel); } export function setZoomFactor(zoomFactor: number): void { - ZoomManager.INSTANCE.setZoomFactor(zoomFactor); + WindowManager.INSTANCE.setZoomFactor(zoomFactor); } export function onDidChangeZoomLevel(callback: (zoomLevel: number) => void): IDisposable { - return ZoomManager.INSTANCE.onDidChangeZoomLevel(callback); + return WindowManager.INSTANCE.onDidChangeZoomLevel(callback); +} +export function setFullscreen(fullscreen: boolean): void { + WindowManager.INSTANCE.setFullscreen(fullscreen); +} +export function isFullscreen(): boolean { + return WindowManager.INSTANCE.isFullscreen(); +} +export function onDidChangeFullscreen(callback: () => void): IDisposable { + return WindowManager.INSTANCE.onDidChangeFullscreen(callback); } const userAgent = navigator.userAgent; diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index b346f149aab..14a6082dd43 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -96,6 +96,7 @@ export interface IWindowConfiguration extends ParsedArgs { userEnv: platform.IProcessEnvironment; zoomLevel?: number; + fullscreen?: boolean; workspacePath?: string; @@ -442,6 +443,9 @@ export class VSCodeWindow { windowConfiguration.zoomLevel = zoomLevel; } + // Set fullscreen state + windowConfiguration.fullscreen = this._win.isFullScreen(); + // Config (combination of process.argv and window configuration) const environment = parseArgs(process.argv); const config = objects.assign(environment, windowConfiguration); diff --git a/src/vs/workbench/electron-browser/integration.ts b/src/vs/workbench/electron-browser/integration.ts index ff372f726bf..b73371c9026 100644 --- a/src/vs/workbench/electron-browser/integration.ts +++ b/src/vs/workbench/electron-browser/integration.ts @@ -140,6 +140,7 @@ export class ElectronIntegration { // Fullscreen Events ipc.on('vscode:enterFullScreen', (event) => { this.partService.joinCreation().then(() => { + browser.setFullscreen(true); this.partService.addClass('fullscreen'); if (!this.partService.isTitleBarHidden()) { @@ -150,6 +151,7 @@ export class ElectronIntegration { ipc.on('vscode:leaveFullScreen', (event) => { this.partService.joinCreation().then(() => { + browser.setFullscreen(false); this.partService.removeClass('fullscreen'); if (!this.partService.isTitleBarHidden()) { diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index f94821cb5a8..85f560c36b1 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -9,6 +9,7 @@ import nls = require('vs/nls'); import { TPromise } from 'vs/base/common/winjs.base'; import { WorkbenchShell } from 'vs/workbench/electron-browser/shell'; import { IOptions } from 'vs/workbench/common/options'; +import * as browser from 'vs/base/browser/browser'; import { domContentLoaded } from 'vs/base/browser/dom'; import errors = require('vs/base/common/errors'); import platform = require('vs/base/common/platform'); @@ -29,6 +30,8 @@ import fs = require('fs'); import gracefulFs = require('graceful-fs'); import { IPath, IOpenFileRequest } from 'vs/workbench/electron-browser/common'; +import { webFrame } from 'electron'; + gracefulFs.gracefulify(fs); // enable gracefulFs const timers = (window).MonacoEnvironment.timers; @@ -40,10 +43,18 @@ export interface IWindowConfiguration extends ParsedArgs, IOpenFileRequest { userEnv: any; /* vs/code/electron-main/env/IProcessEnvironment*/ workspacePath?: string; + + zoomLevel?: number; + fullscreen?: boolean; } export function startup(configuration: IWindowConfiguration): TPromise { + // Ensure others can listen to zoom level changes + browser.setZoomLevel(webFrame.getZoomLevel()); + browser.setZoomFactor(webFrame.getZoomFactor()); + browser.setFullscreen(!!configuration.fullscreen); + // Shell Options const filesToOpen = configuration.filesToOpen && configuration.filesToOpen.length ? toInputs(configuration.filesToOpen) : null; const filesToCreate = configuration.filesToCreate && configuration.filesToCreate.length ? toInputs(configuration.filesToCreate) : null; diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index b1e1995e429..277476c88c9 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -18,7 +18,6 @@ import errors = require('vs/base/common/errors'); import { toErrorMessage } from 'vs/base/common/errorMessage'; import product from 'vs/platform/product'; import pkg from 'vs/platform/package'; -import * as browser from 'vs/base/browser/browser'; import { ContextViewService } from 'vs/platform/contextview/browser/contextViewService'; import timer = require('vs/base/common/timer'); import { Workbench } from 'vs/workbench/electron-browser/workbench'; @@ -87,7 +86,7 @@ import { IURLService } from 'vs/platform/url/common/url'; import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions'; import { WorkspaceConfigurationService } from 'vs/workbench/services/configuration/node/configurationService'; import { ExtensionHostProcessWorker } from 'vs/workbench/electron-browser/extensionHost'; -import { remote, webFrame } from 'electron'; +import { remote } from 'electron'; // self registering services import 'vs/platform/opener/browser/opener.contribution'; @@ -365,10 +364,6 @@ export class WorkbenchShell { this.onUnexpectedError(error); }); - // Ensure others can listen to zoom level changes - browser.setZoomLevel(webFrame.getZoomLevel()); - browser.setZoomFactor(webFrame.getZoomFactor()); - // Shell Class for CSS Scoping $(this.container).addClass('monaco-shell'); diff --git a/src/vs/workbench/services/message/browser/messageList.css b/src/vs/workbench/services/message/browser/media/messageList.css similarity index 100% rename from src/vs/workbench/services/message/browser/messageList.css rename to src/vs/workbench/services/message/browser/media/messageList.css diff --git a/src/vs/workbench/services/message/browser/messageList.ts b/src/vs/workbench/services/message/browser/messageList.ts index 0245e20274a..6980f64d319 100644 --- a/src/vs/workbench/services/message/browser/messageList.ts +++ b/src/vs/workbench/services/message/browser/messageList.ts @@ -5,7 +5,7 @@ 'use strict'; -import 'vs/css!./messageList'; +import 'vs/css!./media/messageList'; import nls = require('vs/nls'); import { TPromise } from 'vs/base/common/winjs.base'; import { Builder, $ } from 'vs/base/browser/builder';