1
1
mirror of https://github.com/Eugeny/tabby.git synced 2024-11-25 19:17:39 +03:00
This commit is contained in:
Eugene Pankov 2017-06-20 22:11:08 +02:00
parent 65e9cbe759
commit d9fd78fb42
14 changed files with 117 additions and 17 deletions

View File

@ -8,6 +8,7 @@ html
window.nodeRequire = require window.nodeRequire = require
script(src='./preload.js') script(src='./preload.js')
script(src='./bundle.js', defer) script(src='./bundle.js', defer)
style#custom-css
body(style='background: ; min-height: 100vh; overflow: hidden') body(style='background: ; min-height: 100vh; overflow: hidden')
app-root app-root
.preload-logo .preload-logo

View File

@ -6,7 +6,7 @@
"email": "e@ajenti.org" "email": "e@ajenti.org"
}, },
"main": "main.js", "main": "main.js",
"version": "0.0.2", "version": "1.0.0-alpha.1",
"scripts": { "scripts": {
"build": "../node_modules/.bin/webpack --progress --color --display-modules", "build": "../node_modules/.bin/webpack --progress --color --display-modules",
"watch": "../node_modules/.bin/webpack --progress --color --watch" "watch": "../node_modules/.bin/webpack --progress --color --watch"

View File

@ -1,3 +1,33 @@
import 'source-sans-pro' import 'source-sans-pro'
import 'font-awesome/css/font-awesome.css' import 'font-awesome/css/font-awesome.css'
import './preload.scss' import './preload.scss'
import * as Raven from 'raven-js'
const SENTRY_DSN = 'https://4717a0a7ee0b4429bd3a0f06c3d7eec3@sentry.io/181876'
Raven.config(
SENTRY_DSN,
{
release: require('electron').remote.app.getVersion(),
dataCallback: (data: any) => {
const normalize = (filename) => {
let splitArray = filename.split('/')
return splitArray[splitArray.length - 1]
}
data.exception.values[0].stacktrace.frames.forEach(frame => {
frame.filename = normalize(frame.filename)
})
data.culprit = data.exception.values[0].stacktrace.frames[0].filename
return data
}
}
)
process.on('uncaughtException', (err) => {
Raven.captureException(err)
console.error(err)
})

50
package-lock.json generated
View File

@ -27,6 +27,18 @@
"integrity": "sha1-JeTdgEtjDJFq5nEjPm1x9s4YEko=", "integrity": "sha1-JeTdgEtjDJFq5nEjPm1x9s4YEko=",
"dev": true "dev": true
}, },
"@types/raven": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@types/raven/-/raven-1.2.2.tgz",
"integrity": "sha1-r+Ur2YGHo6PSi4IS42MUO9FvI78=",
"dev": true
},
"@types/raven-js": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/@types/raven-js/-/raven-js-3.10.0.tgz",
"integrity": "sha1-0IMhYuvqdnHq//CKMktWrd5b+cM=",
"dev": true
},
"@types/webpack-env": { "@types/webpack-env": {
"version": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.0.tgz", "version": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.0.tgz",
"integrity": "sha1-MEQ4FkfhHulzxa8uklMjkw9pHYA=", "integrity": "sha1-MEQ4FkfhHulzxa8uklMjkw9pHYA=",
@ -641,6 +653,12 @@
"integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
"dev": true "dev": true
}, },
"cookie": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
"dev": true
},
"core-js": { "core-js": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
@ -1985,6 +2003,12 @@
"integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=",
"dev": true "dev": true
}, },
"lsmod": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz",
"integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks=",
"dev": true
},
"macaddress": { "macaddress": {
"version": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", "version": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz",
"integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=",
@ -2756,6 +2780,26 @@
"integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=", "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=",
"dev": true "dev": true
}, },
"raven": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/raven/-/raven-2.0.2.tgz",
"integrity": "sha1-pD07hwKubbLpGYdii+jyiVAIEK4=",
"dev": true,
"dependencies": {
"uuid": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz",
"integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=",
"dev": true
}
}
},
"raven-js": {
"version": "3.16.0",
"resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.16.0.tgz",
"integrity": "sha1-p5naT90ExjlD9n3rk9qg7P4QHqs=",
"dev": true
},
"raw-loader": { "raw-loader": {
"version": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", "version": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
"integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
@ -3131,6 +3175,12 @@
} }
} }
}, },
"stack-trace": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz",
"integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=",
"dev": true
},
"stat-mode": { "stat-mode": {
"version": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", "version": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
"integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=",

View File

@ -5,6 +5,8 @@
"@types/electron": "1.4.34", "@types/electron": "1.4.34",
"@types/fs-promise": "^1.0.1", "@types/fs-promise": "^1.0.1",
"@types/node": "^7.0.5", "@types/node": "^7.0.5",
"@types/raven": "^1.2.2",
"@types/raven-js": "^3.10.0",
"@types/webpack-env": "^1.13.0", "@types/webpack-env": "^1.13.0",
"apply-loader": "^0.1.0", "apply-loader": "^0.1.0",
"awesome-typescript-loader": "3.1.2", "awesome-typescript-loader": "3.1.2",
@ -28,6 +30,8 @@
"pug-html-loader": "^1.0.9", "pug-html-loader": "^1.0.9",
"pug-loader": "^2.3.0", "pug-loader": "^2.3.0",
"pug-static-loader": "0.0.1", "pug-static-loader": "0.0.1",
"raven": "^2.0.2",
"raven-js": "^3.16.0",
"raw-loader": "^0.5.1", "raw-loader": "^0.5.1",
"sass-loader": "^6.0.3", "sass-loader": "^6.0.3",
"shelljs": "^0.7.7", "shelljs": "^0.7.7",

View File

@ -5,3 +5,4 @@ appearance:
tabsLocation: top tabsLocation: top
theme: Standard theme: Standard
frame: thin frame: thin
css: '/* * { color: blue !important; } */'

View File

@ -1,7 +1,8 @@
import { Subject } from 'rxjs'
import * as yaml from 'js-yaml' import * as yaml from 'js-yaml'
import * as path from 'path' import * as path from 'path'
import * as fs from 'fs' import * as fs from 'fs'
import { EventEmitter, Injectable, Inject } from '@angular/core' import { Injectable, Inject } from '@angular/core'
import { ConfigProvider } from '../api/configProvider' import { ConfigProvider } from '../api/configProvider'
import { ElectronService } from './electron.service' import { ElectronService } from './electron.service'
import { HostAppService } from './hostApp.service' import { HostAppService } from './hostApp.service'
@ -51,7 +52,7 @@ export class ConfigProxy {
@Injectable() @Injectable()
export class ConfigService { export class ConfigService {
store: any store: any
change = new EventEmitter() changed$ = new Subject<void>()
restartRequested: boolean restartRequested: boolean
private _store: any private _store: any
private path: string private path: string
@ -91,7 +92,7 @@ export class ConfigService {
} }
emitChange (): void { emitChange (): void {
this.change.emit() this.changed$.next()
} }
requestRestart (): void { requestRestart (): void {

View File

@ -15,13 +15,13 @@ export class ElectronService {
constructor () { constructor () {
this.electron = require('electron') this.electron = require('electron')
this.remoteElectron = this.remoteRequire('electron') this.remoteElectron = this.remoteRequire('electron')
this.app = this.remoteElectron.app this.app = this.electron.remote.app
this.screen = this.remoteElectron.screen this.screen = this.electron.remote.screen
this.dialog = this.remoteElectron.dialog this.dialog = this.electron.remote.dialog
this.shell = this.electron.shell this.shell = this.electron.shell
this.clipboard = this.electron.clipboard this.clipboard = this.electron.clipboard
this.ipcRenderer = this.electron.ipcRenderer this.ipcRenderer = this.electron.ipcRenderer
this.globalShortcut = this.remoteElectron.globalShortcut this.globalShortcut = this.electron.remote.globalShortcut
} }
remoteRequire (name: string): any { remoteRequire (name: string): any {

View File

@ -43,7 +43,7 @@ export class HotkeysService {
}) })
}) })
this.hotkeyDescriptions = hotkeyProviders.map(x => x.hotkeys).reduce((a, b) => a.concat(b)) this.hotkeyDescriptions = hotkeyProviders.map(x => x.hotkeys).reduce((a, b) => a.concat(b))
this.config.change.subscribe(() => { this.config.changed$.subscribe(() => {
this.registerGlobalHotkey() this.registerGlobalHotkey()
}) })
this.registerGlobalHotkey() this.registerGlobalHotkey()

View File

@ -11,8 +11,9 @@ export class ThemesService {
@Inject(Theme) private themes: Theme[], @Inject(Theme) private themes: Theme[],
) { ) {
this.applyCurrentTheme() this.applyCurrentTheme()
config.change.subscribe(() => { config.changed$.subscribe(() => {
this.applyCurrentTheme() this.applyCurrentTheme()
document.querySelector('style#custom-css').innerHTML = config.store.appearance.css
}) })
} }

View File

@ -145,6 +145,13 @@ ngb-tabset.vertical(type='tabs')
i.fa.fa-bug i.fa.fa-bug
span Open DevTools span Open DevTools
.form-group
label Custom CSS
textarea.form-control(
[(ngModel)]='config.store.appearance.css',
'(ngModelChange)'='config.save()',
)
ngb-tab ngb-tab
template(ngbTabTitle) template(ngbTabTitle)
| Hotkeys | Hotkeys

View File

@ -8,12 +8,17 @@
width: auto; width: auto;
flex: none; flex: none;
} }
}
.hotkeys-table { .hotkeys-table {
margin-top: 30px; margin-top: 30px;
td, th { td, th {
padding: 5px 10px; padding: 5px 10px;
}
} }
} }
textarea {
font-family: 'Source Sans Mono', monospace;
height: 120px;
}

View File

@ -44,7 +44,7 @@ export class TerminalTabComponent extends BaseTabComponent {
super() super()
this.decorators = this.decorators || [] this.decorators = this.decorators || []
this.title$.next('Terminal') this.title$.next('Terminal')
this.configSubscription = config.change.subscribe(() => { this.configSubscription = config.changed$.subscribe(() => {
this.configure() this.configure()
}) })
this.resize$.first().subscribe(async (resizeEvent) => { this.resize$.first().subscribe(async (resizeEvent) => {

View File

@ -7,7 +7,7 @@ import { Injectable } from '@angular/core'
import { Logger, LogService } from 'terminus-core' import { Logger, LogService } from 'terminus-core'
import { SessionOptions, SessionPersistenceProvider } from './api' import { SessionOptions, SessionPersistenceProvider } from './api'
declare function delay(ms: number): Promise<void> declare function delay (ms: number): Promise<void>
interface IChildProcess { interface IChildProcess {
pid: number pid: number