From ee1a18f050a5458ade460720091e20ce6b335011 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Thu, 18 May 2017 09:44:37 -0700 Subject: 3860 - stop buffering the screen in termbox To achieve this we have to switch to a model of the screen in termbox that is closer to the underlying terminal. Before: a screen is a grid of characters writing out of bounds does nothing After: a screen is a scrolling raster of characters writing out of bounds wraps to next line and scrolls if necessary To move to the new model, it was essential that I migrate my fake screen at the same time to mimic it. This is why the first attempt (commit 3824) failed (commit 3858). This is also why this commit can't be split into smaller pieces. The fake screen now 'scrolls' by rotating screen lines from top to bottom. There's still no notion of a scrollback buffer. The newer model is richer; it permits repl-like apps that upstream termbox can't do easily. It also permits us to simply use `printf` or `cout` to write to the screen, and everything mostly works as you would expect. Exceptions: a) '\n' won't do what you expect. You need to explicitly print both '\n' and '\r'. b) backspace won't do what you expect. It only moves the cursor back, without erasing the previous character. It does not wrap. Both behaviors exactly mimic my existing terminal's emulation of vt100. The catch: it's easy to accidentally scroll in apps. Out-of-bounds prints didn't matter before, but they're bugs now. To help track them down, use the `save-top-idx`, `assert-no-scroll` pair of helpers. An important trick is to wrap the cursor before rather after printing a character. Otherwise we end up scrolling every time we print to the bottom-right character. This means that the cursor position can be invalid at the start of a print, and we need to handle that. In the process we also lose the ability to hide and show the screen. We have to show the prints happening. Seems apt for a "white-box" platform like Mu. --- sandbox/001-editor.mu | 2 -- sandbox/002-typing.mu | 5 +++++ sandbox/004-programming-environment.mu | 8 +++----- sandbox/005-sandbox.mu | 4 ---- sandbox/006-sandbox-copy.mu | 2 -- sandbox/007-sandbox-delete.mu | 2 -- sandbox/008-sandbox-edit.mu | 2 -- sandbox/009-sandbox-test.mu | 2 -- sandbox/010-sandbox-trace.mu | 2 -- 9 files changed, 8 insertions(+), 21 deletions(-) (limited to 'sandbox') diff --git a/sandbox/001-editor.mu b/sandbox/001-editor.mu index d81278ae..a6dde85b 100644 --- a/sandbox/001-editor.mu +++ b/sandbox/001-editor.mu @@ -6,10 +6,8 @@ def main text:text [ local-scope load-ingredients open-console - hide-screen 0/screen e:&:editor <- new-editor text, 0/left, 5/right render 0/screen, e - show-screen 0/screen wait-for-event 0/console close-console ] diff --git a/sandbox/002-typing.mu b/sandbox/002-typing.mu index 8c48f147..16693429 100644 --- a/sandbox/002-typing.mu +++ b/sandbox/002-typing.mu @@ -264,6 +264,7 @@ def insert-at-cursor editor:&:editor, c:char, screen:&:screen -> go-render?:bool def editor-render screen:&:screen, editor:&:editor -> screen:&:screen, editor:&:editor [ local-scope load-ingredients + old-top-idx:num <- save-top-idx screen left:num <- get *editor, left:offset right:num <- get *editor, right:offset row:num, column:num <- render screen, editor @@ -272,6 +273,7 @@ def editor-render screen:&:screen, editor:&:editor -> screen:&:screen, editor:&: draw-horizontal screen, row, left, right, 9480/horizontal-dotted row <- add row, 1 clear-screen-from screen, row, left, left, right + assert-no-scroll screen, old-top-idx ] scenario editor-handles-empty-event-queue [ @@ -1057,6 +1059,9 @@ after [ def draw-horizontal screen:&:screen, row:num, x:num, right:num -> screen:&:screen [ local-scope load-ingredients + height:num <- screen-height screen + past-bottom?:bool <- greater-or-equal row, height + return-if past-bottom? style:char, style-found?:bool <- next-ingredient { break-if style-found? diff --git a/sandbox/004-programming-environment.mu b/sandbox/004-programming-environment.mu index 0f1280e3..53f9f846 100644 --- a/sandbox/004-programming-environment.mu +++ b/sandbox/004-programming-environment.mu @@ -79,7 +79,6 @@ def event-loop screen:&:screen, console:&:console, env:&:environment, resources: } # not global and not a touch event { - hide-screen screen render?:bool <- handle-keyboard-event screen, current-sandbox, e:event break-unless render? # try to batch up rendering if there are more events queued up @@ -93,7 +92,6 @@ def event-loop screen:&:screen, console:&:console, env:&:environment, resources: } +finish-event screen <- update-cursor screen, current-sandbox, env - show-screen screen } loop } @@ -199,7 +197,7 @@ def render-all screen:&:screen, env:&:environment, {render-editor: (recipe (addr local-scope load-ingredients trace 10, [app], [render all] - hide-screen screen + old-top-idx:num <- save-top-idx screen # top menu trace 11, [app], [render top menu] width:num <- screen-width screen @@ -211,12 +209,12 @@ def render-all screen:&:screen, env:&:environment, {render-editor: (recipe (addr print screen, [ run (F4) ], 255/white, 161/reddish # screen <- render-sandbox-side screen, env, render-editor - + # no early returns permitted # current-sandbox:&:editor <- get *env, current-sandbox:offset screen <- update-cursor screen, current-sandbox, env # - show-screen screen + assert-no-scroll screen, old-top-idx ] # replaced in a later layer diff --git a/sandbox/005-sandbox.mu b/sandbox/005-sandbox.mu index e9500797..a7df7a54 100644 --- a/sandbox/005-sandbox.mu +++ b/sandbox/005-sandbox.mu @@ -793,9 +793,7 @@ after [ render-from <- add render-from, 1 *env <- put *env, render-from:offset, render-from } - hide-screen screen screen <- render-sandbox-side screen, env, render - show-screen screen jump +finish-event } ] @@ -822,9 +820,7 @@ after [ break-if at-beginning? render-from <- subtract render-from, 1 *env <- put *env, render-from:offset, render-from - hide-screen screen screen <- render-sandbox-side screen, env, render - show-screen screen jump +finish-event } ] diff --git a/sandbox/006-sandbox-copy.mu b/sandbox/006-sandbox-copy.mu index 995f4c7c..4835f02e 100644 --- a/sandbox/006-sandbox-copy.mu +++ b/sandbox/006-sandbox-copy.mu @@ -140,10 +140,8 @@ after [ break-unless copy? copy?, env <- try-copy-sandbox click-row, env break-unless copy? - hide-screen screen screen <- render-sandbox-side screen, env, render screen <- update-cursor screen, current-sandbox, env - show-screen screen loop +next-event } ] diff --git a/sandbox/007-sandbox-delete.mu b/sandbox/007-sandbox-delete.mu index ddfbf692..107c861c 100644 --- a/sandbox/007-sandbox-delete.mu +++ b/sandbox/007-sandbox-delete.mu @@ -69,10 +69,8 @@ after [ break-unless delete? delete?, env <- try-delete-sandbox click-row, env break-unless delete? - hide-screen screen screen <- render-sandbox-side screen, env, render screen <- update-cursor screen, current-sandbox, env - show-screen screen loop +next-event } ] diff --git a/sandbox/008-sandbox-edit.mu b/sandbox/008-sandbox-edit.mu index cb19ebc4..ec4fd578 100644 --- a/sandbox/008-sandbox-edit.mu +++ b/sandbox/008-sandbox-edit.mu @@ -111,10 +111,8 @@ after [ break-unless edit? edit?, env <- try-edit-sandbox click-row, env break-unless edit? - hide-screen screen screen <- render-sandbox-side screen, env, render screen <- update-cursor screen, current-sandbox, env - show-screen screen loop +next-event } ] diff --git a/sandbox/009-sandbox-test.mu b/sandbox/009-sandbox-test.mu index d7b8ed62..1c24bcb8 100644 --- a/sandbox/009-sandbox-test.mu +++ b/sandbox/009-sandbox-test.mu @@ -132,10 +132,8 @@ after [ # toggle its expected-response, and save session sandbox <- toggle-expected-response sandbox save-sandboxes env, resources - hide-screen screen screen <- render-sandbox-side screen, env, render screen <- update-cursor screen, current-sandbox, env - show-screen screen loop +next-event } ] diff --git a/sandbox/010-sandbox-trace.mu b/sandbox/010-sandbox-trace.mu index f81d4151..27f2915a 100644 --- a/sandbox/010-sandbox-trace.mu +++ b/sandbox/010-sandbox-trace.mu @@ -190,10 +190,8 @@ after [ x:bool <- get *sandbox, display-trace?:offset x <- not x *sandbox <- put *sandbox, display-trace?:offset, x - hide-screen screen screen <- render-sandbox-side screen, env, render screen <- update-cursor screen, current-sandbox, env - show-screen screen loop +next-event } ] -- cgit 1.4.1-2-gfad0