OSDN Git Service

Add Go frontend, libgo library, and Go testsuite.
[pf3gnuchains/gcc-fork.git] / libgo / go / exp / nacl / av / event.go
1 // Copyright 2009 The Go Authors.  All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // NaCl GUI events.
6 // Clients do not have raw access to the event stream
7 // (only filtered through the lens of package draw)
8 // but perhaps they will.
9
10 package av
11
12 import (
13         "encoding/binary"
14         "exp/draw"
15         "image"
16         "log"
17         "os"
18         "time"
19 )
20
21 // An eventType identifies the type of a Native Client Event.
22 type eventType uint8
23
24 const (
25         eventActive = 1 + iota
26         eventExpose
27         eventKeyDown
28         eventKeyUp
29         eventMouseMotion
30         eventMouseButtonDown
31         eventMouseButtonUp
32         eventQuit
33         eventUnsupported
34 )
35
36 // A key represents a key on a keyboard.
37 type key uint16
38
39 const (
40         keyUnknown      = 0
41         keyFirst        = 0
42         keyBackspace    = 8
43         keyTab          = 9
44         keyClear        = 12
45         keyReturn       = 13
46         keyPause        = 19
47         keyEscape       = 27
48         keySpace        = 32
49         keyExclaim      = 33
50         keyQuotedbl     = 34
51         keyHash         = 35
52         keyDollar       = 36
53         keyAmpersand    = 38
54         keyQuote        = 39
55         keyLeftparen    = 40
56         keyRightparen   = 41
57         keyAsterisk     = 42
58         keyPlus         = 43
59         keyComma        = 44
60         keyMinus        = 45
61         keyPeriod       = 46
62         keySlash        = 47
63         key0            = 48
64         key1            = 49
65         key2            = 50
66         key3            = 51
67         key4            = 52
68         key5            = 53
69         key6            = 54
70         key7            = 55
71         key8            = 56
72         key9            = 57
73         keyColon        = 58
74         keySemicolon    = 59
75         keyLess         = 60
76         keyEquals       = 61
77         keyGreater      = 62
78         keyQuestion     = 63
79         keyAt           = 64
80         keyLeftbracket  = 91
81         keyBackslash    = 92
82         keyRightbracket = 93
83         keyCaret        = 94
84         keyUnderscore   = 95
85         keyBackquote    = 96
86         keyA            = 97
87         keyB            = 98
88         keyC            = 99
89         keyD            = 100
90         keyE            = 101
91         keyF            = 102
92         keyG            = 103
93         keyH            = 104
94         keyI            = 105
95         keyJ            = 106
96         keyK            = 107
97         keyL            = 108
98         keyM            = 109
99         keyN            = 110
100         keyO            = 111
101         keyP            = 112
102         keyQ            = 113
103         keyR            = 114
104         keyS            = 115
105         keyT            = 116
106         keyU            = 117
107         keyV            = 118
108         keyW            = 119
109         keyX            = 120
110         keyY            = 121
111         keyZ            = 122
112         keyDelete       = 127
113         keyWorld0       = 160
114         keyWorld1       = 161
115         keyWorld2       = 162
116         keyWorld3       = 163
117         keyWorld4       = 164
118         keyWorld5       = 165
119         keyWorld6       = 166
120         keyWorld7       = 167
121         keyWorld8       = 168
122         keyWorld9       = 169
123         keyWorld10      = 170
124         keyWorld11      = 171
125         keyWorld12      = 172
126         keyWorld13      = 173
127         keyWorld14      = 174
128         keyWorld15      = 175
129         keyWorld16      = 176
130         keyWorld17      = 177
131         keyWorld18      = 178
132         keyWorld19      = 179
133         keyWorld20      = 180
134         keyWorld21      = 181
135         keyWorld22      = 182
136         keyWorld23      = 183
137         keyWorld24      = 184
138         keyWorld25      = 185
139         keyWorld26      = 186
140         keyWorld27      = 187
141         keyWorld28      = 188
142         keyWorld29      = 189
143         keyWorld30      = 190
144         keyWorld31      = 191
145         keyWorld32      = 192
146         keyWorld33      = 193
147         keyWorld34      = 194
148         keyWorld35      = 195
149         keyWorld36      = 196
150         keyWorld37      = 197
151         keyWorld38      = 198
152         keyWorld39      = 199
153         keyWorld40      = 200
154         keyWorld41      = 201
155         keyWorld42      = 202
156         keyWorld43      = 203
157         keyWorld44      = 204
158         keyWorld45      = 205
159         keyWorld46      = 206
160         keyWorld47      = 207
161         keyWorld48      = 208
162         keyWorld49      = 209
163         keyWorld50      = 210
164         keyWorld51      = 211
165         keyWorld52      = 212
166         keyWorld53      = 213
167         keyWorld54      = 214
168         keyWorld55      = 215
169         keyWorld56      = 216
170         keyWorld57      = 217
171         keyWorld58      = 218
172         keyWorld59      = 219
173         keyWorld60      = 220
174         keyWorld61      = 221
175         keyWorld62      = 222
176         keyWorld63      = 223
177         keyWorld64      = 224
178         keyWorld65      = 225
179         keyWorld66      = 226
180         keyWorld67      = 227
181         keyWorld68      = 228
182         keyWorld69      = 229
183         keyWorld70      = 230
184         keyWorld71      = 231
185         keyWorld72      = 232
186         keyWorld73      = 233
187         keyWorld74      = 234
188         keyWorld75      = 235
189         keyWorld76      = 236
190         keyWorld77      = 237
191         keyWorld78      = 238
192         keyWorld79      = 239
193         keyWorld80      = 240
194         keyWorld81      = 241
195         keyWorld82      = 242
196         keyWorld83      = 243
197         keyWorld84      = 244
198         keyWorld85      = 245
199         keyWorld86      = 246
200         keyWorld87      = 247
201         keyWorld88      = 248
202         keyWorld89      = 249
203         keyWorld90      = 250
204         keyWorld91      = 251
205         keyWorld92      = 252
206         keyWorld93      = 253
207         keyWorld94      = 254
208         keyWorld95      = 255
209
210         // Numeric keypad
211         keyKp0        = 256
212         keyKp1        = 257
213         keyKp2        = 258
214         keyKp3        = 259
215         keyKp4        = 260
216         keyKp5        = 261
217         keyKp6        = 262
218         keyKp7        = 263
219         keyKp8        = 264
220         keyKp9        = 265
221         keyKpPeriod   = 266
222         keyKpDivide   = 267
223         keyKpMultiply = 268
224         keyKpMinus    = 269
225         keyKpPlus     = 270
226         keyKpEnter    = 271
227         keyKpEquals   = 272
228
229         // Arrow & insert/delete pad
230         keyUp       = 273
231         keyDown     = 274
232         keyRight    = 275
233         keyLeft     = 276
234         keyInsert   = 277
235         keyHome     = 278
236         keyEnd      = 279
237         keyPageup   = 280
238         keyPagedown = 281
239
240         // Function keys
241         keyF1  = 282
242         keyF2  = 283
243         keyF3  = 284
244         keyF4  = 285
245         keyF5  = 286
246         keyF6  = 287
247         keyF7  = 288
248         keyF8  = 289
249         keyF9  = 290
250         keyF10 = 291
251         keyF11 = 292
252         keyF12 = 293
253         keyF13 = 294
254         keyF14 = 295
255         keyF15 = 296
256
257         // Modifier keys
258         keyNumlock   = 300
259         keyCapslock  = 301
260         keyScrollock = 302
261         keyRshift    = 303
262         keyLshift    = 304
263         keyRctrl     = 305
264         keyLctrl     = 306
265         keyRalt      = 307
266         keyLalt      = 308
267         keyRmeta     = 309
268         keyLmeta     = 310
269         keyLsuper    = 311
270         keyRsuper    = 312
271         keyMode      = 313
272         keyCompose   = 314
273
274         // Misc keys
275         keyHelp   = 315
276         keyPrint  = 316
277         keySysreq = 317
278         keyBreak  = 318
279         keyMenu   = 319
280         keyPower  = 320
281         keyEuro   = 321
282         keyUndo   = 322
283
284         // Add any other keys here
285         keyLast
286 )
287
288 // A keymod is a set of bit flags
289 type keymod uint16
290
291 const (
292         keymodNone     = 0x0000
293         keymodLshift   = 0x0001
294         keymodRshift   = 0x0002
295         keymodLctrl    = 0x0040
296         keymodRctrl    = 0x0080
297         keymodLalt     = 0x0100
298         keymodRalt     = 0x0200
299         keymodLmeta    = 0x0400
300         keymodRmeta    = 0x0800
301         keymodNum      = 0x1000
302         keymodCaps     = 0x2000
303         keymodMode     = 0x4000
304         keymodReserved = 0x8000
305 )
306
307 const (
308         mouseButtonLeft   = 1
309         mouseButtonMiddle = 2
310         mouseButtonRight  = 3
311         mouseScrollUp     = 4
312         mouseScrollDown   = 5
313 )
314
315 const (
316         mouseStateLeftButtonPressed   = 1
317         mouseStateMiddleButtonPressed = 2
318         mouseStateRightButtonPressed  = 4
319 )
320
321 const (
322         activeMouse       = 1 //  mouse leaving/entering
323         activeInputFocus  = 2 // input focus lost/restored
324         activeApplication = 4 // application minimized/restored
325 )
326
327 const maxEventBytes = 64
328
329 type activeEvent struct {
330         EventType eventType
331         Gain      uint8
332         State     uint8
333 }
334
335 type exposeEvent struct {
336         EventType eventType
337 }
338
339 type keyboardEvent struct {
340         EventType eventType
341         Device    uint8
342         State     uint8
343         Pad       uint8
344         ScanCode  uint8
345         Pad1      uint8
346         Key       key
347         Mod       keymod
348         Unicode   uint16
349 }
350
351 type mouseMotionEvent struct {
352         EventType eventType
353         Device    uint8
354         Buttons   uint8
355         Pad       uint8
356         X         uint16
357         Y         uint16
358         Xrel      int16
359         Yrel      int16
360 }
361
362 type mouseButtonEvent struct {
363         EventType eventType
364         Device    uint8
365         Button    uint8
366         State     uint8
367         X         uint16
368         Y         uint16
369 }
370
371 type quitEvent struct {
372         EventType eventType
373 }
374
375 type syncEvent struct{}
376
377 type event interface{}
378
379 type reader []byte
380
381 func (r *reader) Read(p []byte) (n int, err os.Error) {
382         b := *r
383         if len(b) == 0 && len(p) > 0 {
384                 return 0, os.EOF
385         }
386         n = copy(p, b)
387         *r = b[n:]
388         return
389 }
390
391 func (w *Window) readEvents() {
392         buf := make([]byte, maxEventBytes)
393         clean := false
394         var (
395                 ea  *activeEvent
396                 ee  *exposeEvent
397                 ke  *keyboardEvent
398                 mme *mouseMotionEvent
399                 mbe *mouseButtonEvent
400                 qe  *quitEvent
401         )
402         var m draw.MouseEvent
403         for {
404                 if err := videoPollEvent(buf); err != nil {
405                         if !clean {
406                                 clean = w.eventc <- draw.ConfigEvent{image.Config{ColorModel, w.Image.Bounds().Dx(), w.Image.Bounds().Dy()}}
407                         }
408                         time.Sleep(10e6) // 10ms
409                         continue
410                 }
411                 clean = false
412                 var e event
413                 switch buf[0] {
414                 default:
415                         log.Print("unsupported event type", buf[0])
416                         continue
417                 case eventActive:
418                         ea = new(activeEvent)
419                         e = ea
420                 case eventExpose:
421                         ee = new(exposeEvent)
422                         e = ee
423                 case eventKeyDown, eventKeyUp:
424                         ke = new(keyboardEvent)
425                         e = ke
426                 case eventMouseMotion:
427                         mme = new(mouseMotionEvent)
428                         e = mme
429                 case eventMouseButtonDown, eventMouseButtonUp:
430                         mbe = new(mouseButtonEvent)
431                         e = mbe
432                 case eventQuit:
433                         qe = new(quitEvent)
434                         e = qe
435                 }
436                 r := reader(buf)
437                 if err := binary.Read(&r, binary.LittleEndian, e); err != nil {
438                         log.Print("unpacking %T event: %s", e, err)
439                         continue
440                 }
441                 // log.Printf("%#v\n", e);
442                 switch buf[0] {
443                 case eventExpose:
444                         w.eventc <- draw.ConfigEvent{image.Config{ColorModel, w.Image.Bounds().Dx(), w.Image.Bounds().Dy()}}
445                 case eventKeyDown:
446                         w.eventc <- draw.KeyEvent{int(ke.Key)}
447                 case eventKeyUp:
448                         w.eventc <- draw.KeyEvent{-int(ke.Key)}
449                 case eventMouseMotion:
450                         m.Loc.X = int(mme.X)
451                         m.Loc.Y = int(mme.Y)
452                         m.Buttons = int(mme.Buttons)
453                         m.Nsec = time.Nanoseconds()
454                         _ = w.eventc <- m
455                 case eventMouseButtonDown:
456                         m.Loc.X = int(mbe.X)
457                         m.Loc.Y = int(mbe.Y)
458                         // TODO(rsc): Remove uint cast once 8g bug is fixed.
459                         m.Buttons |= 1 << uint(mbe.Button-1)
460                         m.Nsec = time.Nanoseconds()
461                         _ = w.eventc <- m
462                 case eventMouseButtonUp:
463                         m.Loc.X = int(mbe.X)
464                         m.Loc.Y = int(mbe.Y)
465                         // TODO(rsc): Remove uint cast once 8g bug is fixed.
466                         m.Buttons &^= 1 << uint(mbe.Button-1)
467                         m.Nsec = time.Nanoseconds()
468                         _ = w.eventc <- m
469                 case eventQuit:
470                         close(w.eventc)
471                 }
472         }
473 }