diff --git a/src/common/TaskQueue.ts b/src/common/TaskQueue.ts index 021bb7ce..29c29f64 100644 --- a/src/common/TaskQueue.ts +++ b/src/common/TaskQueue.ts @@ -71,6 +71,8 @@ abstract class TaskQueue implements ITaskQueue { this._idleCallback = undefined; let taskDuration = 0; let longestTask = 0; + let lastDeadlineRemaining = deadline.timeRemaining(); + let deadlineRemaining = 0; while (this._i < this._tasks.length) { taskDuration = Date.now(); if (!this._tasks[this._i]()) { @@ -83,10 +85,17 @@ abstract class TaskQueue implements ITaskQueue { longestTask = Math.max(taskDuration, longestTask); // Guess the following task will take a similar time to the longest task in this batch, allow // additional room to try avoid exceeding the deadline - if (longestTask * 1.5 > deadline.timeRemaining()) { + deadlineRemaining = deadline.timeRemaining(); + if (longestTask * 1.5 > deadlineRemaining) { + // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the + // task should be split into sub-tasks to ensure the UI remains responsive. + if (lastDeadlineRemaining - taskDuration < -20) { + console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`); + } this._start(); return; } + lastDeadlineRemaining = deadlineRemaining; } this.clear(); } diff --git a/src/common/input/Keyboard.test.ts b/src/common/input/Keyboard.test.ts index 68fbaac1..f2d0936b 100644 --- a/src/common/input/Keyboard.test.ts +++ b/src/common/input/Keyboard.test.ts @@ -125,6 +125,12 @@ describe('Keyboard', () => { it('should return \\x1ba for alt+a', () => { assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 65 }, { isMac: false }).key, '\x1ba'); }); + it('should return \\x1b\\x20 for alt+space', () => { + assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 32 }, { isMac: false }).key, '\x1b\x20'); + }); + it('should return \\x1b\\x00 for ctrl+alt+space', () => { + assert.equal(testEvaluateKeyboardEvent({ altKey: true, ctrlKey: true, keyCode: 32 }, { isMac: false }).key, '\x1b\x00'); + }); }); describe('On macOS platforms', () => { diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index 013a7711..225c914e 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -360,6 +360,8 @@ export function evaluateKeyboardEvent( keyString = keyString.toUpperCase(); } result.key = C0.ESC + keyString; + } else if (ev.keyCode === 32) { + result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' '); } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) { // Reference: https://github.com/xtermjs/xterm.js/issues/3725 // Alt will produce a "dead key" (initate composition) with some