mirror of
				https://git.proxmox.com/git/mirror_xterm.js
				synced 2025-10-31 10:17:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			127 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var term,
 | |
|     protocol,
 | |
|     socketURL,
 | |
|     socket,
 | |
|     pid,
 | |
|     charWidth,
 | |
|     charHeight;
 | |
| 
 | |
| var terminalContainer = document.getElementById('terminal-container'),
 | |
|     optionElements = {
 | |
|       cursorBlink: document.querySelector('#option-cursor-blink')
 | |
|     },
 | |
|     colsElement = document.getElementById('cols'),
 | |
|     rowsElement = document.getElementById('rows');
 | |
| 
 | |
| function setTerminalSize () {
 | |
|   var cols = parseInt(colsElement.value),
 | |
|       rows = parseInt(rowsElement.value),
 | |
|       width = (cols * charWidth).toString() + 'px',
 | |
|       height = (rows * charHeight).toString() + 'px';
 | |
| 
 | |
|   terminalContainer.style.width = width;
 | |
|   terminalContainer.style.height = height;
 | |
|   term.resize(cols, rows);
 | |
| }
 | |
| 
 | |
| colsElement.addEventListener('change', setTerminalSize);
 | |
| rowsElement.addEventListener('change', setTerminalSize);
 | |
| 
 | |
| optionElements.cursorBlink.addEventListener('change', createTerminal);
 | |
| 
 | |
| createTerminal();
 | |
| 
 | |
| function createTerminal() {
 | |
|   // Clean terminal
 | |
|   while (terminalContainer.children.length) {
 | |
|     terminalContainer.removeChild(terminalContainer.children[0]);
 | |
|   }
 | |
|   term = new Terminal({
 | |
|     cursorBlink: optionElements.cursorBlink.checked
 | |
|   });
 | |
|   term.on('resize', function (size) {
 | |
|     if (!pid) {
 | |
|       return;
 | |
|     }
 | |
|     var cols = size.cols,
 | |
|         rows = size.rows,
 | |
|         url = '/terminals/' + pid + '/size?cols=' + cols + '&rows=' + rows;
 | |
| 
 | |
|     fetch(url, {method: 'POST'});
 | |
|   });
 | |
|   protocol = (location.protocol === 'https:') ? 'wss://' : 'ws://';
 | |
|   socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/terminals/';
 | |
| 
 | |
|   term.open(terminalContainer);
 | |
|   term.fit();
 | |
| 
 | |
|   var initialGeometry = term.proposeGeometry(),
 | |
|       cols = initialGeometry.cols,
 | |
|       rows = initialGeometry.rows;
 | |
| 
 | |
|   colsElement.value = cols;
 | |
|   rowsElement.value = rows;
 | |
| 
 | |
|   fetch('/terminals?cols=' + cols + '&rows=' + rows, {method: 'POST'}).then(function (res) {
 | |
| 
 | |
|     charWidth = Math.ceil(term.element.offsetWidth / cols);
 | |
|     charHeight = Math.ceil(term.element.offsetHeight / rows);
 | |
| 
 | |
|     res.text().then(function (pid) {
 | |
|       window.pid = pid;
 | |
|       socketURL += pid;
 | |
|       socket = new WebSocket(socketURL);
 | |
|       socket.onopen = runRealTerminal;
 | |
|       socket.onclose = runFakeTerminal;
 | |
|       socket.onerror = runFakeTerminal;
 | |
|     });
 | |
|   });
 | |
| }
 | |
| 
 | |
| 
 | |
| function runRealTerminal() {
 | |
|   term.attach(socket);
 | |
|   term._initialized = true;
 | |
| }
 | |
| 
 | |
| function runFakeTerminal() {
 | |
|   if (term._initialized) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   term._initialized = true;
 | |
| 
 | |
|   var shellprompt = '$ ';
 | |
| 
 | |
|   term.prompt = function () {
 | |
|     term.write('\r\n' + shellprompt);
 | |
|   };
 | |
| 
 | |
|   term.writeln('Welcome to xterm.js');
 | |
|   term.writeln('This is a local terminal emulation, without a real terminal in the back-end.');
 | |
|   term.writeln('Type some keys and commands to play around.');
 | |
|   term.writeln('');
 | |
|   term.prompt();
 | |
| 
 | |
|   term.on('key', function (key, ev) {
 | |
|     var printable = (
 | |
|       !ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey
 | |
|     );
 | |
| 
 | |
|     if (ev.keyCode == 13) {
 | |
|       term.prompt();
 | |
|     } else if (ev.keyCode == 8) {
 | |
|      // Do not delete the prompt
 | |
|       if (term.x > 2) {
 | |
|         term.write('\b \b');
 | |
|       }
 | |
|     } else if (printable) {
 | |
|       term.write(key);
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   term.on('paste', function (data, ev) {
 | |
|     term.write(data);
 | |
|   });
 | |
| }
 | 
