From 4921cf32c8bda089a21dc4a14ce191ed477f80ff Mon Sep 17 00:00:00 2001 From: Midas Date: Thu, 22 Apr 2010 01:06:40 +0200 Subject: 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. --- block/control.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 block/control.c (limited to 'block/control.c') 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 + +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; +} + -- cgit v1.2.3