about summary refs log tree commit diff stats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
0 files changed, 0 insertions, 0 deletions
iv>
9f484946 ^
6fef33fd ^
45c08fea ^


9f484946 ^
45c08fea ^




6fef33fd ^




45c08fea ^
cc20549c ^
455fbac6 ^
e3092e7b ^

455fbac6 ^
77d5b5d6 ^
104854ca ^
455fbac6 ^

104854ca ^
cc20549c ^
502d2ea5 ^
e3092e7b ^

455fbac6 ^
77d5b5d6 ^
104854ca ^
e3092e7b ^
104854ca ^
cc20549c ^
455fbac6 ^
e3092e7b ^
502d2ea5 ^
cc20549c ^
502d2ea5 ^
455fbac6 ^
104854ca ^
e3092e7b ^
cc20549c ^

104854ca ^
e3092e7b ^
6aa42628 ^
45c08fea ^
104854ca ^
e3092e7b ^

c6c19a27 ^


455fbac6 ^
77d5b5d6 ^
104854ca ^
502d2ea5 ^





e3092e7b ^
f8c0ef3e ^
455fbac6 ^
77d5b5d6 ^
104854ca ^
f8c0ef3e ^
502d2ea5 ^



136412d2 ^
502d2ea5 ^
f8c0ef3e ^


6a0f71b9 ^
455fbac6 ^
77d5b5d6 ^
104854ca ^
6a0f71b9 ^
502d2ea5 ^

6a0f71b9 ^

5e9eff8c ^

455fbac6 ^
77d5b5d6 ^
104854ca ^
5e9eff8c ^
502d2ea5 ^
5e9eff8c ^
bc643692 ^
5e9eff8c ^
104854ca ^
5e9eff8c ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

                                                                            
 


                                                                     
                                              
                     


                                                              
                       




               




                        
                   
                            
                                   

 
                                                                                            
             
                  

                                                                              
                     
                                                                       
                

 
                                                                                                                                 
             
                  
   
                        
                                                                                          
                                                                 
     
                               
                                                                 
                        
                                                  
                                                                 
     

                                                       
                                                               
   
                                                                      
                                                       
                                                            

 


                                                                            
                                                                                                                                   
             
                  





                                                                       
 
 
                                                                                                                                                                                                                    
             
                  
   



                                                                           
                             
                         


        
 
                                                                                        
             
                  
   

                                                    

   

                                                                             
                                                                          
             
                  
   
                        
                                                     
                 
   
                              
 
# Wrappers around interaction primitives that take a potentially fake object
# and are thus easier to test.

exclusive-container event [
  text:character
  keycode:number  # keys on keyboard without a unicode representation
  touch:touch-event  # mouse, track ball, etc.
  resize:resize-event
  # update the assume-console handler if you add more variants
]

container touch-event [
  type:number
  row:number
  column:number
]

container resize-event [
  width:number
  height:number
]

container console [
  current-event-index:number
  events:address:shared:array:event
]

recipe new-fake-console events:address:shared:array:event -> result:address:shared:console [
  local-scope
  load-ingredients
  result:address:shared:console <- new console:type
  buf:address:address:shared:array:event <- get-address *result, events:offset
  *buf <- copy events
  idx:address:number <- get-address *result, current-event-index:offset
  *idx <- copy 0
]

recipe read-event console:address:shared:console -> result:event, console:address:shared:console, found?:boolean, quit?:boolean [
  local-scope
  load-ingredients
  {
    break-unless console
    current-event-index:address:number <- get-address *console, current-event-index:offset
    buf:address:shared:array:event <- get *console, events:offset
    {
      max:number <- length *buf
      done?:boolean <- greater-or-equal *current-event-index, max
      break-unless done?
      dummy:address:shared:event <- new event:type
      reply *dummy, console/same-as-ingredient:0, 1/found, 1/quit
    }
    result <- index *buf, *current-event-index
    *current-event-index <- add *current-event-index, 1
    reply result, console/same-as-ingredient:0, 1/found, 0/quit
  }
  switch  # real event source is infrequent; avoid polling it too much
  result:event, found?:boolean <- check-for-interaction
  reply result, console/same-as-ingredient:0, found?, 0/quit
]

# variant of read-event for just keyboard events. Discards everything that
# isn't unicode, so no arrow keys, page-up/page-down, etc. But you still get
# newlines, tabs, ctrl-d..
recipe read-key console:address:shared:console -> result:character, console:address:shared:console, found?:boolean, quit?:boolean [
  local-scope
  load-ingredients
  x:event, console, found?:boolean, quit?:boolean <- read-event console
  reply-if quit?, 0, console/same-as-ingredient:0, found?, quit?
  reply-unless found?, 0, console/same-as-ingredient:0, found?, quit?
  c:address:character <- maybe-convert x, text:variant
  reply-unless c, 0, console/same-as-ingredient:0, 0/found, 0/quit
  reply *c, console/same-as-ingredient:0, 1/found, 0/quit
]

recipe send-keys-to-channel console:address:shared:console, chan:address:shared:channel, screen:address:shared:screen -> console:address:shared:console, chan:address:shared:channel, screen:address:shared:screen [
  local-scope
  load-ingredients
  {
    c:character, console, found?:boolean, quit?:boolean <- read-key console
    loop-unless found?
    break-if quit?
    assert c, [invalid event, expected text]
    screen <- print screen, c
    chan <- write chan, c
    loop
  }
]

recipe wait-for-event console:address:shared:console -> console:address:shared:console [
  local-scope
  load-ingredients
  {
    _, console, found?:boolean <- read-event console
    loop-unless found?
  }
]

# use this helper to skip rendering if there's lots of other events queued up
recipe has-more-events? console:address:shared:console -> result:boolean [
  local-scope
  load-ingredients
  {
    break-unless console
    # fake consoles should be plenty fast; never skip
    reply 0/false
  }
  result <- interactions-left?
]