summaryrefslogtreecommitdiff
path: root/menu.c
diff options
context:
space:
mode:
authorLars Hanisch <dvb@flensrocker.de>2011-03-25 21:20:07 +0100
committerLars Hanisch <dvb@flensrocker.de>2011-03-25 21:20:07 +0100
commit59cb96c4c68c1031d713ee36342643378641ca4e (patch)
treec6177a5b57eac5f220ca7e9ffcaee4f7505be38e /menu.c
parent2e1250d57513f385d3dbd6527f94d98366c84fc9 (diff)
downloadvdr-plugin-dynamite-59cb96c4c68c1031d713ee36342643378641ca4e.tar.gz
vdr-plugin-dynamite-59cb96c4c68c1031d713ee36342643378641ca4e.tar.bz2
add some OSD functionalityv0.0.6a
Diffstat (limited to 'menu.c')
-rw-r--r--menu.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/menu.c b/menu.c
new file mode 100644
index 0000000..30a90f3
--- /dev/null
+++ b/menu.c
@@ -0,0 +1,131 @@
+#include "menu.h"
+#include "dynamicdevice.h"
+
+
+class cDynamiteMenuDevicelist : public cOsdMenu
+{
+public:
+ cVector<int> deviceIds;
+ cStringList devicePaths;
+
+ cDynamiteMenuDevicelist(const char *Title)
+ :cOsdMenu(Title)
+ {
+ cDynamicDevice *d;
+ const char *cp;
+ char *p;
+ for (int i = 0; i < cDynamicDevice::NumDynamicDevices(); i++) {
+ d = cDynamicDevice::GetDynamicDevice(i);
+ if (d == NULL)
+ continue;
+ cp = d->GetDevPath();
+ if ((cp == NULL) || (strlen(cp) == 0))
+ continue;
+ p = strdup(cp);
+ if (p == NULL)
+ continue;
+ deviceIds.Append(i);
+ devicePaths.Append(p);
+ cString text = cString::sprintf("%d%s %s", i + 1, (d->IsDetachable() ? " " : "*"), p);
+ Add(new cOsdItem(*text));
+ }
+ }
+};
+
+enum eMenuAction { maList,
+ maScan,
+ maDetach,
+ maLock,
+ maUnlock,
+ maSetIdle
+ };
+
+class cDynamiteMenuItem : public cOsdItem
+{
+public:
+ eMenuAction action;
+ bool showList;
+
+ cDynamiteMenuItem(eMenuAction Action, const char *Text, bool ShowList = true)
+ :cOsdItem(Text)
+ ,action(Action)
+ ,showList(ShowList)
+ {
+ }
+
+ virtual eOSState Action(int DevId, const char *DevPath)
+ {
+ switch (action) {
+ case maScan:
+ isyslog("dynamite: menu action: scan for dvb devices");
+ cDynamicDevice::AttachDevicePattern("/dev/dvb/adapter*/frontend*");
+ return osEnd;
+ case maDetach:
+ isyslog("dynamite: menu action: detach device %s", DevPath);
+ cDynamicDeviceProbe::QueueDynamicDeviceCommand(ddpcDetach, DevPath);
+ return osEnd;
+ case maLock:
+ case maUnlock:
+ isyslog("dynamite: menu action: %slock device %s", (action == maUnlock ? "un" : ""), DevPath);
+ cDynamicDevice::SetLockDevice(DevPath, action == maLock);
+ break;
+ case maSetIdle:
+ isyslog("dynamite: menu action: set idle mode on device %s", DevPath);
+ cDynamicDevice::SetIdle(DevPath, true);
+ break;
+ default:
+ return osUnknown;
+ }
+ return osUnknown;
+ }
+};
+
+cDynamiteMainMenu::cDynamiteMainMenu(void)
+:cOsdMenu("dynamite")
+{
+ Add(new cDynamiteMenuItem(maList, "list attached devices"));
+ Add(new cDynamiteMenuItem(maScan, "scan for new DVB devices", false));
+ Add(new cDynamiteMenuItem(maDetach, "detach device"));
+ Add(new cDynamiteMenuItem(maLock, "lock device"));
+ Add(new cDynamiteMenuItem(maUnlock, "unlock device"));
+ Add(new cDynamiteMenuItem(maSetIdle, "switch device to idle"));
+}
+
+cDynamiteMainMenu::~cDynamiteMainMenu(void)
+{
+}
+
+eOSState cDynamiteMainMenu::ProcessKey(eKeys Key)
+{
+ cDynamiteMenuItem *item = dynamic_cast<cDynamiteMenuItem*>(Get(Current()));
+ if (item == NULL)
+ return cOsdMenu::ProcessKey(Key);
+ eOSState state = osUnknown;
+ switch (Key) {
+ case kOk:
+ {
+ if (HasSubMenu()) {
+ cDynamiteMenuDevicelist *dl = dynamic_cast<cDynamiteMenuDevicelist*>(SubMenu());
+ if (dl != NULL) {
+ int i = dl->Current();
+ if ((i >= 0) && (i < dl->deviceIds.Size()))
+ state = item->Action(dl->deviceIds[i], dl->devicePaths[i]);
+ }
+ CloseSubMenu();
+ }
+ else {
+ if (item->showList)
+ state = AddSubMenu(new cDynamiteMenuDevicelist(item->Text()));
+ else
+ state = item->Action(-1, NULL);
+ }
+ break;
+ }
+ default:
+ {
+ state = cOsdMenu::ProcessKey(Key);
+ break;
+ }
+ }
+ return state;
+}