#define LIB_CEC m_processor->GetLib()
#define ToString(x) CCECTypeUtils::ToString(x)
+#define COMBO_KEY CEC_USER_CONTROL_CODE_STOP
+#define COMBO_TIMEOUT_MS 1000
+
CCECClient::CCECClient(CCECProcessor *processor, const libcec_configuration &configuration) :
m_processor(processor),
m_bInitialised(false),
return CallbackMenuStateChanged(newState);
}
-void CCECClient::AddKey(void)
+void CCECClient::AddKey(bool bSendComboKey /* = false */)
{
cec_keypress key;
key.keycode = CEC_USER_CONTROL_CODE_UNKNOWN;
if (m_iCurrentButton != CEC_USER_CONTROL_CODE_UNKNOWN)
{
key.duration = (unsigned int) (GetTimeMs() - m_buttontime);
- key.keycode = m_iCurrentButton;
- m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN;
- m_buttontime = 0;
+ if (key.duration > COMBO_TIMEOUT_MS || m_iCurrentButton != COMBO_KEY || bSendComboKey)
+ {
+ key.keycode = m_iCurrentButton;
+
+ m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN;
+ m_buttontime = 0;
+ }
}
}
// send back the previous key if there is one
AddKey();
+ cec_keypress transmitKey(key);
+
{
CLockObject lock(m_mutex);
- m_iCurrentButton = key.duration > 0 || key.keycode > CEC_USER_CONTROL_CODE_MAX ?
- CEC_USER_CONTROL_CODE_UNKNOWN :
- key.keycode;
- m_buttontime = key.duration > 0 ? 0 : GetTimeMs();
+ if (key.duration > 0 || key.keycode > CEC_USER_CONTROL_CODE_MAX)
+ {
+ transmitKey.keycode = CEC_USER_CONTROL_CODE_UNKNOWN;
+ }
+ else if (m_iCurrentButton == COMBO_KEY)
+ {
+ // stop + ok -> exit
+ if (key.keycode == CEC_USER_CONTROL_CODE_SELECT)
+ transmitKey.keycode = CEC_USER_CONTROL_CODE_EXIT;
+ // stop + pause -> root menu
+ else if (key.keycode == CEC_USER_CONTROL_CODE_ROOT_MENU)
+ transmitKey.keycode = CEC_USER_CONTROL_CODE_ROOT_MENU;
+ // stop + play -> dot (which is handled as context menu in xbmc)
+ else if (key.keycode == CEC_USER_CONTROL_CODE_PLAY)
+ transmitKey.keycode = CEC_USER_CONTROL_CODE_DOT;
+ // default, send back the previous key
+ else
+ AddKey(true);
+ }
+
+ m_iCurrentButton = transmitKey.keycode;
+ m_buttontime = m_iCurrentButton == CEC_USER_CONTROL_CODE_UNKNOWN || key.duration > 0 ? 0 : GetTimeMs();
}
- LIB_CEC->AddLog(CEC_LOG_DEBUG, "key pressed: %s (%1x)", ToString(key.keycode), key.keycode);
- CallbackAddKey(key);
+ LIB_CEC->AddLog(CEC_LOG_DEBUG, "key pressed: %s (%1x)", ToString(transmitKey.keycode), transmitKey.keycode);
+ CallbackAddKey(transmitKey);
}
void CCECClient::SetCurrentButton(const cec_user_control_code iButtonCode)
uint64_t iNow = GetTimeMs();
if (m_iCurrentButton != CEC_USER_CONTROL_CODE_UNKNOWN &&
- iNow - m_buttontime > CEC_BUTTON_TIMEOUT)
+ ((m_iCurrentButton == COMBO_KEY && iNow - m_buttontime > COMBO_TIMEOUT_MS) ||
+ (m_iCurrentButton != COMBO_KEY && iNow - m_buttontime > CEC_BUTTON_TIMEOUT)))
{
key.duration = (unsigned int) (iNow - m_buttontime);
key.keycode = m_iCurrentButton;