Index: current/menu.c =================================================================== --- menu.c.orig 2015-11-02 11:54:55.310709767 +0100 +++ menu.c 2015-11-02 11:54:55.310709767 +0100 @@ -1190,6 +1190,7 @@ class cMenuTimerItem : public cOsdItem { private: const cTimer *timer; + void DoSet(void); public: cMenuTimerItem(const cTimer *Timer); virtual int Compare(const cListObject &ListObject) const; @@ -1201,7 +1202,7 @@ cMenuTimerItem::cMenuTimerItem(const cTimer *Timer) { timer = Timer; - Set(); + DoSet(); } int cMenuTimerItem::Compare(const cListObject &ListObject) const @@ -1211,6 +1212,19 @@ void cMenuTimerItem::Set(void) { + // check for deleted timer + LOCK_TIMERS_READ; + for (const cTimer *t = Timers->First(); ; t = Timers->Next(t)) { + if (t == timer) + break; // timer still there + if (t == NULL) + return; // no matching timer found + } + DoSet(); +} + +void cMenuTimerItem::DoSet(void) +{ cString day, name(""); if (timer->WeekDays()) day = timer->PrintDay(0, timer->WeekDays(), false); @@ -1258,8 +1273,7 @@ cStateKey timersStateKey; int helpKeys; void Set(void); - eOSState Edit(void); - eOSState New(void); + eOSState Edit(bool New = false); eOSState Delete(void); eOSState OnOff(void); eOSState Info(void); @@ -1351,20 +1365,29 @@ return osContinue; } -eOSState cMenuTimers::Edit(void) -{ - if (HasSubMenu() || Count() == 0) - return osContinue; - return AddSubMenu(new cMenuEditTimer(GetTimer())); -} - -eOSState cMenuTimers::New(void) +eOSState cMenuTimers::Edit(bool New) { - if (HasSubMenu()) + if (HasSubMenu() || Count() == 0 && !New) return osContinue; cTimer *Timer = new cTimer; if (*Setup.SVDRPDefaultHost) Timer->SetRemote(Setup.SVDRPDefaultHost); + // Data structure for service "Epgsearch-exttimeredit-v1.0" + struct Epgsearch_exttimeredit_v1_0 + { + // in + cTimer* timer; // pointer to the timer to edit + bool bNew; // flag that indicates, if this is a new timer or an existing one + const cEvent* event; // pointer to the event corresponding to this timer (may be NULL) + // out + cOsdMenu* pTimerMenu; // pointer to the menu of results + } exttimeredit; + exttimeredit.timer = New ? (new cTimer) : GetTimer(); + exttimeredit.bNew = New; + exttimeredit.event = exttimeredit.timer->Event(); + if (cPluginManager::CallFirstService("Epgsearch-exttimeredit-v1.0", &exttimeredit)) + return AddSubMenu(exttimeredit.pTimerMenu); + return AddSubMenu(new cMenuEditTimer(Timer, true)); } @@ -1423,7 +1446,7 @@ switch (Key) { case kOk: return Edit(); case kRed: state = OnOff(); break; // must go through SetHelpKeys()! - case kGreen: return New(); + case kGreen: return Edit(true); case kYellow: state = Delete(); break; case kInfo: case kBlue: return Info(); @@ -1437,6 +1460,14 @@ Add(new cMenuTimerItem(Timer), true); Display(); } + if (!HasSubMenu()) { + LOCK_TIMERS_READ; + if (Timers->Count()