diff --git a/README.md b/README.md index 8637e46f..dff27fcd 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ See docker oneliner mentioned above. Dockerfile is at [/Dockerfile](/Dockerfile) For detailed instructions and troubleshooting, see the [self-hosted quick start guide](doc/self-hosted/index.md). -Quickstart guides for [Google Cloud](doc/admin/install/google_cloud.md), [AWS](doc/admin/install/aws.md), and [Digital Ocean](doc/admin/install/digitalocean.md). +Quickstart guides for [Google Cloud](doc/admin/install/google_cloud.md), [AWS](doc/admin/install/aws.md), and [DigitalOcean](doc/admin/install/digitalocean.md). How to [secure your setup](/doc/security/ssl.md). diff --git a/packages/ide/src/fill/electron.ts b/packages/ide/src/fill/electron.ts index 1ef1677b..dc74d244 100644 --- a/packages/ide/src/fill/electron.ts +++ b/packages/ide/src/fill/electron.ts @@ -378,14 +378,31 @@ class BrowserWindow extends EventEmitter { public setFullScreen(fullscreen: boolean): void { if (fullscreen) { - document.documentElement.requestFullscreen(); + document.documentElement.requestFullscreen().catch((error) => { + logger.error(error.message); + }); } else { - document.exitFullscreen(); + document.exitFullscreen().catch((error) => { + logger.error(error.message); + }); } } public isFullScreen(): boolean { - return document.fullscreenEnabled; + // TypeScript doesn't recognize this property. + // tslint:disable no-any + if (typeof (window as any)["fullScreen"] !== "undefined") { + return (window as any)["fullScreen"]; + } + // tslint:enable no-any + + try { + return window.matchMedia("(display-mode: fullscreen)").matches; + } catch (error) { + logger.error(error.message); + + return false; + } } public isFocused(): boolean { diff --git a/packages/server/src/cli.ts b/packages/server/src/cli.ts index 7183d45b..26b1adea 100644 --- a/packages/server/src/cli.ts +++ b/packages/server/src/cli.ts @@ -216,6 +216,7 @@ const bold = (text: string | number): string | number => { } let password = options.password || process.env.PASSWORD; + const usingCustomPassword = !!password; if (!password) { // Generate a random password with a length of 24. const buffer = Buffer.alloc(12); @@ -304,7 +305,7 @@ const bold = (text: string | number): string | number => { logger.warn("Documentation on securing your setup: https://github.com/codercom/code-server/blob/master/doc/security/ssl.md"); } - if (!options.noAuth) { + if (!options.noAuth && !usingCustomPassword) { logger.info(" "); logger.info(`Password:\u001B[1m ${password}`); } else { diff --git a/packages/vscode/src/dialog.scss b/packages/vscode/src/dialog.scss index 2d08911f..b1ffb846 100644 --- a/packages/vscode/src/dialog.scss +++ b/packages/vscode/src/dialog.scss @@ -79,9 +79,7 @@ .dialog-entry { cursor: pointer; font-size: 1.02em; - padding: 0px; - padding-left: 8px; - padding-right: 8px; + padding: 0px 8px; .dialog-entry-info { display: flex; @@ -94,6 +92,14 @@ margin-right: 5px; } + .dialog-entry-size { + text-align: right; + } + + .dialog-entry-mtime { + padding-left: 8px; + } + &:hover { background-color: var(--list-hover-background); } diff --git a/packages/vscode/src/dialog.ts b/packages/vscode/src/dialog.ts index 6eb63405..4ec06306 100644 --- a/packages/vscode/src/dialog.ts +++ b/packages/vscode/src/dialog.ts @@ -404,7 +404,7 @@ class Dialog { */ private async list(directory: string): Promise> { const paths = (await util.promisify(fs.readdir)(directory)).sort(); - const stats = await Promise.all(paths.map(p => util.promisify(fs.stat)(path.join(directory, p)))); + const stats = await Promise.all(paths.map(p => util.promisify(fs.lstat)(path.join(directory, p)))); return stats.map((stat, index): DialogEntry => ({ fullPath: path.join(directory, paths[index]), @@ -480,7 +480,7 @@ class DialogEntryRenderer implements ITreeRenderer