From 4d6c63a0e3149010533df9691bdf36c157e2e6b7 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Mon, 17 Apr 2017 17:27:04 +0200 Subject: [PATCH] . --- terminus-clickable-links/tsconfig.json | 7 +-- .../tsconfig.json | 5 +- terminus-core/tsconfig.json | 4 +- terminus-settings/tsconfig.json | 4 +- terminus-terminal/package.json | 8 ++- .../terminalSettingsTab.component.ts | 21 ++++++- .../src/components/terminalTab.component.ts | 9 ++- .../src/services/sessions.service.ts | 59 ++++++++++--------- terminus-terminal/tsconfig.json | 4 +- terminus-terminal/webpack.config.js | 1 + terminus-theme-hype/tsconfig.json | 4 +- 11 files changed, 74 insertions(+), 52 deletions(-) diff --git a/terminus-clickable-links/tsconfig.json b/terminus-clickable-links/tsconfig.json index f27292c3..c04b0316 100644 --- a/terminus-clickable-links/tsconfig.json +++ b/terminus-clickable-links/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "baseUrl": "src", "module": "commonjs", - "target": "es2015", + "target": "es2016", "declaration": false, "noImplicitAny": false, "removeComments": false, @@ -22,8 +22,5 @@ "es7" ] }, - "compileOnSave": false, - "exclude": [ - "node_modules" - ] + "exclude": ["node_modules", "dist"] } diff --git a/terminus-community-color-schemes/tsconfig.json b/terminus-community-color-schemes/tsconfig.json index 119f34fb..c04b0316 100644 --- a/terminus-community-color-schemes/tsconfig.json +++ b/terminus-community-color-schemes/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "baseUrl": "src", "module": "commonjs", - "target": "es2015", + "target": "es2016", "declaration": false, "noImplicitAny": false, "removeComments": false, @@ -22,6 +22,5 @@ "es7" ] }, - "compileOnSave": false, - "include": ["src"] + "exclude": ["node_modules", "dist"] } diff --git a/terminus-core/tsconfig.json b/terminus-core/tsconfig.json index 98612ad0..c04b0316 100644 --- a/terminus-core/tsconfig.json +++ b/terminus-core/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "baseUrl": "src", "module": "commonjs", - "target": "es2015", + "target": "es2016", "declaration": false, "noImplicitAny": false, "removeComments": false, @@ -22,5 +22,5 @@ "es7" ] }, - "include": ["src"] + "exclude": ["node_modules", "dist"] } diff --git a/terminus-settings/tsconfig.json b/terminus-settings/tsconfig.json index 26325f73..2711fd9c 100644 --- a/terminus-settings/tsconfig.json +++ b/terminus-settings/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "baseUrl": "./src", "module": "commonjs", - "target": "es2015", + "target": "es2016", "declaration": false, "noImplicitAny": false, "removeComments": false, @@ -22,5 +22,5 @@ "es7" ] }, - "include": ["src"] + "exclude": ["node_modules", "dist"] } diff --git a/terminus-terminal/package.json b/terminus-terminal/package.json index a7f7e0e8..9bdda5ea 100644 --- a/terminus-terminal/package.json +++ b/terminus-terminal/package.json @@ -11,9 +11,10 @@ "author": "Eugene Pankov", "license": "MIT", "devDependencies": { - "@types/deep-equal": "1.0.0", + "@types/deep-equal": "^1.0.0", "@types/node": "7.0.12", "@types/webpack-env": "1.13.0", + "@types/winreg": "^1.2.30", "awesome-typescript-loader": "3.1.2", "css-loader": "^0.28.0", "dataurl": "0.1.0", @@ -38,9 +39,10 @@ }, "dependencies": { "child-process-promise": "2.2.1", - "fs-promise": "2.0.2", "font-manager": "0.2.2", + "fs-promise": "2.0.2", "hterm-commonjs": "1.0.0", - "node-pty": "0.6.2" + "node-pty": "0.6.2", + "winreg": "^1.2.3" } } diff --git a/terminus-terminal/src/components/terminalSettingsTab.component.ts b/terminus-terminal/src/components/terminalSettingsTab.component.ts index 6af49054..505eb248 100644 --- a/terminus-terminal/src/components/terminalSettingsTab.component.ts +++ b/terminus-terminal/src/components/terminalSettingsTab.component.ts @@ -1,14 +1,18 @@ -import 'rxjs' import { Observable } from 'rxjs' import * as fs from 'fs-promise' -const fontManager = require('font-manager') +import * as path from 'path' const equal = require('deep-equal') +const fontManager = require('font-manager') const { exec } = require('child-process-promise') import { Component, Inject } from '@angular/core' import { ConfigService, HostAppService, Platform } from 'terminus-core' import { TerminalColorSchemeProvider, ITerminalColorScheme } from '../api' +let Registry = null +try { + Registry = require('winreg') +} catch (_) { } interface IShell { name: string @@ -58,6 +62,19 @@ export class TerminalSettingsTabComponent { if (await fs.exists(wslPath)) { this.shells.push({ name: 'Bash on Windows', command: wslPath }) } + + let cygwinPath = await new Promise(resolve => { + let reg = new Registry({ hive: Registry.HKLM, key: "\\Software\\Cygwin\\setup" }) + reg.get('rootdir', (err, item) => { + if (err) { + resolve(null) + } + resolve(item.value) + }) + }) + if (cygwinPath) { + this.shells.push({ name: 'Cygwin', command: path.join(cygwinPath, 'bin', 'bash.exe') }) + } } if (this.hostApp.platform == Platform.Linux || this.hostApp.platform == Platform.macOS) { this.shells = (await fs.readFile('/etc/shells', 'utf-8')) diff --git a/terminus-terminal/src/components/terminalTab.component.ts b/terminus-terminal/src/components/terminalTab.component.ts index 0d1eca30..676f00e3 100644 --- a/terminus-terminal/src/components/terminalTab.component.ts +++ b/terminus-terminal/src/components/terminalTab.component.ts @@ -16,6 +16,7 @@ import { hterm, preferenceManager } from '../hterm' export class TerminalTabComponent extends BaseTabComponent { hterm: any configSubscription: Subscription + sessionCloseSubscription: Subscription bell$ = new Subject() size$ = new ReplaySubject(1) input$ = new Subject() @@ -70,7 +71,7 @@ export class TerminalTabComponent extends BaseTabComponent { }) this.write(data) }) - this.session.closed$.first().subscribe(() => { + this.sessionCloseSubscription = this.session.closed$.subscribe(() => { this.app.closeTab(this) }) @@ -225,6 +226,7 @@ export class TerminalTabComponent extends BaseTabComponent { decorator.detach(this) }) this.configSubscription.unsubscribe() + this.sessionCloseSubscription.unsubscribe() this.size$.complete() this.input$.complete() this.output$.complete() @@ -232,7 +234,10 @@ export class TerminalTabComponent extends BaseTabComponent { this.alternateScreenActive$.complete() this.mouseEvent$.complete() this.bell$.complete() + } - this.session.gracefullyDestroy() + async destroy () { + super.destroy() + await this.session.destroy() } } diff --git a/terminus-terminal/src/services/sessions.service.ts b/terminus-terminal/src/services/sessions.service.ts index a81804e3..ba834a77 100644 --- a/terminus-terminal/src/services/sessions.service.ts +++ b/terminus-terminal/src/services/sessions.service.ts @@ -56,7 +56,9 @@ export class Session { }) this.pty.on('close', () => { - this.close() + if (this.open) { + this.destroy() + } }) } @@ -74,41 +76,40 @@ export class Session { this.pty.write(data) } - sendSignal (signal) { + kill (signal?: string) { this.pty.kill(signal) } - close () { - this.open = false - this.closed$.next() - this.pty.end() - } - - gracefullyDestroy () { - return new Promise((resolve) => { - this.sendSignal('SIGTERM') - if (!this.open) { - resolve() - this.destroy() - } else { - setTimeout(() => { - if (this.open) { - this.sendSignal('SIGKILL') - this.destroy() + async gracefullyKillProcess (): Promise { + if (process.platform == 'win32') { + this.kill() + } else { + await new Promise((resolve) => { + this.kill('SIGTERM') + setImmediate(() => { + if (!this.open) { + resolve() + } else { + setTimeout(() => { + if (this.open) { + this.kill('SIGKILL') + } + resolve() + }, 1000) } - resolve() - }, 1000) - } - }) + }) + }) + } } - destroy () { - if (open) { - this.close() + async destroy (): Promise { + if (this.open) { + this.open = false + this.closed$.next() + this.destroyed$.next() + this.output$.complete() + await this.gracefullyKillProcess() } - this.destroyed$.next() - this.pty.destroy() - this.output$.complete() } async getWorkingDirectory (): Promise { diff --git a/terminus-terminal/tsconfig.json b/terminus-terminal/tsconfig.json index 98612ad0..c04b0316 100644 --- a/terminus-terminal/tsconfig.json +++ b/terminus-terminal/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "baseUrl": "src", "module": "commonjs", - "target": "es2015", + "target": "es2016", "declaration": false, "noImplicitAny": false, "removeComments": false, @@ -22,5 +22,5 @@ "es7" ] }, - "include": ["src"] + "exclude": ["node_modules", "dist"] } diff --git a/terminus-terminal/webpack.config.js b/terminus-terminal/webpack.config.js index 406a4b9e..1a5b65dd 100644 --- a/terminus-terminal/webpack.config.js +++ b/terminus-terminal/webpack.config.js @@ -41,6 +41,7 @@ module.exports = { 'path', 'node-pty', 'child-process-promise', + 'winreg', /^rxjs/, /^@angular/, /^@ng-bootstrap/, diff --git a/terminus-theme-hype/tsconfig.json b/terminus-theme-hype/tsconfig.json index e5b78343..b963c8d8 100644 --- a/terminus-theme-hype/tsconfig.json +++ b/terminus-theme-hype/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "baseUrl": "src", "module": "commonjs", - "target": "es2015", + "target": "es2016", "declaration": false, "noImplicitAny": false, "removeComments": false, @@ -14,5 +14,5 @@ "es7" ] }, - "include": ["src"] + "exclude": ["node_modules", "dist"] }