diff options
author | lordjaxom <lordjaxom> | 2004-12-17 19:56:21 +0000 |
---|---|---|
committer | lordjaxom <lordjaxom> | 2004-12-17 19:56:21 +0000 |
commit | ac920774dee48c0a85b3c6fc8c6785c1a5dd8f6d (patch) | |
tree | d572f41490e8949a5e7323bf94b59c4034438afe | |
parent | b8f29c674cc0ccca207123342c1344bbd0f13796 (diff) | |
download | vdr-plugin-text2skin-ac920774dee48c0a85b3c6fc8c6785c1a5dd8f6d.tar.gz vdr-plugin-text2skin-ac920774dee48c0a85b3c6fc8c6785c1a5dd8f6d.tar.bz2 |
1.0-pre5v1.0-pre5
-rw-r--r-- | common.c | 4 | ||||
-rw-r--r-- | display.c | 436 | ||||
-rw-r--r-- | display.h | 11 | ||||
-rw-r--r-- | patches/vdr-1.3.17-dvbplayer-buttons.diff | 10 | ||||
-rw-r--r-- | render.c | 86 | ||||
-rw-r--r-- | render.h | 50 | ||||
-rw-r--r-- | screen.h | 4 | ||||
-rw-r--r-- | scroller.h | 4 | ||||
-rw-r--r-- | text2skin.c | 4 | ||||
-rw-r--r-- | theme.h | 13 | ||||
-rw-r--r-- | xml/function.c | 5 | ||||
-rw-r--r-- | xml/object.c | 4 | ||||
-rw-r--r-- | xml/string.c | 5 | ||||
-rw-r--r-- | xml/string.h | 25 | ||||
-rw-r--r-- | xml/type.c | 5 | ||||
-rw-r--r-- | xml/type.h | 11 |
16 files changed, 448 insertions, 229 deletions
@@ -1,5 +1,5 @@ /* - * $Id: common.c,v 1.4 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: common.c,v 1.5 2004/12/17 19:56:16 lordjaxom Exp $ */ #include "common.h" @@ -101,7 +101,7 @@ cxType TimeType(time_t Time, const std::string &Format) { } else return Time; } - return ""; + return false; } bool ParseVar(const char *Text, const char *Name, std::string &Value) { @@ -1,5 +1,5 @@ /* - * $Id: display.c,v 1.9 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: display.c,v 1.10 2004/12/17 19:56:16 lordjaxom Exp $ */ #include "render.h" @@ -19,153 +19,191 @@ cText2SkinDisplayChannel::cText2SkinDisplayChannel(cText2SkinLoader *Loader, boo mPresent(NULL), mFollowing(NULL), mType(mtStatus), - mText("") + mText("") , + mButtonRed(""), + mButtonGreen(""), + mButtonYellow(""), + mButtonBlue("") { } -cText2SkinDisplayChannel::~cText2SkinDisplayChannel() +cText2SkinDisplayChannel::~cText2SkinDisplayChannel() { } -void cText2SkinDisplayChannel::SetChannel(const cChannel *Channel, int Number) +void cText2SkinDisplayChannel::SetChannel(const cChannel *Channel, int Number) { + UpdateLock(); if (mChannel != Channel || mNumber != Number) { mChannel = Channel; mNumber = Number; SetDirty(); } + UpdateUnlock(); } -void cText2SkinDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following) +void cText2SkinDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following) { + UpdateLock(); if (mPresent != Present || mFollowing != Following) { mPresent = Present; mFollowing = Following; SetDirty(); } + UpdateUnlock(); } -void cText2SkinDisplayChannel::SetMessage(eMessageType Type, const char *Text) +void cText2SkinDisplayChannel::SetMessage(eMessageType Type, const char *Text) { + UpdateLock(); if (Text == NULL) Text = ""; if (mType != Type || mText != Text) { mType = Type; mText = Text; SetDirty(); } + UpdateUnlock(); } -void cText2SkinDisplayChannel::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue) +void cText2SkinDisplayChannel::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue) { + UpdateLock(); Dprintf("SetButtons(%s, %s, %s, %s)\n", Red, Green, Yellow, Blue); + if (Red == NULL) Red = ""; + if (Green == NULL) Green = ""; + if (Yellow == NULL) Yellow = ""; + if (Blue == NULL) Blue = ""; + if (mButtonRed != Red || mButtonGreen != Green || mButtonYellow != Yellow + || mButtonBlue != Blue) { + mButtonRed = Red; + mButtonGreen = Green; + mButtonYellow = Yellow; + mButtonBlue = Blue; + SetDirty(); + } + UpdateUnlock(); } -cxType cText2SkinDisplayChannel::GetTokenData(const txToken &Token) +cxType cText2SkinDisplayChannel::GetTokenData(const txToken &Token) { switch (Token.Type) { - case tChannelNumber: - return mChannel != NULL - ? (cxType)ChannelNumber(mChannel, mNumber) + case tChannelNumber: + return mChannel != NULL + ? (cxType)ChannelNumber(mChannel, mNumber) : (cxType)false; - case tChannelName: - return mChannel != NULL - ? (cxType)ChannelName(mChannel, mNumber) + case tChannelName: + return mChannel != NULL + ? (cxType)ChannelName(mChannel, mNumber) : (cxType)false; case tChannelShortName: - return mChannel != NULL - ? (cxType)ChannelShortName(mChannel, mNumber) + return mChannel != NULL + ? (cxType)ChannelShortName(mChannel, mNumber) : (cxType)false; case tChannelBouquet: - return mChannel != NULL +#if VDRVERSNUM < 10315 + return cxType::False; +#else + return mChannel != NULL ? (cxType)mChannel->Provider() : (cxType)false; +#endif case tChannelPortal: +#if VDRVERSNUM < 10315 + return false; +#else return mChannel != NULL ? (cxType)mChannel->PortalName() - : (cxType)false; + : (cxType)false; +#endif case tChannelSource: return mChannel != NULL ? (cxType)Sources.Get(mChannel->Source())->Description() - : (cxType)false; + : (cxType)false; case tPresentStartDateTime: - return mPresent != NULL - ? (cxType)TimeType(mPresent->StartTime(), Token.Attrib) + return mPresent != NULL + ? (cxType)TimeType(mPresent->StartTime(), Token.Attrib) : (cxType)false; case tPresentVPSDateTime: - return mPresent != NULL - ? (cxType)TimeType(mPresent->Vps(), Token.Attrib) + return mPresent != NULL + ? (cxType)TimeType(mPresent->Vps(), Token.Attrib) : (cxType)false; case tPresentEndDateTime: - return mPresent != NULL - ? (cxType)TimeType(mPresent->EndTime(), Token.Attrib) + return mPresent != NULL + ? (cxType)TimeType(mPresent->EndTime(), Token.Attrib) : (cxType)false; case tPresentProgress: - return mPresent != NULL - ? (cxType)TimeType(time(NULL) - mPresent->StartTime(), Token.Attrib) + return mPresent != NULL + ? (cxType)TimeType(time(NULL) - mPresent->StartTime(), Token.Attrib) : (cxType)false; case tPresentDuration: - return mPresent != NULL - ? (cxType)TimeType(mPresent->Duration(), Token.Attrib) + return mPresent != NULL + ? (cxType)TimeType(mPresent->Duration(), Token.Attrib) + : (cxType)false; + + case tPresentRemaining: + return mPresent != NULL + ? (cxType)TimeType(mPresent->Duration() - (time(NULL) - mPresent->StartTime()), + Token.Attrib) : (cxType)false; case tPresentTitle: - return mPresent != NULL - ? (cxType)mPresent->Title() + return mPresent != NULL + ? (cxType)mPresent->Title() : (cxType)false; case tPresentShortText: - return mPresent != NULL - ? (cxType)mPresent->ShortText() + return mPresent != NULL + ? (cxType)mPresent->ShortText() : (cxType)false; case tPresentDescription: - return mPresent != NULL + return mPresent != NULL ? (cxType)mPresent->Description() : (cxType)false; case tFollowingStartDateTime: - return mFollowing != NULL - ? (cxType)TimeType(mFollowing->StartTime(), Token.Attrib) + return mFollowing != NULL + ? (cxType)TimeType(mFollowing->StartTime(), Token.Attrib) : (cxType)false; case tFollowingVPSDateTime: - return mFollowing != NULL - ? (cxType)TimeType(mFollowing->Vps(), Token.Attrib) + return mFollowing != NULL + ? (cxType)TimeType(mFollowing->Vps(), Token.Attrib) : (cxType)false; case tFollowingEndDateTime: - return mFollowing != NULL - ? (cxType)TimeType(mFollowing->EndTime(), Token.Attrib) + return mFollowing != NULL + ? (cxType)TimeType(mFollowing->EndTime(), Token.Attrib) : (cxType)false; case tFollowingDuration: - return mFollowing != NULL - ? (cxType)TimeType(mFollowing->Duration(), Token.Attrib) + return mFollowing != NULL + ? (cxType)TimeType(mFollowing->Duration(), Token.Attrib) : (cxType)false; case tFollowingTitle: - return mFollowing != NULL - ? (cxType)mFollowing->Title() + return mFollowing != NULL + ? (cxType)mFollowing->Title() : (cxType)false; case tFollowingShortText: - return mFollowing != NULL - ? (cxType)mFollowing->ShortText() + return mFollowing != NULL + ? (cxType)mFollowing->ShortText() : (cxType)false; case tFollowingDescription: - return mFollowing != NULL - ? (cxType)mFollowing->Description() + return mFollowing != NULL + ? (cxType)mFollowing->Description() : (cxType)false; case tLanguage: { @@ -212,25 +250,37 @@ cxType cText2SkinDisplayChannel::GetTokenData(const txToken &Token) return mText; case tMessageInfo: - return mType == mtInfo - ? (cxType)mText + return mType == mtInfo + ? (cxType)mText : (cxType)false; case tMessageWarning: - return mType == mtWarning - ? (cxType)mText + return mType == mtWarning + ? (cxType)mText : (cxType)false; case tMessageStatus: - return mType == mtStatus - ? (cxType)mText + return mType == mtStatus + ? (cxType)mText : (cxType)false; case tMessageError: - return mType == mtError - ? (cxType)mText + return mType == mtError + ? (cxType)mText : (cxType)false; + case tButtonRed: + return mButtonRed; + + case tButtonGreen: + return mButtonGreen; + + case tButtonYellow: + return mButtonYellow; + + case tButtonBlue: + return mButtonBlue; + default: break; } @@ -243,19 +293,24 @@ cText2SkinDisplayVolume::cText2SkinDisplayVolume(cText2SkinLoader *Loader): cText2SkinRender(Loader, cxDisplay::volume), mCurrent(0), mTotal(0), - mMute(false) { + mMute(false) +{ } -cText2SkinDisplayVolume::~cText2SkinDisplayVolume() { +cText2SkinDisplayVolume::~cText2SkinDisplayVolume() +{ } -void cText2SkinDisplayVolume::SetVolume(int Current, int Total, bool Mute) { +void cText2SkinDisplayVolume::SetVolume(int Current, int Total, bool Mute) +{ + UpdateLock(); if (mCurrent != Current || mTotal != Total || mMute != Mute) { mCurrent = Current; mTotal = Total; mMute = Mute; SetDirty(); } + UpdateUnlock(); } cxType cText2SkinDisplayVolume::GetTokenData(const txToken &Token) { @@ -289,21 +344,32 @@ cText2SkinDisplayReplay::cText2SkinDisplayReplay(cText2SkinLoader *Loader, bool mMarks(NULL), mPrompt(""), mType(mtStatus), - mText("") { + mText(""), + mButtonRed(""), + mButtonGreen(""), + mButtonYellow(""), + mButtonBlue("") +{ } -cText2SkinDisplayReplay::~cText2SkinDisplayReplay() { +cText2SkinDisplayReplay::~cText2SkinDisplayReplay() +{ } -void cText2SkinDisplayReplay::SetTitle(const char *Title) { +void cText2SkinDisplayReplay::SetTitle(const char *Title) +{ + UpdateLock(); if (Title == NULL) Title = ""; if (mTitle != Title) { mTitle = Title; SetDirty(); } + UpdateUnlock(); } -void cText2SkinDisplayReplay::SetMode(bool Play, bool Forward, int Speed) { +void cText2SkinDisplayReplay::SetMode(bool Play, bool Forward, int Speed) +{ + UpdateLock(); if (!mStateInfo || mPlay != Play || mForward != Forward || mSpeed != Speed) { mStateInfo = true; mPlay = Play; @@ -311,57 +377,96 @@ void cText2SkinDisplayReplay::SetMode(bool Play, bool Forward, int Speed) { mSpeed = Speed; SetDirty(); } + UpdateUnlock(); } -void cText2SkinDisplayReplay::SetProgress(int Current, int Total) { +void cText2SkinDisplayReplay::SetProgress(int Current, int Total) +{ + UpdateLock(); if (mCurrent != Current || mTotal != Total) { mCurrent = Current; mTotal = Total; // SetDirty(); TODO: let this cause a display update every frame? } + UpdateUnlock(); } -void cText2SkinDisplayReplay::SetMarks(const cMarks *Marks) { +void cText2SkinDisplayReplay::SetMarks(const cMarks *Marks) +{ + UpdateLock(); if (mMarks != Marks) { mMarks = Marks; SetDirty(); } + UpdateUnlock(); } -void cText2SkinDisplayReplay::SetCurrent(const char *Current) { +void cText2SkinDisplayReplay::SetCurrent(const char *Current) +{ + UpdateLock(); if (Current == NULL) Current = ""; if (mPosition != Current) { mPosition = Current; SetDirty(); - } + } + UpdateUnlock(); } -void cText2SkinDisplayReplay::SetTotal(const char *Total) { +void cText2SkinDisplayReplay::SetTotal(const char *Total) +{ + UpdateLock(); if (Total == NULL) Total = ""; if (mDuration != Total) { mDuration = Total; SetDirty(); - } + } + UpdateUnlock(); } -void cText2SkinDisplayReplay::SetJump(const char *Jump) { +void cText2SkinDisplayReplay::SetJump(const char *Jump) +{ + UpdateLock(); if (Jump == NULL) Jump = ""; if (mPrompt != Jump) { mPrompt = Jump; SetDirty(); } + UpdateUnlock(); } -void cText2SkinDisplayReplay::SetMessage(eMessageType Type, const char *Text) { +void cText2SkinDisplayReplay::SetMessage(eMessageType Type, const char *Text) +{ + UpdateLock(); if (Text == NULL) Text = ""; if (mType != Type || mText != Text) { mType = Type; mText = Text; SetDirty(); } + UpdateUnlock(); +} + +void cText2SkinDisplayReplay::SetButtons(const char *Red, const char *Green, const char *Yellow, + const char *Blue) +{ + UpdateLock(); + Dprintf("SetButtons(%s, %s, %s, %s)\n", Red, Green, Yellow, Blue); + if (Red == NULL) Red = ""; + if (Green == NULL) Green = ""; + if (Yellow == NULL) Yellow = ""; + if (Blue == NULL) Blue = ""; + if (mButtonRed != Red || mButtonGreen != Green || mButtonYellow != Yellow || mButtonBlue != Blue) { + mButtonRed = Red; + mButtonGreen = Green; + mButtonYellow = Yellow; + mButtonBlue = Blue; + SetDirty(); + } + UpdateUnlock(); } -cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token) { +cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token) +{ switch (Token.Type) { case tReplayTitle: return mTitle; @@ -378,6 +483,9 @@ cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token) { case tReplayDuration: return mDuration; + case tReplayRemaining: + return TimeType(mTotal - mCurrent, Token.Attrib); + case tReplayPrompt: return mPrompt; @@ -423,28 +531,40 @@ cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token) { return mText; case tMessageInfo: - return mType == mtInfo - ? (cxType)mText + return mType == mtInfo + ? (cxType)mText : (cxType)false; case tMessageWarning: - return mType == mtWarning - ? (cxType)mText + return mType == mtWarning + ? (cxType)mText : (cxType)false; case tMessageStatus: - return mType == mtStatus - ? (cxType)mText + return mType == mtStatus + ? (cxType)mText : (cxType)false; case tMessageError: - return mType == mtError - ? (cxType)mText + return mType == mtError + ? (cxType)mText : (cxType)false; case tReplayMode: return cText2SkinStatus::ReplayMode(); + case tButtonRed: + return mButtonRed; + + case tButtonGreen: + return mButtonGreen; + + case tButtonYellow: + return mButtonYellow; + + case tButtonBlue: + return mButtonBlue; + default: break; } @@ -462,12 +582,14 @@ cText2SkinDisplayMessage::~cText2SkinDisplayMessage() { } void cText2SkinDisplayMessage::SetMessage(eMessageType Type, const char *Text) { + UpdateLock(); if (Text == NULL) Text = ""; if (mType != Type || mText != Text) { mType = Type; mText = Text; SetDirty(); } + UpdateUnlock(); } cxType cText2SkinDisplayMessage::GetTokenData(const txToken &Token) { @@ -476,24 +598,24 @@ cxType cText2SkinDisplayMessage::GetTokenData(const txToken &Token) { return mText; case tMessageInfo: - return mType == mtInfo - ? (cxType)mText - : (cxType)false; + return mType == mtInfo + ? (cxType)mText + : (cxType)false; case tMessageWarning: - return mType == mtWarning - ? (cxType)mText - : (cxType)false; + return mType == mtWarning + ? (cxType)mText + : (cxType)false; case tMessageStatus: - return mType == mtStatus - ? (cxType)mText - : (cxType)false; + return mType == mtStatus + ? (cxType)mText + : (cxType)false; case tMessageError: - return mType == mtError - ? (cxType)mText - : (cxType)false; + return mType == mtError + ? (cxType)mText + : (cxType)false; default: break; } @@ -534,10 +656,13 @@ cText2SkinDisplayMenu::cText2SkinDisplayMenu(cText2SkinLoader *Loader): } } -cText2SkinDisplayMenu::~cText2SkinDisplayMenu() { +cText2SkinDisplayMenu::~cText2SkinDisplayMenu() +{ } -void cText2SkinDisplayMenu::Clear(void) { +void cText2SkinDisplayMenu::Clear(void) +{ + UpdateLock(); mItems.clear(); mCurrentItem = (uint)-1; mEvent = NULL; @@ -545,43 +670,54 @@ void cText2SkinDisplayMenu::Clear(void) { mText = ""; cText2SkinRender::Clear(); SetDirty(); + UpdateUnlock(); } -void cText2SkinDisplayMenu::SetTitle(const char *Title) { +void cText2SkinDisplayMenu::SetTitle(const char *Title) +{ + UpdateLock(); if (Title == NULL) Title = ""; if (mTitle != Title) { mTitle = Title; SetDirty(); } + UpdateUnlock(); } -void cText2SkinDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue) { +void cText2SkinDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, + const char *Blue) +{ + UpdateLock(); if (Red == NULL) Red = ""; if (Green == NULL) Green = ""; if (Yellow == NULL) Yellow = ""; if (Blue == NULL) Blue = ""; - if (mButtonRed != Red || mButtonGreen != Green || mButtonYellow != Yellow || mButtonBlue != Blue) { + if (mButtonRed != Red || mButtonGreen != Green || mButtonYellow != Yellow + || mButtonBlue != Blue) { mButtonRed = Red; mButtonGreen = Green; mButtonYellow = Yellow; mButtonBlue = Blue; SetDirty(); } + UpdateUnlock(); } void cText2SkinDisplayMenu::SetMessage(eMessageType Type, const char *Text) { + UpdateLock(); if (Text == NULL) Text = ""; if (mMessageType != Type || mMessageText != Text) { mMessageType = Type; mMessageText = Text; SetDirty(); } + UpdateUnlock(); } void cText2SkinDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable) { + UpdateLock(); if (Text == NULL) return; - Dprintf("SetItem(%s)\n", Text); tListItem *item = new tListItem(Text, Selectable); //item.text = Text; @@ -609,43 +745,51 @@ void cText2SkinDisplayMenu::SetItem(const char *Text, int Index, bool Current, b mCurrentItem = Index; SetDirty(); } - Dprintf("end SetItem()\n"); + UpdateUnlock(); } void cText2SkinDisplayMenu::SetEvent(const cEvent *Event) { - Dprintf("setEvent %p\n", Event); + UpdateLock(); if (mEvent != Event) { - Dprintf("dirty\n"); mEvent = Event; if (mEvent != NULL) SetDirty(); } + UpdateUnlock(); } void cText2SkinDisplayMenu::SetRecording(const cRecording *Recording) { + UpdateLock(); // yet unused if (mRecording != Recording) { mRecording = Recording; if (mRecording != NULL) SetDirty(); } + UpdateUnlock(); } void cText2SkinDisplayMenu::SetText(const char *Text, bool /*FixedFont*/) { + UpdateLock(); if (Text == NULL) Text = ""; if (mText != Text) { mText = Text; SetDirty(); } + UpdateUnlock(); } void cText2SkinDisplayMenu::SetTabs(int Tab1, int Tab2, int Tab3, int Tab4, int Tab5) { + UpdateLock(); cSkinDisplayMenu::SetTabs(Tab1, Tab2, Tab3, Tab4, Tab5); + UpdateUnlock(); } void cText2SkinDisplayMenu::Scroll(bool Up, bool Page) { + UpdateLock(); cText2SkinRender::Scroll(Up, Page); SetDirty(); + UpdateUnlock(); } cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token) { @@ -667,13 +811,13 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token) { return mTitle; case tMenuItem: - return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel - && mCurrentItem != (uint)Token.Index + return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel + && mCurrentItem != (uint)Token.Index ? (cxType)mItems[Token.Index].tabs[Token.Tab] - : (cxType)false; + : (cxType)false; case tIsMenuItem: - return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel + return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel && mCurrentItem != (uint)Token.Index; case tMenuCurrent: @@ -682,19 +826,19 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token) { ? (cxType)mItems[mCurrentItem].text : (cxType)false; - return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel - && mCurrentItem == (uint)Token.Index + return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel + && mCurrentItem == (uint)Token.Index ? (cxType)mItems[Token.Index].tabs[Token.Tab] - : (cxType)false; + : (cxType)false; case tIsMenuCurrent: - return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel + return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel && mCurrentItem == (uint)Token.Index; case tMenuGroup: - return mItems.size() > (uint)Token.Index && !mItems[Token.Index].sel + return mItems.size() > (uint)Token.Index && !mItems[Token.Index].sel ? (cxType)mItems[Token.Index].tabs[Token.Tab] - : (cxType)false; + : (cxType)false; case tIsMenuGroup: return mItems.size() > (uint)Token.Index && !mItems[Token.Index].sel; @@ -715,64 +859,64 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token) { return mMessageText; case tMessageInfo: - return mMessageType == mtInfo - ? (cxType)mMessageText - : (cxType)false; + return mMessageType == mtInfo + ? (cxType)mMessageText + : (cxType)false; case tMessageWarning: - return mMessageType == mtWarning - ? (cxType)mMessageText - : (cxType)false; + return mMessageType == mtWarning + ? (cxType)mMessageText + : (cxType)false; case tMessageStatus: - return mMessageType == mtStatus - ? (cxType)mMessageText - : (cxType)false; + return mMessageType == mtStatus + ? (cxType)mMessageText + : (cxType)false; case tMessageError: - return mMessageType == mtError - ? (cxType)mMessageText - : (cxType)false; + return mMessageType == mtError + ? (cxType)mMessageText + : (cxType)false; case tPresentStartDateTime: - return mEvent != NULL - ? (cxType)TimeType(mEvent->StartTime(), Token.Attrib) - : (cxType)false; + return mEvent != NULL + ? (cxType)TimeType(mEvent->StartTime(), Token.Attrib) + : (cxType)false; case tPresentVPSDateTime: - return mEvent != NULL - ? (cxType)TimeType(mEvent->Vps(), Token.Attrib) - : (cxType)false; + return mEvent != NULL + ? (cxType)TimeType(mEvent->Vps(), Token.Attrib) + : (cxType)false; case tPresentEndDateTime: return mEvent != NULL - ? (cxType)TimeType(mEvent->EndTime(), Token.Attrib) - : (cxType)false; + ? (cxType)TimeType(mEvent->EndTime(), Token.Attrib) + : (cxType)false; case tPresentProgress: - return mEvent != NULL - ? (cxType)TimeType(time(NULL) - mEvent->StartTime(), Token.Attrib) - : (cxType)false; + return mEvent != NULL + ? (cxType)TimeType(time(NULL) - mEvent->StartTime(), Token.Attrib) + : (cxType)false; case tPresentDuration: - return mEvent != NULL - ? (cxType)TimeType(mEvent->Duration(), Token.Attrib) - : (cxType)false; + return mEvent != NULL + ? (cxType)TimeType(mEvent->Duration(), Token.Attrib) + : (cxType)false; case tPresentTitle: - return mEvent != NULL - ? (cxType)mEvent->Title() - : (cxType)false; + return mEvent != NULL + ? (cxType)mEvent->Title() + : (cxType)false; case tPresentShortText: - return mEvent != NULL - ? (cxType)mEvent->ShortText() - : (cxType)false; + return mEvent != NULL + ? (cxType)mEvent->ShortText() + : (cxType)false; case tPresentDescription: - return mEvent != NULL - ? (cxType)mEvent->Description() - : (cxType)false; + return mEvent != NULL + ? (cxType)mEvent->Description() + : (cxType)false; case tHasVPS: return mEvent != NULL && mEvent->Vps() != 0; @@ -1,5 +1,5 @@ /* - * $Id: display.h,v 1.7 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: display.h,v 1.8 2004/12/17 19:56:16 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_SKIN_H @@ -23,6 +23,10 @@ private: const cEvent *mFollowing; eMessageType mType; std::string mText; + std::string mButtonRed; + std::string mButtonGreen; + std::string mButtonYellow; + std::string mButtonBlue; protected: virtual cxType GetTokenData(const txToken &Token); @@ -71,6 +75,10 @@ private: std::string mPrompt; eMessageType mType; std::string mText; + std::string mButtonRed; + std::string mButtonGreen; + std::string mButtonYellow; + std::string mButtonBlue; protected: virtual cxType GetTokenData(const txToken &Token); @@ -87,6 +95,7 @@ public: virtual void SetTotal(const char *Total); virtual void SetJump(const char *Jump); virtual void SetMessage(eMessageType Type, const char *Text); + virtual void SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue); virtual void Flush(void) { cText2SkinRender::Flush(); } }; diff --git a/patches/vdr-1.3.17-dvbplayer-buttons.diff b/patches/vdr-1.3.17-dvbplayer-buttons.diff new file mode 100644 index 0000000..dc72164 --- /dev/null +++ b/patches/vdr-1.3.17-dvbplayer-buttons.diff @@ -0,0 +1,10 @@ +--- menu.c.orig Fri Dec 17 18:31:27 2004 ++++ menu.c Fri Dec 17 18:37:18 2004 +@@ -3331,6 +3331,7 @@ + if (Initial) { + if (title) + displayReplay->SetTitle(title); ++ displayReplay->SetButtons(tr("Jump"), tr("Skip +60s"), tr("Skip -60s"), tr("Button$Stop")); + lastCurrent = lastTotal = -1; + } + if (Total != lastTotal) { @@ -1,5 +1,5 @@ /* - * $Id: render.c,v 1.10 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: render.c,v 1.11 2004/12/17 19:56:16 lordjaxom Exp $ */ #include "render.h" @@ -17,7 +17,8 @@ cText2SkinRender *cText2SkinRender::mRender = NULL; -cText2SkinRender::cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Display, const std::string &BasePath, bool OffScreen): +cText2SkinRender::cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Display, + const std::string &BasePath, bool OffScreen): mSkin(Loader->Data()), mDisplay(mSkin->Get(Display)), mI18n(Loader->I18n()), @@ -44,6 +45,9 @@ cText2SkinRender::cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Di return; mScreen = new cText2SkinScreen(OffScreen); + if (!mScreen->IsOpen()) + return; + mBaseSize = mSkin->BaseSize(); eOsdError res; @@ -56,9 +60,8 @@ cText2SkinRender::cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Di areas[i].x2 = mSkin->BaseOffset().x + pos2.x; areas[i].y2 = mSkin->BaseOffset().y + pos2.y; areas[i].bpp = mDisplay->Windows()[i].bpp; - Dprintf("setting area: %d, %d, %d, %d, %d\n", - areas[i].x1, areas[i].y1, areas[i].x2, areas[i].y2, - areas[i].bpp); + Dprintf("setting area: %d, %d, %d, %d, %d\n", areas[i].x1, areas[i].y1, areas[i].x2, + areas[i].y2, areas[i].bpp); } res = mScreen->SetAreas(areas, mDisplay->NumWindows()); @@ -87,10 +90,10 @@ cText2SkinRender::cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Di } if (!OffScreen) { - mDoUpdateMutex.Lock(); + UpdateLock(); Start(); mStarted.Wait(mDoUpdateMutex); - mDoUpdateMutex.Unlock(); + UpdateUnlock(); } } @@ -110,7 +113,7 @@ cText2SkinRender::~cText2SkinRender() void cText2SkinRender::Action(void) { mActive = true; - mDoUpdateMutex.Lock(); + UpdateLock(); mStarted.Broadcast(); while (mActive) { if (mUpdateIn) mDoUpdate.TimedWait(mDoUpdateMutex, mUpdateIn); @@ -121,7 +124,7 @@ void cText2SkinRender::Action(void) mUpdateIn = 0; // has to be re-set within Update(); Update(); } - mDoUpdateMutex.Unlock(); + UpdateUnlock(); } void cText2SkinRender::Update(void) @@ -149,7 +152,8 @@ void cText2SkinRender::DrawObject(const cxObject *Object) break; case cxObject::text: - DrawText(Object->Pos(), Object->Size(), Object->Fg(), Object->Text(), Object->Font(), Object->Align()); + DrawText(Object->Pos(), Object->Size(), Object->Fg(), Object->Text(), Object->Font(), + Object->Align()); break; case cxObject::rectangle: @@ -165,11 +169,14 @@ void cText2SkinRender::DrawObject(const cxObject *Object) break; case cxObject::progress: - DrawProgressbar(Object->Pos(), Object->Size(), Object->Current(), Object->Total(), Object->Bg(), Object->Fg(), Object->Keep(), Object->Mark(), Object->Active(), GetMarks()); + DrawProgressbar(Object->Pos(), Object->Size(), Object->Current(), Object->Total(), + Object->Bg(), Object->Fg(), Object->Keep(), Object->Mark(), + Object->Active(), GetMarks()); break; case cxObject::scrolltext: - DrawScrolltext(Object->Pos(), Object->Size(), Object->Fg(), Object->Text(), Object->Font(), Object->Align()); + DrawScrolltext(Object->Pos(), Object->Size(), Object->Fg(), Object->Text(), Object->Font(), + Object->Align()); break; case cxObject::scrollbar: @@ -244,10 +251,11 @@ void cText2SkinRender::DrawObject(const cxObject *Object) } void cText2SkinRender::DrawImage(const txPoint &Pos, const txSize &Size, const tColor *Bg, - const tColor *Fg, int Alpha, int Colors, const std::string &Path) + const tColor *Fg, int Alpha, int Colors, const std::string &Path) { cText2SkinBitmap *bmp; - Dprintf("trying to draw image %s to %dx%d - alpha %d\n", ImagePath(Path).c_str(), Pos.x, Pos.y, Alpha); + Dprintf("trying to draw image %s to %dx%d - alpha %d\n", ImagePath(Path).c_str(), Pos.x, + Pos.y, Alpha); if ((bmp = cText2SkinBitmap::Load(ImagePath(Path), Alpha, Size.h > 1 ? Size.h : 0, Size.w > 1 ? Size.w : 0, Colors)) != NULL) { @@ -261,7 +269,8 @@ void cText2SkinRender::DrawImage(const txPoint &Pos, const txSize &Size, const t void cText2SkinRender::DrawText(const txPoint &Pos, const txSize &Size, const tColor *Fg, const std::string &Text, const cFont *Font, int Align) { - //Dprintf("trying to draw text %s to %d,%d size %d,%d, color %x\n", Text.c_str(), Pos.x, Pos.y, Size.w, Size.h, Fg ? *Fg : 0); + //Dprintf("trying to draw text %s to %d,%d size %d,%d, color %x\n", Text.c_str(), Pos.x, Pos.y, + // Size.w, Size.h, Fg ? *Fg : 0); mScreen->DrawText(Pos.x, Pos.y, Text.c_str(), Fg ? *Fg : 0, 0, Font, Size.w, Size.h, Align); } @@ -282,10 +291,11 @@ void cText2SkinRender::DrawSlope(const txPoint &Pos, const txSize &Size, const t void cText2SkinRender::DrawProgressbar(const txPoint &Pos, const txSize &Size, int Current, int Total, const tColor *Bg, const tColor *Fg, - const tColor *Selected, const tColor *Mark, - const tColor *Cur, const cMarks *Marks) + const tColor *Selected, const tColor *Mark, + const tColor *Cur, const cMarks *Marks) { - //Dprintf("trying to draw Progressbar, Current = %d, Total = %d, bg = %x, marks = %p\n", Current, Total, Bg ? *Bg : 0, Marks); + //Dprintf("trying to draw Progressbar, Current = %d, Total = %d, bg = %x, marks = %p\n", + // Current, Total, Bg ? *Bg : 0, Marks); if (Bg) DrawRectangle(Pos, Size, Bg); if (Total == 0) @@ -301,7 +311,9 @@ void cText2SkinRender::DrawProgressbar(const txPoint &Pos, const txSize &Size, i txPoint pt(Pos.x + m->position * Size.w / Total, Pos.y); if (Selected && start) { const cMark *m2 = Marks->Next(m); - DrawRectangle(txPoint(pt.x, Pos.y + Size.h / 3), txSize(((m2 ? m2->position : Total) - m->position) * Size.w / Total, Size.h / 3), Selected); + DrawRectangle(txPoint(pt.x, Pos.y + Size.h / 3), + txSize(((m2 ? m2->position : Total) - m->position) + * Size.w / Total, Size.h / 3), Selected); } DrawMark(pt, Size, start, m->position == Current, false, Mark, Cur); start = !start; @@ -316,7 +328,9 @@ void cText2SkinRender::DrawProgressbar(const txPoint &Pos, const txSize &Size, i txPoint pt(Pos.x, Pos.y + m->position * Size.h / Total); if (Selected && start) { const cMark *m2 = Marks->Next(m); - DrawRectangle(txPoint(Pos.x + Size.w / 3, pt.y), txSize(Size.w / 3, ((m2 ? m2->position : Total) - m->position) * Size.h / Total), Selected); + DrawRectangle(txPoint(Pos.x + Size.w / 3, pt.y), + txSize(Size.w / 3, ((m2 ? m2->position : Total) - m->position) + * Size.h / Total), Selected); } DrawMark(pt, Size, start, m->position == Current, true, Mark, Cur); start = !start; @@ -428,21 +442,37 @@ string cText2SkinRender::Translate(const string &Text) { cxType cText2SkinRender::GetToken(const txToken &Token) { if (mRender != NULL) { + tTokenCache::iterator it = mRender->mTokenCache.find(Token); + if (it != mRender->mTokenCache.end()) + return (*it).second; + cxType res = mRender->GetTokenData(Token); if (Token.Attrib.length() > 0) { if (Token.Attrib == "clean") { std::string str = res.String(); int pos = -1; - - if (Token.Type == tMenuCurrent && (pos = str.rfind(' ')) != -1) - res = str.substr(pos + 1); - else if (Token.Type == tMenuTitle && (pos = str.find(' ')) != -1) - res = str.substr(0, pos); + + if (Token.Type == tMenuCurrent) { + const char *ptr = str.c_str(); + char *end; + strtoul(ptr, &end, 10); + res = skipspace(end); + } + else if (Token.Type == tMenuTitle) { + if ((pos = str.find(" - ")) != -1 + || (pos = str.find(' ')) != -1) { + str.erase(pos); + while (str[str.length() - 1] == ' ') + str.erase(str.length() - 1); + res = str; + } + Dprintf("MenuTitle result: |%s|\n", res.String().c_str()); + } } } - return res; + return (mRender->mTokenCache[Token] = res); } - return false; + return cxType::False; } cxType cText2SkinRender::GetTokenData(const txToken &Token) @@ -453,7 +483,7 @@ cxType cText2SkinRender::GetTokenData(const txToken &Token) case tCanScrollUp: return mScroller != NULL && mScroller->CanScrollUp(); case tCanScrollDown: return mScroller != NULL && mScroller->CanScrollDown(); - + //default: return txToken::Token(Token); // return literal token default: break; } @@ -1,5 +1,5 @@ /* - * $Id: render.h,v 1.8 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: render.h,v 1.9 2004/12/17 19:56:16 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_RENDER_H @@ -31,6 +31,8 @@ class cText2SkinRender: public cThread { friend class VSkinnerScreen; private: + typedef std::map<txToken,cxType> tTokenCache; + static cText2SkinRender *mRender; cxSkin *mSkin; @@ -39,6 +41,7 @@ private: cText2SkinTheme *mTheme; cText2SkinScreen *mScreen; cText2SkinScroller *mScroller; + tTokenCache mTokenCache; std::string mBasePath; bool mDirty; @@ -56,8 +59,8 @@ private: protected: // Update thread - //void Lock(void) { mMutex.Lock(); } - //void Unlock(void) { mMutex.Unlock(); } + void UpdateLock(void) { mDoUpdateMutex.Lock(); } + void UpdateUnlock(void) { mDoUpdateMutex.Unlock(); } virtual void Action(void); // Drawing operations @@ -65,24 +68,20 @@ protected: void DrawBackground(const txPoint &Pos, const txSize &Size, const tColor *Bg, const tColor *Fg, int Alpha, const std::string &Path); void DrawImage(const txPoint &Pos, const txSize &Size, const tColor *Bg, const tColor *Fg, - int Alpha, int Colors, const std::string &Path); + int Alpha, int Colors, const std::string &Path); void DrawText(const txPoint &Pos, const txSize &Size, const tColor *Fg, const std::string &Text, - const cFont *Font, int Align); + const cFont *Font, int Align); void DrawRectangle(const txPoint &Pos, const txSize &Size, - const tColor *Fg); - void DrawEllipse(const txPoint &Pos, const txSize &Size, const tColor *Fg, - int Arc); - void DrawSlope(const txPoint &Pos, const txSize &Size, const tColor *Fg, - int Arc); - void DrawProgressbar(const txPoint &Pos, const txSize &Size, int Current, - int Total, const tColor *Fg, const tColor *Bg, - const tColor *Selected, const tColor *Mark, const tColor *Cur, - const cMarks *Marks = NULL); - void DrawMark(const txPoint &Pos, const txSize &Size, bool Start, - bool Current, bool Horizontal, const tColor *Mark, - const tColor *Cur); - void DrawScrolltext(const txPoint &Pos, const txSize &Size, - const tColor *Fg, const std::string &Text, const cFont *Font, int Align); + const tColor *Fg); + void DrawEllipse(const txPoint &Pos, const txSize &Size, const tColor *Fg, int Arc); + void DrawSlope(const txPoint &Pos, const txSize &Size, const tColor *Fg, int Arc); + void DrawProgressbar(const txPoint &Pos, const txSize &Size, int Current, int Total, + const tColor *Fg, const tColor *Bg, const tColor *Selected, + const tColor *Mark, const tColor *Cur, const cMarks *Marks = NULL); + void DrawMark(const txPoint &Pos, const txSize &Size, bool Start, bool Current, bool Horizontal, + const tColor *Mark, const tColor *Cur); + void DrawScrolltext(const txPoint &Pos, const txSize &Size, const tColor *Fg, + const std::string &Text, const cFont *Font, int Align); void DrawScrollbar(const txPoint &Pos, const txSize &Size, const tColor *Bg, const tColor *Fg); void Update(void); @@ -103,8 +102,8 @@ protected: void Clear(void) { DELETENULL(mScroller); } public: - cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Section, const std::string &BasePath = "", - bool OffScreen = false); + cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Section, + const std::string &BasePath = "", bool OffScreen = false); virtual ~cText2SkinRender(); // functions for object classes to obtain dynamic item information @@ -114,11 +113,14 @@ public: static cxType GetToken(const txToken &Token); }; -inline void cText2SkinRender::Flush(bool Force) { +inline void cText2SkinRender::Flush(bool Force) +{ if (mDirty || Force) { - mDoUpdateMutex.Lock(); + mTokenCache.clear(); + + UpdateLock(); mDoUpdate.Broadcast(); - mDoUpdateMutex.Unlock(); + UpdateUnlock(); mDirty = false; } @@ -1,5 +1,5 @@ /* - * $Id: screen.h,v 1.2 2004/12/06 15:01:02 lordjaxom Exp $ + * $Id: screen.h,v 1.3 2004/12/17 19:56:16 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_SCREEN_H @@ -35,6 +35,8 @@ public: void DrawSlope(int x1, int y1, int x2, int y2, tColor Color, int Type); void Flush(void); + + bool IsOpen(void) const { return mOsd != NULL; } }; #endif // VDR_TEXT2SKIN_SCREEN_H @@ -1,5 +1,5 @@ /* - * $Id: scroller.h,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: scroller.h,v 1.2 2004/12/17 19:56:16 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_SCROLLER_H @@ -38,9 +38,9 @@ public: int Total(void) { return mWrapper.Lines(); } int Offset(void) { return mOffset; } int Shown(void) { return mShown; } - bool CanScroll(void) { return CanScrollUp() || CanScrollDown(); } bool CanScrollUp(void) { return mOffset > 0; } bool CanScrollDown(void) { return mOffset + mShown < Total(); } + bool CanScroll(void) { return CanScrollUp() || CanScrollDown(); } void Scroll(bool Up, bool Page); }; diff --git a/text2skin.c b/text2skin.c index e6b9f7f..adee8ea 100644 --- a/text2skin.c +++ b/text2skin.c @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: text2skin.c,v 1.4 2004/12/12 20:26:25 lordjaxom Exp $ + * $Id: text2skin.c,v 1.5 2004/12/17 19:56:16 lordjaxom Exp $ */ #include "text2skin.h" @@ -12,7 +12,7 @@ #include "i18n.h" #include "loader.h" -const char *cText2SkinPlugin::VERSION = "1.0-pre4"; +const char *cText2SkinPlugin::VERSION = "1.0-pre5"; const char *cText2SkinPlugin::SKINVERSION = "1.0"; const char *cText2SkinPlugin::DESCRIPTION = "Loader for text-based skins"; @@ -1,5 +1,5 @@ /* - * $Id: theme.h,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: theme.h,v 1.2 2004/12/17 19:56:16 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_THEME_H @@ -12,8 +12,10 @@ class cText2SkinTheme: public cText2SkinFile { private: - cTheme mTheme; - std::map<std::string,int> mMap; + typedef std::map<std::string,int> tThemeMap; + + cTheme mTheme; + tThemeMap mMap; protected: bool Parse(const char *Text); @@ -27,8 +29,9 @@ public: }; inline tColor cText2SkinTheme::Color(const std::string &Name) { - if (mMap.find(Name) != mMap.end()) - return mTheme.Color(mMap[Name]); + tThemeMap::iterator it = mMap.find(Name); + if (it != mMap.end()) + return mTheme.Color((*it).second); else return 0x00000000; } diff --git a/xml/function.c b/xml/function.c index 597bece..66bae48 100644 --- a/xml/function.c +++ b/xml/function.c @@ -1,5 +1,5 @@ /* - * $Id: function.c,v 1.7 2004/12/14 13:13:10 lordjaxom Exp $ + * $Id: function.c,v 1.8 2004/12/17 19:56:16 lordjaxom Exp $ */ #include "xml/function.h" @@ -165,11 +165,9 @@ const std::string &cxFunction::FunFile(const std::string &Param) const std::string cxFunction::FunPlugin(const std::string &Param) const { - Dprintf("FunPlugin: Get(%s)\n", Param.c_str()); cPlugin *p = cPluginManager::GetPlugin(Param.c_str()); if (p) { const char *entry = p->MainMenuEntry(); - Dprintf("Entry: |%s|\n", entry); if (entry) return entry; } @@ -200,7 +198,6 @@ std::string cxFunction::Evaluate(void) const return False; case fun_eq: - Dprintf("eq: |%s| <-> |%s|\n", mParams[0]->Evaluate().c_str(), mParams[1]->Evaluate().c_str()); return mParams[0]->Evaluate() == mParams[1]->Evaluate() ? True : False; case fun_file: diff --git a/xml/object.c b/xml/object.c index b0b8dc0..940e5a9 100644 --- a/xml/object.c +++ b/xml/object.c @@ -1,5 +1,5 @@ /* - * $Id: object.c,v 1.5 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: object.c,v 1.6 2004/12/17 19:56:16 lordjaxom Exp $ */ #include "xml/object.h" @@ -118,11 +118,9 @@ const cFont *cxObject::Font(void) const { const cFont *font; - Dprintf("trying: %s %d\n", (SkinPath() + "/fonts/" + mFontFace).c_str(), mFontSize); if ((font = cText2SkinFont::Load(SkinPath() + "/fonts", mFontFace, mFontSize)) != NULL) return font; - Dprintf("trying: %s %d\n", (SkinPath() + "/" + mSkin->Name() + "/" + mFontFace).c_str(), mFontSize); if ((font = cText2SkinFont::Load(SkinPath() + "/" + mSkin->Name(), mFontFace, mFontSize)) != NULL) return font; diff --git a/xml/string.c b/xml/string.c index 3748df2..5b573eb 100644 --- a/xml/string.c +++ b/xml/string.c @@ -1,5 +1,5 @@ /* - * $Id: string.c,v 1.7 2004/12/14 13:13:10 lordjaxom Exp $ + * $Id: string.c,v 1.8 2004/12/17 19:56:16 lordjaxom Exp $ */ #include "xml/string.h" @@ -13,6 +13,7 @@ static const char *Tokens[__COUNT_TOKEN__] = { "ChannelNumber", "ChannelName", "ChannelShortName", "ChannelBouquet", "ChannelPortal", "ChannelSource", "PresentStartDateTime", "PresentVPSDateTime", "PresentEndDateTime", "PresentDuration", "PresentProgress", + "PresentRemaining", "PresentTitle", "PresentShortText", "PresentDescription", "FollowingStartDateTime", "FollowingVPSDateTime", "FollowingEndDateTime", "FollowingDuration", "FollowingTitle", "FollowingShortText", "FollowingDescription", "Language", @@ -29,7 +30,7 @@ static const char *Tokens[__COUNT_TOKEN__] = { // Replay Display "ReplayTitle", "ReplayPositionIndex", "ReplayDurationIndex", "ReplayPrompt", "IsPlaying", "IsFastForward", "IsFastRewind", "IsSlowForward", "IsSlowRewind", "IsPausing", - "ReplayPosition", "ReplayDuration", "ReplayMode", + "ReplayPosition", "ReplayDuration", "ReplayRemaining", "ReplayMode", // Menu Page "MenuTitle", "MenuGroup", "IsMenuGroup", "MenuItem", "IsMenuItem", "MenuCurrent", "IsMenuCurrent", diff --git a/xml/string.h b/xml/string.h index 650e7f7..8e29db8 100644 --- a/xml/string.h +++ b/xml/string.h @@ -1,5 +1,5 @@ /* - * $Id: string.h,v 1.7 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: string.h,v 1.8 2004/12/17 19:56:16 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_XML_STRING_H @@ -25,6 +25,7 @@ enum exToken { tPresentEndDateTime, tPresentDuration, tPresentProgress, + tPresentRemaining, tPresentTitle, tPresentShortText, tPresentDescription, @@ -52,7 +53,7 @@ enum exToken { tVolumeTotal, tIsMute, - // Message Display + // Message Display (also in all other displays) tMessage, tMessageStatus, tMessageInfo, @@ -72,6 +73,7 @@ enum exToken { tIsPausing, tReplayPosition, tReplayDuration, + tReplayRemaining, tReplayMode, // Menu Page @@ -83,6 +85,7 @@ enum exToken { tMenuCurrent, tIsMenuCurrent, tMenuText, + // next four also in Channel and Replay display (if supported by vdr/plugin) tButtonRed, tButtonGreen, tButtonYellow, @@ -103,9 +106,27 @@ struct txToken { txToken(void): Index(-1), Tab(-1) {} txToken(exToken t, uint o, const std::string &a): Type(t), Offset(o), Attrib(a), Index(-1), Tab(-1) {} + friend bool operator< (const txToken &A, const txToken &B); + static std::string Token(const txToken &Token); }; +inline bool operator< (const txToken &A, const txToken &B) +{ + if (A.Type == B.Type) { + if (A.Attrib == B.Attrib) { + if (A.Index == B.Index) + return A.Tab < B.Tab; + else + return A.Index < B.Index; + } + else + return A.Attrib < B.Attrib; + } + else + return A.Type < B.Type; +} + class cxString { private: std::string mText; @@ -1,11 +1,14 @@ /* - * $Id: type.c,v 1.3 2004/12/12 20:26:25 lordjaxom Exp $ + * $Id: type.c,v 1.4 2004/12/17 19:56:16 lordjaxom Exp $ */ #include "xml/type.h" #include "xml/function.h" #include <stdio.h> +cxType cxType::False(false); +cxType cxType::True(true); + const std::string &cxType::String(void) { if (mType == number) { char *buffer; @@ -1,5 +1,5 @@ /* - * $Id: type.h,v 1.5 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: type.h,v 1.6 2004/12/17 19:56:16 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_XML_TYPE_H @@ -22,6 +22,9 @@ private: int mNumber; public: + static cxType True; + static cxType False; + cxType(void): mType(boolean), mNumber(0) {} cxType(const char *String): mType(string), mString(String ?: "") {} cxType(std::string String): mType(string), mString(String) {} @@ -30,15 +33,11 @@ public: cxType(bool Value): mType(boolean), mNumber(Value ? 1 : 0) {} const std::string &String(void); - int Number(void) const; + int Number(void) const { return mType == number ? mNumber : 0; } operator std::string () { return String(); } operator int () { return Number(); } operator bool () { return Number(); } }; -inline int cxType::Number(void) const { - return mType == number ? mNumber : 0; -} - #endif // VDR_TEXT2SKIN_XML_TYPE_H |