summaryrefslogtreecommitdiff
path: root/display.c
diff options
context:
space:
mode:
Diffstat (limited to 'display.c')
-rw-r--r--display.c275
1 files changed, 258 insertions, 17 deletions
diff --git a/display.c b/display.c
index c274080..663fd45 100644
--- a/display.c
+++ b/display.c
@@ -10,6 +10,7 @@
#include "common.h"
#include "xml/string.h"
#include <vdr/menu.h>
+#include <vdr/plugin.h>
// --- cText2SkinDisplayChannel -----------------------------------------------
@@ -241,7 +242,16 @@ cxType cText2SkinDisplayChannel::GetTokenData(const txToken &Token)
case tLanguage: {
#if VDRVERSNUM >= 10318
- // TODO !!!
+ cDevice *dev = cDevice::PrimaryDevice();
+ eTrackType trackType = dev->GetCurrentAudioTrack();
+ const tTrackId *track = dev->GetTrack(trackType);
+ if (track) {
+ std::string buffer(track->language);
+ if (trackType >= ttDolby)
+ buffer.append("DD");
+ return (cxType)buffer.c_str();
+ }
+ return (cxType)false;
#else
int cur;
const char **tracks = cDevice::PrimaryDevice()->GetAudioTracks(&cur);
@@ -582,6 +592,32 @@ cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token)
}
return false;
+ case tLanguage: {
+#if VDRVERSNUM >= 10318
+ cDevice *dev = cDevice::PrimaryDevice();
+ eTrackType trackType = dev->GetCurrentAudioTrack();
+ const tTrackId *track = dev->GetTrack(trackType);
+ if (track) {
+ std::string buffer(track->language);
+ if (trackType >= ttDolby)
+ buffer.append("DD");
+ return (cxType)buffer.c_str();
+ }
+ return (cxType)false;
+#else
+ int cur;
+ const char **tracks = cDevice::PrimaryDevice()->GetAudioTracks(&cur);
+ if (tracks) {
+ int i = 0;
+ while (tracks[i] != NULL)
+ ++i;
+ if (cur < i)
+ return tracks[cur];
+ }
+#endif
+ }
+ return false;
+
case tMessage:
return mText;
@@ -737,7 +773,9 @@ void cText2SkinDisplayMenu::Clear(void)
mItems.clear();
mCurrentItem = (uint)-1;
mEvent = NULL;
+ ExtPresentDescription = "";
mRecording = NULL;
+ ExtRecordingDescription = "";
mText = "";
cText2SkinRender::Clear();
SetDirty();
@@ -755,6 +793,9 @@ void cText2SkinDisplayMenu::SetTitle(const char *Title)
UpdateLock();
if (Title == NULL) Title = "";
if (mTitle != Title) {
+ mUpdate.timerConflict = true;
+ mUpdate.events = true;
+ mUpdate.resetMarquee = true;
mTitle = Title;
SetDirty();
}
@@ -835,6 +876,9 @@ void cText2SkinDisplayMenu::SetItem(const char *Text, int Index, bool Current, b
mCurrentItem = Index;
SetDirty();
}
+
+ if (Current)
+ mRender->mMenuScrollbar.currentOnScreen = (uint)Index;
UpdateUnlock();
}
@@ -848,6 +892,7 @@ void cText2SkinDisplayMenu::SetEvent(const cEvent *Event)
UpdateLock();
if (mEvent != Event) {
mEvent = Event;
+ ExtPresentDescription = "";
if (mEvent != NULL)
SetDirty();
}
@@ -865,6 +910,7 @@ void cText2SkinDisplayMenu::SetRecording(const cRecording *Recording)
// yet unused
if (mRecording != Recording) {
mRecording = Recording;
+ ExtRecordingDescription = "";
if (mRecording != NULL)
SetDirty();
}
@@ -1046,14 +1092,129 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token)
: (cxType)false;
case tPresentDescription:
+ if (mEvent) {
+ if (ExtPresentDescription == "") {
+#if VDRVERSNUM >= 10344
+ // find corresponding timer
+ const char *aux = NULL;
+ for (cTimer *tim = Timers.First(); tim; tim = Timers.Next(tim))
+ if (tim->Event() == mEvent)
+ aux = tim->Aux();
+ ExtPresentDescription = AddExtInfoToDescription(mEvent->Title(), mEvent->ShortText(), mEvent->Description(), aux, Text2SkinSetup.StripAux);
+#else
+ ExtPresentDescription = AddExtInfoToDescription(mEvent->Title(), mEvent->ShortText(), mEvent->Description());
+#endif
+ }
+ return (cxType)ExtPresentDescription;
+ } else
+ return (cxType)false;
+
+#if VDRVERSNUM >= 10318
+ case tPresentLanguageCode:
+ if (mEvent) {
+ const cComponents *components = mEvent->Components();
+ if (components) {
+ int index = Token.Attrib.Number;
+
+ // don't return language-code for the video-stream
+ for (int i = 0; i < components->NumComponents(); i++) {
+ const tComponent *c = components->Component(i);
+ if (c->stream != 2) // only audio-streams
+ index++;
+ if (i == index) {
+ std::string buffer(c->language);
+ if (c->type == 1)
+ buffer.append("MONO");
+ if ((c->type == 2) || (c->type == 4))
+ buffer.append("DUAL");
+ if (c->type == 5)
+ buffer.append("DD");
+ return (cxType)buffer.c_str();
+ }
+ }
+ }
+ }
+ return false;
+
+ case tPresentLanguageDescription:
+ if (mEvent) {
+ const cComponents *components = mEvent->Components();
+ if (components) {
+ int index = Token.Attrib.Number;
+
+ // don't return language-code for the video-stream
+ for (int i = 0; i < components->NumComponents(); i++) {
+ const tComponent *c = components->Component(i);
+ if (c->stream != 2) // only audio-streams
+ index++;
+ if (i == index)
+ return (cxType)c->description;
+ }
+ }
+ }
+ return false;
+
+ case tPresentVideoAR:
+ if (mEvent) {
+ const cComponents *components = mEvent->Components();
+ if (components) {
+ for (int i = 0; i < components->NumComponents(); i++) {
+ const tComponent *c = components->Component(i);
+ if (c->stream == 1) {
+ switch (c->type) {
+ case 1:
+ return "4:3";
+ case 3:
+ return "16:9";
+ }
+ }
+ }
+ }
+ }
+ return false;
+#endif
+
+ case tPresentEventID:
return mEvent != NULL
- ? (cxType)mEvent->Description()
+ ? (cxType)EventType(mEvent->EventID())
: (cxType)false;
case tHasVPS:
case tChannelHasVPS:
return mEvent != NULL && mEvent->Vps() != 0;
+ case tChannelName:
+ if (mEvent) { // extended EPG
+ cChannel *channel = Channels.GetByChannelID(mEvent->ChannelID(), true);
+ return channel != NULL
+ ? (cxType)ChannelName(channel, 0)
+ : (cxType)false;
+ }
+ else if (mRecording) { // recording Info
+ cRecordingInfo *recInfo = const_cast<cRecordingInfo*>(mRecording->Info());
+ cChannel *channel = Channels.GetByChannelID(recInfo->ChannelID(), true);
+ return channel != NULL
+ ? (cxType)ChannelName(channel, 0)
+ : (cxType)false;
+ } else
+ return (cxType)false;
+
+ case tChannelShortName:
+ if (mEvent) { // extended EPG
+ cChannel *channel = Channels.GetByChannelID(mEvent->ChannelID(), true);
+ return channel != NULL
+ ? (cxType)ChannelShortName(channel, 0)
+ : (cxType)false;
+ }
+ else if (mRecording) { // recording Info
+ cRecordingInfo *recInfo = const_cast<cRecordingInfo*>(mRecording->Info());
+ cChannel *channel = Channels.GetByChannelID(recInfo->ChannelID(), true);
+ return channel != NULL
+ ? (cxType)ChannelShortName(channel, 0)
+ : (cxType)false;
+ } else
+ return (cxType)false;
+
case tPresentHasVPS:
return mEvent != NULL && mEvent->Vps() != 0 && mEvent->Vps() != mEvent->StartTime();
@@ -1074,6 +1235,21 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token)
? (cxType)mRecording->Name()
: (cxType)false;
+ case tRecordingFilename:
+ return mRecording != NULL
+ ? (cxType)mRecording->FileName()
+ : (cxType)false;
+
+ case tRecordingPriority:
+ return mRecording != NULL
+ ? (cxType)mRecording->priority
+ : (cxType)false;
+
+ case tRecordingLifetime:
+ return mRecording != NULL
+ ? (cxType)mRecording->lifetime
+ : (cxType)false;
+
case tRecordingDateTime:
return mRecording != NULL
? (cxType)TimeType(mRecording->start, Token.Attrib.Text)
@@ -1090,31 +1266,96 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token)
: (cxType)false;
case tRecordingDescription:
- return mRecording != NULL
- ? (cxType)mRecording->Info()->Description()
- : (cxType)false;
+ if (mRecording) {
+ if (ExtRecordingDescription == "")
+#if VDRVERSNUM >= 10344
+ ExtRecordingDescription = AddExtInfoToDescription(mRecording->Info()->Title(), mRecording->Info()->ShortText(), mRecording->Info()->Description(), Text2SkinSetup.ShowAux ? mRecording->Info()->Aux() : NULL, Text2SkinSetup.StripAux);
+#else
+ ExtRecordingDescription = AddExtInfoToDescription(mRecording->Info()->Title(), mRecording->Info()->ShortText(), mRecording->Info()->Description());
+#endif
+ return (cxType)ExtRecordingDescription;
+ } else
+ return (cxType)false;
case tRecordingLanguageCode:
- if (mRecording != NULL) {
- const tComponent *c
- = mRecording->Info()->Components()->Component(Token.Attrib.Number);
- return c != NULL
- ? (cxType)c->language
- : (cxType)false;
+ if (mRecording) {
+ const cComponents *components = mRecording->Info()->Components();
+ if (components) {
+ int index = Token.Attrib.Number;
+
+ // don't return language-code for the video-stream
+ for (int i = 0; i < components->NumComponents(); i++) {
+ const tComponent *c = components->Component(i);
+ if (c->stream != 2) // only audio-streams
+ index++;
+ if (i == index) {
+ std::string buffer(c->language);
+ if (c->type == 1)
+ buffer.append("MONO");
+ if ((c->type == 2) || (c->type == 4))
+ buffer.append("DUAL");
+ if (c->type == 5)
+ buffer.append("DD");
+ return (cxType)buffer.c_str();
+ }
+ }
+ }
}
return false;
case tRecordingLanguageDescription:
- if (mRecording != NULL) {
- const tComponent *c
- = mRecording->Info()->Components()->Component(Token.Attrib.Number);
- return c != NULL
- ? (cxType)c->description
- : (cxType)false;
+ if (mRecording) {
+ const cComponents *components = mRecording->Info()->Components();
+ if (components) {
+ int index = Token.Attrib.Number;
+
+ // don't return language-code for the video-stream
+ for (int i = 0; i < components->NumComponents(); i++) {
+ const tComponent *c = components->Component(i);
+ if (c->stream != 2) // only audio-streams
+ index++;
+ if (i == index)
+ return (cxType)c->description;
+ }
+ }
+ }
+ return false;
+
+ case tRecordingVideoAR:
+ if (mRecording) {
+ const cComponents *components = mRecording->Info()->Components();
+ if (components) {
+ for (int i = 0; i < components->NumComponents(); i++) {
+ const tComponent *c = components->Component(i);
+ if (c->stream == 1) {
+ switch (c->type) {
+ case 1:
+ return "4:3";
+ case 3:
+ return "16:9";
+ }
+ }
+ }
+ }
}
return false;
#endif
+ case tRecordingSize:
+ return mRecording != NULL
+ ? (cxType)GetRecordingSize(mRecording->FileName())
+ : (cxType)false;
+
+ case tRecordingLength:
+ return mRecording != NULL
+ ? (cxType)GetRecordingLength(mRecording->FileName())
+ : (cxType)false;
+
+ case tRecordingCuttedLength:
+ return mRecording != NULL
+ ? (cxType)GetRecordingCuttedLength(mRecording->FileName())
+ : (cxType)false;
+
default:
return cText2SkinRender::GetTokenData(Token);
}