« get me outta code hell

tui-lib - Pure Node.js library for making visual command-line programs (ala vim, ncdu)
about summary refs log tree commit diff
path: root/util/tui-app.js
diff options
context:
space:
mode:
Diffstat (limited to 'util/tui-app.js')
-rw-r--r--util/tui-app.js31
1 files changed, 25 insertions, 6 deletions
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);
     };