Eugene Pankov 8 years ago
parent
commit
4d6c63a0e3

+ 2 - 5
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"]
 }

+ 2 - 3
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"]
 }

+ 2 - 2
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"]
 }

+ 2 - 2
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"]
 }

+ 5 - 3
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"
   }
 }

+ 19 - 2
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<string>(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'))

+ 7 - 2
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<ResizeEvent>(1)
     input$ = new Subject<string>()
@@ -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()
     }
 }

+ 30 - 29
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<void> {
+        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<void> {
+        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<string> {

+ 2 - 2
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"]
 }

+ 1 - 0
terminus-terminal/webpack.config.js

@@ -41,6 +41,7 @@ module.exports = {
     'path',
     'node-pty',
     'child-process-promise',
+    'winreg',
     /^rxjs/,
     /^@angular/,
     /^@ng-bootstrap/,

+ 2 - 2
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"]
 }