return this.on(type, on);
};
EventEmitter.prototype.emit = function (type) {
+ var args = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ args[_i - 1] = arguments[_i];
+ }
if (!this._events[type]) {
return;
}
- var args = Array.prototype.slice.call(arguments, 1);
var obj = this._events[type];
for (var i = 0; i < obj.length; i++) {
obj[i].apply(this, args);
if (ch === EscapeSequences_1.C0.ESC || ch === EscapeSequences_1.C0.BEL) {
if (ch === EscapeSequences_1.C0.ESC)
this._position++;
+ var pt = void 0;
+ var valid = void 0;
switch (this._terminal.prefix) {
case '':
break;
case '$q':
- var pt = this._terminal.currentParam, valid = false;
+ pt = this._terminal.currentParam;
+ valid = false;
switch (pt) {
case '"q':
pt = '0"q';
case '+p':
break;
case '+q':
- pt = this._terminal.currentParam
- , valid = false;
+ pt = this._terminal.currentParam;
+ valid = false;
this._terminal.send(EscapeSequences_1.C0.ESC + 'P' + +valid + '+r' + pt + EscapeSequences_1.C0.ESC + '\\');
break;
default:
break;
}
}
+ return this._state;
};
Parser.prototype.setState = function (state) {
this._state = state;
},{"./Charsets":1,"./EscapeSequences":3}],8:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
+var DomElementObjectPool_1 = require("./utils/DomElementObjectPool");
var MAX_REFRESH_FRAME_SKIP = 5;
var FLAGS;
(function (FLAGS) {
this._refreshRowsQueue = [];
this._refreshFramesSkipped = 0;
this._refreshAnimationFrame = null;
+ this._spanElementObjectPool = new DomElementObjectPool_1.DomElementObjectPool('span');
if (brokenBold === null) {
brokenBold = checkBoldBroken(this._terminal.element);
}
+ this._spanElementObjectPool = new DomElementObjectPool_1.DomElementObjectPool('span');
}
Renderer.prototype.queueRefresh = function (start, end) {
this._refreshRowsQueue.push({ start: start, end: end });
this._refresh(start, end);
};
Renderer.prototype._refresh = function (start, end) {
- var x, y, i, line, out, ch, ch_width, width, data, attr, bg, fg, flags, row, parent, focused = document.activeElement;
+ var parent;
if (end - start >= this._terminal.rows / 2) {
parent = this._terminal.element.parentNode;
if (parent) {
this._terminal.element.removeChild(this._terminal.rowContainer);
}
}
- width = this._terminal.cols;
- y = start;
+ var width = this._terminal.cols;
+ var y = start;
if (end >= this._terminal.rows) {
this._terminal.log('`end` is too large. Most likely a bad CSR.');
end = this._terminal.rows - 1;
}
for (; y <= end; y++) {
- row = y + this._terminal.ydisp;
- line = this._terminal.lines.get(row);
- if (!line || !this._terminal.children[y]) {
- continue;
- }
- out = '';
- if (this._terminal.y === y - (this._terminal.ybase - this._terminal.ydisp)
- && this._terminal.cursorState
- && !this._terminal.cursorHidden) {
+ var row = y + this._terminal.ydisp;
+ var line = this._terminal.lines.get(row);
+ var x = void 0;
+ if (this._terminal.y === y - (this._terminal.ybase - this._terminal.ydisp) &&
+ this._terminal.cursorState &&
+ !this._terminal.cursorHidden) {
x = this._terminal.x;
}
else {
x = -1;
}
- attr = this._terminal.defAttr;
- i = 0;
- for (; i < width; i++) {
- if (!line[i]) {
+ var attr = this._terminal.defAttr;
+ var documentFragment = document.createDocumentFragment();
+ var innerHTML = '';
+ var currentElement = void 0;
+ while (this._terminal.children[y].children.length) {
+ var child = this._terminal.children[y].children[0];
+ this._terminal.children[y].removeChild(child);
+ this._spanElementObjectPool.release(child);
+ }
+ for (var i = 0; i < width; i++) {
+ var data = line[i][0];
+ var ch = line[i][1];
+ var ch_width = line[i][2];
+ if (!ch_width) {
continue;
}
- data = line[i][0];
- ch = line[i][1];
- ch_width = line[i][2];
- if (!ch_width)
- continue;
- if (i === x)
+ if (i === x) {
data = -1;
+ }
if (data !== attr) {
if (attr !== this._terminal.defAttr) {
- out += '</span>';
+ if (innerHTML) {
+ currentElement.innerHTML = innerHTML;
+ innerHTML = '';
+ }
+ documentFragment.appendChild(currentElement);
+ currentElement = null;
}
if (data !== this._terminal.defAttr) {
+ if (innerHTML && !currentElement) {
+ currentElement = this._spanElementObjectPool.acquire();
+ }
+ if (currentElement) {
+ if (innerHTML) {
+ currentElement.innerHTML = innerHTML;
+ innerHTML = '';
+ }
+ documentFragment.appendChild(currentElement);
+ }
+ currentElement = this._spanElementObjectPool.acquire();
if (data === -1) {
- out += '<span class="reverse-video terminal-cursor">';
+ currentElement.classList.add('reverse-video', 'terminal-cursor');
}
else {
- var classNames = [];
- bg = data & 0x1ff;
- fg = (data >> 9) & 0x1ff;
- flags = data >> 18;
+ var bg = data & 0x1ff;
+ var fg = (data >> 9) & 0x1ff;
+ var flags = data >> 18;
if (flags & FLAGS.BOLD) {
if (!brokenBold) {
- classNames.push('xterm-bold');
+ currentElement.classList.add('xterm-bold');
}
- if (fg < 8)
+ if (fg < 8) {
fg += 8;
+ }
}
if (flags & FLAGS.UNDERLINE) {
- classNames.push('xterm-underline');
+ currentElement.classList.add('xterm-underline');
}
if (flags & FLAGS.BLINK) {
- classNames.push('xterm-blink');
+ currentElement.classList.add('xterm-blink');
}
if (flags & FLAGS.INVERSE) {
- bg = [fg, fg = bg][0];
- if ((flags & 1) && fg < 8)
+ var temp = bg;
+ bg = fg;
+ fg = temp;
+ if ((flags & 1) && fg < 8) {
fg += 8;
+ }
}
if (flags & FLAGS.INVISIBLE) {
- classNames.push('xterm-hidden');
+ currentElement.classList.add('xterm-hidden');
}
if (flags & FLAGS.INVERSE) {
if (bg === 257) {
}
}
if (bg < 256) {
- classNames.push('xterm-bg-color-' + bg);
+ currentElement.classList.add("xterm-bg-color-" + bg);
}
if (fg < 256) {
- classNames.push('xterm-color-' + fg);
+ currentElement.classList.add("xterm-color-" + fg);
}
- out += '<span';
- if (classNames.length) {
- out += ' class="' + classNames.join(' ') + '"';
- }
- out += '>';
}
}
}
if (ch_width === 2) {
- out += '<span class="xterm-wide-char">';
+ innerHTML += "<span class=\"xterm-wide-char\">" + ch + "</span>";
}
- switch (ch) {
- case '&':
- out += '&';
- break;
- case '<':
- out += '<';
- break;
- case '>':
- out += '>';
- break;
- default:
- if (ch <= ' ') {
- out += ' ';
- }
- else {
- out += ch;
- }
- break;
+ else if (ch.charCodeAt(0) > 255) {
+ innerHTML += "<span class=\"xterm-normal-char\">" + ch + "</span>";
}
- if (ch_width === 2) {
- out += '</span>';
+ else {
+ switch (ch) {
+ case '&':
+ innerHTML += '&';
+ break;
+ case '<':
+ innerHTML += '<';
+ break;
+ case '>':
+ innerHTML += '>';
+ break;
+ default:
+ if (ch <= ' ') {
+ innerHTML += ' ';
+ }
+ else {
+ innerHTML += ch;
+ }
+ break;
+ }
}
attr = data;
}
- if (attr !== this._terminal.defAttr) {
- out += '</span>';
+ if (innerHTML && !currentElement) {
+ currentElement = this._spanElementObjectPool.acquire();
}
- this._terminal.children[y].innerHTML = out;
+ if (currentElement) {
+ if (innerHTML) {
+ currentElement.innerHTML = innerHTML;
+ innerHTML = '';
+ }
+ documentFragment.appendChild(currentElement);
+ currentElement = null;
+ }
+ this._terminal.children[y].appendChild(documentFragment);
}
if (parent) {
this._terminal.element.appendChild(this._terminal.rowContainer);
-},{}],9:[function(require,module,exports){
+},{"./utils/DomElementObjectPool":14}],9:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Viewport = (function () {
return processedText;
}
exports.prepareTextForClipboard = prepareTextForClipboard;
+function prepareTextForTerminal(text, isMSWindows) {
+ if (isMSWindows) {
+ return text.replace(/\r?\n/g, '\n');
+ }
+ return text;
+}
+exports.prepareTextForTerminal = prepareTextForTerminal;
function copyHandler(ev, term) {
var copiedText = window.getSelection().toString(), text = prepareTextForClipboard(copiedText);
if (term.browser.isMSIE) {
ev.stopPropagation();
var text;
var dispatchPaste = function (text) {
+ text = prepareTextForTerminal(text, term.browser.isMSWindows);
term.handler(text);
term.textarea.value = '';
+ term.emit('paste', text);
return term.cancel(ev);
};
if (term.browser.isMSIE) {
-},{"./Generic":14}],12:[function(require,module,exports){
+},{"./Generic":15}],12:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
},{}],14:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
+var DomElementObjectPool = (function () {
+ function DomElementObjectPool(type) {
+ this.type = type;
+ this._type = type;
+ this._pool = [];
+ this._inUse = {};
+ }
+ DomElementObjectPool.prototype.acquire = function () {
+ var element;
+ if (this._pool.length === 0) {
+ element = this._createNew();
+ }
+ else {
+ element = this._pool.pop();
+ }
+ this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)] = element;
+ return element;
+ };
+ DomElementObjectPool.prototype.release = function (element) {
+ if (!this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)]) {
+ throw new Error('Could not release an element not yet acquired');
+ }
+ delete this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)];
+ this._cleanElement(element);
+ this._pool.push(element);
+ };
+ DomElementObjectPool.prototype._createNew = function () {
+ var element = document.createElement(this._type);
+ var id = DomElementObjectPool._objectCount++;
+ element.setAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE, id.toString(10));
+ return element;
+ };
+ DomElementObjectPool.prototype._cleanElement = function (element) {
+ element.className = '';
+ element.innerHTML = '';
+ };
+ return DomElementObjectPool;
+}());
+DomElementObjectPool.OBJECT_ID_ATTRIBUTE = 'data-obj-id';
+DomElementObjectPool._objectCount = 0;
+exports.DomElementObjectPool = DomElementObjectPool;
+
+
+
+},{}],15:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
function contains(arr, el) {
return arr.indexOf(el) >= 0;
}
-},{}],15:[function(require,module,exports){
+},{}],16:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function getCoords(event, rowContainer, charMeasure) {
+ if (event.pageX == null) {
+ return null;
+ }
+ var x = event.pageX;
+ var y = event.pageY;
+ var el = rowContainer;
+ while (el && el !== self.document.documentElement) {
+ x -= el.offsetLeft;
+ y -= el.offsetTop;
+ el = 'offsetParent' in el ? el.offsetParent : el.parentElement;
+ }
+ x = Math.ceil(x / charMeasure.width);
+ y = Math.ceil(y / charMeasure.height);
+ return [x, y];
+}
+exports.getCoords = getCoords;
+function getRawByteCoords(event, rowContainer, charMeasure, colCount, rowCount) {
+ var coords = getCoords(event, rowContainer, charMeasure);
+ var x = coords[0];
+ var y = coords[1];
+ x = Math.min(Math.max(x, 0), colCount);
+ y = Math.min(Math.max(y, 0), rowCount);
+ x += 32;
+ y += 32;
+ return { x: x, y: y };
+}
+exports.getRawByteCoords = getRawByteCoords;
+
+
+
+},{}],17:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var CompositionHelper_1 = require("./CompositionHelper");
var Linkifier_1 = require("./Linkifier");
var CharMeasure_1 = require("./utils/CharMeasure");
var Browser = require("./utils/Browser");
+var Mouse_1 = require("./utils/Mouse");
var document = (typeof window != 'undefined') ? window.document : null;
var WRITE_BUFFER_PAUSE_THRESHOLD = 5;
var WRITE_BATCH_SIZE = 300;
}
};
Terminal.prototype.updateCharSizeCSS = function () {
- this.charSizeStyleElement.textContent = '.xterm-wide-char{width:' + (this.charMeasure.width * 2) + 'px;}';
+ this.charSizeStyleElement.textContent =
+ ".xterm-wide-char{width:" + this.charMeasure.width * 2 + "px;}" +
+ (".xterm-normal-char{width:" + this.charMeasure.width + "px;}");
};
Terminal.prototype.bindMouse = function () {
var el = this.element, self = this, pressed = 32;
function sendButton(ev) {
var button, pos;
button = getButton(ev);
- pos = getCoords(ev);
+ pos = Mouse_1.getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows);
if (!pos)
return;
sendEvent(button, pos);
}
function sendMove(ev) {
var button = pressed, pos;
- pos = getCoords(ev);
+ pos = Mouse_1.getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows);
if (!pos)
return;
button += 32;
button = (32 + (mod << 2)) + button;
return button;
}
- function getCoords(ev) {
- var x, y, w, h, el;
- if (ev.pageX == null)
- return;
- x = ev.pageX;
- y = ev.pageY;
- el = self.element;
- while (el && el !== self.document.documentElement) {
- x -= el.offsetLeft;
- y -= el.offsetTop;
- el = 'offsetParent' in el
- ? el.offsetParent
- : el.parentNode;
- }
- x = Math.ceil(x / self.charMeasure.width);
- y = Math.ceil(y / self.charMeasure.height);
- if (x < 0)
- x = 0;
- if (x > self.cols)
- x = self.cols;
- if (y < 0)
- y = 0;
- if (y > self.rows)
- y = self.rows;
- x += 32;
- y += 32;
- return {
- x: x,
- y: y,
- type: 'wheel'
- };
- }
on(el, 'mousedown', function (ev) {
if (!self.mouseEvents)
return;
}
this.refreshStart = this.y;
this.refreshEnd = this.y;
- this.parser.parse(data);
+ var state = this.parser.parse(data);
+ this.parser.setState(state);
this.updateRange(this.y);
this.refresh(this.refreshStart, this.refreshEnd);
}
-},{"./CompositionHelper":2,"./EscapeSequences":3,"./EventEmitter":4,"./InputHandler":5,"./Linkifier":6,"./Parser":7,"./Renderer":8,"./Viewport":9,"./handlers/Clipboard":10,"./utils/Browser":11,"./utils/CharMeasure":12,"./utils/CircularList":13}]},{},[15])(15)
+},{"./CompositionHelper":2,"./EscapeSequences":3,"./EventEmitter":4,"./InputHandler":5,"./Linkifier":6,"./Parser":7,"./Renderer":8,"./Viewport":9,"./handlers/Clipboard":10,"./utils/Browser":11,"./utils/CharMeasure":12,"./utils/CircularList":13,"./utils/Mouse":16}]},{},[17])(17)
});
//# sourceMappingURL=xterm.js.map