diff options
-rw-r--r-- | util/Flushable.js | 4 | ||||
-rw-r--r-- | util/tui-app.js | 31 |
2 files changed, 29 insertions, 6 deletions
diff --git a/util/Flushable.js b/util/Flushable.js index 318bb52..058d186 100644 --- a/util/Flushable.js +++ b/util/Flushable.js @@ -31,6 +31,10 @@ module.exports = class Flushable { resizeScreen({lines, cols}) { this.screenLines = lines this.screenCols = cols + this.clearLastFrame() + } + + clearLastFrame() { this.lastFrame = undefined } diff --git a/util/tui-app.js b/util/tui-app.js index 7ee0480..0b845ea 100644 --- a/util/tui-app.js +++ b/util/tui-app.js @@ -28,18 +28,36 @@ module.exports = async function tuiApp(callback) { root.fixAllLayout(); }); - const clean = function() { + const cleanTerminal = function () { process.stdout.write(ansi.cleanCursor()); process.stdout.write(ansi.disableAlternateScreen()); }; - const quitProgram = function(status = 0) { - clean(); + const dirtyTerminal = function () { + process.stdout.write(ansi.enableAlternateScreen()); + process.stdout.write(ansi.startTrackingMouse()); + }; + + const quitProgram = function (status = 0) { + cleanTerminal(); process.exit(status); }; - const startRenderLoop = function() { - process.stdout.write(ansi.enableAlternateScreen()); + const suspendProgram = function () { + cleanTerminal(); + process.kill(process.pid, 'SIGTSTP'); + }; + + const startRenderLoop = function () { + dirtyTerminal(); + + process.on('SIGCONT', () => { + flushable.clearLastFrame(); + process.stdin.setRawMode(false); + process.stdin.setRawMode(true); + dirtyTerminal(); + }); + setInterval(() => { root.renderTo(flushable); flushable.flush(); @@ -50,10 +68,11 @@ module.exports = async function tuiApp(callback) { return await callback({ root, startRenderLoop, + suspendProgram, quitProgram }); } catch (error) { - clean(); + cleanTerminal(); console.error(error); process.exit(1); }; |