diff options
| author | Midas <vdrportal_midas@gmx.de> | 2010-04-22 01:06:40 +0200 |
|---|---|---|
| committer | Midas <vdrportal_midas@gmx.de> | 2010-04-22 01:06:40 +0200 |
| commit | 4921cf32c8bda089a21dc4a14ce191ed477f80ff (patch) | |
| tree | ff9debb648949a2ad43ee7759fb667fb03a78b73 /block/control.c | |
| download | vdr-plugin-block-4921cf32c8bda089a21dc4a14ce191ed477f80ff.tar.gz vdr-plugin-block-4921cf32c8bda089a21dc4a14ce191ed477f80ff.tar.bz2 | |
Initial release. Version 0.0.1b. Fork of the taste plugin 0.0.2d by LordJaxom.
Patches for the taste plugin by tomg and mapovi were added permanently to the
source of the block plugin. For more information, feature list und bugfixes
read HISTORY and README please.
Diffstat (limited to 'block/control.c')
| -rw-r--r-- | block/control.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/block/control.c b/block/control.c new file mode 100644 index 0000000..d6acd7e --- /dev/null +++ b/block/control.c @@ -0,0 +1,129 @@ +/** + * based on control.c,v 1.4 2007/06/18 17:58:52 lordjaxom + * + * version by Midas + * + */ + +#include "control.h" +#include "config.h" +#include "common.h" + +#include <vdr/remote.h> + +inline uint64_t BlockTimeout() { return SetupBlock.MessageTimeout * 1000; } + +bool cControlBlock::mRequested = false; + +cControlBlock::cControlBlock(int LastChannel, const cChannel *Channel, const cEvent *Present, const cEvent *Following): + cControl(new cPlayer), + mLastChannel(LastChannel), + mChannel(Channel), + mPresent(Present), + mFollowing(Following), + mStart(0), + mSwitch(true), + mOsd(NULL) +{ +#if APIVERSNUM >= 10500 + SetNeedsFastResponse(true); +#else + needsFastResponse = true; +#endif + cRemote::Put(kOk, true); // Hide OSD +} + +cControlBlock::~cControlBlock() +{ + if (mOsd != NULL) + delete mOsd; + if (mRequested) + { +#ifdef LOGGING + dsyslog("plugin-block: userint user requested to watch blocked channel"); +#endif + //if (mChannel!=0) + if (mChannel != NULL) + { + cDevice::PrimaryDevice()->SwitchChannel(mChannel, true); + } + else + { + //don't know if this is necessary - just taken from plugin taste + //seems that mChannel cannot be 0 because it is an object reference + //changed that to NULL + dsyslog("plugin-block: userint Cannot switch - channel unknown!"); + } + } + + if (mSwitch) { + // possibly first or last available channel, fall back to old channel + int direction = mChannel->Number() - mLastChannel; + if (direction == 0) + direction = 1; + if (!cDevice::SwitchChannel(direction) && (mLastChannel != 0)) + Channels.SwitchTo(mLastChannel); + } +} + +void cControlBlock::Show(void) +{ + if (mOsd == NULL) + mOsd = Skins.Current()->DisplayChannel(true); + + mOsd->SetChannel(mChannel, 0); + mOsd->SetEvents(mPresent, mFollowing); + mOsd->SetMessage(mtError, tr("Channel not acceptable!")); + mOsd->Flush(); + + mStart = time_ms(); +} + +eOSState cControlBlock::ProcessKey(eKeys Key) +{ +#ifdef LOGGING + dsyslog("plugin-block: userint cControlBlock::ProcessKey(%d) this = %p", Key, this); +#endif + + switch (Key) { + + case kOk: +#ifdef LOGGING + dsyslog("plugin-block: userint Processing 'Ok' event"); +#endif + mRequested = true; + mSwitch = false; + return osEnd; + + case kNone: +#ifdef LOGGING +dsyslog("plugin-block: userint Processing kNone (no user interaction)"); +#endif + if (mStart == 0) + Show(); + else if (time_ms() - mStart > BlockTimeout()) { + mSwitch = true; + return osEnd; + } + return osContinue; + + + + case kUp: + case kDown: + case kChanUp: + case kChanDn: +#ifdef LOGGING +dsyslog("plugin-block: userint Processing k(Ch)Up/(Ch)Down event."); +#endif + mRequested = false; + mSwitch = true; + return osEnd; + break; + + default: + break; + } + return osContinue; +} + |
