update files

This commit is contained in:
nuintun 2015-12-02 17:58:14 +08:00
parent 3671a3c456
commit ad789f61f5
2 changed files with 107 additions and 53 deletions

View File

@ -10,7 +10,6 @@ var fs = require('fs');
var path = require('path'); var path = require('path');
var util = require('../../util'); var util = require('../../util');
var Vue = require('../../vue/vue'); var Vue = require('../../vue/vue');
var Terminal = require('../../terminal');
const EMPTYPROJECT = { const EMPTYPROJECT = {
name: '', name: '',
@ -47,14 +46,34 @@ function scroll(xterm, parent){
} }
} }
var worker = new Worker('static/js/components/app-main/terminal-worker.js'); // uuid
var uuid = 0;
/** /**
* openXTerm * openXTerm
* @param name * @param vm
*/ */
function openXTerm(name){
worker.postMessage({ action: 'open', name: name }); function openXTerm(vm){
var project = vm.project;
var runtime = AppRuntime[project.name];
if (!runtime) {
var worker = new SharedWorker('static/js/components/app-main/terminal-worker.js', 'SharedWorker-' + (uuid++));
worker.port.addEventListener('message', function (event){
if (vm.project.name === event.data.name) {
vm.$els.terminal.innerHTML = event.data.screen;
}
});
worker.port.start();
worker.port.postMessage({ action: 'open', name: project.name });
AppRuntime[project.name] = { worker: worker };
} else {
runtime.worker.port.postMessage({ action: 'open', name: project.name });
}
} }
/** /**
@ -62,7 +81,14 @@ function openXTerm(name){
* @param name * @param name
*/ */
function closeXTerm(name){ function closeXTerm(name){
worker.postMessage({ action: 'close', name: name }); var runtime = AppRuntime[name];
if (runtime) {
runtime.worker.port.postMessage({ action: 'close', name: name });
runtime.worker.terminate();
delete AppRuntime[name];
}
} }
module.exports = Vue.component('app-main', { module.exports = Vue.component('app-main', {
@ -105,7 +131,7 @@ module.exports = Vue.component('app-main', {
this.command = project.command.slice(0, 3); this.command = project.command.slice(0, 3);
this.moreCommand = project.command.slice(3); this.moreCommand = project.command.slice(3);
openXTerm(project.name); openXTerm(this);
} }
}, },
methods: { methods: {
@ -162,6 +188,8 @@ module.exports = Vue.component('app-main', {
}, false); }, false);
ipc.on('emulator', function (event, type, project, data){ ipc.on('emulator', function (event, type, project, data){
var runtime = AppRuntime[project.name];
switch (type) { switch (type) {
case 'data': case 'data':
data = data.toString(); data = data.toString();
@ -173,19 +201,12 @@ module.exports = Vue.component('app-main', {
data = '\u001b[32m命令执行完成\u001b[0m'; data = '\u001b[32m命令执行完成\u001b[0m';
break; break;
} }
worker.postMessage({ action: 'write', name: project.name, data: data.toString() });
runtime.worker.port.postMessage({ action: 'write', name: project.name, data: data.toString() });
// event.sender.send('emulator', project, 'stop'); // event.sender.send('emulator', project, 'stop');
}); });
}, },
ready: function (){ ready: function (){
var context = this; openXTerm(this);
worker.onmessage = function (event){
if (event.data.name === context.project.name) {
context.$els.terminal.innerHTML = event.data.screen;
}
};
openXTerm(this.project.name);
} }
}); });

View File

@ -6,48 +6,81 @@
importScripts('../../terminal/index.js'); importScripts('../../terminal/index.js');
var ACTIVE; var xterm;
var RUNTIMECACHE = {};
function send(name, xterm){ onconnect = function (event){
postMessage({ var port = event.ports[0];
name: name,
screen: xterm.toString('html')
});
}
onmessage = function (event){ port.onmessage = function (event){
var xterm; var message = event.data;
var message = event.data;
switch (message.action) { function send(name, xterm){
case 'open': var data = {
xterm = RUNTIMECACHE[message.name]; name: name,
screen: xterm.toString('html')
};
if (!xterm) { port.postMessage(data);
xterm = new AnsiTerminal(120, 60, 0); }
xterm.newline_mode = true;
RUNTIMECACHE[message.name] = xterm;
}
ACTIVE = message.name; switch (message.action) {
case 'open':
if (!xterm) {
xterm = new AnsiTerminal(120, 60, 0);
xterm.newline_mode = true;
}
send(message.name, xterm); send(message.name, xterm);
break; break;
case 'close': case 'close':
delete RUNTIMECACHE[message.name]; delete xterm.reset();
break; break;
case 'write': case 'write':
xterm = RUNTIMECACHE[message.name];
if (ACTIVE === message.name) {
xterm.write(message.data); xterm.write(message.data);
send(message.name, xterm); send(message.name, xterm);
} else { break;
setTimeout(function (){ }
xterm.write(message.data); };
}, 16);
} //function send(name, xterm){
break; // postMessage({
} // name: name,
// screen: xterm.toString('html')
// });
//}
//
//switch (message.action) {
// case 'open':
// xterm = RUNTIMECACHE[message.name];
//
// if (!xterm) {
// xterm = new AnsiTerminal(120, 60, 0);
// xterm.newline_mode = true;
// SCREENCACHE[message.name] = '';
// RUNTIMECACHE[message.name] = xterm;
// }
//
// ACTIVE = message.name;
//
// if (SCREENCACHE[message.name]) {
// xterm.write(SCREENCACHE[message.name]);
// SCREENCACHE[message.name] = '';
// }
//
// send(message.name, xterm);
// break;
// case 'close':
// delete RUNTIMECACHE[message.name];
// break;
// case 'write':
// xterm = RUNTIMECACHE[message.name];
//
// if (ACTIVE === message.name) {
// xterm.write(message.data);
// send(message.name, xterm);
// } else {
// SCREENCACHE[message.name] += message.data;
// }
// break;
//}
}; };