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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 074keyboard.mu</title>
<meta name="Generator" content="Vim/7.4">
<meta name="plugin-version" content="vim7.4_v1">
<meta name="syntax" content="none">
<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy=">
<meta name="colorscheme" content="minimal">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
body { font-family: monospace; color: #eeeeee; background-color: #080808; }
* { font-size: 1.05em; }
.Delimiter { color: #a04060; }
.Comment { color: #9090ff; }
.Constant { color: #00a0a0; }
.Special { color: #ff6060; }
.CommentedCode { color: #6c6c6c; }
.muControl { color: #c0a020; }
.muRecipe { color: #ff8700; }
-->
</style>
<script type='text/javascript'>
<!--
-->
</script>
</head>
<body>
<pre id='vimCodeElement'>
<span class="Comment"># Wrappers around interaction primitives that take a potentially fake object</span>
<span class="Comment"># and are thus easier to test.</span>
exclusive-container event [
text:character
keycode:number <span class="Comment"># keys on keyboard without a unicode representation</span>
touch:touch-event <span class="Comment"># mouse, track ball, etc.</span>
<span class="Comment"># update the assume-console handler if you add more variants</span>
]
container touch-event [
type:number
row:number
column:number
]
container console [
index:number
data:address:array:event
]
<span class="muRecipe">recipe</span> new-fake-console [
<span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span>
result:address:console<span class="Special"> <- </span>new console:type
buf:address:address:array:character<span class="Special"> <- </span>get-address result:address:console/deref, data:offset
<span class="CommentedCode">#? $start-tracing #? 1</span>
buf:address:address:array:character/deref<span class="Special"> <- </span><span class="Constant">next-ingredient</span>
<span class="CommentedCode">#? $stop-tracing #? 1</span>
idx:address:number<span class="Special"> <- </span>get-address result:address:console/deref, index:offset
idx:address:number/deref<span class="Special"> <- </span>copy <span class="Constant">0:literal</span>
<span class="muControl">reply</span> result:address:console
]
<span class="muRecipe">recipe</span> read-event [
<span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span>
x:address:console<span class="Special"> <- </span><span class="Constant">next-ingredient</span>
<span class="Delimiter">{</span>
<span class="muControl">break-unless</span> x:address:console
idx:address:number<span class="Special"> <- </span>get-address x:address:console/deref, index:offset
buf:address:array:event<span class="Special"> <- </span>get x:address:console/deref, data:offset
<span class="Delimiter">{</span>
max:number<span class="Special"> <- </span>length buf:address:array:event/deref
done?:boolean<span class="Special"> <- </span>greater-or-equal idx:address:number/deref, max:number
<span class="muControl">break-unless</span> done?:boolean
dummy:address:event<span class="Special"> <- </span>new event:type
<span class="muControl">reply</span> dummy:address:event/deref, x:address:console/same-as-ingredient:0, <span class="Constant">1:literal/found</span>, <span class="Constant">1:literal/quit</span>
<span class="Delimiter">}</span>
result:event<span class="Special"> <- </span>index buf:address:array:event/deref, idx:address:number/deref
idx:address:number/deref<span class="Special"> <- </span>add idx:address:number/deref, <span class="Constant">1:literal</span>
<span class="muControl">reply</span> result:event, x:address:console/same-as-ingredient:0, <span class="Constant">1:literal/found</span>, <span class="Constant">0:literal/quit</span>
<span class="Delimiter">}</span>
<span class="Comment"># real event source is infrequent; avoid polling it too much</span>
switch
result:event, found?:boolean<span class="Special"> <- </span>check-for-interaction
<span class="muControl">reply</span> result:event, x:address:console/same-as-ingredient:0, found?:boolean, <span class="Constant">0:literal/quit</span>
]
<span class="Comment"># variant of read-event for just keyboard events. Discards everything that</span>
<span class="Comment"># isn't unicode, so no arrow keys, page-up/page-down, etc. But you still get</span>
<span class="Comment"># newlines, tabs, ctrl-d..</span>
<span class="muRecipe">recipe</span> read-key [
<span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span>
<span class="CommentedCode">#? $print default-space:address:array:location #? 1</span>
<span class="CommentedCode">#? $exit #? 1</span>
<span class="CommentedCode">#? $start-tracing #? 1</span>
console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span>
x:event, console:address, found?:boolean, quit?:boolean<span class="Special"> <- </span>read-event console:address
<span class="CommentedCode">#? $print [aaa 1] #? 1</span>
<span class="muControl">reply-if</span> quit?:boolean, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:0, found?:boolean, quit?:boolean
<span class="CommentedCode">#? $print [aaa 2] #? 1</span>
<span class="muControl">reply-unless</span> found?:boolean, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:0, found?:boolean, quit?:boolean
<span class="CommentedCode">#? $print [aaa 3] #? 1</span>
c:address:character<span class="Special"> <- </span>maybe-convert x:event, text:variant
<span class="muControl">reply-unless</span> c:address:character, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:0, <span class="Constant">0:literal/found</span>, <span class="Constant">0:literal/quit</span>
<span class="CommentedCode">#? $print [aaa 4] #? 1</span>
<span class="muControl">reply</span> c:address:character/deref, console:address/same-as-ingredient:0, <span class="Constant">1:literal/found</span>, <span class="Constant">0:literal/quit</span>
]
<span class="muRecipe">recipe</span> send-keys-to-channel [
<span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span>
console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span>
chan:address:channel<span class="Special"> <- </span><span class="Constant">next-ingredient</span>
screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span>
<span class="Delimiter">{</span>
c:character, console:address, found?:boolean, quit?:boolean<span class="Special"> <- </span>read-key console:address
<span class="muControl">loop-unless</span> found?:boolean
<span class="muControl">break-if</span> quit?:boolean
assert c:character, <span class="Constant">[invalid event, expected text]</span>
print-character screen:address, c:character
chan:address:channel<span class="Special"> <- </span>write chan:address:channel, c:character
<span class="muControl">loop</span>
<span class="Delimiter">}</span>
]
<span class="muRecipe">recipe</span> wait-for-event [
<span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span>
console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span>
<span class="Delimiter">{</span>
_, console:address, found?:boolean<span class="Special"> <- </span>read-event console:address
<span class="muControl">loop-unless</span> found?:boolean
<span class="Delimiter">}</span>
]
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->
|