14 Commits

Author SHA1 Message Date
kamel5
5870b1ae4c Version 1.3.1 2020-03-11 15:08:32 +01:00
kamel5
69b851c9ed Fixed a segfault 2020-03-11 14:59:03 +01:00
kamel5
8335ab0e41 Fixes for <VDR-2.3.1 compatibility 2020-03-07 16:55:49 +01:00
kamel5
240cbe87e0 Version 1.3.0 2020-03-06 14:03:36 +01:00
kamel5
ee68d2eb2f Fixed messages in DisplayTimerConflict 2020-03-06 14:01:47 +01:00
kamel5
eb3a4113be Fixed horizontal alignment in timeline 2020-03-06 14:01:47 +01:00
kamel5
7ec89bf12b Fixed stopIndex in cRecMenu::JumpBegin 2020-03-06 14:01:47 +01:00
kamel5
f653594c4a Fixes for <VDR-2.3.1 compatibility 2020-03-04 15:26:27 +01:00
kamel5
8129d116fb Show numTimersToday in timeline 2020-03-02 13:33:58 +01:00
kamel5
874f5cd9d5 Fixed a problem in DisplayTimerConflict 2020-03-02 12:47:04 +01:00
kamel5
9044e092f8 Version 1.2.17 2020-02-17 16:08:14 +01:00
kamel5
b96f800240 Add episode to manual timer 2020-02-17 16:05:43 +01:00
kamel5
5d9ed1439a Fixed a remote timer problem 2020-02-17 15:51:51 +01:00
kamel5
66a0c15aea Final fix for utf8 CutText 2020-02-17 15:51:47 +01:00
23 changed files with 346 additions and 126 deletions

20
HISTORY
View File

@@ -250,3 +250,23 @@ Version 1.2.16
- Optimize display "REC" sign in epgview
- Separate "displayTime" for horizontal and vertical view
- RecMenu "Timer Timeline" displays now sorted active timer
Version 1.2.17
- Final fix for utf8 CutText
- Fixed a remote timer problem
- Add episode to manual timer
Version 1.3.0
- last version with <VDR-2.3.1 compatibility
- Fixed a possible seqfault in DisplayTimerConflict
- Show numTimersToday in timeline
- Fixed stopIndex in cRecMenu::JumpBegin
- Fixed horizontal alignment in timeline
- Fixed messages in DisplayTimerConflict
Version 1.3.1
- Fixes for <VDR-2.3.1 compatibility
- Fixed a segfault while starting tvguide

View File

@@ -34,6 +34,7 @@ cTVGuideConfig::cTVGuideConfig() {
channelJumpMode = eNumJump;
jumpChannels = 0;
blueKeyMode = 2;
addSubtitleToTimer = 1;
closeOnSwitch = 1;
numkeyMode = 0;
useRemoteTimers = 0;
@@ -295,6 +296,7 @@ bool cTVGuideConfig::SetupParse(const char *Name, const char *Value) {
else if (strcmp(Name, "footerHeightPercent") == 0) footerHeightPercent = atoi(Value);
else if (strcmp(Name, "instRecFolderMode") == 0) instRecFolderMode = atoi(Value);
else if (strcmp(Name, "instRecFixedFolder") == 0) instRecFixedFolder = Value;
else if (strcmp(Name, "addSubtitleToTimer") == 0) addSubtitleToTimer = atoi(Value);
else if (strcmp(Name, "favWhatsOnNow") == 0) favWhatsOnNow = atoi(Value);
else if (strcmp(Name, "favWhatsOnNext") == 0) favWhatsOnNext = atoi(Value);
else if (strcmp(Name, "favUseTime1") == 0) favUseTime1 = atoi(Value);

View File

@@ -43,6 +43,12 @@ enum eInstRecFolderMode {
eFolderFixed
};
typedef enum {
addSubtitleNever = 0,
addSubtitleSmart,
addSubtitleAlways
} addSubtitleToTimerMode;
class cTVGuideConfig {
private:
cString checkSlashAtEnd(std::string path);
@@ -82,6 +88,7 @@ class cTVGuideConfig {
int channelJumpMode;
int jumpChannels;
int blueKeyMode;
int addSubtitleToTimer;
int closeOnSwitch;
int numkeyMode;
int useRemoteTimers;

View File

@@ -7,7 +7,7 @@ cOsdManager::cOsdManager(void) {
bool cOsdManager::setOsd() {
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
if (osd) {
tArea Area = { 0, 0, cOsd::OsdWidth(), cOsd::OsdHeight(), 32 };
tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 };
if (osd->SetAreas(&Area, 1) == oeOk) {
return true;
}

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vdr-tvguide 0.0.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2020-01-06 14:31+0100\n"
"POT-Creation-Date: 2020-02-17 14:30+0100\n"
"PO-Revision-Date: 2013-09-21 17:49+0200\n"
"Last-Translator: My friend <Sampep> Thanks David <Gabychan> <gbonich@gmail.com>\n"
"Language-Team: \n"
@@ -57,6 +57,9 @@ msgstr ""
msgid "images"
msgstr ""
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder"
msgstr "Directori principal per a vídeo"
@@ -888,15 +891,27 @@ msgstr ""
msgid "Use fixed folder"
msgstr ""
msgid "smart"
msgstr ""
msgid "Instant recording:"
msgstr ""
msgid "Folder for instant Recordings"
msgstr ""
msgid "Folder"
msgstr ""
msgid "Add episode to manual timers"
msgstr ""
msgid "Use Remotetimers"
msgstr "Utilitza temporitzadors remots"
msgid "Favorites:"
msgstr ""
msgid "Limit channels in favorites"
msgstr ""

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vdr-tvguide 0.0.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2020-01-06 14:31+0100\n"
"POT-Creation-Date: 2020-02-17 14:30+0100\n"
"PO-Revision-Date: 2012-08-25 17:49+0200\n"
"Last-Translator: Horst\n"
"Language-Team: \n"
@@ -54,6 +54,9 @@ msgstr "Favoriten"
msgid "images"
msgstr "Bilder"
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder"
msgstr "Video Hauptverzeichnis"
@@ -885,15 +888,27 @@ msgstr "Verzeichnis aus Liste auswählen"
msgid "Use fixed folder"
msgstr "Festes Verzeichnis benutzen"
msgid "smart"
msgstr "intelligent"
msgid "Instant recording:"
msgstr "Sofortaufnahmen:"
msgid "Folder for instant Recordings"
msgstr "Verzeichnis für Sofortaufnahmen"
msgid "Folder"
msgstr "Verzeichnis"
msgid "Add episode to manual timers"
msgstr "Untertitel in manuellen Timern"
msgid "Use Remotetimers"
msgstr "RemoteTimers benutzen"
msgid "Favorites:"
msgstr "Favoriten:"
msgid "Limit channels in favorites"
msgstr "Kanäle in Favoriten beschränken"

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vdr-tvguide 0.0.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2020-01-06 14:31+0100\n"
"POT-Creation-Date: 2020-02-17 14:30+0100\n"
"PO-Revision-Date: 2012-08-25 17:49+0200\n"
"Last-Translator: fiveten_59\n"
"Language-Team: \n"
@@ -54,6 +54,9 @@ msgstr "Favoriti"
msgid "images"
msgstr "Immagini"
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder"
msgstr "cartella video di root"
@@ -885,15 +888,27 @@ msgstr "Scegli dall'elenco cartelle"
msgid "Use fixed folder"
msgstr "Usa cartella fissa"
msgid "smart"
msgstr "intelligente"
msgid "Instant recording:"
msgstr ""
msgid "Folder for instant Recordings"
msgstr "Cartella per la registrazione immediata"
msgid "Folder"
msgstr "Cartella"
msgid "Add episode to manual timers"
msgstr "Aggiungi episodi ai timer manuali"
msgid "Use Remotetimers"
msgstr "Usa Remotetimers"
msgid "Favorites:"
msgstr ""
msgid "Limit channels in favorites"
msgstr "Limite dei canali nei favoriti"

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vdr-tvguide 1.0.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2020-01-06 14:31+0100\n"
"POT-Creation-Date: 2020-02-17 14:30+0100\n"
"PO-Revision-Date: 2013-09-25 17:49+0400\n"
"Last-Translator: AmiD, ilya\n"
"Language-Team: Russia-Cherepovets(wm.amid@gmail.com)\n"
@@ -54,6 +54,9 @@ msgstr ""
msgid "images"
msgstr ""
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder"
msgstr "Главная видео директория"
@@ -885,15 +888,27 @@ msgstr ""
msgid "Use fixed folder"
msgstr ""
msgid "smart"
msgstr ""
msgid "Instant recording:"
msgstr ""
msgid "Folder for instant Recordings"
msgstr ""
msgid "Folder"
msgstr ""
msgid "Add episode to manual timers"
msgstr ""
msgid "Use Remotetimers"
msgstr "RemoteTimers benutzen"
msgid "Favorites:"
msgstr ""
msgid "Limit channels in favorites"
msgstr ""

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vdr-tvguide 1.1.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2020-01-06 14:31+0100\n"
"POT-Creation-Date: 2020-02-17 14:30+0100\n"
"PO-Revision-Date: 2013-09-15 00:12+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: \n"
@@ -54,6 +54,9 @@ msgstr ""
msgid "images"
msgstr ""
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder"
msgstr "Hlavn<76> video adres<65>r"
@@ -885,15 +888,27 @@ msgstr ""
msgid "Use fixed folder"
msgstr ""
msgid "smart"
msgstr "chytr<74>"
msgid "Instant recording:"
msgstr ""
msgid "Folder for instant Recordings"
msgstr ""
msgid "Folder"
msgstr ""
msgid "Add episode to manual timers"
msgstr "Prida<64> epiz<69>dy do ru<72>n<EFBFBD>ho <20>asova<76>a"
msgid "Use Remotetimers"
msgstr "Pou<6F>i<EFBFBD> vzdialen<65> pl<70>nova<76>"
msgid "Favorites:"
msgstr ""
msgid "Limit channels in favorites"
msgstr ""

View File

@@ -96,10 +96,11 @@ cTimer *cRecManager::createTimer(const cEvent *event, std::string path) {
cTimer *cRecManager::createLocalTimer(const cEvent *event, std::string path) {
cTimer *timer = new cTimer(event);
#if VDRVERSNUM >= 20301
if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
((cTimer*)timer)->SetRemote(Setup.SVDRPDefaultHost);
LOCK_TIMERS_WRITE;
cTimers* timers = Timers;
timers->SetExplicitModify();
if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
timer->SetRemote(Setup.SVDRPDefaultHost);
#else
cTimers* timers = &Timers;
#endif
@@ -115,12 +116,21 @@ cTimer *cRecManager::createLocalTimer(const cEvent *event, std::string path) {
timer = t;
isyslog("timer %s reactivated", *t->ToDescr());
} else {
SetTimerPath(timer, event, path);
timers->Add(timer);
timers->SetModified();
#if VDRVERSNUM >= 20301
if (!HandleRemoteTimerModifications(timer)) {
timers->Del(timer);
esyslog(tr("tvguide: RemoteTimerModifications failed"));
} else {
isyslog("timer %s added (active)", *timer->ToDescr());
}
#else
isyslog("timer %s added (active)", *timer->ToDescr());
#endif
}
SetTimerPath(timer, event, path);
timers->SetModified();
return timer;
return timers->GetTimer(timer);
}
cTimer *cRecManager::createRemoteTimer(const cEvent *event, std::string path) {
@@ -165,12 +175,25 @@ void cRecManager::SetTimerPath(cTimer *timer, const cEvent *event, std::string p
return;
}
//Set choosen path
bool addSubtitle = false;
if (!isempty(event->ShortText())) { // add subtitle if present
addSubtitle = (config.addSubtitleToTimer != addSubtitleNever);
if (config.addSubtitleToTimer == addSubtitleSmart)
if (event->Duration() > 80 * 60)
addSubtitle = false;
}
cString newFileName;
if (path.size() > 0) {
std::replace(path.begin(), path.end(), '/', '~');
newFileName = cString::sprintf("%s~%s", path.c_str(), timer->File());
if (addSubtitle)
newFileName = cString::sprintf("%s~%s~%s", path.c_str(), event->Title(), event->ShortText());
else
newFileName = cString::sprintf("%s~%s", path.c_str(), timer->File());
} else {
newFileName = event->Title();
if (addSubtitle)
newFileName = cString::sprintf("%s~%s", event->Title(), event->ShortText());
else
newFileName = event->Title();
}
timer->SetFile(*newFileName);
}
@@ -204,6 +227,12 @@ void cRecManager::DeleteTimer(const cTimer *timer) {
#if VDRVERSNUM >= 20301
LOCK_TIMERS_WRITE;
cTimers* timers = Timers;
if (timer && timer->Remote() && !timer->Recording()) {
if (HandleRemoteTimerModifications(NULL, (cTimer*)timer)) {
timers->Del((cTimer*)timer);
}
timers->SetModified();
}
cTimer* t = timers->GetTimer(timer);
#else
cTimers* timers = &Timers;
@@ -238,24 +267,34 @@ void cRecManager::DeleteRemoteTimer(const cEvent *event) {
}
}
void cRecManager::SaveTimer(const cTimer *t, cTimer newTimerSettings) {
void cRecManager::SaveTimer(const cTimer *t, cTimer *newTimerSettings) {
if (!t)
return;
#if VDRVERSNUM >= 20301
LOCK_TIMERS_WRITE;
cTimer *timer = Timers->GetTimer(t);
cTimers* timers = Timers;
timers->SetExplicitModify();
if (t && t->Remote()) {
if (!HandleRemoteTimerModifications(newTimerSettings, (cTimer *)t)) {
esyslog(tr("tvguide: RemoteTimerModifications failed"));
}
}
cTimer *timer = timers->GetTimer(t);
#else
cTimer *timer = Timers.GetTimer((cTimer*)t);
cTimers* timers = &Timers;
cTimer *timer = timers->GetTimer((cTimer *)t);
#endif
bool active = newTimerSettings.HasFlags(tfActive);
int prio = newTimerSettings.Priority();
int lifetime = newTimerSettings.Lifetime();
time_t day = newTimerSettings.Day();
int start = newTimerSettings.Start();
int stop = newTimerSettings.Stop();
std::string fileName = newTimerSettings.File();
if (!timer) {
return;
}
bool active = newTimerSettings->HasFlags(tfActive);
int prio = newTimerSettings->Priority();
int lifetime = newTimerSettings->Lifetime();
time_t day = newTimerSettings->Day();
int start = newTimerSettings->Start();
int stop = newTimerSettings->Stop();
std::string fileName = newTimerSettings->File();
timer->SetDay(day);
timer->SetStart(start);
@@ -264,10 +303,10 @@ void cRecManager::SaveTimer(const cTimer *t, cTimer newTimerSettings) {
timer->SetLifetime(lifetime);
timer->SetFile(fileName.c_str());
if (timer->HasFlags(tfActive) && !active)
timer->ClrFlags(tfActive);
else if (!timer->HasFlags(tfActive) && active)
timer->SetFlags(tfActive);
if (active)
timer->SetFlags(tfActive);
else
timer->ClrFlags(tfActive);
#if VDRVERSNUM < 20300
timer->SetEventFromSchedule();
@@ -279,11 +318,7 @@ void cRecManager::SaveTimer(const cTimer *t, cTimer newTimerSettings) {
rt.timer = NULL;
RefreshRemoteTimers();
} else {
#if VDRVERSNUM >= 20301
Timers->SetModified();
#else
Timers.SetModified();
#endif
timers->SetModified();
}
}

View File

@@ -37,7 +37,7 @@ public:
void DeleteTimer(const cEvent *event);
void DeleteLocalTimer(const cEvent *event);
void DeleteRemoteTimer(const cEvent *event);
void SaveTimer(const cTimer *timer, cTimer newTimerSettings);
void SaveTimer(const cTimer *timer, cTimer *newTimerSettings);
bool IsRecorded(const cEvent *event);
cTVGuideTimerConflicts *CheckTimerConflict(void);
void CreateSeriesTimer(cTimer *seriesTimer);

View File

@@ -441,7 +441,7 @@ void cRecMenu::JumpBegin(void) {
CreatePixmap();
Arrange(false);
startIndex = 0;
stopIndex = numItems - 1;
stopIndex = currentItem;
cRecMenuItem *first = menuItems.front();
first->setActive();
first->setBackground();
@@ -589,10 +589,14 @@ void cRecMenu::UpdateActiveMenuItem(void) {
void cRecMenu::DrawScrollBar(void) {
if (!pixmapScrollBar)
return;
pixmapScrollBar->Fill(theme.Color(clrBorder));
pixmapScrollBar->DrawRectangle(cRect(2,2,pixmapScrollBar->ViewPort().Width()-4, pixmapScrollBar->ViewPort().Height() - 4), theme.Color(clrBackground));
int totalNumItems = GetTotalNumMenuItems();
if (!totalNumItems)
return;
if (imgScrollBar == NULL) {
int scrollBarImgHeight = (pixmapScrollBar->ViewPort().Height() - 8) * numItems / totalNumItems;
imgScrollBar = createScrollbar(pixmapScrollBar->ViewPort().Width()-8, scrollBarImgHeight, theme.Color(clrHighlight), theme.Color(clrHighlightBlending));

View File

@@ -1548,6 +1548,7 @@ cRecMenuItemTimer::cRecMenuItemTimer(const cTimer *timer,
this->overlapStop = overlapStop;
this->active = active;
height = 3 * font->Height();
pixmapStatus = NULL;
pixmapIcons = NULL;
}
@@ -1585,6 +1586,8 @@ void cRecMenuItemTimer::Show(void) {
}
void cRecMenuItemTimer::Draw(void) {
if (!timer)
return;
const cChannel *channel = timer->Channel();
int channelTransponder = 0;
cString channelName = "";
@@ -1740,8 +1743,13 @@ cRecMenuItemTimerConflictHeader::~cRecMenuItemTimerConflictHeader(void) {
}
void cRecMenuItemTimerConflictHeader::SetPixmaps(void) {
pixmap = osdManager.requestPixmap(4, cRect(x, y, width, height));
pixmapStatus = osdManager.requestPixmap(5, cRect(x, y, width, height));
if (!pixmap) {
pixmap = osdManager.requestPixmap(4, cRect(x, y, width, height));
pixmapStatus = osdManager.requestPixmap(5, cRect(x, y, width, height));
} else {
pixmap->SetViewPort(cRect(x, y, width, height));
pixmapStatus->SetViewPort(cRect(x, y, width, height));
}
pixmapStatus->Fill(clrTransparent);
}
@@ -2304,13 +2312,14 @@ void cRecMenuItemRecording::Show(void) {
}
// --- cRecMenuItemTimelineHeader -------------------------------------------------------
cRecMenuItemTimelineHeader::cRecMenuItemTimelineHeader(time_t day, std::vector<cTVGuideTimerConflict*> conflictsToday) {
cRecMenuItemTimelineHeader::cRecMenuItemTimelineHeader(time_t day, int numTimersToday, std::vector<cTVGuideTimerConflict*> conflictsToday) {
conflicts = conflictsToday;
pixmapTimeline = NULL;
pixmapTimerInfo = NULL;
pixmapTimerConflicts = NULL;
timer = NULL;
this->day = day;
this->numTimersToday = numTimersToday;
selectable = false;
active = false;
height = 5 * font->Height();
@@ -2359,7 +2368,7 @@ void cRecMenuItemTimelineHeader::Draw(void) {
}
DrawTimerConflicts();
pixmap->Fill(clrTransparent);
cString headerText = tr("Timers for");
cString headerText = cString::sprintf("%i %s", numTimersToday, tr("Timers for"));
cString dateText = DateString(day);
cString header = cString::sprintf("%s: %s", *headerText, *dateText);
int xText = (width - fontLarge->Width(*header)) / 2;
@@ -2421,7 +2430,7 @@ void cRecMenuItemTimelineHeader::DrawTimeline(void) {
pixmapTimeline->Fill(clrTransparent);
width5Mins = (float)width * 5.0 / 24.0 / 60.0;
int widthHour = 12 * width5Mins;
x0 = (width - 24*widthHour)/2;
x0 = (width - (24 * widthHour)) / 2;
int barHeight = fontSmall->Height();
int y = height - barHeight;
tColor col1 = theme.Color(clrTimeline1);
@@ -2526,7 +2535,8 @@ void cRecMenuItemTimelineTimer::SetPixmaps(void) {
}
width5Mins = (float)width * 5.0 / 24.0 / 60.0;
x0 = (width - 24*12*width5Mins)/2;
int widthHour = 12 * width5Mins;
x0 = (width - (24 * widthHour)) / 2;
}
void cRecMenuItemTimelineTimer::Draw(void) {

View File

@@ -573,19 +573,21 @@ private:
cPixmap *pixmapTimeline;
cPixmap *pixmapTimerInfo;
cPixmap *pixmapTimerConflicts;
int width5Mins;
float width5Mins;
int x0;
int numTimersToday;
bool timelineDrawn;
void DrawTimeline(void);
void DrawTimerConflicts(void);
void DrawCurrentTimer(void);
public:
cRecMenuItemTimelineHeader(time_t day, std::vector<cTVGuideTimerConflict*> conflictsToday);
cRecMenuItemTimelineHeader(time_t day, int numTimersToday, std::vector<cTVGuideTimerConflict*> conflictsToday);
virtual ~cRecMenuItemTimelineHeader(void);
void SetDay(time_t day) { this->day = day; };
void SetPixmaps(void);
void SetCurrentTimer(const cTimer *timer) { this->timer = timer; };
void UnsetCurrentTimer(void) { timer = NULL; };
void SetNumTimersToday(int numTimersToday) { this->numTimersToday = numTimersToday; };
void RefreshTimerDisplay(void);
void Hide(void);
void Show(void);
@@ -601,7 +603,7 @@ private:
cPixmap *pixmapTimerConflicts;
cRecMenuItemTimelineHeader *header;
int x0;
int width5Mins;
float width5Mins;
time_t start;
time_t stop;
void DrawBackground(void);

View File

@@ -194,8 +194,9 @@ cRecMenuAskDeleteTimer::cRecMenuAskDeleteTimer(const cEvent *event) {
// --- cRecMenuTimerConflicts ---------------------------------------------------------
cRecMenuTimerConflicts::cRecMenuTimerConflicts(cTVGuideTimerConflicts *conflicts) {
int numConflicts = conflicts->NumConflicts();
SetWidthPercent(50);
int numConflicts = (conflicts) ? conflicts->NumConflicts() : 0;
cString text;
if (numConflicts == 1) {
text = cString::sprintf("%s %s %s", tr("One"), tr("Timer Conflict"), tr("detected"));
@@ -230,19 +231,21 @@ int cRecMenuTimerConflicts::GetTimerConflict(void) {
}
// --- cRecMenuTimerConflict ---------------------------------------------------------
cRecMenuTimerConflict::cRecMenuTimerConflict(cTVGuideTimerConflict *conflict) {
cRecMenuTimerConflict::cRecMenuTimerConflict(cTVGuideTimerConflict *conflict, eRecMenuState nextAction) {
SetWidthPercent(95);
this->conflict = conflict;
SetHeader(new cRecMenuItemTimerConflictHeader(conflict->timeStart,
conflict->timeStop,
conflict->overlapStart,
totalNumMenuItems = (int)conflict->timerIDs.size();
SetHeader(new cRecMenuItemTimerConflictHeader(conflict->timeStart,
conflict->timeStop,
conflict->overlapStart,
conflict->overlapStop));
SetFooter(new cRecMenuItemButton(tr("Ignore Conflict"), rmsIgnoreTimerConflict, false, true));
SetFooter(new cRecMenuItemButton(tr("Ignore Conflict"), nextAction, false, true));
int i=0;
for(std::vector<int>::iterator it = conflict->timerIDs.begin(); it != conflict->timerIDs.end(); it++) {
#if VDRVERSNUM >= 20301
LOCK_TIMERS_READ;
const cTimer *timer = Timers->Get(*it);
const cTimer *timer = Timers->GetById(*it + 1);
#else
const cTimer *timer = Timers.Get(*it);
#endif
@@ -268,7 +271,7 @@ cRecMenuTimerConflict::cRecMenuTimerConflict(cTVGuideTimerConflict *conflict) {
}
cRecMenuItem *cRecMenuTimerConflict::GetMenuItem(int number) {
if ((number >= 0) && (number < (int)conflict->timerIDs.size())) {
if ((number >= 0) && (number < totalNumMenuItems)) {
#if VDRVERSNUM >= 20301
LOCK_TIMERS_READ;
const cTimer *timer = Timers->Get(conflict->timerIDs[number]);
@@ -290,8 +293,8 @@ cRecMenuItem *cRecMenuTimerConflict::GetMenuItem(int number) {
return NULL;
}
int cRecMenuTimerConflict::GetTotalNumMenuItems(void) {
return conflict->timerIDs.size();
int cRecMenuTimerConflict::GetTotalNumMenuItems(void) {
return totalNumMenuItems;
}
int cRecMenuTimerConflict::GetTimerConflictIndex(void) {
@@ -467,17 +470,17 @@ const cTimer *cRecMenuEditTimer::GetOriginalTimer(void) {
return originalTimer;
}
cTimer cRecMenuEditTimer::GetTimer(void) {
cTimer t;
cTimer *cRecMenuEditTimer::GetTimer(void) {
cTimer *t = (cTimer *)originalTimer;
if (timerActive)
t.SetFlags(tfActive);
t->SetFlags(tfActive);
else
t.SetFlags(tfNone);
t.SetDay(day);
t.SetStart(start);
t.SetStop(stop);
t.SetPriority(prio);
t.SetLifetime(lifetime);
t->ClrFlags(tfActive);
t->SetDay(day);
t->SetStart(start);
t->SetStop(stop);
t->SetPriority(prio);
t->SetLifetime(lifetime);
std::string newFolder(folder);
std::string newFile = originalTimer->File();
size_t found = newFile.find_last_of('~');
@@ -492,7 +495,7 @@ cTimer cRecMenuEditTimer::GetTimer(void) {
newFile = *cString::sprintf("%s~%s", newFolder.c_str(), newFile.c_str());
}
std::replace(newFile.begin(), newFile.end(), '/', '~');
t.SetFile(newFile.c_str());
t->SetFile(newFile.c_str());
return t;
}
@@ -1410,8 +1413,8 @@ cRecMenuTimeline::cRecMenuTimeline(cTVGuideTimerConflicts *timerConflicts) {
SetStartStop();
conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop);
GetTimersForDay();
SetWidthPercent(95);
header = new cRecMenuItemTimelineHeader(timeStart, conflictsToday);
SetWidthPercent(90);
header = new cRecMenuItemTimelineHeader(timeStart, numTimersToday, conflictsToday);
SetHeader(header);
cRecMenuItem *footer = new cRecMenuItemButton(tr("Close"), rmsClose, false, true);
SetFooter(footer);
@@ -1432,9 +1435,6 @@ void cRecMenuTimeline::GetTimersForDay(void) {
#if VDRVERSNUM >= 20301
LOCK_TIMERS_READ;
const cTimers* timers = Timers;
#else
const cTimers* timers = &Timers;
#endif
cSortedTimers SortedTimers(timers);
int i = 0;
while (i < SortedTimers.Size()) {
@@ -1445,17 +1445,29 @@ void cRecMenuTimeline::GetTimersForDay(void) {
}
i++;
}
#else
for (const cTimer *t = Timers.First(); t; t = Timers.Next(t)) {
if (((t->StartTime() > timeStart) && (t->StartTime() <= timeStop)) || ((t->StopTime() > timeStart) && (t->StopTime() <= timeStop))) {
timersToday.push_back(t);
}
}
#endif
numTimersToday = timersToday.size();
}
void cRecMenuTimeline::SetTimers(void) {
ClearMenu();
GetTimersForDay();
conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop);
header->UnsetCurrentTimer();
header->SetDay(timeStart);
header->RefreshTimerDisplay();
header->SetNumTimersToday(numTimersToday);
if (numTimersToday == 0) {
AddMenuItem(new cRecMenuItemTimelineTimer(NULL, 0, 0, conflictsToday, header, false));
header->UnsetCurrentTimer();
footer->setActive();
} else {
for (int i=0; i<numTimersToday; i++) {
for (int i = 0; i<numTimersToday; i++) {
cRecMenuItemTimelineTimer *item = new cRecMenuItemTimelineTimer(timersToday[i], timeStart, timeStop, conflictsToday, header, false);
if (i==0)
item->setActive();
@@ -1474,12 +1486,6 @@ void cRecMenuTimeline::PrevDay(void) {
return;
timeStart -= 3600*24;
timeStop -= 3600*24;
conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop);
SetWidthPercent(95);
header->SetDay(timeStart);
header->UnsetCurrentTimer();
header->RefreshTimerDisplay();
GetTimersForDay();
SetTimers();
Display();
}
@@ -1487,12 +1493,6 @@ void cRecMenuTimeline::PrevDay(void) {
void cRecMenuTimeline::NextDay(void) {
timeStart += 3600*24;
timeStop += 3600*24;
conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop);
SetWidthPercent(95);
header->SetDay(timeStart);
header->UnsetCurrentTimer();
header->RefreshTimerDisplay();
GetTimersForDay();
SetTimers();
Display();
}

View File

@@ -77,11 +77,12 @@ public:
class cRecMenuTimerConflict: public cRecMenu {
private:
cTVGuideTimerConflict *conflict;
int totalNumMenuItems;
public:
cRecMenuTimerConflict(cTVGuideTimerConflict *conflict);
cRecMenuTimerConflict(cTVGuideTimerConflict *conflict, eRecMenuState nextAction = rmsClose);
virtual ~cRecMenuTimerConflict(void) {};
cRecMenuItem *GetMenuItem(int number);
int GetTotalNumMenuItems(void);
virtual ~cRecMenuTimerConflict(void) {};
int GetTimerConflictIndex(void);
};
@@ -136,7 +137,7 @@ public:
cRecMenuEditTimer(const cTimer *timer, eRecMenuState nextState);
const cTimer *GetOriginalTimer(void);
virtual ~cRecMenuEditTimer(void) {};
cTimer GetTimer(void);
cTimer *GetTimer(void);
};
/******************************************************************************************

View File

@@ -93,16 +93,18 @@ void cRecMenuView::DisplaySearchTimerList(void) {
}
bool cRecMenuView::DisplayTimerConflict(const cTimer *timer) {
int timerID = 0;
#if VDRVERSNUM >= 20301
LOCK_TIMERS_READ;
for (const cTimer *t = Timers->First(); t; t = Timers->Next(t)) {
if (t == timer)
return DisplayTimerConflict(timer->Id() - 1);
#else
int timerID = 0;
for (const cTimer *t = Timers.First(); t; t = Timers.Next(t)) {
#endif
if (t == timer)
return DisplayTimerConflict(timerID);
timerID++;
#endif
}
return false;
}
@@ -119,7 +121,7 @@ bool cRecMenuView::DisplayTimerConflict(int timerID) {
cTVGuideTimerConflict *conflict = timerConflicts->GetCurrentConflict();
if (!conflict)
return false;
activeMenu = new cRecMenuTimerConflict(conflict);
activeMenu = new cRecMenuTimerConflict(conflict, rmsIgnoreTimerConflict);
activeMenu->Display();
return true;
}
@@ -206,7 +208,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
case rmsSaveTimer: {
//caller: cRecMenuEditTimer
//save timer for active event
cTimer timerModified;
cTimer *timerModified;
const cTimer *originalTimer;
if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) {
timerModified = menu->GetTimer();
@@ -229,12 +231,18 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) {
timerIndex = menu->GetTimerConflictIndex();
} else break;
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
const cTimers* timers;
#if VDRVERSNUM >= 20301
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex) + 1;
{
LOCK_TIMERS_READ;
const cTimer *t = Timers->Get(timerID);
timers = Timers;
}
const cTimer *t = timers->GetById(timerID);
#else
const cTimer *t = Timers.Get(timerID);
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
timers = &Timers;
const cTimer *t = timers->Get(timerID);
#endif
if (t) {
const cEvent *ev = t->Event();
@@ -250,20 +258,24 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) {
timerIndex = menu->GetTimerConflictIndex();
} else break;
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
const cTimers* timers;
const cEvent *event;
#if VDRVERSNUM >= 20301
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex) + 1;
{
LOCK_TIMERS_READ;
timers = Timers;
}
event = timers->GetById(timerID)->Event();
#else
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
timers = &Timers;
event = timers->Get(timerID)->Event();
#endif
recManager->DeleteTimer(timers->Get(timerID)->Event());
recManager->DeleteTimer(event);
delete activeMenu;
if (!DisplayTimerConflict(timerID)) {
activeMenu = new cRecMenuConfirmTimer(timers->Get(timerID)->Event());
activeMenu = new cRecMenuConfirmDeleteTimer(event);
activeMenu->Display();
}
break; }
@@ -274,12 +286,18 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) {
timerIndex = menu->GetTimerConflictIndex();
} else break;
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
const cTimers* timers;
#if VDRVERSNUM >= 20301
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex) + 1;
{
LOCK_TIMERS_READ;
const cTimer *timer = Timers->Get(timerID);
timers = Timers;
}
const cTimer *timer = timers->GetById(timerID);
#else
const cTimer *timer = Timers.Get(timerID);
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
timers = &Timers;
const cTimer *timer = timers->Get(timerID);
#endif
if (timer) {
delete activeMenu;
@@ -290,7 +308,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
case rmsSaveTimerConflictMenu: {
//caller: cRecMenuEditTimer
//save timer from current timer conflict
cTimer timerModified;
cTimer *timerModified;
const cTimer *originalTimer;
if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) {
timerModified = menu->GetTimer();
@@ -648,7 +666,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
} else break;
timerConflicts->SetCurrentConflict(timerConflict);
delete activeMenu;
activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict());
activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict(), rmsTimerConflicts);
activeMenu->Display();
break; }
case rmsSearchRerunsTimerConflictMenu: {
@@ -660,12 +678,18 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) {
timerConflict = menu->GetTimerConflictIndex();
} else break;
int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict);
const cTimers* timers;
#if VDRVERSNUM >= 20301
int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict) + 1;
{
LOCK_TIMERS_READ;
const cTimer *timer = Timers->Get(timerID);
timers = Timers;
}
const cTimer *timer = timers->GetById(timerID);
#else
cTimer *timer = Timers.Get(timerID);
int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict);
timers = &Timers;
const cTimer *timer = timers->Get(timerID);
#endif
if (timer) {
const cEvent *event = timer->Event();
@@ -707,12 +731,16 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
originalConflictIndex = menu->GetTimerConflictIndex();
} else break;
int originalTimerID = timerConflicts->GetCurrentConflictTimerID(originalConflictIndex);
const cTimers* timers;
#if VDRVERSNUM >= 20301
{
LOCK_TIMERS_READ;
const cTimer *timerOriginal = Timers->Get(originalTimerID);
timers = Timers;
}
#else
cTimer *timerOriginal = Timers.Get(originalTimerID);
timers = &Timers;
#endif
const cTimer *timerOriginal = timers->Get(originalTimerID);
if (replace && timerOriginal) {
recManager->DeleteTimer(timerOriginal->Event());
recManager->createTimer(replace);
@@ -749,7 +777,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
}
break;}
case rmsTimelineTimerSave: {
cTimer timerModified;
cTimer *timerModified;
const cTimer *originalTimer;
if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) {
timerModified = menu->GetTimer();

10
setup.c
View File

@@ -108,6 +108,7 @@ void cTvguideSetup::Store(void) {
SetupStore("footerHeightPercent", config.footerHeightPercent);
SetupStore("instRecFolderMode", config.instRecFolderMode);
SetupStore("instRecFixedFolder", config.instRecFixedFolder.c_str());
SetupStore("AddSubtitleToTimerMode", config.addSubtitleToTimer);
SetupStore("favWhatsOnNow", config.favWhatsOnNow);
SetupStore("favWhatsOnNext", config.favWhatsOnNext);
SetupStore("favUseTime1", config.favUseTime1);
@@ -410,6 +411,9 @@ cMenuSetupFavorites::cMenuSetupFavorites(cTVGuideConfig* data) : cMenuSetupSubM
recFolderMode[1] = tr("Select from folder list");
recFolderMode[2] = tr("Use fixed folder");
strn0cpy(fixedFolder, data->instRecFixedFolder.c_str(), sizeof(fixedFolder));
addSubtitleMode[0] = tr("never");
addSubtitleMode[1] = tr("smart");
addSubtitleMode[2] = tr("always");
switchModeItems[0] = (tr("switch"));
switchModeItems[1] = (tr("announce only"));
switchModeItems[2] = (tr("ask for switch"));
@@ -420,13 +424,15 @@ void cMenuSetupFavorites::Set(void) {
int currentItem = Current();
Clear();
Add(new cMenuEditStraItem(tr("Folder for instant Recordings"), &tmpConfig->instRecFolderMode, 3, recFolderMode));
Add(new cOsdItem(tr("Instant recording:"), osUnknown, false));
Add(new cMenuEditStraItem(tr("Folder for instant Recordings"), &tmpConfig->instRecFolderMode, 3, recFolderMode));
if (tmpConfig->instRecFolderMode == eFolderFixed) {
Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Folder")), fixedFolder, sizeof(fixedFolder), trVDR(FileNameChars)));
}
Add(new cMenuEditStraItem(tr("Add episode to manual timers"), &tmpConfig->addSubtitleToTimer, 3, addSubtitleMode));
if (pRemoteTimers)
Add(new cMenuEditBoolItem(tr("Use Remotetimers"), &tmpConfig->useRemoteTimers));
Add(new cOsdItem(tr("Favorites:"), osUnknown, false));
Add(new cMenuEditBoolItem(tr("Limit channels in favorites"), &tmpConfig->favLimitChannels));
if (tmpConfig->favLimitChannels) {
Add(new cMenuEditChanItem(tr("Start Channel"), &tmpConfig->favStartChannel));

View File

@@ -70,6 +70,7 @@ class cMenuSetupFavorites : public cMenuSetupSubMenu {
char description3[256];
char description4[256];
const char * recFolderMode[3];
const char * addSubtitleMode[3];
const char * switchModeItems[3];
char fixedFolder[256];
void Set(void);

View File

@@ -16,12 +16,11 @@ cTVGuideTimerConflict::cTVGuideTimerConflict(void) {
}
cTVGuideTimerConflict::~cTVGuideTimerConflict(void) {
}
bool cTVGuideTimerConflict::timerInvolved(int involvedID) {
int numConflicts = timerIDs.size();
for (int i=0; i<numConflicts; i++) {
for (int i = 0; i < numConflicts; i++) {
if (timerIDs[i] == involvedID)
return true;
}
@@ -44,13 +43,12 @@ cTVGuideTimerConflicts::~cTVGuideTimerConflicts(void) {
}
void cTVGuideTimerConflicts::AddConflict(std::string epgSearchConflictLine) {
/* TIMERCONFLICT FORMAT:
/* TIMERCONFLICT FORMAT:
The result list looks like this for example when we have 2 timer conflicts at one time:
1190232780:152|30|50#152#45:45|10|50#152#45
'1190232780' is the time of the conflict in seconds since 1970-01-01.
It's followed by list of timers that have a conflict at this time:
'152|30|50#1 int editTimer(cTimer *timer, bool active, int prio, int start, int stop);
52#45' is the description of the first conflicting timer. Here:
'152|30|50#152#45' is the description of the first conflicting timer. Here:
'152' is VDR's timer id of this timer as returned from VDR's LSTT command
'30' is the percentage of recording that would be done (0...100)
'50#152#45' is the list of concurrent timers at this conflict
@@ -86,11 +84,13 @@ void cTVGuideTimerConflicts::CalculateConflicts(void) {
#if VDRVERSNUM >= 20301
LOCK_TIMERS_READ;
const cTimers* timers = Timers;
for (int j=0; j < numTimers; j++) {
const cTimer *timer = timers->GetById(conflicts[i]->timerIDs[j] + 1);
#else
const cTimers* timers = &Timers;
#endif
for (int j=0; j < numTimers; j++) {
const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]);
#endif
if (timer) {
if (!unionSet) {
unionSet = new cTimeInterval(timer->StartTime(), timer->StopTime());
@@ -109,7 +109,11 @@ void cTVGuideTimerConflicts::CalculateConflicts(void) {
cTimeInterval *intersect = NULL;
for (int j=0; j < numTimers; j++) {
#if VDRVERSNUM >= 20301
const cTimer *timer = timers->GetById(conflicts[i]->timerIDs[j] + 1);
#else
const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]);
#endif
if (timer) {
if (!intersect) {
intersect = new cTimeInterval(timer->StartTime(), timer->StopTime());
@@ -152,7 +156,7 @@ int cTVGuideTimerConflicts::GetCurrentConflictTimerID(int timerIndex) {
int cTVGuideTimerConflicts::GetCorrespondingConflict(int timerID) {
int conflictIndex = -1;
if (numConflicts > 0) {
for (int i=0; i<numConflicts; i++) {
for (int i = 0; i < numConflicts; i++) {
if (conflicts[i]->timerInvolved(timerID)) {
conflictIndex = i;
break;
@@ -172,7 +176,7 @@ cTVGuideTimerConflict *cTVGuideTimerConflicts::GetConflict(int conflictIndex) {
std::vector<cTVGuideTimerConflict*> cTVGuideTimerConflicts::GetConflictsBetween(time_t start, time_t stop) {
std::vector<cTVGuideTimerConflict*> conflictsFound;
for (int i=0; i < numConflicts; i++) {
for (int i = 0; i < numConflicts; i++) {
if ((conflicts[i]->timeStart > start) && (conflicts[i]->timeStart < stop)||
(conflicts[i]->timeStop > start) && (conflicts[i]->timeStop < stop))
conflictsFound.push_back(conflicts[i]);

38
tools.c
View File

@@ -23,22 +23,47 @@ cPlugin *GetScraperPlugin(void) {
/****************************************************************************************
* CUTTEXT
****************************************************************************************/
std::string utf8_substr(const std::string& str, unsigned int start, long unsigned int leng) {
if (leng==0) { return ""; }
unsigned int c, i, ix, q;
long unsigned int min=std::string::npos, max=std::string::npos;
for (q=0, i=0, ix=str.length(); i < ix; i++, q++) {
if (q==start){ min=i; }
if (q<=start+leng || leng==std::string::npos){ max=i; }
c = (unsigned char) str[i];
if (c>=0 && c<=127) i+=0;
else if ((c & 0xE0) == 0xC0) i+=1;
else if ((c & 0xF0) == 0xE0) i+=2;
else if ((c & 0xF8) == 0xF0) i+=3;
//else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8
//else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8
else return "";//invalid utf8
}
if (q<=start+leng || leng==std::string::npos){ max=i; }
if (min==std::string::npos || max==std::string::npos) { return ""; }
return str.substr(min,max);
}
std::string CutText(std::string text, int width, const cFont *font) {
int actWidth = font->Width(text.c_str());
if (actWidth <= width) {
return text.c_str();
} else {
int i = std::max((actWidth - width) / font->Size(), 1);
int i = std::max(width / font->Size(), 1) - 1;
std::string cuttext, oldtext;
cuttext = utf8_substr(text, 0, i);
do {
text = text.substr(0, text.length() - i);
oldtext = cuttext;
i++;
cuttext = utf8_substr(text, 0, i);
std::stringstream sstrText;
sstrText << text << "....";
sstrText << cuttext << "...";
actWidth = font->Width(sstrText.str().c_str());
i = 1;
}
while ((actWidth > width) && (text.length() > 0));
while (actWidth < width);
std::stringstream sstrText2;
sstrText2 << text << "...";
sstrText2 << oldtext << "...";
return sstrText2.str();
}
}
@@ -105,7 +130,6 @@ void ReadRecordingDirectories(std::vector<std::string> *folders, cList<cNestedIt
}
}
/****************************************************************************************
* DrawRoundedCorners
****************************************************************************************/

View File

@@ -9,6 +9,7 @@
cPlugin *GetScraperPlugin(void);
std::string utf8_substr(const std::string& str, unsigned int start=0, long unsigned int leng=std::string::npos);
std::string CutText(std::string text, int width, const cFont *font);
std::string StrToLowerCase(std::string str);
std::string GetDirectoryFromTimer(std::string file);

View File

@@ -27,7 +27,7 @@
#error "VDR-2.0.0 API version or greater is required!"
#endif
static const char *VERSION = "1.2.16";
static const char *VERSION = "1.3.1";
static const char *DESCRIPTION = tr("A fancy 2d EPG Viewer");
static const char *MAINMENUENTRY = "Tvguide";