xterm tryout

This commit is contained in:
Leon van Kammen 2024-04-18 15:10:07 +00:00
parent 8fbcd79759
commit 2e45c627d1
1 changed files with 67 additions and 14 deletions

View File

@ -9,6 +9,9 @@ AFRAME.registerComponent('isoterminal', {
html: "https://unpkg.com/aframe-htmlmesh@2.1.0/build/aframe-html.js", // html to AFRAME html: "https://unpkg.com/aframe-htmlmesh@2.1.0/build/aframe-html.js", // html to AFRAME
winboxjs: "https://unpkg.com/winbox@0.2.82/dist/winbox.bundle.min.js", // deadsimple windows: https://nextapps-de.github.io/winbox winboxjs: "https://unpkg.com/winbox@0.2.82/dist/winbox.bundle.min.js", // deadsimple windows: https://nextapps-de.github.io/winbox
winboxcss: "https://unpkg.com/winbox@0.2.82/dist/css/winbox.min.css", // winboxcss: "https://unpkg.com/winbox@0.2.82/dist/css/winbox.min.css", //
xtermcss: "https://unpkg.com/xterm@3.12.0/dist/xterm.css",
xtermjs: "https://unpkg.com/xterm@3.12.0/dist/xterm.js",
axterm: "https://unpkg.com/aframe-xterm-component/aframe-xterm-component.js"
}, },
dom: { dom: {
@ -35,21 +38,46 @@ AFRAME.registerComponent('isoterminal', {
}, },
launcher: function(){ launcher: function(){
new WinBox( this.manifest.iso + ' ' + this.manifest.name, {
width: '70%',
height: '80%',
x:"center",
y:"center",
id: this.el.uid, // important hint for html-mesh
root: document.querySelector("#overlay"),
mount: this.el.dom,
onclose: () => {
if( !confirm('do you want to kill this virtual machine and all its processes?') ) return true
this.el.dom.style.display = 'none'
return false
}
});
this.el.dom.style.display = '' this.el.dom.style.display = ''
this.el.innerHTML += `
<a-curvedimage
class="terminal"
xterm-shell
theta-length="60"
radius="6"
height="4"
rotation="0 150 0"
position="0 2 -2"
></a-curvedimage>
`
setTimeout( () => {
let el = this.el.querySelector('a-curvedimage')
el.object3D.children[0].material.transparent = false
const message = 'Hello from \x1B[1;3;31mWebVR\x1B[0m !\r\n$ '
const xterm = el.components['xterm']
xterm.write(message)
this.el.addEventListener('xterm-data', ({detail}) => {
console.log('Got input from terminal', detail)
})
//new WinBox( this.manifest.iso + ' ' + this.manifest.name, {
// width: '70%',
// height: '80%',
// x:"center",
// y:"center",
// id: this.el.uid, // important hint for html-mesh
// root: document.querySelector("#overlay"),
// mount: this.el.dom,
// onclose: () => {
// if( !confirm('do you want to kill this virtual machine and all its processes?') ) return true
// this.el.dom.style.display = 'none'
// return false
// }
//});
},500)
}, },
}, },
@ -108,3 +136,28 @@ in above's case "\nHelloworld application\n" will qualify as header.
}); });
AFRAME.registerComponent('xterm-shell', {
dependencies: ['xterm'],
init: function() {
const message = 'Run \x1B[1;3;31m\'node server.js\'\x1B[0m to open a shell\r\n'
const xterm = this.el.components['xterm']
xterm.write(message)
const socket = new WebSocket('ws://localhost:8080/')
// Listen on data, write it to the terminal
socket.onmessage = ({data}) => {
xterm.write(data)
}
socket.onclose = () => {
xterm.write('\r\nConnection closed.\r\n')
}
// Listen on user input, send it to the connection
this.el.addEventListener('xterm-data', ({detail}) => {
socket.send(detail)
})
}
})