1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| <template> <div class="term" :id="'terminal' + id"> </div> </template> <script> import 'xterm/css/xterm.css'; const ipc = require("electron").ipcRenderer; import { Terminal } from 'xterm'; import { FitAddon } from 'xterm-addon-fit'; export default { props: { id: { type: Number }, showFlag: { type: Boolean } }, watch: { showFlag: { handler: function(newVal, oldVal) { this.fitSize(); }, immediate: true } }, name: 'Term', data() { return { xterm: null, fitAddon: null, channels: null }; }, beforeDestroy() { this.destoryTerm(); }, mounted() { this.initConnect(); }, methods: { initConnect() { this.destoryTerm(); let that = this; ipc.invoke('terminal-create').then(res => { let pid = res; let xterm = new Terminal(); let fitAddon = new FitAddon(); xterm.loadAddon(fitAddon); xterm.open(document.getElementById('terminal' + this.id)); that.xterm = xterm; that.fitAddon = fitAddon; that.channels = ["terminal-incomingData-" + pid, "terminal-keystroke-" + pid, "terminal-resize-" + pid, "terminal-close-" + pid]; xterm.onData((data) => { ipc.send(that.channels[1], data); }) xterm.onResize((size) => { ipc.send(that.channels[2], size.cols, size.rows); }) ipc.on(that.channels[0], (event, data) => { xterm.write(data); }); window.onresize = function() { that.fitSize(); } that.fitSize(); xterm.focus(); }) }, destoryTerm() { if (this.xterm) { this.xterm.dispose(); this.xterm = null; } if (this.fitAddon) { this.fitAddon.dispose(); this.fitAddon = null; } if (this.channels) { ipc.send(this.channels[3]); ipc.removeAllListeners(this.channels[0]); this.channels = null; } }, fitSize() { if (this.showFlag && this.fitAddon) { this.fitAddon.fit(); } } } } </script> <style> </style>
|