void XInputMTInputDevice::handleXIEvent(const XEvent& xEvent) { m_SDLLockFunc(); XGenericEventCookie* pCookie = (XGenericEventCookie*)&xEvent.xcookie; if (pCookie->type == GenericEvent && pCookie->extension == m_XIOpcode) { XIDeviceEvent* pDevEvent = (XIDeviceEvent*)(pCookie->data); IntPoint pos(pDevEvent->event_x, pDevEvent->event_y); int xid = pDevEvent->detail; switch (pCookie->evtype) { case XI_TouchBegin: { // cerr << "TouchBegin " << xid << ", " << pos << endl; m_LastID++; TouchEventPtr pEvent = createEvent(m_LastID, Event::CURSOR_DOWN, pos); addTouchStatus(xid, pEvent); } break; case XI_TouchUpdate: { // cerr << "TouchUpdate " << xid << ", " << pos << endl; TouchEventPtr pEvent = createEvent(0, Event::CURSOR_MOTION, pos); TouchStatusPtr pTouchStatus = getTouchStatus(xid); AVG_ASSERT(pTouchStatus); pTouchStatus->pushEvent(pEvent); } break; case XI_TouchEnd: { // cerr << "TouchEnd " << xid << ", " << pos << endl; TouchStatusPtr pTouchStatus = getTouchStatus(xid); AVG_ASSERT(pTouchStatus); TouchEventPtr pEvent = createEvent(0, Event::CURSOR_UP, pos); pTouchStatus->pushEvent(pEvent); } break; default: ; // cerr << "Unhandled XInput event, type: " // << cookieTypeToName(pCookie->evtype) << endl; } } else { // cerr << "Unhandled X11 Event: " << xEvent.type << endl; } XFreeEventData(s_pDisplay, pCookie); m_SDLUnlockFunc(); }
void MPR121::serviceCallbacks() { for (uint8_t channel = 0; channel < NUM_CHANNELS; channel++) { bool touchStatus = getTouchStatus(channel); if (touchStatus != m_prevTouchStatus[channel]) { for (uint8_t type = 0; type < NUM_EVENTS; type++) { const CallbackPtrType cb = touchStatus ? m_callbackMap[channel][TOUCHED] : m_callbackMap[channel][RELEASED]; if (cb != 0) { cb(); } } m_prevTouchStatus[channel] = touchStatus; } } }
void AppleTrackpadInputDevice::onData(int device, Finger* pFingers, int numFingers, float timestamp, int frame) { boost::mutex::scoped_lock lock(getMutex()); for (int i = 0; i < numFingers; i++) { Finger* pFinger = &pFingers[i]; TouchStatusPtr pTouchStatus = getTouchStatus(pFinger->identifier); if (!pTouchStatus) { m_LastID++; TouchEventPtr pEvent = createEvent(m_LastID, pFinger, Event::CURSORDOWN); addTouchStatus(pFinger->identifier, pEvent); } else { Event::Type eventType; if (pFinger->state == 7) { eventType = Event::CURSORUP; removeTouchStatus(pFinger->identifier); } else { eventType = Event::CURSORMOTION; } TouchEventPtr pEvent = createEvent(0, pFinger, eventType); pTouchStatus->pushEvent(pEvent); } } }