Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e6b5dad8c | ||
|
|
0b603952c3 | ||
|
|
9bd2a1c202 | ||
|
|
c7f4658e97 | ||
|
|
96848a6425 | ||
|
|
0997f4398f | ||
|
|
e278837de8 |
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Implements the attach method, that
|
||||
* attaches the terminal to a WebSocket stream.
|
||||
*
|
||||
* The bidirectional argument indicates, whether the terminal should
|
||||
* send data to the socket as well and is true, by default.
|
||||
*/
|
||||
Terminal.prototype.attach = function (socket, bidirectional) {
|
||||
var term = this;
|
||||
|
||||
bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
|
||||
this.socket = socket;
|
||||
|
||||
socket.addEventListener('message', function (ev) {
|
||||
term.write(ev.data);
|
||||
});
|
||||
|
||||
if (bidirectional) {
|
||||
this.on('data', function (data) {
|
||||
socket.send(data);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="../../src/xterm.css" />
|
||||
<link rel="stylesheet" href="../../demo/style.css" />
|
||||
<script src="../../src/xterm.js"></script>
|
||||
<script src="attach.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<form id="socket-form">
|
||||
<input id="socket-url"
|
||||
type="text"
|
||||
placeholder="Enter socket url (e.g. ws://mysock)"
|
||||
autofocus />
|
||||
<button>
|
||||
Attach
|
||||
</button>
|
||||
</form>
|
||||
<div id="terminal-container"></div>
|
||||
<script>
|
||||
var term = new Terminal(),
|
||||
container = document.getElementById('terminal-container'),
|
||||
socketUrl = document.getElementById('socket-url'),
|
||||
socketForm = document.getElementById('socket-form');
|
||||
|
||||
socketForm.addEventListener('submit', function (ev) {
|
||||
ev.preventDefault();
|
||||
var url = socketUrl.value,
|
||||
sock = new WebSocket(url);
|
||||
sock.addEventListener('open', function () {
|
||||
term.attach(sock);
|
||||
});
|
||||
});
|
||||
|
||||
term.open(container);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
.xterm.fullscreen {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
width: auto;
|
||||
height: auto;
|
||||
z-index: 255;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Fullscreen addon for xterm.js
|
||||
*
|
||||
* Implements the toggleFullscreen function.
|
||||
*
|
||||
* If the `fullscreen` argument has been supplied, then
|
||||
* if it is true, the fullscreen mode gets turned on,
|
||||
* if it is false or null, the fullscreen mode gets turned off.
|
||||
*
|
||||
* If the `fullscreen` argument has not been supplied, the
|
||||
* fullscreen mode is being toggled.
|
||||
*/
|
||||
Terminal.prototype.toggleFullscreen = function (fullscreen) {
|
||||
var fn;
|
||||
|
||||
if (typeof fullscreen == 'undefined') {
|
||||
fn = (this.element.classList.contains('fullscreen')) ? 'remove' : 'add';
|
||||
} else if (!fullscreen) {
|
||||
fn = 'remove';
|
||||
} else {
|
||||
fn = 'add';
|
||||
}
|
||||
|
||||
this.element.classList[fn]('fullscreen');
|
||||
}
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "xterm.js",
|
||||
"version": "0.5",
|
||||
"version": "0.9.1",
|
||||
"ignore": ["demo", "docs", "test", ".gitignore"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,10 @@
|
||||
<head>
|
||||
<title>xterm.js demo</title>
|
||||
<link rel="stylesheet" href="../src/xterm.css" />
|
||||
<link rel="stylesheet" href="../addon/fullscreen/fullscreen.css" />
|
||||
<link rel="stylesheet" href="style.css" />
|
||||
<script src="../src/xterm.js"></script>
|
||||
<script src="../addon/fullscreen/fullscreen.js"></script>
|
||||
<script src="main.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -17,7 +17,6 @@ term.on('key', function (key, ev) {
|
||||
var printable = (!ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey);
|
||||
|
||||
if (ev.keyIdentifier == 'Enter') {
|
||||
ev.preventDefault();
|
||||
term.prompt();
|
||||
} else if (ev.keyCode == 8) {
|
||||
term.write('\b \b');
|
||||
|
||||
+19
-17
@@ -542,6 +542,10 @@ Terminal.prototype.open = function(parent) {
|
||||
this.element.appendChild(this.helperContainer);
|
||||
this.textarea = document.createElement('textarea');
|
||||
this.textarea.classList.add('xterm-helper-textarea');
|
||||
this.textarea.setAttribute('autocorrect', 'off');
|
||||
this.textarea.setAttribute('autocapitalize', 'off');
|
||||
this.textarea.setAttribute('spellcheck', 'false');
|
||||
this.textarea.tabIndex = 0;
|
||||
this.helperContainer.appendChild(this.textarea);
|
||||
|
||||
for (; i < this.rows; i++) {
|
||||
@@ -564,9 +568,7 @@ Terminal.prototype.open = function(parent) {
|
||||
|
||||
on(this.element, 'mouseup', function() {
|
||||
var selection = document.getSelection();
|
||||
if (selection.type == 'Range') {
|
||||
console.log(selection);
|
||||
} else {
|
||||
if (selection.type != 'Range') {
|
||||
self.focus();
|
||||
}
|
||||
});
|
||||
@@ -953,7 +955,7 @@ Terminal.prototype.destroy = function() {
|
||||
* 1=bold, 2=underline, 4=blink, 8=inverse, 16=invisible
|
||||
*/
|
||||
Terminal.prototype.refresh = function(start, end) {
|
||||
var x, y, i, line, out, ch, width, data, attr, bg, fg, flags, row, parent;
|
||||
var x, y, i, line, out, ch, width, data, attr, bg, fg, flags, row, parent, focused = document.activeElement;
|
||||
|
||||
if (end - start >= this.rows / 2) {
|
||||
parent = this.element.parentNode;
|
||||
@@ -1086,6 +1088,10 @@ Terminal.prototype.refresh = function(start, end) {
|
||||
parent.appendChild(this.element);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return focus to previously focused element
|
||||
*/
|
||||
focused.focus();
|
||||
this.emit('refresh', {element: this.element, start: start, end: end});
|
||||
};
|
||||
|
||||
@@ -2169,14 +2175,17 @@ Terminal.prototype.keyDown = function(ev) {
|
||||
break;
|
||||
}
|
||||
key = '\t';
|
||||
this.cancel(ev, true);
|
||||
break;
|
||||
// return/enter
|
||||
case 13:
|
||||
key = '\r';
|
||||
this.cancel(ev, true);
|
||||
break;
|
||||
// escape
|
||||
case 27:
|
||||
key = '\x1b';
|
||||
this.cancel(ev, true);
|
||||
break;
|
||||
// left-arrow
|
||||
case 37:
|
||||
@@ -2350,7 +2359,6 @@ Terminal.prototype.keyDown = function(ev) {
|
||||
|
||||
this.emit('keydown', ev);
|
||||
this.emit('key', key, ev);
|
||||
|
||||
this.showCursor();
|
||||
this.handler(key);
|
||||
|
||||
@@ -2392,7 +2400,6 @@ Terminal.prototype.keyPress = function(ev) {
|
||||
|
||||
this.emit('keypress', key, ev);
|
||||
this.emit('key', key, ev);
|
||||
|
||||
this.showCursor();
|
||||
this.handler(key);
|
||||
|
||||
@@ -2530,7 +2537,7 @@ Terminal.prototype.resize = function(x, y) {
|
||||
Terminal.prototype.fit = function () {
|
||||
var container = this.element.parentElement,
|
||||
subjectRow = this.rowContainer.firstElementChild,
|
||||
rows = parseInt(container.scrollHeight / subjectRow.offsetHeight),
|
||||
rows = parseInt(container.offsetHeight / subjectRow.offsetHeight),
|
||||
characterWidth,
|
||||
cols;
|
||||
|
||||
@@ -2538,7 +2545,7 @@ Terminal.prototype.fit = function () {
|
||||
characterWidth = parseInt(subjectRow.offsetWidth / this.cols);
|
||||
subjectRow.style.display = '';
|
||||
|
||||
cols = parseInt(container.scrollWidth / characterWidth);
|
||||
cols = parseInt(container.offsetWidth / characterWidth);
|
||||
|
||||
this.resize(cols, rows);
|
||||
}
|
||||
@@ -4656,17 +4663,12 @@ function off(el, type, handler, capture) {
|
||||
el.removeEventListener(type, handler, capture || false);
|
||||
}
|
||||
|
||||
function cancel(ev) {
|
||||
if (!this.cancelEvents) {
|
||||
function cancel(ev, force) {
|
||||
if (!this.cancelEvents && !force) {
|
||||
return;
|
||||
}
|
||||
if (ev.preventDefault) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
if (ev.stopPropagation) {
|
||||
ev.stopPropagation();
|
||||
}
|
||||
ev.cancelBubble = true;
|
||||
ev.preventDefault();
|
||||
ev.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user