Compare commits

...
7 Commits
Author SHA1 Message Date
paris 0b603952c3 Removed debugging stuff
Bumped bower version to 0.9
2014-04-10 16:04:59 +00:00
paris 9bd2a1c202 Implemented the attach addon 2014-04-10 15:54:39 +00:00
paris c7f4658e97 Add fullscreen mode plug in 2014-04-10 15:20:41 +00:00
paris 96848a6425 Improved textarea handling 2014-04-10 15:08:19 +00:00
paris 0997f4398f Proper event handling
Bump bower version to 0.7
2014-04-10 14:39:17 +00:00
paris e278837de8 Fix focus on refresh 2014-04-09 16:49:29 +00:00
paris e572734a21 Syntax fix
Bumped bower version to 0.5
2014-04-09 15:42:37 +00:00
8 changed files with 118 additions and 19 deletions
+23
View File
@@ -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);
});
}
}
+38
View File
@@ -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>
+10
View File
@@ -0,0 +1,10 @@
.xterm.fullscreen {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: auto;
height: auto;
z-index: 255;
}
+25
View File
@@ -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
View File
@@ -1,5 +1,5 @@
{ {
"name": "xterm.js", "name": "xterm.js",
"version": "0.4", "version": "0.9",
"ignore": ["demo", "docs", "test", ".gitignore"] "ignore": ["demo", "docs", "test", ".gitignore"]
} }
+2
View File
@@ -3,8 +3,10 @@
<head> <head>
<title>xterm.js demo</title> <title>xterm.js demo</title>
<link rel="stylesheet" href="../src/xterm.css" /> <link rel="stylesheet" href="../src/xterm.css" />
<link rel="stylesheet" href="../addon/fullscreen/fullscreen.css" />
<link rel="stylesheet" href="style.css" /> <link rel="stylesheet" href="style.css" />
<script src="../src/xterm.js"></script> <script src="../src/xterm.js"></script>
<script src="../addon/fullscreen/fullscreen.js"></script>
<script src="main.js" defer></script> <script src="main.js" defer></script>
</head> </head>
<body> <body>
-1
View File
@@ -17,7 +17,6 @@ term.on('key', function (key, ev) {
var printable = (!ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey); var printable = (!ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey);
if (ev.keyIdentifier == 'Enter') { if (ev.keyIdentifier == 'Enter') {
ev.preventDefault();
term.prompt(); term.prompt();
} else if (ev.keyCode == 8) { } else if (ev.keyCode == 8) {
term.write('\b \b'); term.write('\b \b');
+18 -16
View File
@@ -416,7 +416,7 @@ Terminal.prototype.initGlobal = function() {
*/ */
Terminal.bindPaste = function(term) { Terminal.bindPaste = function(term) {
on([term.textarea, term.element], 'paste', function(ev) { on([term.textarea, term.element], 'paste', function(ev) {
ev.stopPropagation[(); ev.stopPropagation();
if (ev.clipboardData) { if (ev.clipboardData) {
var text = ev.clipboardData.getData('text/plain'); var text = ev.clipboardData.getData('text/plain');
term.handler(text); term.handler(text);
@@ -542,6 +542,10 @@ Terminal.prototype.open = function(parent) {
this.element.appendChild(this.helperContainer); this.element.appendChild(this.helperContainer);
this.textarea = document.createElement('textarea'); this.textarea = document.createElement('textarea');
this.textarea.classList.add('xterm-helper-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); this.helperContainer.appendChild(this.textarea);
for (; i < this.rows; i++) { for (; i < this.rows; i++) {
@@ -564,9 +568,7 @@ Terminal.prototype.open = function(parent) {
on(this.element, 'mouseup', function() { on(this.element, 'mouseup', function() {
var selection = document.getSelection(); var selection = document.getSelection();
if (selection.type == 'Range') { if (selection.type != 'Range') {
console.log(selection);
} else {
self.focus(); self.focus();
} }
}); });
@@ -953,7 +955,7 @@ Terminal.prototype.destroy = function() {
* 1=bold, 2=underline, 4=blink, 8=inverse, 16=invisible * 1=bold, 2=underline, 4=blink, 8=inverse, 16=invisible
*/ */
Terminal.prototype.refresh = function(start, end) { 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) { if (end - start >= this.rows / 2) {
parent = this.element.parentNode; parent = this.element.parentNode;
@@ -1086,6 +1088,10 @@ Terminal.prototype.refresh = function(start, end) {
parent.appendChild(this.element); parent.appendChild(this.element);
} }
/*
* Return focus to previously focused element
*/
focused.focus();
this.emit('refresh', {element: this.element, start: start, end: end}); this.emit('refresh', {element: this.element, start: start, end: end});
}; };
@@ -2169,14 +2175,17 @@ Terminal.prototype.keyDown = function(ev) {
break; break;
} }
key = '\t'; key = '\t';
this.cancel(ev, true);
break; break;
// return/enter // return/enter
case 13: case 13:
key = '\r'; key = '\r';
this.cancel(ev, true);
break; break;
// escape // escape
case 27: case 27:
key = '\x1b'; key = '\x1b';
this.cancel(ev, true);
break; break;
// left-arrow // left-arrow
case 37: case 37:
@@ -2350,7 +2359,6 @@ Terminal.prototype.keyDown = function(ev) {
this.emit('keydown', ev); this.emit('keydown', ev);
this.emit('key', key, ev); this.emit('key', key, ev);
this.showCursor(); this.showCursor();
this.handler(key); this.handler(key);
@@ -2392,7 +2400,6 @@ Terminal.prototype.keyPress = function(ev) {
this.emit('keypress', key, ev); this.emit('keypress', key, ev);
this.emit('key', key, ev); this.emit('key', key, ev);
this.showCursor(); this.showCursor();
this.handler(key); this.handler(key);
@@ -4656,17 +4663,12 @@ function off(el, type, handler, capture) {
el.removeEventListener(type, handler, capture || false); el.removeEventListener(type, handler, capture || false);
} }
function cancel(ev) { function cancel(ev, force) {
if (!this.cancelEvents) { if (!this.cancelEvents && !force) {
return; return;
} }
if (ev.preventDefault) { ev.preventDefault();
ev.preventDefault(); ev.stopPropagation();
}
if (ev.stopPropagation) {
ev.stopPropagation();
}
ev.cancelBubble = true;
return false; return false;
} }