From b03b6aa72ca6a991cff8c32f12d6fb47f9103a5e Mon Sep 17 00:00:00 2001 From: anbr Date: Sun, 24 May 2009 20:36:41 +0200 Subject: Render current OSD state --- status.c | 18 ++++++----- watch.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++------------ watch.h | 7 +++-- 3 files changed, 100 insertions(+), 29 deletions(-) diff --git a/status.c b/status.c index 035282f..34d5348 100644 --- a/status.c +++ b/status.c @@ -64,14 +64,15 @@ void ciMonStatusMonitor::Replaying(const cControl *pControl, const char *szName, void ciMonStatusMonitor::OsdClear(void) { -#ifdef unusedMOREDEBUGMSG +#ifdef MOREDEBUGMSG dsyslog("iMonLCD: OsdClear"); #endif + m_pDev->OsdClear(); } void ciMonStatusMonitor::OsdTitle(const char *Title) { -#ifdef unusedMOREDEBUGMSG +#ifdef MOREDEBUGMSG dsyslog("iMonLCD: OsdTitle '%s'", Title); #endif } @@ -81,7 +82,7 @@ void ciMonStatusMonitor::OsdStatusMessage(const char *szMessage) #ifdef MOREDEBUGMSG dsyslog("iMonLCD: OsdStatusMessage '%s'", szMessage ? szMessage : "NULL"); #endif - m_pDev->StatusMessage(szMessage); + m_pDev->OsdStatusMessage(szMessage); } void ciMonStatusMonitor::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue) @@ -91,23 +92,24 @@ void ciMonStatusMonitor::OsdHelpKeys(const char *Red, const char *Green, const c #endif } -void ciMonStatusMonitor::OsdCurrentItem(const char *Text) +void ciMonStatusMonitor::OsdCurrentItem(const char *szText) { -#ifdef unusedMOREDEBUGMSG - dsyslog("iMonLCD: OsdCurrentItem %s", Text); +#ifdef MOREDEBUGMSG + dsyslog("iMonLCD: OsdCurrentItem %s", szText); #endif + m_pDev->OsdCurrentItem(szText); } void ciMonStatusMonitor::OsdTextItem(const char *Text, bool Scroll) { -#ifdef unusedMOREDEBUGMSG +#ifdef MOREDEBUGMSG dsyslog("iMonLCD: OsdTextItem %s %d", Text, Scroll); #endif } void ciMonStatusMonitor::OsdChannel(const char *Text) { -#ifdef unusedMOREDEBUGMSG +#ifdef MOREDEBUGMSG dsyslog("iMonLCD: OsdChannel %s", Text); #endif } diff --git a/watch.c b/watch.c index 2cc52ae..8e00db2 100644 --- a/watch.c +++ b/watch.c @@ -47,7 +47,7 @@ ciMonWatch::ciMonWatch() m_nLastVolume = cDevice::CurrentVolume(); m_bVolumeMute = false; - m_bShowOsdMessage = false; + osdItem = NULL; osdMessage = NULL; m_pControl = NULL; @@ -81,6 +81,10 @@ ciMonWatch::~ciMonWatch() delete osdMessage; osdMessage = NULL; } + if(osdItem) { + delete osdItem; + osdItem = NULL; + } if(replayTitle) { delete replayTitle; replayTitle = NULL; @@ -292,11 +296,13 @@ void ciMonWatch::Action(void) bool ciMonWatch::RenderScreen() { cString* scRender; bool bForce = m_bUpdateScreen; - if(m_eWatchMode == eLiveTV) { + if(osdMessage) { + scRender = osdMessage; + } else if(osdItem) { + scRender = osdItem; + } else if(m_eWatchMode == eLiveTV) { if(Program()) { bForce = true; - m_nScrollOffset = 0; - m_bScrollBackward = false; } if(chPresentTitle) scRender = chPresentTitle; @@ -305,11 +311,13 @@ bool ciMonWatch::RenderScreen() { } else { if(Replay()) { bForce = true; - m_nScrollOffset = 0; - m_bScrollBackward = false; } scRender = replayTitle; } + if(bForce) { + m_nScrollOffset = 0; + m_bScrollBackward = false; + } if(bForce || m_nScrollOffset > 0 || m_bScrollBackward) { this->clear(); if(scRender) { @@ -654,23 +662,81 @@ bool ciMonWatch::Volume(int nVolume, bool bAbsolute) return bStateIsChanged; } -void ciMonWatch::StatusMessage(const char *szMessage) + +void ciMonWatch::OsdClear() { + cMutexLooker m(mutex); + if(osdMessage) { + delete osdMessage; + osdMessage = NULL; + m_bUpdateScreen = true; + } + if(osdItem) { + delete osdItem; + osdItem = NULL; + m_bUpdateScreen = true; + } +} + +void ciMonWatch::OsdCurrentItem(const char *sz) { + char *s = NULL; + char *sc = NULL; + if(sz && !isempty(sz)) { + s = strdup(sz); + sc = compactspace(strreplace(s,'\t',' ')); + } + if(sc + && osdItem + && 0 == strcmp(sc, *osdItem)) { + if(s) { + free(s); + } + return; + } cMutexLooker m(mutex); - if(szMessage) { - if(osdMessage) { - delete osdMessage; - osdMessage = NULL; - } - if (!isempty(szMessage)) { - osdMessage = new cString(szMessage); - m_bShowOsdMessage = true; - m_bUpdateScreen = true; - } - } else { - m_bShowOsdMessage = false; + if(osdItem) { + delete osdItem; + osdItem = NULL; + m_bUpdateScreen = true; + } + if(sc) { + osdItem = new cString(sc); + m_bUpdateScreen = true; + } + if(s) { + free(s); + } +} + +void ciMonWatch::OsdStatusMessage(const char *sz) +{ + char *s = NULL; + char *sc = NULL; + if(sz && !isempty(sz)) { + s = strdup(sz); + sc = compactspace(strreplace(s,'\t',' ')); + } + if(sc + && osdMessage + && 0 == strcmp(sc, *osdMessage)) { + if(s) { + free(s); + } + return; + } + cMutexLooker m(mutex); + if(osdMessage) { + delete osdMessage; + osdMessage = NULL; m_bUpdateScreen = true; } + if(sc) { + osdMessage = new cString(sc); + m_bUpdateScreen = true; + } + if(s) { + free(s); + } } bool ciMonWatch::SetFont(const char *szFont) { diff --git a/watch.h b/watch.h index 4ac3da2..68aa894 100644 --- a/watch.h +++ b/watch.h @@ -95,7 +95,7 @@ private: int m_nLastVolume; bool m_bVolumeMute; - bool m_bShowOsdMessage; + cString* osdItem; cString* osdMessage; eReplayMode m_eReplayMode; @@ -120,7 +120,10 @@ public: void Recording(const cDevice *pDevice, const char *szName, const char *szFileName, bool bOn); void Channel(int nChannelNumber); bool Volume(int nVolume, bool bAbsolute); - void StatusMessage(const char *szMessage); + + void OsdClear(); + void OsdCurrentItem(const char *sz); + void OsdStatusMessage(const char *sz); virtual bool SetFont(const char *szFont); }; -- cgit v1.2.3