about summary refs log tree commit diff stats
path: root/edit
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-02-01 13:29:46 -0800
committerKartik K. Agaram <vc@akkartik.com>2016-02-01 13:37:12 -0800
commit07a6418389a6c36c0fe9cded6e585fb013ec90e1 (patch)
tree7c6cd399cc2b741b0befc47023cf264cb4796adb /edit
parent34a2336e41daa20f02f20ae995d6c17ea0b3127f (diff)
downloadmu-07a6418389a6c36c0fe9cded6e585fb013ec90e1.tar.gz
2623 - bugfix: editing sandboxes
If you restore 2 sandboxes, the first render was setting
response-starting-row-on-screen on both, without ever rendering a
response. If the lower sandbox contained a print and rendered the screen
instead of the response, the original response-starting-row-on-screen
was never reset. If the process of running the sandboxes caused the
lower sandbox's title bar to move below the now-stale
response-starting-row-on-screen[1], editing the lower sandbox no longer
works.

[1] (Either because the upper sandbox prints to screen as well (causing
the first F4 to move the lower sandbox down by several lines), or
because a fresh sandbox is created with several lines before the first
F4 is hit.)

Current solution: never set response-starting-row-on-screen during
reload (or otherwise when there's no response).

This is hard to test right now because 'restore' is not a tested
interface, and I can't come up with another situation where the
response-starting-row-on-screen goes stale. So I'm now trying to keep
all changes to response-starting-row-on-screen close together. Another
idea is to add a check that the click row lies below the
response-starting row *and* above the start of the next sandbox. (But
what if there's no next sandbox?)

(This bug is really a regression, introduced last Sep in 2163.)
Diffstat (limited to 'edit')
-rw-r--r--edit/005-sandbox.mu6
-rw-r--r--edit/008-sandbox-test.mu13
-rw-r--r--edit/010-warnings.mu1
3 files changed, 15 insertions, 5 deletions
diff --git a/edit/005-sandbox.mu b/edit/005-sandbox.mu
index 244c24f6..a5a0d239 100644
--- a/edit/005-sandbox.mu
+++ b/edit/005-sandbox.mu
@@ -36,7 +36,6 @@ container sandbox-data [
   # constraint: will be 0 for sandboxes at positions before env.render-from
   starting-row-on-screen:number
   code-ending-row-on-screen:number  # past end of code
-  response-starting-row-on-screen:number
   screen:address:shared:screen  # prints in the sandbox go here
   next-sandbox:address:shared:sandbox-data
 ]
@@ -301,7 +300,6 @@ recipe render-sandboxes screen:address:shared:screen, sandbox:address:shared:san
     code-ending-row:address:number <- get-address *sandbox, code-ending-row-on-screen:offset
     *code-ending-row <- copy row
     # render sandbox warnings, screen or response, in that order
-    response-starting-row:address:number <- get-address *sandbox, response-starting-row-on-screen:offset
     sandbox-response:address:shared:array:character <- get *sandbox, response:offset
     <render-sandbox-results>
     {
@@ -312,7 +310,6 @@ recipe render-sandboxes screen:address:shared:screen, sandbox:address:shared:san
     }
     {
       break-unless empty-screen?
-      *response-starting-row <- copy row
       <render-sandbox-response>
       row, screen <- render screen, sandbox-response, left, right, 245/grey, row
     }
@@ -329,8 +326,7 @@ recipe render-sandboxes screen:address:shared:screen, sandbox:address:shared:san
     *tmp <- copy 0
     tmp:address:number <- get-address *sandbox, code-ending-row-on-screen:offset
     *tmp <- copy 0
-    tmp:address:number <- get-address *sandbox, response-starting-row-on-screen:offset
-    *tmp <- copy 0
+    <end-render-sandbox-reset-hidden>
   }
   # draw next sandbox
   next-sandbox:address:shared:sandbox-data <- get *sandbox, next-sandbox:offset
diff --git a/edit/008-sandbox-test.mu b/edit/008-sandbox-test.mu
index fb6dc260..347980aa 100644
--- a/edit/008-sandbox-test.mu
+++ b/edit/008-sandbox-test.mu
@@ -111,6 +111,11 @@ after <global-touch> [
   }
 ]
 
+# this requires tracking where responses begin for every sandbox
+container sandbox-data [
+  response-starting-row-on-screen:number
+]
+
 recipe find-click-in-sandbox-output env:address:shared:programming-environment-data, click-row:number -> sandbox:address:shared:sandbox-data [
   local-scope
   load-ingredients
@@ -156,6 +161,8 @@ recipe toggle-expected-response sandbox:address:shared:sandbox-data -> sandbox:a
 after <render-sandbox-response> [
   {
     break-unless sandbox-response
+    response-starting-row:address:number <- get-address *sandbox, response-starting-row-on-screen:offset
+    *response-starting-row <- copy row
     expected-response:address:shared:array:character <- get *sandbox, expected-response:offset
     break-unless expected-response  # fall-through to print in grey
     response-is-expected?:boolean <- equal expected-response, sandbox-response
@@ -170,3 +177,9 @@ after <render-sandbox-response> [
     jump +render-sandbox-end:label
   }
 ]
+
+before <end-render-sandbox-reset-hidden> [
+  $log sandbox, [resetting response starting row]
+  tmp:address:number <- get-address *sandbox, response-starting-row-on-screen:offset
+  *tmp <- copy 0
+]
diff --git a/edit/010-warnings.mu b/edit/010-warnings.mu
index 5220ad3e..8771a869 100644
--- a/edit/010-warnings.mu
+++ b/edit/010-warnings.mu
@@ -117,6 +117,7 @@ after <render-sandbox-trace-done> [
   {
     sandbox-warnings:address:shared:array:character <- get *sandbox, warnings:offset
     break-unless sandbox-warnings
+    response-starting-row:address:number <- get-address *sandbox, response-starting-row-on-screen:offset
     *response-starting-row <- copy 0  # no response
     row, screen <- render screen, sandbox-warnings, left, right, 1/red, row
     # don't try to print anything more for this sandbox