diff --git a/coreengine/animation.c b/coreengine/animation.c index 735d309..90756b4 100644 --- a/coreengine/animation.c +++ b/coreengine/animation.c @@ -14,6 +14,7 @@ cAnimation::cAnimation(cScrollable *scrollable) : cThread("scroller") { keepSleeping = false; doAnimation = true; modeIn = false; + doFlush = true; blinkFunc = -1; } @@ -27,6 +28,7 @@ cAnimation::cAnimation(cDetachable *detachable, bool wait, bool animation) : cTh keepSleeping = false; doAnimation = animation; modeIn = false; + doFlush = true; blinkFunc = -1; } @@ -40,10 +42,11 @@ cAnimation::cAnimation(cFadable *fadable, bool fadein) : cThread("fadable") { keepSleeping = false; doAnimation = true; modeIn = fadein; + doFlush = true; blinkFunc = -1; } -cAnimation::cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool shiftin) : cThread("shiftable") { +cAnimation::cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool shiftin, bool doFlush) : cThread("shiftable") { this->scrollable = NULL; this->detachable = NULL; this->fadable = NULL; @@ -55,6 +58,7 @@ cAnimation::cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool s modeIn = shiftin; shiftstart = start; shiftend = end; + this->doFlush = doFlush; blinkFunc = -1; } @@ -68,6 +72,7 @@ cAnimation::cAnimation(cBlinkable *blinkable, int func) : cThread("blinking") { keepSleeping = false; doAnimation = true; modeIn = false; + doFlush = true; blinkFunc = func; } @@ -317,12 +322,14 @@ void cAnimation::Shift(void) { if (delay > 0) Sleep(delay); } + + shiftable->SetStartShifting(); uint64_t start = cTimeMs::Now(); while (Running() || !modeIn) { uint64_t now = cTimeMs::Now(); if (Running() || !modeIn) shiftable->SetPosition(pos, shiftend); - if (Running() || !modeIn) + if ((Running() || !modeIn) && doFlush) shiftable->Flush(); int delta = cTimeMs::Now() - now; if ((Running() || !modeIn) && (delta < frametime)) { @@ -347,7 +354,7 @@ void cAnimation::Shift(void) { pos.Set(pos.X() - stepX, pos.Y() - stepY); } } - + shiftable->SetEndShifting(); } void cAnimation::Blink(void) { diff --git a/coreengine/animation.h b/coreengine/animation.h index 6a4b733..2147e8a 100644 --- a/coreengine/animation.h +++ b/coreengine/animation.h @@ -70,6 +70,8 @@ public: virtual int ShiftTime(void) = 0; virtual int ShiftMode(void) = 0; virtual void SetPosition(cPoint &position, cPoint &reference, bool force = false) = 0; + virtual void SetStartShifting(void) = 0; + virtual void SetEndShifting(void) = 0; virtual void Flush(void) = 0; }; @@ -104,6 +106,7 @@ private: int blinkFunc; cPoint shiftstart; cPoint shiftend; + bool doFlush; void Sleep(int duration); void Wait(void); void Scroll(void); @@ -115,7 +118,7 @@ public: cAnimation(cScrollable *scrollable); cAnimation(cDetachable *detachable, bool wait, bool animation); cAnimation(cFadable *fadable, bool fadein); - cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool shiftin); + cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool shiftin, bool doFlush = true); cAnimation(cBlinkable *blinkable, int func); ~cAnimation(void); void WakeUp(void); diff --git a/coreengine/view.c b/coreengine/view.c index fbaac4f..48cded7 100644 --- a/coreengine/view.c +++ b/coreengine/view.c @@ -12,6 +12,7 @@ cView::cView(void) { viewElementsHorizontal = NULL; fader = NULL; shifter = NULL; + shifting = false; currentTvFrame = NULL; newTvFrame = NULL; menuInit = false; @@ -30,6 +31,7 @@ cView::~cView() { free(viewName); delete fader; delete shifter; + shifting = false; sdOsd.DeleteOsd(); } @@ -158,6 +160,8 @@ void cView::PreCache(void) { for (int i=0; i < numViewElements; i++) { if (!viewElements[i]) continue; + if (FadeTime() > 0 || ShiftTime() > 0) + viewElements[i]->SetAnimatedView(); viewElements[i]->SetContainer(contX, contY, attribs->Width(), attribs->Height()); viewElements[i]->Cache(); } @@ -165,6 +169,8 @@ void cView::PreCache(void) { for (int i=0; i < numViewElements; i++) { if (!viewElementsHorizontal[i]) continue; + if (FadeTime() > 0 || ShiftTime() > 0) + viewElementsHorizontal[i]->SetAnimatedView(); viewElementsHorizontal[i]->SetContainer(contX, contY, attribs->Width(), attribs->Height()); viewElementsHorizontal[i]->Cache(); } @@ -240,6 +246,7 @@ void cView::Close(void) { continue; viewElements[i]->Close(); } + sdOsd.Flush(); sdOsd.DeleteOsd(); } diff --git a/coreengine/view.h b/coreengine/view.h index 239c429..623dd08 100644 --- a/coreengine/view.h +++ b/coreengine/view.h @@ -41,6 +41,7 @@ protected: map viewElementNames; cAnimation *fader; cAnimation *shifter; + bool shifting; cRect tvFrame; cRect *currentTvFrame; cRect *newTvFrame; @@ -88,6 +89,8 @@ public: int ShiftTime(void); int ShiftMode(void); virtual void SetPosition(cPoint &position, cPoint &reference, bool force = false); + void SetStartShifting(void) { shifting = true; }; + void SetEndShifting(void) { shifting = false; }; }; #endif //__VIEW_H diff --git a/coreengine/viewdisplaychannel.c b/coreengine/viewdisplaychannel.c index a6ae3d5..97e6c76 100644 --- a/coreengine/viewdisplaychannel.c +++ b/coreengine/viewdisplaychannel.c @@ -174,24 +174,28 @@ void cViewChannel::Flush(void) { if (!displayChannelGroups) { //normal display - Render((int)eVeDisplayChannel::channelinfo); - Render((int)eVeDisplayChannel::epginfo); - Render((int)eVeDisplayChannel::statusinfo); - Render((int)eVeDisplayChannel::scrapercontent); - Render((int)eVeDisplayChannel::progressbar, channelChange); - Render((int)eVeDisplayChannel::screenresolution); - Render((int)eVeDisplayChannel::signalquality); - Render((int)eVeDisplayChannel::audioinfo); - Render((int)eVeDisplayChannel::ecminfo); - Render((int)eVeDisplayChannel::devices); - Render((int)eVeDisplayChannel::customtokens); - Render((int)eVeDisplayChannel::message); + if (!shifting) { + Render((int)eVeDisplayChannel::channelinfo); + Render((int)eVeDisplayChannel::epginfo); + Render((int)eVeDisplayChannel::statusinfo); + Render((int)eVeDisplayChannel::scrapercontent); + Render((int)eVeDisplayChannel::progressbar, channelChange); + Render((int)eVeDisplayChannel::screenresolution); + Render((int)eVeDisplayChannel::signalquality); + Render((int)eVeDisplayChannel::audioinfo); + Render((int)eVeDisplayChannel::ecminfo); + Render((int)eVeDisplayChannel::devices); + Render((int)eVeDisplayChannel::customtokens); + Render((int)eVeDisplayChannel::message); + } } else { //channelgroup display Render((int)eVeDisplayChannel::channelgroup); } - Render((int)eVeDisplayChannel::datetime); - Render((int)eVeDisplayChannel::time); + if (!shifting) { + Render((int)eVeDisplayChannel::datetime); + Render((int)eVeDisplayChannel::time); + } channelChange = false; cView::Flush(); } diff --git a/coreengine/viewelement.c b/coreengine/viewelement.c index 44c4393..542acdd 100644 --- a/coreengine/viewelement.c +++ b/coreengine/viewelement.c @@ -15,6 +15,7 @@ cViewElement::cViewElement(void) { detached = false; waitOnWakeup = true; startAnimation = true; + viewAnimated = false; globals = NULL; tokenContainer = NULL; attribs = new cViewElementAttribs((int)eViewElementAttribs::count); @@ -34,6 +35,7 @@ cViewElement::cViewElement(const cViewElement &other) { detached = false; waitOnWakeup = true; startAnimation = true; + viewAnimated = false; globals = other.globals; container.Set(other.container.X(), other.container.Y(), other.container.Width(), other.container.Height()); tokenContainer = NULL; @@ -424,7 +426,7 @@ void cViewElement::StartAnimation(void) { SetPosition(start, ref); sdOsd->Flush(); delete shifter; - shifter = new cAnimation((cShiftable*)this, start, ref, true); + shifter = new cAnimation((cShiftable*)this, start, ref, true, !viewAnimated); shifter->Start(); } else if (FadeTime() > 0) { SetTransparency(100); diff --git a/coreengine/viewelement.h b/coreengine/viewelement.h index 99950b3..90cb544 100644 --- a/coreengine/viewelement.h +++ b/coreengine/viewelement.h @@ -27,6 +27,7 @@ protected: bool waitOnWakeup; bool scrollingStarted; bool startAnimation; + bool viewAnimated; cGlobals *globals; cRect container; cViewElementAttribs *attribs; @@ -54,6 +55,7 @@ public: bool Detached(void); void SetContainer(int x, int y, int width, int height); void SetAttributes(vector &attributes); + void SetAnimatedView(void) { viewAnimated = true; }; void AddArea(cAreaNode *area); void SetAreaX(int x); void SetAreaY(int y); @@ -84,6 +86,8 @@ public: void StartAnimation(void); virtual void SetTransparency(int transparency, bool force = false); virtual void SetPosition(cPoint &position, cPoint &reference, bool force = false); + void SetStartShifting(void) { }; + void SetEndShifting(void) { }; cRect CoveredArea(void); void Flush(void); virtual bool Parse(bool forced = false); diff --git a/coreengine/viewelementscommon.c b/coreengine/viewelementscommon.c index 2226b77..411a1d8 100644 --- a/coreengine/viewelementscommon.c +++ b/coreengine/viewelementscommon.c @@ -250,7 +250,7 @@ bool cVeDevices::Parse(bool forced) { if (light) return false; //check if drawing is necessary - if (lastRefresh - cTimeMs::Now() < 500) + if (cTimeMs::Now() - lastRefresh < 500) return false; bool changed = false; for (int i = 0; i < numDevices; i++) {