diff options
author | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2002-05-09 18:00:00 +0200 |
---|---|---|
committer | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2002-05-09 18:00:00 +0200 |
commit | ae8a947367b4be57c9b0ca7bbf0032de0e2018d3 (patch) | |
tree | f9a5b6c7d320222b841a54c86590eb012ab3a107 /menu.c | |
parent | c9a5d8ea5328e4a8bcb0c3423b825c02cb0c3b27 (diff) | |
download | vdr-patch-lnbsharing-ae8a947367b4be57c9b0ca7bbf0032de0e2018d3.tar.gz vdr-patch-lnbsharing-ae8a947367b4be57c9b0ca7bbf0032de0e2018d3.tar.bz2 |
Version 1.1.0vdr-1.1.0
- Begin of the 1.1 development branch. THIS IS NOT A STABLE VERSION!
The current stable version for every day use is still the 1.0 branch.
- First step towards a universal plugin interface. See the file PLUGINS.html
for a detailed description. The man page vdr(1) describes the new options '-L'
and '-P' used to load plugins. This first step implements the complete "outer"
shell for plugins. The "inner" access to VDR data structures will follow.
- The VDR version number is now displayed in the title line of the "Setup" menu.
Diffstat (limited to 'menu.c')
-rw-r--r-- | menu.c | 611 |
1 files changed, 137 insertions, 474 deletions
@@ -4,10 +4,11 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.182 2002/04/06 09:41:59 kls Exp $ + * $Id: menu.c 1.190 2002/05/09 10:13:47 kls Exp $ */ #include "menu.h" +#include <ctype.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> @@ -15,134 +16,19 @@ #include "config.h" #include "eit.h" #include "i18n.h" +#include "menuitems.h" +#include "plugin.h" #include "videodir.h" #define MENUTIMEOUT 120 // seconds #define MAXWAIT4EPGINFO 10 // seconds #define MODETIMEOUT 3 // seconds -#define CHNUMWIDTH (Channels.Count() > 999 ? 5 : 4) // there are people with more than 999 channels... - -const char *FileNameChars = " aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789-.#~^"; - -// --- cMenuEditItem --------------------------------------------------------- - -class cMenuEditItem : public cOsdItem { -private: - const char *name; - const char *value; -public: - cMenuEditItem(const char *Name); - ~cMenuEditItem(); - void SetValue(const char *Value); - }; - -cMenuEditItem::cMenuEditItem(const char *Name) -{ - name = strdup(Name); - value = NULL; -} - -cMenuEditItem::~cMenuEditItem() -{ - delete name; - delete value; -} - -void cMenuEditItem::SetValue(const char *Value) -{ - delete value; - value = strdup(Value); - char *buffer = NULL; - asprintf(&buffer, "%s:\t%s", name, value); - SetText(buffer, false); - Display(); -} - -// --- cMenuEditIntItem ------------------------------------------------------ - -class cMenuEditIntItem : public cMenuEditItem { -protected: - int *value; - int min, max; - virtual void Set(void); -public: - cMenuEditIntItem(const char *Name, int *Value, int Min = 0, int Max = INT_MAX); - virtual eOSState ProcessKey(eKeys Key); - }; - -cMenuEditIntItem::cMenuEditIntItem(const char *Name, int *Value, int Min, int Max) -:cMenuEditItem(Name) -{ - value = Value; - min = Min; - max = Max; - Set(); -} - -void cMenuEditIntItem::Set(void) -{ - char buf[16]; - snprintf(buf, sizeof(buf), "%d", *value); - SetValue(buf); -} +#define MAXINSTANTRECTIME (24 * 60 - 1) // 23:59 hours -eOSState cMenuEditIntItem::ProcessKey(eKeys Key) -{ - eOSState state = cMenuEditItem::ProcessKey(Key); - - if (state == osUnknown) { - int newValue; - if (k0 <= Key && Key <= k9) { - if (fresh) { - *value = 0; - fresh = false; - } - newValue = *value * 10 + (Key - k0); - } - else if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly? - newValue = *value - 1; - fresh = true; - } - else if (NORMALKEY(Key) == kRight) { - newValue = *value + 1; - fresh = true; - } - else - return state; - if ((!fresh || min <= newValue) && newValue <= max) { - *value = newValue; - Set(); - } - state = osContinue; - } - return state; -} - -// --- cMenuEditBoolItem ----------------------------------------------------- - -class cMenuEditBoolItem : public cMenuEditIntItem { -protected: - const char *falseString, *trueString; - virtual void Set(void); -public: - cMenuEditBoolItem(const char *Name, int *Value, const char *FalseString = NULL, const char *TrueString = NULL); - }; +#define CHNUMWIDTH (Channels.Count() > 999 ? 5 : 4) // there are people with more than 999 channels... -cMenuEditBoolItem::cMenuEditBoolItem(const char *Name, int *Value, const char *FalseString, const char *TrueString) -:cMenuEditIntItem(Name, Value, 0, 1) -{ - falseString = FalseString ? FalseString : tr("no"); - trueString = TrueString ? TrueString : tr("yes"); - Set(); -} - -void cMenuEditBoolItem::Set(void) -{ - char buf[16]; - snprintf(buf, sizeof(buf), "%s", *value ? trueString : falseString); - SetValue(buf); -} +const char *FileNameChars = " abcdefghijklmnopqrstuvwxyz0123456789-.#~"; // --- cMenuEditChanItem ----------------------------------------------------- @@ -448,186 +334,6 @@ eOSState cMenuEditTimeItem::ProcessKey(eKeys Key) return state; } -// --- cMenuEditChrItem ------------------------------------------------------ - -class cMenuEditChrItem : public cMenuEditItem { -private: - char *value; - const char *allowed; - const char *current; - virtual void Set(void); -public: - cMenuEditChrItem(const char *Name, char *Value, const char *Allowed); - ~cMenuEditChrItem(); - virtual eOSState ProcessKey(eKeys Key); - }; - -cMenuEditChrItem::cMenuEditChrItem(const char *Name, char *Value, const char *Allowed) -:cMenuEditItem(Name) -{ - value = Value; - allowed = strdup(Allowed); - current = strchr(allowed, *Value); - if (!current) - current = allowed; - Set(); -} - -cMenuEditChrItem::~cMenuEditChrItem() -{ - delete allowed; -} - -void cMenuEditChrItem::Set(void) -{ - char buf[2]; - snprintf(buf, sizeof(buf), "%c", *value); - SetValue(buf); -} - -eOSState cMenuEditChrItem::ProcessKey(eKeys Key) -{ - eOSState state = cMenuEditItem::ProcessKey(Key); - - if (state == osUnknown) { - if (NORMALKEY(Key) == kLeft) { - if (current > allowed) - current--; - } - else if (NORMALKEY(Key) == kRight) { - if (*(current + 1)) - current++; - } - else - return state; - *value = *current; - Set(); - state = osContinue; - } - return state; -} - -// --- cMenuEditStrItem ------------------------------------------------------ - -class cMenuEditStrItem : public cMenuEditItem { -private: - char *value; - int length; - const char *allowed; - int pos; - virtual void Set(void); - char Inc(char c, bool Up); -public: - cMenuEditStrItem(const char *Name, char *Value, int Length, const char *Allowed); - ~cMenuEditStrItem(); - virtual eOSState ProcessKey(eKeys Key); - }; - -cMenuEditStrItem::cMenuEditStrItem(const char *Name, char *Value, int Length, const char *Allowed) -:cMenuEditItem(Name) -{ - value = Value; - length = Length; - allowed = strdup(Allowed); - pos = -1; - Set(); -} - -cMenuEditStrItem::~cMenuEditStrItem() -{ - delete allowed; -} - -void cMenuEditStrItem::Set(void) -{ - char buf[1000]; - if (pos >= 0) { - strncpy(buf, value, pos); - const char *s = value[pos] != '^' ? value + pos + 1 : ""; - snprintf(buf + pos, sizeof(buf) - pos - 2, "[%c]%s", *(value + pos), s); - SetValue(buf); - } - else - SetValue(value); -} - -char cMenuEditStrItem::Inc(char c, bool Up) -{ - const char *p = strchr(allowed, c); - if (!p) - p = allowed; - if (Up) { - if (!*++p) - p = allowed; - } - else if (--p < allowed) - p = allowed + strlen(allowed) - 1; - return *p; -} - -eOSState cMenuEditStrItem::ProcessKey(eKeys Key) -{ - switch (Key) { - case kLeft|k_Repeat: - case kLeft: if (pos > 0) { - if (value[pos] == '^') - value[pos] = 0; - pos--; - } - break; - case kRight|k_Repeat: - case kRight: if (pos < length && value[pos] != '^' && (pos < int(strlen(value) - 1) || value[pos] != ' ')) { - if (++pos >= int(strlen(value))) { - value[pos] = ' '; - value[pos + 1] = 0; - } - } - break; - case kUp|k_Repeat: - case kUp: - case kDown|k_Repeat: - case kDown: if (pos >= 0) - value[pos] = Inc(value[pos], NORMALKEY(Key) == kUp); - else - return cMenuEditItem::ProcessKey(Key); - break; - case kOk: if (pos >= 0) { - if (value[pos] == '^') - value[pos] = 0; - pos = -1; - stripspace(value); - break; - } - // run into default - default: return cMenuEditItem::ProcessKey(Key); - } - Set(); - return osContinue; -} - -// --- cMenuEditStraItem ----------------------------------------------------- - -class cMenuEditStraItem : public cMenuEditIntItem { -private: - const char * const *strings; -protected: - virtual void Set(void); -public: - cMenuEditStraItem(const char *Name, int *Value, int NumStrings, const char * const *Strings); - }; - -cMenuEditStraItem::cMenuEditStraItem(const char *Name, int *Value, int NumStrings, const char * const *Strings) -:cMenuEditIntItem(Name, Value, 0, NumStrings - 1) -{ - strings = Strings; - Set(); -} - -void cMenuEditStraItem::Set(void) -{ - SetValue(strings[*value]); -} - // --- cMenuEditCaItem ------------------------------------------------------- class cMenuEditCaItem : public cMenuEditIntItem { @@ -699,7 +405,7 @@ cMenuEditChannel::cMenuEditChannel(int Index) channel = Channels.Get(Index); if (channel) { data = *channel; - Add(new cMenuEditStrItem( tr("Name"), data.name, sizeof(data.name), FileNameChars)); + Add(new cMenuEditStrItem( tr("Name"), data.name, sizeof(data.name), tr(FileNameChars))); Add(new cMenuEditIntItem( tr("Frequency"), &data.frequency)); Add(new cMenuEditChrItem( tr("Polarization"), &data.polarization, "hv")); Add(new cMenuEditIntItem( tr("DiSEqC"), &data.diseqc, 0, 10)); //TODO exact limits??? @@ -919,116 +625,6 @@ eOSState cMenuChannels::ProcessKey(eKeys Key) return state; } -// --- cMenuTextItem --------------------------------------------------------- - -class cMenuTextItem : public cOsdItem { -private: - char *text; - int x, y, w, h, lines, offset; - eDvbColor fgColor, bgColor; - eDvbFont font; -public: - cMenuTextItem(const char *Text, int X, int Y, int W, int H = -1, eDvbColor FgColor = clrWhite, eDvbColor BgColor = clrBackground, eDvbFont Font = fontOsd); - ~cMenuTextItem(); - int Height(void) { return h; } - void Clear(void); - virtual void Display(int Offset = -1, eDvbColor FgColor = clrWhite, eDvbColor BgColor = clrBackground); - bool CanScrollUp(void) { return offset > 0; } - bool CanScrollDown(void) { return h + offset < lines; } - void ScrollUp(bool Page); - void ScrollDown(bool Page); - virtual eOSState ProcessKey(eKeys Key); - }; - -cMenuTextItem::cMenuTextItem(const char *Text, int X, int Y, int W, int H, eDvbColor FgColor, eDvbColor BgColor, eDvbFont Font) -{ - x = X; - y = Y; - w = W; - h = H; - fgColor = FgColor; - bgColor = BgColor; - font = Font; - offset = 0; - eDvbFont oldFont = Interface->SetFont(font); - text = Interface->WrapText(Text, w - 1, &lines); - Interface->SetFont(oldFont); - if (h < 0) - h = lines; -} - -cMenuTextItem::~cMenuTextItem() -{ - delete text; -} - -void cMenuTextItem::Clear(void) -{ - Interface->Fill(x, y, w, h, bgColor); -} - -void cMenuTextItem::Display(int Offset, eDvbColor FgColor, eDvbColor BgColor) -{ - int l = 0; - char *t = text; - eDvbFont oldFont = Interface->SetFont(font); - while (*t) { - char *n = strchr(t, '\n'); - if (l >= offset) { - if (n) - *n = 0; - Interface->Write(x, y + l - offset, t, fgColor, bgColor); - if (n) - *n = '\n'; - else - break; - } - if (!n) - break; - t = n + 1; - if (++l >= h + offset) - break; - } - Interface->SetFont(oldFont); - // scroll indicators use inverted color scheme! - if (CanScrollUp()) Interface->Write(x + w - 1, y, "^", bgColor, fgColor); - if (CanScrollDown()) Interface->Write(x + w - 1, y + h - 1, "v", bgColor, fgColor); -} - -void cMenuTextItem::ScrollUp(bool Page) -{ - if (CanScrollUp()) { - Clear(); - offset = max(offset - (Page ? h : 1), 0); - Display(); - } -} - -void cMenuTextItem::ScrollDown(bool Page) -{ - if (CanScrollDown()) { - Clear(); - offset = min(offset + (Page ? h : 1), lines - h); - Display(); - } -} - -eOSState cMenuTextItem::ProcessKey(eKeys Key) -{ - switch (Key) { - case kLeft|k_Repeat: - case kLeft: - case kUp|k_Repeat: - case kUp: ScrollUp(NORMALKEY(Key) == kLeft); break; - case kRight|k_Repeat: - case kRight: - case kDown|k_Repeat: - case kDown: ScrollDown(NORMALKEY(Key) == kRight); break; - default: return osUnknown; - } - return osContinue; -} - // --- cMenuText ------------------------------------------------------------- class cMenuText : public cOsdMenu { @@ -1086,7 +682,7 @@ cMenuEditTimer::cMenuEditTimer(int Index, bool New) //TODO VPS??? Add(new cMenuEditIntItem( tr("Priority"), &data.priority, 0, MAXPRIORITY)); Add(new cMenuEditIntItem( tr("Lifetime"), &data.lifetime, 0, MAXLIFETIME)); - Add(new cMenuEditStrItem( tr("File"), data.file, sizeof(data.file), FileNameChars)); + Add(new cMenuEditStrItem( tr("File"), data.file, sizeof(data.file), tr(FileNameChars))); SetFirstDayItem(); } } @@ -1929,60 +1525,6 @@ eOSState cMenuRecordings::ProcessKey(eKeys Key) return state; } -// --- cMenuSetupPage -------------------------------------------------------- - -class cMenuSetupPage : public cOsdMenu { -protected: - cSetup data; - int osdLanguage; - void SetupTitle(const char *s); - virtual void Set(void) = 0; -public: - cMenuSetupPage(void); - virtual eOSState ProcessKey(eKeys Key); - }; - -cMenuSetupPage::cMenuSetupPage(void) -:cOsdMenu("", 33) -{ - data = Setup; - osdLanguage = Setup.OSDLanguage; -} - -void cMenuSetupPage::SetupTitle(const char *s) -{ - char buf[40]; // can't call tr() for more than one string at a time! - char *q = buf + snprintf(buf, sizeof(buf), "%s - ", tr("Setup")); - snprintf(q, sizeof(buf) - strlen(buf), "%s", tr(s)); - SetTitle(buf); -} - -eOSState cMenuSetupPage::ProcessKey(eKeys Key) -{ - eOSState state = cOsdMenu::ProcessKey(Key); - - if (state == osUnknown) { - switch (Key) { - case kOk: state = (Setup.PrimaryDVB != data.PrimaryDVB) ? osSwitchDvb : osBack; - cDvbApi::PrimaryDvbApi->SetVideoFormat(data.VideoFormat ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3); - Setup = data; - Setup.Save(); - cDvbApi::SetCaCaps(); - break; - default: break; - } - } - if (data.OSDLanguage != osdLanguage) { - int OriginalOSDLanguage = Setup.OSDLanguage; - Setup.OSDLanguage = data.OSDLanguage; - Set(); - Display(); - osdLanguage = data.OSDLanguage; - Setup.OSDLanguage = OriginalOSDLanguage; - } - return state; -} - // --- cMenuSetupOSD --------------------------------------------------------- class cMenuSetupOSD : public cMenuSetupPage { @@ -1996,7 +1538,7 @@ void cMenuSetupOSD::Set(void) { Clear(); SetupTitle("OSD"); - Add(new cMenuEditStraItem(tr("Setup.OSD$Language"), &data.OSDLanguage, NumLanguages, Languages())); + Add(new cMenuEditStraItem(tr("Setup.OSD$Language"), &data.OSDLanguage, I18nNumLanguages, I18nLanguages())); Add(new cMenuEditIntItem( tr("Setup.OSD$Width"), &data.OSDwidth, MINOSDWIDTH, MAXOSDWIDTH)); Add(new cMenuEditIntItem( tr("Setup.OSD$Height"), &data.OSDheight, MINOSDHEIGHT, MAXOSDHEIGHT)); Add(new cMenuEditIntItem( tr("Setup.OSD$Message time (s)"), &data.OSDMessageTime, 1, 60)); @@ -2104,7 +1646,8 @@ void cMenuSetupRecord::Set(void) Add(new cMenuEditIntItem( tr("Setup.Recording$Default lifetime (d)"), &data.DefaultLifetime, 0, MAXLIFETIME)); Add(new cMenuEditBoolItem(tr("Setup.Recording$Use episode name"), &data.UseSubtitle)); Add(new cMenuEditBoolItem(tr("Setup.Recording$Mark instant recording"), &data.MarkInstantRecord)); - Add(new cMenuEditStrItem( tr("Setup.Recording$Name instant recording"), data.NameInstantRecord, sizeof(data.NameInstantRecord), FileNameChars)); + Add(new cMenuEditStrItem( tr("Setup.Recording$Name instant recording"), data.NameInstantRecord, sizeof(data.NameInstantRecord), tr(FileNameChars))); + Add(new cMenuEditIntItem( tr("Setup.Recording$Instant rec. time (min)"), &data.InstantRecordTime, 1, MAXINSTANTRECTIME)); Add(new cMenuEditBoolItem(tr("Setup.Recording$Record Dolby Digital"), &data.RecordDolbyDigital)); Add(new cMenuEditIntItem( tr("Setup.Recording$Max. video file size (MB)"), &data.MaxVideoFileSize, MINVIDEOFILESIZE, MAXVIDEOFILESIZE)); Add(new cMenuEditBoolItem(tr("Setup.Recording$Split edited files"), &data.SplitEditedFiles)); @@ -2142,7 +1685,76 @@ void cMenuSetupMisc::Set(void) SetupTitle("Miscellaneous"); Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Min. event timeout (min)"), &data.MinEventTimeout)); Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Min. user inactivity (min)"), &data.MinUserInactivity)); - Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$SVDRP timeout (min)"), &data.SVDRPTimeout)); + Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$SVDRP timeout (s)"), &data.SVDRPTimeout)); +} + +// --- cMenuSetupPluginItem -------------------------------------------------- + +class cMenuSetupPluginItem : public cOsdItem { +private: + int pluginIndex; +public: + cMenuSetupPluginItem(const char *Name, int Index); + int PluginIndex(void) { return pluginIndex; } + }; + +cMenuSetupPluginItem::cMenuSetupPluginItem(const char *Name, int Index) +:cOsdItem(Name) +{ + pluginIndex = Index; +} + +// --- cMenuSetupPlugins ----------------------------------------------------- + +class cMenuSetupPlugins : public cMenuSetupPage { +private: + virtual void Set(void); +public: + cMenuSetupPlugins(void) { Set(); } + virtual eOSState ProcessKey(eKeys Key); + }; + +void cMenuSetupPlugins::Set(void) +{ + Clear(); + SetupTitle("Plugins"); + SetHasHotkeys(); + for (int i = 0; ; i++) { + cPlugin *p = cPluginManager::GetPlugin(i); + if (p) { + char *buffer = NULL; + asprintf(&buffer, "%s (%s) - %s", p->Name(), p->Version(), p->Description()); + Add(new cMenuSetupPluginItem(hk(buffer), i)); + delete buffer; + } + else + break; + } +} + +eOSState cMenuSetupPlugins::ProcessKey(eKeys Key) +{ + eOSState state = cOsdMenu::ProcessKey(Key); // not cMenuSetupPage::ProcessKey()! + + if (state == osUnknown) { + switch (Key) { + case kOk: { + cMenuSetupPluginItem *item = (cMenuSetupPluginItem *)Get(Current()); + if (item) { + cPlugin *p = cPluginManager::GetPlugin(item->PluginIndex()); + if (p) { + cOsdMenu *menu = p->SetupMenu(); + if (menu) + return AddSubMenu(menu); + Interface->Info(tr("This plugin has no setup parameters!")); + } + } + } + break; + default: break; + } + } + return state; } // --- cMenuSetup ------------------------------------------------------------ @@ -2165,7 +1777,9 @@ cMenuSetup::cMenuSetup(void) void cMenuSetup::Set(void) { Clear(); - SetTitle(tr("Setup")); + char buffer[64]; + snprintf(buffer, sizeof(buffer), "%s - VDR %s", tr("Setup"), VDRVERSION); + SetTitle(buffer); SetHasHotkeys(); Add(new cOsdItem(hk(tr("OSD")), osUser1)); Add(new cOsdItem(hk(tr("EPG")), osUser2)); @@ -2175,7 +1789,9 @@ void cMenuSetup::Set(void) Add(new cOsdItem(hk(tr("Recording")), osUser6)); Add(new cOsdItem(hk(tr("Replay")), osUser7)); Add(new cOsdItem(hk(tr("Miscellaneous")), osUser8)); - Add(new cOsdItem(hk(tr("Restart")), osUser9)); + if (cPluginManager::HasPlugins()) + Add(new cOsdItem(hk(tr("Plugins")), osUser9)); + Add(new cOsdItem(hk(tr("Restart")), osUser10)); } eOSState cMenuSetup::Restart(void) @@ -2201,7 +1817,8 @@ eOSState cMenuSetup::ProcessKey(eKeys Key) case osUser6: return AddSubMenu(new cMenuSetupRecord); case osUser7: return AddSubMenu(new cMenuSetupReplay); case osUser8: return AddSubMenu(new cMenuSetupMisc); - case osUser9: return Restart(); + case osUser9: return AddSubMenu(new cMenuSetupPlugins); + case osUser10: return Restart(); default: ; } if (Setup.OSDLanguage != osdLanguage) { @@ -2264,6 +1881,22 @@ eOSState cMenuCommands::ProcessKey(eKeys Key) return state; } +// --- cMenuPluginItem ------------------------------------------------------- + +class cMenuPluginItem : public cOsdItem { +private: + int pluginIndex; +public: + cMenuPluginItem(const char *Name, int Index); + int PluginIndex(void) { return pluginIndex; } + }; + +cMenuPluginItem::cMenuPluginItem(const char *Name, int Index) +:cOsdItem(Name, osPlugin) +{ + pluginIndex = Index; +} + // --- cMenuMain ------------------------------------------------------------- #define STOP_RECORDING tr(" Stop recording ") @@ -2308,6 +1941,22 @@ void cMenuMain::Set(void) Add(new cOsdItem(hk(tr("Channels")), osChannels)); Add(new cOsdItem(hk(tr("Timers")), osTimers)); Add(new cOsdItem(hk(tr("Recordings")), osRecordings)); + + // Plugins: + + for (int i = 0; ; i++) { + cPlugin *p = cPluginManager::GetPlugin(i); + if (p) { + const char *item = p->MainMenuEntry(); + if (item) + Add(new cMenuPluginItem(hk(item), i)); + } + else + break; + } + + // More basic menu items: + Add(new cOsdItem(hk(tr("Setup")), osSetup)); if (Commands.Count()) Add(new cOsdItem(hk(tr("Commands")), osCommands)); @@ -2375,6 +2024,19 @@ eOSState cMenuMain::ProcessKey(eKeys Key) return osEnd; } break; + case osPlugin: { + cMenuPluginItem *item = (cMenuPluginItem *)Get(Current()); + if (item) { + cPlugin *p = cPluginManager::GetPlugin(item->PluginIndex()); + if (p) { + cOsdMenu *menu = p->MainMenuAction(); + if (menu) + return AddSubMenu(menu); + } + } + state = osEnd; + } + break; default: switch (Key) { case kMenu: state = osEnd; break; case kRed: if (!HasSubMenu()) @@ -3185,6 +2847,7 @@ void cReplayControl::TimeSearch(void) else return; } + timeoutShow = 0; TimeSearchDisplay(); timeSearchActive = true; } @@ -3287,7 +2950,7 @@ eOSState cReplayControl::ProcessKey(eKeys Key) } else if (modeOnly) ShowMode(); - else + else shown = ShowProgress(!shown) || shown; } bool DisplayedFrames = displayFrames; |