summaryrefslogtreecommitdiff
path: root/display.c
diff options
context:
space:
mode:
Diffstat (limited to 'display.c')
-rw-r--r--display.c167
1 files changed, 99 insertions, 68 deletions
diff --git a/display.c b/display.c
index 663fd45..4bcce4c 100644
--- a/display.c
+++ b/display.c
@@ -51,7 +51,7 @@ void cText2SkinDisplayChannel::SetChannel(const cChannel *Channel, int Number)
if (mChannel != Channel || mNumber != Number) {
mChannel = Channel;
mNumber = Number;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -67,7 +67,7 @@ void cText2SkinDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Fo
if (mPresent != Present || mFollowing != Following) {
mPresent = Present;
mFollowing = Following;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -84,7 +84,7 @@ void cText2SkinDisplayChannel::SetMessage(eMessageType Type, const char *Text)
if (mType != Type || mText != Text) {
mType = Type;
mText = Text;
- SetDirty();
+ SetDirty(cxRefresh::all);
}
UpdateUnlock();
}
@@ -108,7 +108,7 @@ void cText2SkinDisplayChannel::SetButtons(const char *Red, const char *Green, co
mButtonGreen = Green;
mButtonYellow = Yellow;
mButtonBlue = Blue;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -372,7 +372,7 @@ void cText2SkinDisplayVolume::SetVolume(int Current, int Total, bool Mute)
mCurrent = Current;
mTotal = Total;
mMute = Mute;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -422,7 +422,7 @@ void cText2SkinDisplayReplay::SetTitle(const char *Title)
if (Title == NULL) Title = "";
if (mTitle != Title) {
mTitle = Title;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -436,7 +436,7 @@ void cText2SkinDisplayReplay::SetMode(bool Play, bool Forward, int Speed)
mPlay = Play;
mForward = Forward;
mSpeed = Speed;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -447,7 +447,7 @@ void cText2SkinDisplayReplay::SetProgress(int Current, int Total)
if (mCurrent != Current || mTotal != Total) {
mCurrent = Current;
mTotal = Total;
- // SetDirty(); TODO: let this cause a display update every frame?
+ // SetDirty(cxRefresh::update); TODO: let this cause a display update every frame?
}
UpdateUnlock();
}
@@ -456,7 +456,7 @@ void cText2SkinDisplayReplay::SetMarks(const cMarks *Marks)
{
UpdateLock();
mMarks = Marks;
- SetDirty();
+ SetDirty(cxRefresh::update);
UpdateUnlock();
}
@@ -466,7 +466,7 @@ void cText2SkinDisplayReplay::SetCurrent(const char *Current)
if (Current == NULL) Current = "";
if (mPosition != Current) {
mPosition = Current;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -477,7 +477,7 @@ void cText2SkinDisplayReplay::SetTotal(const char *Total)
if (Total == NULL) Total = "";
if (mDuration != Total) {
mDuration = Total;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -488,7 +488,7 @@ void cText2SkinDisplayReplay::SetJump(const char *Jump)
if (Jump == NULL) Jump = "";
if (mPrompt != Jump) {
mPrompt = Jump;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -500,7 +500,7 @@ void cText2SkinDisplayReplay::SetMessage(eMessageType Type, const char *Text)
if (mType != Type || mText != Text) {
mType = Type;
mText = Text;
- SetDirty();
+ SetDirty(cxRefresh::all);
}
UpdateUnlock();
}
@@ -519,7 +519,7 @@ void cText2SkinDisplayReplay::SetButtons(const char *Red, const char *Green, con
mButtonGreen = Green;
mButtonYellow = Yellow;
mButtonBlue = Blue;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -677,7 +677,7 @@ void cText2SkinDisplayMessage::SetMessage(eMessageType Type, const char *Text)
if (mType != Type || mText != Text) {
mType = Type;
mText = Text;
- SetDirty();
+ SetDirty(cxRefresh::all);
}
UpdateUnlock();
}
@@ -778,7 +778,7 @@ void cText2SkinDisplayMenu::Clear(void)
ExtRecordingDescription = "";
mText = "";
cText2SkinRender::Clear();
- SetDirty();
+ SetDirty(cxRefresh::all);
UpdateUnlock();
}
@@ -797,7 +797,7 @@ void cText2SkinDisplayMenu::SetTitle(const char *Title)
mUpdate.events = true;
mUpdate.resetMarquee = true;
mTitle = Title;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -821,7 +821,7 @@ void cText2SkinDisplayMenu::SetButtons(const char *Red, const char *Green, const
mButtonGreen = Green;
mButtonYellow = Yellow;
mButtonBlue = Blue;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -839,7 +839,7 @@ void cText2SkinDisplayMenu::SetMessage(eMessageType Type, const char *Text)
if (mMessageType != Type || mMessageText != Text) {
mMessageType = Type;
mMessageText = Text;
- SetDirty();
+ SetDirty(cxRefresh::all);
}
UpdateUnlock();
}
@@ -865,16 +865,22 @@ void cText2SkinDisplayMenu::SetItem(const char *Text, int Index, bool Current, b
if (mItems.size() <= (uint)Index) {
mItems.push_back(item);
- SetDirty();
+ mDirtyItems.push_back(Index);
+ SetDirty(cxRefresh::list);
}
else if (mItems[Index] != item) {
mItems[Index] = item;
- SetDirty();
+ // refresh only the changed items
+ mDirtyItems.push_back(Index);
+ SetDirty(cxRefresh::list);
}
if (Current && mCurrentItem != (uint)Index) {
+ // refresh only the changed items
+ mDirtyItems.push_back(mCurrentItem);
+ mDirtyItems.push_back(Index);
+ SetDirty(cxRefresh::list);
mCurrentItem = Index;
- SetDirty();
}
if (Current)
@@ -894,7 +900,7 @@ void cText2SkinDisplayMenu::SetEvent(const cEvent *Event)
mEvent = Event;
ExtPresentDescription = "";
if (mEvent != NULL)
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -912,7 +918,7 @@ void cText2SkinDisplayMenu::SetRecording(const cRecording *Recording)
mRecording = Recording;
ExtRecordingDescription = "";
if (mRecording != NULL)
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -928,7 +934,7 @@ void cText2SkinDisplayMenu::SetText(const char *Text, bool FixedFont)
if (Text == NULL) Text = "";
if (mText != Text) {
mText = Text;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
@@ -954,7 +960,7 @@ void cText2SkinDisplayMenu::Scroll(bool Up, bool Page)
UpdateLock();
cText2SkinRender::Scroll(Up, Page);
- SetDirty();
+ SetDirty(cxRefresh::scroll);
UpdateUnlock();
}
@@ -963,11 +969,8 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token)
switch (Token.Type) {
case tMenuItem:
case tMenuGroup:
- if (Token.Index < 0) return false;
case tMenuCurrent:
- if (Token.Index >= 0 && Token.Tab == -1) return false;
break;
-
default:
if (Token.Tab >= 0) return false;
break;
@@ -978,38 +981,61 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token)
return mTitle;
case tMenuItem:
- return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel
- && mCurrentItem != (uint)Token.Index
- ? (cxType)mItems[Token.Index].tabs[Token.Tab]
- : (cxType)false;
+ if (Token.Index < 0)
+ return false;
+
+ if (mItems.size() <= (uint)Token.Index || !mItems[Token.Index].sel ||
+ mCurrentItem == (uint)Token.Index)
+ return false;
+
+ if (Token.Tab < 0)
+ return Token.Attrib.Type == aNumber
+ ? (cxType)mItems[Token.Index].tabs[Token.Attrib.Number]
+ : (cxType)mItems[Token.Index].text;
+
+ return (cxType)mItems[Token.Index].tabs[Token.Tab];
case tIsMenuItem:
return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel
&& mCurrentItem != (uint)Token.Index;
case tMenuCurrent:
- if (Token.Index < 0) {
- if (mItems.size() > mCurrentItem)
- return Token.Attrib.Type == aNumber
- ? (cxType)mItems[mCurrentItem].tabs[Token.Attrib.Number]
- : (cxType)mItems[mCurrentItem].text;
- else
- return false;
- }
+ if (mItems.size() <= mCurrentItem)
+ return false;
- return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel
- && mCurrentItem == (uint)Token.Index
- ? (cxType)mItems[Token.Index].tabs[Token.Tab]
- : (cxType)false;
+ if (Token.Index < 0)
+ return Token.Attrib.Type == aNumber
+ ? (cxType)mItems[mCurrentItem].tabs[Token.Attrib.Number]
+ : (cxType)mItems[mCurrentItem].text;
+
+ if (mItems.size() <= (uint)Token.Index || !mItems[Token.Index].sel ||
+ mCurrentItem != (uint)Token.Index)
+ return false;
+
+ if (Token.Tab < 0)
+ return Token.Attrib.Type == aNumber
+ ? (cxType)mItems[Token.Index].tabs[Token.Attrib.Number]
+ : (cxType)mItems[Token.Index].text;
+
+ return (cxType)mItems[Token.Index].tabs[Token.Tab];
case tIsMenuCurrent:
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
- ? (cxType)mItems[Token.Index].tabs[Token.Tab]
- : (cxType)false;
+ if (Token.Index < 0)
+ return false;
+
+ if (mItems.size() <= (uint)Token.Index || mItems[Token.Index].sel)
+ return false;
+
+ if (Token.Tab < 0)
+ return Token.Attrib.Type == aNumber
+ ? (cxType)mItems[Token.Index].tabs[Token.Attrib.Number]
+ : (cxType)mItems[Token.Index].text;
+
+ return (cxType)mItems[Token.Index].tabs[Token.Tab];
case tIsMenuGroup:
return mItems.size() > (uint)Token.Index && !mItems[Token.Index].sel;
@@ -1395,8 +1421,11 @@ void cText2SkinDisplayTracks::SetTrack(int Index, const char * const *Tracks)
UpdateLock();
Dprintf("SetTrack: %d (%s here, %s in array)\n", Index, Tracks[Index], mItems[Index].c_str());
if (mCurrentItem != (uint)Index) {
+ // refresh only the changed items
+ mDirtyItems.push_back(mCurrentItem);
+ mDirtyItems.push_back(Index);
mCurrentItem = Index;
- SetDirty();
+ SetDirty(cxRefresh::list);
}
UpdateUnlock();
}
@@ -1406,24 +1435,15 @@ void cText2SkinDisplayTracks::SetAudioChannel(int AudioChannel)
UpdateLock();
if (mAudioChannel != AudioChannel) {
mAudioChannel = AudioChannel;
- SetDirty();
+ SetDirty(cxRefresh::update);
}
UpdateUnlock();
}
cxType cText2SkinDisplayTracks::GetTokenData(const txToken &Token)
{
- switch (Token.Type) {
- case tMenuItem:
- if (Token.Index < 0) return false;
- case tMenuCurrent:
- if (Token.Index >= 0 && Token.Tab == -1) return false;
- break;
-
- default:
- if (Token.Tab >= 0) return false;
- break;
- }
+ if (Token.Tab >= 0)
+ return false;
int index = Token.Index;
if (index >= 0 && mCurrentItem >= (uint)mMaxItems) {
@@ -1436,17 +1456,28 @@ cxType cText2SkinDisplayTracks::GetTokenData(const txToken &Token)
return mTitle;
case tMenuItem:
- return mItems.size() > (uint)index && mCurrentItem != (uint)index
- ? (cxType)mItems[index]
- : (cxType)false;
-
+ if (index < 0)
+ return false;
+
+ if (mItems.size() <= (uint)index || mCurrentItem == (uint)index)
+ return false;
+
+ return (cxType)mItems[index];
+
case tIsMenuItem:
return mItems.size() > (uint)index && mCurrentItem != (uint)index;
case tMenuCurrent:
- return mItems.size() > (uint)index && mCurrentItem == (uint)index
- ? (cxType)mItems[index]
- : (cxType)false;
+ if (mItems.size() <= mCurrentItem)
+ return false;
+
+ if (index < 0)
+ return (cxType)mItems[mCurrentItem];
+
+ if (mItems.size() <= (uint)index || mCurrentItem != (uint)index)
+ return false;
+
+ return (cxType)mItems[index];
case tIsMenuCurrent:
return mItems.size() > (uint)index && mCurrentItem == (uint)index;