func processEvent(e *C.AInputEvent) { switch C.AInputEvent_getType(e) { case C.AINPUT_EVENT_TYPE_KEY: log.Printf("TODO input event: key") case C.AINPUT_EVENT_TYPE_MOTION: // At most one of the events in this batch is an up or down event; get its index and change. upDownIndex := C.size_t(C.AMotionEvent_getAction(e)&C.AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> C.AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT upDownChange := event.ChangeNone switch C.AMotionEvent_getAction(e) & C.AMOTION_EVENT_ACTION_MASK { case C.AMOTION_EVENT_ACTION_DOWN, C.AMOTION_EVENT_ACTION_POINTER_DOWN: upDownChange = event.ChangeOn case C.AMOTION_EVENT_ACTION_UP, C.AMOTION_EVENT_ACTION_POINTER_UP: upDownChange = event.ChangeOff } for i, n := C.size_t(0), C.AMotionEvent_getPointerCount(e); i < n; i++ { change := event.ChangeNone if i == upDownIndex { change = upDownChange } eventsIn <- event.Touch{ ID: event.TouchSequenceID(C.AMotionEvent_getPointerId(e, i)), Change: change, Loc: geom.Point{ X: geom.Pt(float32(C.AMotionEvent_getX(e, i)) / pixelsPerPt), Y: geom.Pt(float32(C.AMotionEvent_getY(e, i)) / pixelsPerPt), }, } } default: log.Printf("unknown input event, type=%d", C.AInputEvent_getType(e)) } }
//export sendTouch func sendTouch(touch, change uintptr, x, y float32) { id := -1 for i, val := range touchIDs { if val == touch { id = i break } } if id == -1 { for i, val := range touchIDs { if val == 0 { touchIDs[i] = touch id = i break } } if id == -1 { panic("out of touchIDs") } } c := event.Change(change) if c == event.ChangeOff { touchIDs[id] = 0 } eventsIn <- event.Touch{ ID: event.TouchSequenceID(id), Change: c, Loc: geom.Point{ X: geom.Pt(x / pixelsPerPt), Y: geom.Pt(y / pixelsPerPt), }, } }