From 72f417acb5543f24f1de937cef455d8be8add917 Mon Sep 17 00:00:00 2001
From: Florrie <towerofnix@gmail.com>
Date: Sat, 16 Mar 2019 12:05:11 -0300
Subject: Make tui-app boilerplate support ^Z/suspend

---
 util/Flushable.js |  4 ++++
 util/tui-app.js   | 31 +++++++++++++++++++++++++------
 2 files changed, 29 insertions(+), 6 deletions(-)

(limited to 'util')

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);
     };
-- 
cgit 1.3.0-6-gf8a5