mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
155 lines
3.9 KiB
C
155 lines
3.9 KiB
C
|
/*
|
||
|
* keys.c: Remote control Key handling
|
||
|
*
|
||
|
* See the main source file 'vdr.c' for copyright information and
|
||
|
* how to reach the author.
|
||
|
*
|
||
|
* $Id: keys.c 1.1 2002/09/29 09:56:51 kls Exp $
|
||
|
*/
|
||
|
|
||
|
#include "keys.h"
|
||
|
|
||
|
static tKey keyTable[] = { // "Up" and "Down" must be the first two keys!
|
||
|
{ kUp, "Up" },
|
||
|
{ kDown, "Down" },
|
||
|
{ kMenu, "Menu" },
|
||
|
{ kOk, "Ok" },
|
||
|
{ kBack, "Back" },
|
||
|
{ kLeft, "Left" },
|
||
|
{ kRight, "Right" },
|
||
|
{ kRed, "Red" },
|
||
|
{ kGreen, "Green" },
|
||
|
{ kYellow, "Yellow" },
|
||
|
{ kBlue, "Blue" },
|
||
|
{ k0, "0" },
|
||
|
{ k1, "1" },
|
||
|
{ k2, "2" },
|
||
|
{ k3, "3" },
|
||
|
{ k4, "4" },
|
||
|
{ k5, "5" },
|
||
|
{ k6, "6" },
|
||
|
{ k7, "7" },
|
||
|
{ k8, "8" },
|
||
|
{ k9, "9" },
|
||
|
{ kPower, "Power" },
|
||
|
{ kVolUp, "Volume+" },
|
||
|
{ kVolDn, "Volume-" },
|
||
|
{ kMute, "Mute" },
|
||
|
{ kNone, "" },
|
||
|
{ k_Setup, "_Setup" },
|
||
|
{ kNone, NULL },
|
||
|
};
|
||
|
|
||
|
// -- cKey -------------------------------------------------------------------
|
||
|
|
||
|
cKey::cKey(void)
|
||
|
{
|
||
|
remote = code = NULL;
|
||
|
key = kNone;
|
||
|
}
|
||
|
|
||
|
cKey::cKey(const char *Remote, const char *Code, eKeys Key)
|
||
|
{
|
||
|
remote = strdup(Remote);
|
||
|
code = strdup(Code);
|
||
|
key = Key;
|
||
|
}
|
||
|
|
||
|
cKey::~cKey()
|
||
|
{
|
||
|
free(remote);
|
||
|
free(code);
|
||
|
}
|
||
|
|
||
|
bool cKey::Parse(char *s)
|
||
|
{
|
||
|
char *p = strchr(s, '.');
|
||
|
if (p) {
|
||
|
*p++ = 0;
|
||
|
remote = strdup(s);
|
||
|
char *q = strpbrk(p, " \t");
|
||
|
if (q) {
|
||
|
*q++ = 0;
|
||
|
key = FromString(p);
|
||
|
if (key != kNone) {
|
||
|
q = skipspace(q);
|
||
|
if (*q) {
|
||
|
code = strdup(q);
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool cKey::Save(FILE *f)
|
||
|
{
|
||
|
return fprintf(f, "%s.%-10s %s\n", remote, ToString(key), code) > 0;
|
||
|
}
|
||
|
|
||
|
eKeys cKey::FromString(const char *Name)
|
||
|
{
|
||
|
if (Name) {
|
||
|
for (tKey *k = keyTable; k->name; k++) {
|
||
|
if (strcasecmp(k->name, Name) == 0)
|
||
|
return k->type;
|
||
|
}
|
||
|
}
|
||
|
return kNone;
|
||
|
}
|
||
|
|
||
|
const char *cKey::ToString(eKeys Key)
|
||
|
{
|
||
|
for (tKey *k = keyTable; k->name; k++) {
|
||
|
if (k->type == Key)
|
||
|
return k->name;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
// -- cKeys ------------------------------------------------------------------
|
||
|
|
||
|
cKeys Keys;
|
||
|
|
||
|
bool cKeys::KnowsRemote(const char *Remote)
|
||
|
{
|
||
|
if (Remote) {
|
||
|
for (cKey *k = First(); k; k = Next(k)) {
|
||
|
if (strcmp(Remote, k->Remote()) == 0)
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
eKeys cKeys::Get(const char *Remote, const char *Code)
|
||
|
{
|
||
|
if (Remote && Code) {
|
||
|
for (cKey *k = First(); k; k = Next(k)) {
|
||
|
if (strcmp(Remote, k->Remote()) == 0 && strcmp(Code, k->Code()) == 0)
|
||
|
return k->Key();
|
||
|
}
|
||
|
}
|
||
|
return kNone;
|
||
|
}
|
||
|
|
||
|
const char *cKeys::GetSetup(const char *Remote)
|
||
|
{
|
||
|
if (Remote) {
|
||
|
for (cKey *k = First(); k; k = Next(k)) {
|
||
|
if (strcmp(Remote, k->Remote()) == 0 && k->Key() == k_Setup)
|
||
|
return k->Code();
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void cKeys::PutSetup(const char *Remote, const char *Setup)
|
||
|
{
|
||
|
if (!GetSetup(Remote))
|
||
|
Add(new cKey(Remote, Setup, k_Setup));
|
||
|
else
|
||
|
esyslog("ERROR: called PutSetup() for %s, but setup has already been defined!", Remote);
|
||
|
}
|