bool cRemote::Put(const char *Code, bool Repeat, bool Release) { if (learning && this != learning) return false; eKeys Key = Keys.Get(Name(), Code); if (Key != kNone) { if (Repeat) Key = eKeys(Key | k_Repeat); if (Release) Key = eKeys(Key | k_Release); return Put(Key); } if (learning) { free(unknownCode); unknownCode = strdup(Code); keyPressed.Broadcast(); } return false; }
bool cInterface::QueryKeys(cRemote *Remote, cSkinDisplayMenu *DisplayMenu) { DisplayMenu->SetItem(tr("Phase 1: Detecting RC code type"), 2, false, false); DisplayMenu->SetItem(tr("Press any key on the RC unit"), 4, false, false); DisplayMenu->Flush(); if (Remote->Initialize()) { DisplayMenu->SetItem(tr("RC code detected!"), 4, false, false); DisplayMenu->SetItem(tr("Do not press any key..."), 5, false, false); DisplayMenu->Flush(); cCondWait::SleepMs(3000); DisplayMenu->SetItem("", 4, false, false); DisplayMenu->SetItem("", 5, false, false); DisplayMenu->SetItem(tr("Phase 2: Learning specific key codes"), 2, false, false); eKeys NewKey = kUp; while (NewKey != kNone) { DisplayMenu->SetItem(cString::sprintf(tr("Press key for '%s'"), cKey::ToString(NewKey, true)), 4, false, false); cRemote::Clear(); DisplayMenu->Flush(); for (eKeys k = NewKey; k == NewKey; ) { char *NewCode = NULL; eKeys Key = cRemote::Get(100, &NewCode); switch (Key) { case kUp: if (NewKey > kUp) { NewKey = eKeys(NewKey - 1); cKey *last = Keys.Last(); if (last && last->Key() == NewKey) Keys.Del(last); } break; case kDown: DisplayMenu->SetItem(tr("Press 'Up' to confirm"), 4, false, false); DisplayMenu->SetItem(tr("Press 'Down' to continue"), 5, false, false); DisplayMenu->SetItem("", 6, false, false); DisplayMenu->SetItem("", 7, false, false); DisplayMenu->SetItem("", 8, false, false); DisplayMenu->Flush(); for (;;) { Key = cRemote::Get(100); if (Key == kUp) { DisplayMenu->Clear(); return true; } else if (Key == kDown) { DisplayMenu->SetItem("", 5, false, false); k = kNone; // breaks the outer for() loop break; } } break; case kMenu: NewKey = eKeys(NewKey + 1); break; case kNone: if (NewCode) { dsyslog("new %s code: %s = %s", Remote->Name(), NewCode, cKey::ToString(NewKey)); Keys.Add(new cKey(Remote->Name(), NewCode, NewKey)); NewKey = eKeys(NewKey + 1); free(NewCode); } break; default: break; } } if (NewKey > kUp) DisplayMenu->SetItem(tr("(press 'Up' to go back)"), 6, false, false); else DisplayMenu->SetItem("", 6, false, false); if (NewKey > kDown) DisplayMenu->SetItem(tr("(press 'Down' to end key definition)"), 7, false, false); else DisplayMenu->SetItem("", 7, false, false); if (NewKey > kMenu) DisplayMenu->SetItem(tr("(press 'Menu' to skip this key)"), 8, false, false); else DisplayMenu->SetItem("", 8, false, false); } return true; } return false; }