summaryrefslogtreecommitdiff
path: root/keys.c
diff options
context:
space:
mode:
Diffstat (limited to 'keys.c')
-rw-r--r--keys.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/keys.c b/keys.c
new file mode 100644
index 0000000..0d91d67
--- /dev/null
+++ b/keys.c
@@ -0,0 +1,154 @@
+/*
+ * 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);
+}