]> git.ipfire.org Git - thirdparty/gcc.git/blob - libgo/go/exp/nacl/av/event.go
Add Go frontend, libgo library, and Go testsuite.
[thirdparty/gcc.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 }