summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/codeq/console.js42
1 files changed, 31 insertions, 11 deletions
diff --git a/js/codeq/console.js b/js/codeq/console.js
index bc7f3c6..023fcc1 100644
--- a/js/codeq/console.js
+++ b/js/codeq/console.js
@@ -161,11 +161,11 @@
codeq.makeConsole = function (jqElt, options) {
var lines = [], // console content
- maxLines = options.maxLines || 10000, // how many lines to display at most
+ maxLines = (options && options.maxLines) || 10000, // how many lines to display at most
currentRow = 0, // cursor position
currentCol = 0,
- jqContent = $('<div></div>'), // the rendering of the console
- jqInput = $('<textarea style="left: 0; bottom: 0; width: 2px; position: absolute;"></textarea>'), // for receiving keypresses, clipboard content
+ jqContent = $('<div class="cq-con"></div>'), // the rendering of the console
+ jqInput = $('<textarea style="left: -9999px; bottom: 0; width: 2px; position: absolute;"></textarea>'), // for receiving keypresses, clipboard content
inputDisabled = false, // whether to ignore input
lineBuffered = true, // whether we are line-buffered or not buffered
@@ -217,7 +217,7 @@
jqLine.append(jq1);
jqLine.append(jqCursor);
jqLine.append(jq2);
- jq1.text(content.substr(0, currentCol - 1));
+ jq1.text(content.substr(0, currentCol));
jqCursor.text(content.charAt(currentCol));
jq2.text(content.substr(currentCol + 1));
}
@@ -516,6 +516,10 @@
'destroy': function () {
var n = lines.length,
i, lineDescriptor;
+ if (blinkTimer !== null) {
+ clearInterval(blinkTimer);
+ blinkTimer = null;
+ }
// detach all jQuery objects from internal structures
for (i = 0; i < n; i++) {
lineDescriptor = lines[i];
@@ -601,6 +605,8 @@
clipboardPasteInProgress = false, // whether the previous keydown was a CTRL+V or shift+insert
aKeyIsDown = false, // whether a key is currently pressed: if it's not and there is input, then we got a paste via mouse
+ cursorBlinkRate = (options && options.cursorBlinkRate) || 750, // default: 750 ms
+ blinkTimer = null,
i, j, a, b, c;
// copy default key handlers
@@ -668,23 +674,37 @@
// the element supports input events, use them in preference to keypress events
jqInput.on('input', function (evt) {
// this event cannot be prevented/cancelled in the DOM scheme of things, but we can simulate prevention, because we have a "detached" display
- handleInput(evt.input);
+ var t = jqInput.val();
+ jqInput.val('');
+ handleInput(t);
});
}
else {
// the element does not support the "modern" input events, so it ought to support the old keypress events
jqInput.on('keypress', function (evt) {
// this event cannot be prevented/cancelled in the DOM scheme of things, but we can simulate prevention, because we have a "detached" display
- var keyChar = false;
- if ('char' in evt) keyChar = evt.char;
- else if ('charCode' in evt) keyChar = String.fromCharCode(evt.charCode);
- else return; // ignore input
- handleInput(keyChar);
+ var keyChar;
+ try {
+ if ('char' in evt) keyChar = evt.char;
+ else if ('charCode' in evt) keyChar = String.fromCharCode(evt.charCode);
+ else return; // ignore input
+ handleInput(keyChar);
+ }
+ finally {
+ jqInput.val('');
+ }
});
}
+ // start the cursor blinking if so instructed
+ if ((typeof cursorBlinkRate === 'number') && (cursorBlinkRate >= 50)) { // have some sense of sanity
+ blinkTimer = setInterval(function () {
+ jqContent.find('.cq-con-cursor').toggleClass('inverted');
+ }, cursorBlinkRate);
+ }
+
// emit greeting if provided
- if (options.greeting) {
+ if (options && options.greeting) {
lines.push({content: options.greeting, className: 'greeting'});
currentRow++;
}