about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-06-21 00:19:17 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-06-21 00:19:17 -0700
commitc518212143598243cd803fb2656c111c521c3565 (patch)
treefef9ab0d20527d3b633242175d8b0d4f0a894c13
parent18429d408e727f5cf1c96416cda614c124fd0ae7 (diff)
downloadmu-c518212143598243cd803fb2656c111c521c3565.tar.gz
1613 - edit: first event in event loop
No way to quit yet, though.
-rw-r--r--078mouse.mu6
-rw-r--r--edit.mu61
2 files changed, 63 insertions, 4 deletions
diff --git a/078mouse.mu b/078mouse.mu
index 614b986f..c00dc9e9 100644
--- a/078mouse.mu
+++ b/078mouse.mu
@@ -31,13 +31,13 @@ recipe read-event [
       done?:boolean <- greater-or-equal idx:address:number/deref, max:number
       break-unless done?:boolean
       dummy:address:event <- new event:type
-      reply dummy:address:event/deref, x:address:events/same-as-ingredient:0, 1:literal/found
+      reply dummy:address:event/deref, x:address:events/same-as-ingredient:0, 1:literal/found, 1:literal/quit
     }
     result:event <- index buf:address:array:event/deref, idx:address:number/deref
     idx:address:number/deref <- add idx:address:number/deref, 1:literal
-    reply result:event, x:address:events/same-as-ingredient:0, 1:literal/found
+    reply result:event, x:address:events/same-as-ingredient:0, 1:literal/found, 0:literal/quit
   }
   # real event source
   result:event, found?:boolean <- read-keyboard-or-mouse-event
-  reply result:event, x:address:events/same-as-ingredient:0, found?:boolean
+  reply result:event, x:address:events/same-as-ingredient:0, found?:boolean, 0:literal/quit
 ]
diff --git a/edit.mu b/edit.mu
index dec89e88..f2a90484 100644
--- a/edit.mu
+++ b/edit.mu
@@ -276,11 +276,70 @@ recipe event-loop [
   events:address <- next-ingredient
   editor:address:editor-data <- next-ingredient
   {
-    _, _, found?:boolean <- read-event 0:literal/events
+    +next-event
+    e:event, events:address, found?:boolean, quit?:boolean <- read-event events:address
     loop-unless found?:boolean
+    break-if quit?:boolean
+    trace [app], [next-event]
+    {
+      m:address:mouse-event <- maybe-convert e:event, mouse:variant
+      break-unless m:address:mouse-event
+      editor:address:editor-data <- move-cursor-in-editor editor:address:editor-data, m:address:mouse-event
+      loop +next-event:label
+    }
+    k:address:keyboard-event <- maybe-convert e:event, keyboard:variant
+    assert k:address:keyboard-event, [event was of unknown type; neither keyboard nor mouse]
+    loop
   }
 ]
 
+recipe move-cursor-in-editor [
+  default-space:address:array:location <- new location:type, 30:literal
+  editor:address:editor-data <- next-ingredient
+  m:address:mouse-event <- next-ingredient
+  row:address:number <- get-address editor:address:editor-data/deref, cursor-row:offset
+  row:address:number/deref <- get m:address:mouse-event/deref, row:offset
+  column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
+  column:address:number/deref <- get m:address:mouse-event/deref, column:offset
+  # todo: adjust 'cursor' pointer into editor data
+]
+
+scenario editor-handles-empty-event-queue [
+  assume-screen 10:literal/width, 5:literal/height
+  assume-events []
+  run [
+    s:address:array:character <- new [abc]
+    editor:address:editor-data <- new-editor s:address:array:character, screen:address, 0:literal/top, 0:literal/left, 5:literal/right
+    event-loop screen:address, events:address, editor:address:editor-data
+  ]
+  screen-should-contain [
+    .abc       .
+    .          .
+  ]
+]
+
+scenario editor-handles-mouse-clicks [
+  assume-screen 10:literal/width, 5:literal/height
+  assume-events [
+    left-click 0, 1
+  ]
+  run [
+    1:address:array:character <- new [abc]
+    2:address:editor-data <- new-editor 1:address:array:character, screen:address, 0:literal/top, 0:literal/left, 5:literal/right
+    event-loop screen:address, events:address, 2:address:editor-data
+    3:number <- get 2:address:editor-data/deref, cursor-row:offset
+    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+  ]
+  screen-should-contain [
+    .abc       .
+    .          .
+  ]
+  memory-should-contain [
+    3 <- 0  # cursor is at row 0..
+    4 <- 1  # ..and column 1
+  ]
+]
+
 ## helpers for drawing editor borders
 
 recipe draw-box [