void CWinEventsAndroid::MessagePushRepeat(XBMC_Event *repeatEvent) { CSingleLock lock(m_eventsCond); std::list<XBMC_Event>::iterator itt; for (itt = m_events.begin(); itt != m_events.end(); ++itt) { // we have events pending, if we we just // repush, we might push the repeat event // in back of a canceling non-active event. // do not repush if pending are different event. if (different_event(*itt, *repeatEvent)) { #if DEBUG_MESSAGEPUMP CLog::Log(LOGDEBUG, "repush skip, size(%d), fvalue(%f)", m_events.size(), repeatEvent->jaxis.fvalue); #endif return; } } // is a repeat, push it m_events.push_back(*repeatEvent); #if DEBUG_MESSAGEPUMP CLog::Log(LOGDEBUG, "repush event, size(%d), fvalue(%f)", m_events.size(), repeatEvent->jaxis.fvalue); #endif }
void CWinEventsAndroid::MessagePushRepeat(XBMC_Event *repeatEvent) { CSingleLock lock(m_eventsCond); std::list<XBMC_Event>::iterator itt; for (itt = m_events.begin(); itt != m_events.end(); ++itt) { // we have events pending, if we we just // repush, we might push the repeat event // in back of a canceling non-active event. // do not repush if pending are different event. if (different_event(*itt, *repeatEvent)) return; } // is a repeat, push it m_events.push_back(*repeatEvent); }
void CWinEventsAndroid::Process() { uint32_t timeout = 10; uint32_t holdTimeout = 500; uint32_t repeatTimeout = 100; uint32_t repeatDuration = 0; XBMC_Event cur_event; int state = EVENT_STATE_TEST; while (!m_bStop) { // run a 10ms (timeout) wait cycle Sleep(timeout); CSingleLock lock(m_lasteventCond); switch(state) { default: case EVENT_STATE_TEST: // check for axis action events if (!m_lastevent.empty()) { if ((m_lastevent.front().type == XBMC_JOYAXISMOTION && fabs(m_lastevent.front().jaxis.fvalue) >= ALMOST_ZERO) || (m_lastevent.front().type == XBMC_JOYHATMOTION && m_lastevent.front().jhat.value > XBMC_HAT_CENTERED)) { // new active event cur_event = m_lastevent.front(); #if DEBUG_MESSAGEPUMP CLog::Log(LOGDEBUG, "test -> hold, size(%d), fvalue(%f)", m_lastevent.size(), m_lastevent.front().jaxis.fvalue); #endif m_lastevent.pop(); repeatDuration = 0; state = EVENT_STATE_HOLD; break; } #if DEBUG_MESSAGEPUMP CLog::Log(LOGDEBUG, "munch test, size(%d), fvalue(%f)", m_lastevent.size(), m_lastevent.front().jaxis.fvalue); #endif // non-active event, eat it m_lastevent.pop(); } break; case EVENT_STATE_HOLD: repeatDuration += timeout; if (!m_lastevent.empty()) { if (different_event(cur_event, m_lastevent.front())) { // different axis event, cycle back to test state = EVENT_STATE_TEST; break; } #if DEBUG_MESSAGEPUMP CLog::Log(LOGDEBUG, "munch hold, size(%d), fvalue(%f)", m_lastevent.size(), m_lastevent.front().jaxis.fvalue); #endif // same axis event, eat it m_lastevent.pop(); } if (repeatDuration >= holdTimeout) { CLog::Log(LOGDEBUG, "hold ->repeat, size(%d), repeatDuration(%d)", m_lastevent.size(), repeatDuration); state = EVENT_STATE_REPEAT; } break; case EVENT_STATE_REPEAT: repeatDuration += timeout; if (!m_lastevent.empty()) { if (different_event(cur_event, m_lastevent.front())) { // different axis event, cycle back to test state = EVENT_STATE_TEST; #if DEBUG_MESSAGEPUMP CLog::Log(LOGDEBUG, "repeat-> test, size(%d), fvalue(%f)", m_lastevent.size(), m_lastevent.front().jaxis.fvalue); #endif break; } #if DEBUG_MESSAGEPUMP CLog::Log(LOGDEBUG, "munch repeat, size(%d), fvalue(%f)", m_lastevent.size(), m_lastevent.front().jaxis.fvalue); #endif // same axis event, eat it m_lastevent.pop(); } if (repeatDuration >= holdTimeout) { // this is a repeat, push it MessagePushRepeat(&cur_event); // assuming holdTimeout > repeatTimeout, // just subtract the repeatTimeout // to get the next cycle time repeatDuration -= repeatTimeout; } break; } } }
void CWinEventsAndroid::Process() { uint32_t timeout = 10; uint32_t holdTimeout = 500; uint32_t repeatTimeout = 100; uint32_t repeatDuration = 0; XBMC_Event cur_event; int state = EVENT_STATE_TEST; while (!m_bStop) { // run a 10ms (timeout) wait cycle Sleep(timeout); CSingleLock lock(m_lasteventCond); switch(state) { default: case EVENT_STATE_TEST: // non-active event, eat it if (!m_lastevent.empty()) m_lastevent.pop(); break; case EVENT_STATE_HOLD: repeatDuration += timeout; if (!m_lastevent.empty()) { if (different_event(cur_event, m_lastevent.front())) { // different event, cycle back to test state = EVENT_STATE_TEST; break; } // same event, eat it m_lastevent.pop(); } if (repeatDuration >= holdTimeout) { CLog::Log(LOGDEBUG, "hold ->repeat, size(%d), repeatDuration(%d)", m_lastevent.size(), repeatDuration); state = EVENT_STATE_REPEAT; } break; case EVENT_STATE_REPEAT: repeatDuration += timeout; if (!m_lastevent.empty()) { if (different_event(cur_event, m_lastevent.front())) { // different event, cycle back to test state = EVENT_STATE_TEST; break; } // same event, eat it m_lastevent.pop(); } if (repeatDuration >= holdTimeout) { // this is a repeat, push it MessagePushRepeat(&cur_event); // assuming holdTimeout > repeatTimeout, // just subtract the repeatTimeout // to get the next cycle time repeatDuration -= repeatTimeout; } break; } } }