about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--apps/browse/paginated-screen.mu218
1 files changed, 210 insertions, 8 deletions
diff --git a/apps/browse/paginated-screen.mu b/apps/browse/paginated-screen.mu
index 44d112ba..86ec5b6b 100644
--- a/apps/browse/paginated-screen.mu
+++ b/apps/browse/paginated-screen.mu
@@ -16,10 +16,12 @@ type paginated-screen {
   page-width: int
   top-margin: int
   left-margin: int
+  # page bounds
   toprow: int
-  botrow: int
+  botrow: int  # (inclusive)
   leftcol: int
-  rightcol: int
+  rightcol: int  # (exclusive)
+  # current cursor position
   row: int
   col: int
 }
@@ -57,11 +59,12 @@ fn initialize-paginated-screen _self: (addr paginated-screen), page-width: int,
     dest <- get self, left-margin
     copy-to *dest, tmp
   }
-  # self->toprow = top-margin
+  # self->toprow = 1 + top-margin
   {
     var tmp/eax: int <- copy top-margin
     dest <- get self, toprow
-    copy-to *dest, tmp
+    copy-to *dest, 1
+    add-to *dest, tmp
   }
   # self->botrow = nrows
   {
@@ -77,16 +80,24 @@ fn start-drawing _self: (addr paginated-screen) {
   clear-paginated-screen self
   var tmp/eax: (addr int) <- copy 0
   var tmp2/ecx: int <- copy 0
-  # self->leftcol = left-margin
+  # self->leftcol = 1 + left-margin
   tmp <- get self, left-margin
   tmp2 <- copy *tmp
   tmp <- get self, leftcol
-  copy-to *tmp, tmp2
+  copy-to *tmp, 1
+  add-to *tmp, tmp2
+#?   print-string-to-real-screen "start: left column: "
+#?   print-int32-hex-to-real-screen *tmp
   # self->rightcol = self->leftcol + page-width
   tmp <- get self, page-width
   tmp2 <- copy *tmp
+  tmp <- get self, leftcol
+  tmp2 <- add *tmp
   tmp <- get self, rightcol
-  copy-to *tmp, tmp2  # left-margin + page-width
+  copy-to *tmp, tmp2
+#?   print-string-to-real-screen "; right column: "
+#?   print-int32-hex-to-real-screen *tmp
+#?   print-string-to-real-screen "\n"
   # self->row = self->toprow
   tmp <- get self, toprow
   tmp2 <- copy *tmp
@@ -143,7 +154,7 @@ $add-grapheme:body: {
   tmp <- get self, rightcol
   compare tmp2, *tmp
   {
-    break-if-<=
+    break-if-<
     next-line self
     reposition-cursor self
   }
@@ -164,6 +175,189 @@ fn test-print-grapheme-on-paginated-screen {
   check-screen-row screen-addr, 1, "a", "F - test-print-grapheme-on-paginated-screen"
 }
 
+fn test-print-single-page {
+  var pg-on-stack: paginated-screen
+  var pg/eax: (addr paginated-screen) <- address pg-on-stack
+  initialize-fake-paginated-screen pg, 2, 4, 2, 0, 0  # 2 rows, 4 columns, 2 pages * 2 columns each
+  start-drawing pg
+  # pages at columns [1, 3), [3, 5]
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x61   # 'a'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x62   # 'b'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x63   # 'c'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x64   # 'd'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var screen-ah/eax: (addr handle screen) <- get pg, screen
+  var screen-addr/eax: (addr screen) <- lookup *screen-ah
+  check-screen-row screen-addr, 1, "ab  ", "F - test-print-single-page/row1"
+  check-screen-row screen-addr, 2, "cd  ", "F - test-print-single-page/row2"
+  # currently it's hard-coded that we avoid printing to the bottom-most row of the screen
+}
+
+fn test-print-multiple-pages {
+  var pg-on-stack: paginated-screen
+  var pg/eax: (addr paginated-screen) <- address pg-on-stack
+  initialize-fake-paginated-screen pg, 2, 2, 1, 0, 0  # 2 rows, 2 columns, 2 pages * 1 column each
+  start-drawing pg
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x61   # 'a'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x62   # 'b'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x63   # 'c'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x64   # 'd'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var screen-ah/eax: (addr handle screen) <- get pg, screen
+  var screen-addr/eax: (addr screen) <- lookup *screen-ah
+  check-screen-row screen-addr, 1, "ac", "F - test-print-multiple-pages/row1"
+  check-screen-row screen-addr, 2, "bd", "F - test-print-multiple-pages/row2"
+  # currently it's hard-coded that we avoid printing to the bottom-most row of the screen
+}
+
+fn test-print-multiple-pages-2 {
+  var pg-on-stack: paginated-screen
+  var pg/eax: (addr paginated-screen) <- address pg-on-stack
+  initialize-fake-paginated-screen pg, 2, 4, 2, 0, 0  # 2 rows, 4 columns, 2 pages * 2 columns each
+  start-drawing pg
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x61   # 'a'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x62   # 'b'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x63   # 'c'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x64   # 'd'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x65   # 'e'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x66   # 'f'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x67   # 'g'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var c/ecx: grapheme <- copy 0x68   # 'h'
+  add-grapheme pg, c
+#?   {
+#?     var foo/eax: boolean <- done-drawing? pg
+#?     var foo2/eax: int <- copy foo
+#?     print-int32-hex-to-real-screen foo2
+#?     print-string-to-real-screen "\n"
+#?   }
+  var screen-ah/eax: (addr handle screen) <- get pg, screen
+  var screen-addr/eax: (addr screen) <- lookup *screen-ah
+  check-screen-row screen-addr, 1, "abef", "F - test-print-multiple-pages-2/row1"
+  check-screen-row screen-addr, 2, "cdgh", "F - test-print-multiple-pages-2/row2"
+  # currently it's hard-coded that we avoid printing to the bottom-most row of the screen
+}
+
 fn initialize-fake-paginated-screen _self: (addr paginated-screen), nrows: int, ncols: int, page-width: int, top-margin: int, left-margin: int {
   var self/esi: (addr paginated-screen) <- copy _self
   var screen-ah/eax: (addr handle screen) <- get self, screen
@@ -179,6 +373,11 @@ fn reposition-cursor _self: (addr paginated-screen) {
   var self/esi: (addr paginated-screen) <- copy _self
   var r/ecx: (addr int) <- get self, row
   var c/edx: (addr int) <- get self, col
+#?   print-string-to-real-screen "reposition cursor: "
+#?   print-int32-hex-to-real-screen *r
+#?   print-string-to-real-screen ", "
+#?   print-int32-hex-to-real-screen *c
+#?   print-string-to-real-screen "\n"
   var screen-ah/eax: (addr handle screen) <- get self, screen
   var screen-addr/eax: (addr screen) <- lookup *screen-ah
   move-cursor screen-addr, *r *c
@@ -247,6 +446,9 @@ fn next-line _self: (addr paginated-screen) {
   # self->row++
   tmp <- get self, row
   increment *tmp
+#?   print-string-to-real-screen "next-line: row: "
+#?   print-int32-hex-to-real-screen *tmp
+#?   print-string-to-real-screen "\n"
   # if (self->row > self->botrow) next-page(self)
   tmp2 <- copy *tmp
   tmp <- get self, botrow