Merge pull request #626 from Tyriar/625_cursor_blink_perf
Use setInterval over animation for cursor blink
This commit is contained in:
+8
-15
@@ -97,16 +97,9 @@
|
|||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.terminal:not(.xterm-cursor-style-underline):not(.xterm-cursor-style-bar).focus.xterm-cursor-blink .terminal-cursor {
|
.terminal:not(.xterm-cursor-style-underline):not(.xterm-cursor-style-bar).focus.xterm-cursor-blink-on .terminal-cursor {
|
||||||
animation: xterm-cursor-blink 1.2s infinite step-end;
|
background-color: transparent;
|
||||||
}
|
color: inherit;
|
||||||
|
|
||||||
@keyframes xterm-cursor-blink {
|
|
||||||
0% { }
|
|
||||||
50% {
|
|
||||||
background-color: transparent;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.terminal.xterm-cursor-style-bar .terminal-cursor,
|
.terminal.xterm-cursor-style-bar .terminal-cursor,
|
||||||
@@ -132,13 +125,13 @@
|
|||||||
right: 0;
|
right: 0;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
}
|
}
|
||||||
|
.terminal.xterm-cursor-style-bar.focus.xterm-cursor-blink.xterm-cursor-blink-on .terminal-cursor::before,
|
||||||
|
.terminal.xterm-cursor-style-underline.focus.xterm-cursor-blink.xterm-cursor-blink-on .terminal-cursor::before {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
.terminal.xterm-cursor-style-bar.focus.xterm-cursor-blink .terminal-cursor::before,
|
.terminal.xterm-cursor-style-bar.focus.xterm-cursor-blink .terminal-cursor::before,
|
||||||
.terminal.xterm-cursor-style-underline.focus.xterm-cursor-blink .terminal-cursor::before {
|
.terminal.xterm-cursor-style-underline.focus.xterm-cursor-blink .terminal-cursor::before {
|
||||||
animation: xterm-cursor-non-bar-blink 1.2s infinite step-end;
|
background-color: #fff;
|
||||||
}
|
|
||||||
@keyframes xterm-cursor-non-bar-blink {
|
|
||||||
0% { background-color: #fff; }
|
|
||||||
50% { background-color: transparent; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.terminal .composition-view {
|
.terminal .composition-view {
|
||||||
|
|||||||
+37
-2
@@ -52,6 +52,13 @@ var WRITE_BUFFER_PAUSE_THRESHOLD = 5;
|
|||||||
*/
|
*/
|
||||||
var WRITE_BATCH_SIZE = 300;
|
var WRITE_BATCH_SIZE = 300;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time between cursor blinks. This is driven by JS rather than a CSS
|
||||||
|
* animation due to a bug in Chromium that causes it to use excessive CPU time.
|
||||||
|
* See https://github.com/Microsoft/vscode/issues/22900
|
||||||
|
*/
|
||||||
|
var CURSOR_BLINK_INTERVAL = 600;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Terminal
|
* Terminal
|
||||||
*/
|
*/
|
||||||
@@ -159,6 +166,7 @@ function Terminal(options) {
|
|||||||
this.scrollTop = 0;
|
this.scrollTop = 0;
|
||||||
this.scrollBottom = this.rows - 1;
|
this.scrollBottom = this.rows - 1;
|
||||||
this.customKeydownHandler = null;
|
this.customKeydownHandler = null;
|
||||||
|
this.cursorBlinkInterval = null;
|
||||||
|
|
||||||
// modes
|
// modes
|
||||||
this.applicationKeypad = false;
|
this.applicationKeypad = false;
|
||||||
@@ -423,7 +431,7 @@ Terminal.prototype.setOption = function(key, value) {
|
|||||||
this[key] = value;
|
this[key] = value;
|
||||||
this.options[key] = value;
|
this.options[key] = value;
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case 'cursorBlink': this.element.classList.toggle('xterm-cursor-blink', value); break;
|
case 'cursorBlink': this.setCursorBlinking(value); break;
|
||||||
case 'cursorStyle':
|
case 'cursorStyle':
|
||||||
// Style 'block' applies with no class
|
// Style 'block' applies with no class
|
||||||
this.element.classList.toggle(`xterm-cursor-style-underline`, value === 'underline');
|
this.element.classList.toggle(`xterm-cursor-style-underline`, value === 'underline');
|
||||||
@@ -433,6 +441,29 @@ Terminal.prototype.setOption = function(key, value) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Terminal.prototype.restartCursorBlinking = function () {
|
||||||
|
this.setCursorBlinking(this.options.cursorBlink);
|
||||||
|
};
|
||||||
|
|
||||||
|
Terminal.prototype.setCursorBlinking = function (enabled) {
|
||||||
|
this.element.classList.toggle('xterm-cursor-blink', enabled);
|
||||||
|
this.clearCursorBlinkingInterval();
|
||||||
|
if (enabled) {
|
||||||
|
var self = this;
|
||||||
|
this.cursorBlinkInterval = setInterval(function () {
|
||||||
|
self.element.classList.toggle('xterm-cursor-blink-on');
|
||||||
|
}, CURSOR_BLINK_INTERVAL);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Terminal.prototype.clearCursorBlinkingInterval = function () {
|
||||||
|
this.element.classList.remove('xterm-cursor-blink-on');
|
||||||
|
if (this.cursorBlinkInterval) {
|
||||||
|
clearInterval(this.cursorBlinkInterval);
|
||||||
|
this.cursorBlinkInterval = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds the desired focus behavior on a given terminal object.
|
* Binds the desired focus behavior on a given terminal object.
|
||||||
*
|
*
|
||||||
@@ -445,6 +476,7 @@ Terminal.bindFocus = function (term) {
|
|||||||
}
|
}
|
||||||
term.element.classList.add('focus');
|
term.element.classList.add('focus');
|
||||||
term.showCursor();
|
term.showCursor();
|
||||||
|
term.restartCursorBlinking.apply(term);
|
||||||
Terminal.focus = term;
|
Terminal.focus = term;
|
||||||
term.emit('focus', {terminal: term});
|
term.emit('focus', {terminal: term});
|
||||||
});
|
});
|
||||||
@@ -469,6 +501,7 @@ Terminal.bindBlur = function (term) {
|
|||||||
term.send(C0.ESC + '[O');
|
term.send(C0.ESC + '[O');
|
||||||
}
|
}
|
||||||
term.element.classList.remove('focus');
|
term.element.classList.remove('focus');
|
||||||
|
term.clearCursorBlinkingInterval.apply(term);
|
||||||
Terminal.focus = null;
|
Terminal.focus = null;
|
||||||
term.emit('blur', {terminal: term});
|
term.emit('blur', {terminal: term});
|
||||||
});
|
});
|
||||||
@@ -594,7 +627,7 @@ Terminal.prototype.open = function(parent) {
|
|||||||
this.element.classList.add('terminal');
|
this.element.classList.add('terminal');
|
||||||
this.element.classList.add('xterm');
|
this.element.classList.add('xterm');
|
||||||
this.element.classList.add('xterm-theme-' + this.theme);
|
this.element.classList.add('xterm-theme-' + this.theme);
|
||||||
this.element.classList.toggle('xterm-cursor-blink', this.options.cursorBlink);
|
this.setCursorBlinking(this.options.cursorBlink);
|
||||||
|
|
||||||
this.element.style.height
|
this.element.style.height
|
||||||
this.element.setAttribute('tabindex', 0);
|
this.element.setAttribute('tabindex', 0);
|
||||||
@@ -1336,6 +1369,8 @@ Terminal.prototype.keyDown = function(ev) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.restartCursorBlinking();
|
||||||
|
|
||||||
if (!this.compositionHelper.keydown.bind(this.compositionHelper)(ev)) {
|
if (!this.compositionHelper.keydown.bind(this.compositionHelper)(ev)) {
|
||||||
if (this.ybase !== this.ydisp) {
|
if (this.ybase !== this.ydisp) {
|
||||||
this.scrollToBottom();
|
this.scrollToBottom();
|
||||||
|
|||||||
Reference in New Issue
Block a user