#SERVICE 1:0:1:33:21:85:C00000:0:0:0:\r
#SERVICE 1:0:1:701:5:85:C00000:0:0:0:\r
#SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7005:436:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:\r
#SERVICE 1:0:1:2FC:5:85:C00000:0:0:0:\r
#SERVICE 1:0:1:F98:454:1:C00000:0:0:0:\r
#SERVICE 1:0:1:7034:41B:1:C00000:0:0:0:\r
#SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen\r
#DESCRIPTION Doku/Wissen/Themen\r
#SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:\r
#SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0:\r
#SERVICE 1:0:1:2775:444:1:C00000:0:0:0:\r
#SERVICE 1:0:1:293:5:85:C00000:0:0:0:\r
#SERVICE 1:64:5:0:0:0:0:0:0:0::Reisen\r
#DESCRIPTION Reisen\r
#SERVICE 1:0:1:20:21:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:3339:45B:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:27B9:444:1:C00000:0:0:0:\r
#SERVICE 1:64:9:0:0:0:0:0:0:0::Beratung\r
#DESCRIPTION Beratung\r
#SERVICE 1:0:1:295:21:85:C00000:0:0:0:\r
#SERVICE 1:0:1:36:7:85:C00000:0:0:0:\r
#SERVICE 1:0:1:307:7:85:C00000:0:0:0:\r
#SERVICE 1:0:1:296:5:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:2791:444:1:C00000:0:0:0:\r
#SERVICE 1:0:1:383:21:85:C00000:0:0:0:\r
#SERVICE 1:0:1:313C:459:1:C00000:0:0:0:\r
#SERVICE 1:0:1:3159:459:1:C00000:0:0:0:\r
#SERVICE 1:0:19:2B66:3F3:1:C00000:0:0:0:\r
#SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0:\r
#SERVICE 1:0:19:6EEC:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:1324:3EF:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:1325:3EF:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:EF12:421:1:C00000:0:0:0:\r
#SERVICE 1:0:19:2B84:3F3:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:EF13:421:1:C00000:0:0:0:\r
#SERVICE 1:64:0:0:0:0:0:0:0:0::Alternativen\r
#DESCRIPTION Alternativen\r
#SERVICE 1:0:1:6DCB:44D:1:C00000:0:0:0:\r
<widget name="menu" position="10,10" size="290,225" scrollbarMode="showOnDemand" />
</screen>
<!-- Channel context menu -->
- <screen name="ChannelContextMenu" position="center,center" size="300,255" title="Channellist menu">
- <widget name="menu" position="10,10" size="290,230" scrollbarMode="showOnDemand" />
+ <screen name="ChannelContextMenu" position="center,center" size="350,255" title="Channellist menu">
+ <widget name="menu" position="10,10" size="340,230" scrollbarMode="showOnDemand" />
</screen>
<!-- Channel selection - TV -->
<screen name="ChannelSelection" position="center,center" size="560,430" title="Channel Selection">
<screen name="Dish" flags="wfNoBorder" position="300,100" size="130,160" title="Dish" zPosition="100" backgroundColor="transparent">
<widget name="Dishpixmap" pixmap="skin_default/icons/dish.png" position="0,0" size="130,160" alphatest="off" />
</screen>
+ <!-- unhandled key pressed -->
+ <screen name="UnhandledKey" flags="wfNoBorder" position="620,50" size="34,45" title="UnhandledKey" zPosition="100" backgroundColor="transparent">
+ <widget name="UnhandledKeyPixmap" pixmap="skin_default/unhandled-key.png" position="0,0" size="34,45" alphatest="off" />
+ </screen>
<!-- EPG Selection - Single -->
<screen name="EPGSelection" position="center,center" size="560,430" title="EPG Selection">
<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
sleeptimer.png \
timeline-now.png \
timeline.png \
+ unhandled-key.png \
verticalline-plugins.png \
vkey_backspace.png \
vkey_bg.png \
}
} else
{
- eDebug("wildcard.");
+// eDebug("wildcard.");
ePyObject pArgs = PyTuple_New(2);
PyTuple_SET_ITEM(pArgs, 0, PyInt_FromLong(key));
PyTuple_SET_ITEM(pArgs, 1, PyInt_FromLong(flags));
{
sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read);
CONNECT(sn->activated, eRCShortDriver::keyPressed);
- eRCInput::getInstance()->setFile(handle);
}
}
{
sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read);
CONNECT(sn->activated, eRCInputEventDriver::keyPressed);
- eRCInput::getInstance()->setFile(handle);
}
}
return name;
}
+void eRCInputEventDriver::setExclusive(bool b)
+{
+ if (handle >= 0)
+ {
+ int grab = b;
+ if (::ioctl(handle, EVIOCGRAB, grab) < 0)
+ perror("EVIOCGRAB");
+ }
+}
+
eRCInputEventDriver::~eRCInputEventDriver()
{
if (handle>=0)
{
ASSERT( !instance);
instance=this;
- handle = -1;
locked = 0;
keyboardMode = kmNone;
}
return false;
}
-int eRCInput::lock()
+void eRCInput::lock()
{
locked=1;
- return handle;
+ for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
+ i->second->setExclusive(false);
}
void eRCInput::unlock()
{
- if (locked)
- locked=0;
-}
-
-void eRCInput::setFile(int newh)
-{
- handle=newh;
+ locked=0;
+ for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
+ i->second->setExclusive(true);
}
void eRCInput::addDevice(const std::string &id, eRCDevice *dev)
if (i == devices.end())
{
eDebug("failed, possible choices are:");
- for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
+ for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
eDebug("%s", i->first.c_str());
return 0;
}
* \param key The key to get the description for.
* \result User readable description of given key.
*/
+ virtual void setExclusive(bool b) { };
};
/**
~eRCDriver();
void enable(int en) { enabled=en; }
+ virtual void setExclusive(bool) { }
};
class eRCShortDriver: public eRCDriver
std::string getDeviceName();
eRCInputEventDriver(const char *filename);
~eRCInputEventDriver();
+ void setExclusive(bool b); // in exclusive mode data is not carried to console device
};
class eRCKey
class eRCInput: public Object
{
int locked;
- int handle;
static eRCInput *instance;
int keyboardMode;
#ifdef SWIG
void close();
bool open();
- void setFile(int handle);
-
/* This is only relevant for "keyboard"-styled input devices,
i.e. not plain remote controls. It's up to the input device
driver to decide wheter an input device is a keyboard or
void setKeyboardMode(int mode) { keyboardMode = mode; }
int getKeyboardMode() { return keyboardMode; }
static eRCInput *getInstance() { return instance; }
- int lock();
+ void lock();
void unlock();
int islocked() { return locked; }
};
{
sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read);
CONNECT(sn->activated, eRCConsoleDriver::keyPressed);
- eRCInput::getInstance()->setFile(handle);
}
/* set console mode */
break;
}
}
+ setExclusive(true);
eDebug("Input device \"%s\" is %sa keyboard.", id.c_str(), iskeyboard ? "" : "not ");
+}
+void eRCDeviceInputDev::setExclusive(bool b)
+{
+ driver->setExclusive(!iskeyboard && b);
}
const char *eRCDeviceInputDev::getDescription() const
void handleCode(long code);
eRCDeviceInputDev(eRCInputEventDriver *driver);
const char *getDescription() const;
+ void setExclusive(bool);
};
#endif
from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont
from Tools.LoadPixmap import LoadPixmap
-def ChoiceEntryComponent(key, text):
+def ChoiceEntryComponent(key = "", text = ["--"]):
res = [ text ]
if text[0] == "--":
res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 00, 800, 25, 0, RT_HALIGN_LEFT, "-"*200))
tmp.lnb = lnb
nim.advanced.sat[x] = tmp
+ def toneAmplitudeChanged(configElement):
+ fe_id = configElement.fe_id
+ slot_id = configElement.slot_id
+ if nimmgr.nim_slots[slot_id].description == 'Alps BSBE2':
+ open("/proc/stb/frontend/%d/tone_amplitude" %(fe_id), "w").write(configElement.value)
+
+ empty_slots = 0
for slot in nimmgr.nim_slots:
x = slot.slot
nim = config.Nims[x]
if slot.isCompatible("DVB-S"):
+ nim.toneAmplitude = ConfigSelection([("9", "600mV"), ("8", "700mV"), ("7", "800mV"), ("6", "900mV"), ("5", "1100mV")], "7")
+ nim.toneAmplitude.fe_id = x - empty_slots
+ nim.toneAmplitude.slot_id = x
+ nim.toneAmplitude.addNotifier(toneAmplitudeChanged)
nim.diseqc13V = ConfigYesNo(False)
nim.diseqcMode = ConfigSelection(diseqc_mode_choices, "diseqc_a_b")
nim.connectedTo = ConfigSelection([(str(id), nimmgr.getNimDescription(id)) for id in nimmgr.getNimListOfType("DVB-S") if id != x])
nim.terrestrial = ConfigSelection(choices = list)
nim.terrestrial_5V = ConfigOnOff()
else:
+ empty_slots += 1
nim.configMode = ConfigSelection(choices = { "nothing": _("disabled") }, default="nothing");
if slot.type is not None:
print "pls add support for this frontend type!", slot.type
RESULT eServiceDVD::isCurrentlySeekable()
{
- return m_state == stRunning;
+ return m_state == stRunning ? 3 : 0;
}
RESULT eServiceDVD::keyPressed(int key)
def modeSelect(self, mode):
ratesList = self.listRates(mode)
print "ratesList:", ratesList
- self.hw.setMode(port = self.port, mode = mode, rate = ratesList[0][0])
-
+ if self.port == "DVI" and mode in ("720p", "1080i"):
+ self.rate = "multi"
+ self.hw.setMode(port = self.port, mode = mode, rate = "multi")
+ else:
+ self.hw.setMode(port = self.port, mode = mode, rate = ratesList[0][0])
+
def listRates(self, querymode = None):
if querymode is None:
querymode = self.mode
self["portpic"].hide()
</code>
</step>
- <step id="rateselection" nextstep="dvirateintroduction" timeout="20" timeoutaction="selectnext">
+ <step id="rateselection" nextstep="end" timeout="20" timeoutaction="selectnext">
<condition>
self.condition = (self.port != "DVI" or self.mode == "PC")
</condition>
self.selectKey("DOWN")
</code>
</step>
- <step id="dvirateintroduction" nextstep="dvirateselection">
+ <!--step id="dvirateintroduction" nextstep="dvirateselection">
<condition>
self.condition = (self.port == "DVI" and self.mode in ["720p", "1080i"])
</condition>
self.selectKey("DOWN")
self.rateSelect("50Hz")
</code>
- </step>
+ </step-->
<step id="end">
<code>
self.hw.saveMode(self.port, self.mode, self.rate)
from Components.Input import Input
profile("ChannelSelection.py 3")
from Components.ParentalControl import parentalControl
+from Components.ChoiceList import ChoiceList, ChoiceEntryComponent
+from Components.SystemInfo import SystemInfo
from Screens.InputBox import InputBox, PinInput
from Screens.MessageBox import MessageBox
from Screens.ServiceInfo import ServiceInfo
profile("ChannelSelection.py 4")
+from Screens.PictureInPicture import PictureInPicture
from Screens.RdsDisplay import RassInteractive
from ServiceReference import ServiceReference
from Tools.BoundFunction import boundFunction
EDIT_BOUQUET = 1
EDIT_ALTERNATIVES = 2
-def append_when_current_valid(current, menu, args, level = 0):
+def append_when_current_valid(current, menu, args, level = 0, key = ""):
if current and current.valid() and level <= config.usage.setup_level.index:
- menu.append(args)
+ menu.append(ChoiceEntryComponent(key, args))
class ChannelContextMenu(Screen):
def __init__(self, session, csel):
self.csel = csel
self.bsel = None
- self["actions"] = ActionMap(["OkCancelActions"],
+ self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "NumberActions"],
{
"ok": self.okbuttonClick,
- "cancel": self.cancelClick
+ "cancel": self.cancelClick,
+ "blue": self.showServiceInPiP
})
menu = [ ]
+ self.pipAvailable = False
current = csel.getCurrentSelection()
current_root = csel.getRoot()
current_sel_path = current.getPath()
append_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService), level = 0)
if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0)
+ if isPlayable and SystemInfo.get("NumVideoDecoders", 1) > 1:
+ append_when_current_valid(current, menu, (_("Activate Picture in Picture"), self.showServiceInPiP), level = 0, key = "blue")
+ self.pipAvailable = True
else:
- menu.append((_("add bouquet"), self.showBouquetInputBox))
+ menu.append(ChoiceEntryComponent(text = (_("add bouquet"), self.showBouquetInputBox)))
append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0)
if inBouquet: # current list is editable?
if not csel.movemode:
append_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode), level = 1)
if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup):
- menu.append((_("add marker"), self.showMarkerInputBox))
+ menu.append(ChoiceEntryComponent(text = (_("add marker"), self.showMarkerInputBox)))
if haveBouquets:
append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0)
else:
append_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd), level = 0)
append_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort), level = 0)
- menu.append((_("back"), self.cancelClick))
- self["menu"] = MenuList(menu)
+ menu.append(ChoiceEntryComponent(text = (_("back"), self.cancelClick)))
+ self["menu"] = ChoiceList(menu)
def okbuttonClick(self):
- self["menu"].getCurrent()[1]()
+ self["menu"].getCurrent()[0][1]()
def cancelClick(self):
self.close(False)
self.close()
else:
self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
+
+ def showServiceInPiP(self):
+ if not self.pipAvailable:
+ return
+ if self.session.pipshown:
+ del self.session.pip
+ self.session.pip = self.session.instantiateDialog(PictureInPicture)
+ self.session.pip.show()
+ newservice = self.csel.servicelist.getCurrent()
+ if self.session.pip.playService(newservice):
+ self.session.pipshown = True
+ self.session.pip.servicePath = self.csel.getCurrentServicePath()
+ self.close(True)
+ else:
+ self.session.pipshown = False
+ del self.session.pip
+ self.session.openWithCallback(self.close, MessageBox, _("Could not open Picture in Picture"), MessageBox.TYPE_ERROR)
def addServiceToBouquetSelected(self):
bouquets = self.csel.getBouquetList()
self.entry_marked = True
def doContext(self):
- self.session.open(ChannelContextMenu, self)
+ self.session.openWithCallback(self.exitContext, ChannelContextMenu, self)
+
+ def exitContext(self, close = False):
+ if close:
+ self.cancel()
MODE_TV = 0
MODE_RADIO = 1
from Screens.InfoBarGenerics import InfoBarShowHide, \
InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarRdsDecoder, \
InfoBarEPG, InfoBarSeek, InfoBarInstantRecord, \
- InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, \
+ InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarUnhandledKey, \
InfoBarSubserviceSelection, InfoBarShowMovies, InfoBarTimeshift, \
InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView, \
InfoBarSummarySupport, InfoBarMoviePlayerSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions, \
class InfoBar(InfoBarBase, InfoBarShowHide,
InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder,
InfoBarInstantRecord, InfoBarAudioSelection,
- HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish,
+ HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarUnhandledKey,
InfoBarSubserviceSelection, InfoBarTimeshift, InfoBarSeek,
InfoBarSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions,
InfoBarPiP, InfoBarPlugins, InfoBarSubtitleSupport, InfoBarServiceErrorPopupSupport, InfoBarJobman,
for x in HelpableScreen, \
InfoBarBase, InfoBarShowHide, \
InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, \
- InfoBarInstantRecord, InfoBarAudioSelection, \
+ InfoBarInstantRecord, InfoBarAudioSelection, InfoBarUnhandledKey, \
InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarSubserviceSelection, \
InfoBarTimeshift, InfoBarSeek, InfoBarSummarySupport, InfoBarTimeshiftState, \
InfoBarTeletextPlugin, InfoBarExtensions, InfoBarPiP, InfoBarSubtitleSupport, InfoBarJobman, \
from Screens.SubtitleDisplay import SubtitleDisplay
from Screens.RdsDisplay import RdsInfoDisplay, RassInteractive
from Screens.TimeDateInput import TimeDateInput
+from Screens.UnhandledKey import UnhandledKey
from ServiceReference import ServiceReference
from Tools import Notifications
from Tools.Directories import fileExists
from enigma import eTimer, eServiceCenter, eDVBServicePMTHandler, iServiceInformation, \
- iPlayableService, eServiceReference, eEPGCache
+ iPlayableService, eServiceReference, eEPGCache, eActionMap
from time import time, localtime, strftime
from os import stat as os_stat
def __init__(self):
self.dishDialog = self.session.instantiateDialog(Dish)
+class InfoBarUnhandledKey:
+ def __init__(self):
+ self.unhandledKeyDialog = self.session.instantiateDialog(UnhandledKey)
+ self.hideUnhandledKeySymbolTimer = eTimer()
+ self.hideUnhandledKeySymbolTimer.callback.append(self.unhandledKeyDialog.hide)
+ self.checkUnusedTimer = eTimer()
+ self.checkUnusedTimer.callback.append(self.checkUnused)
+ self.onLayoutFinish.append(self.unhandledKeyDialog.hide)
+ eActionMap.getInstance().bindAction('', -0x7FFFFFFF, self.actionA) #highest prio
+ eActionMap.getInstance().bindAction('', 0x7FFFFFFF, self.actionB) #lowest prio
+ self.flags = (1<<1);
+ self.uflags = 0;
+
+ #this function is called on every keypress!
+ def actionA(self, key, flag):
+ if flag != 4:
+ if self.flags & (1<<1):
+ self.flags = self.uflags = 0
+ self.flags |= (1<<flag)
+ if flag == 1: # break
+ self.checkUnusedTimer.start(0, True)
+ return 0
+
+ #this function is only called when no other action has handled this key
+ def actionB(self, key, flag):
+ if flag != 4:
+ self.uflags |= (1<<flag)
+
+ def checkUnused(self):
+ if self.flags == self.uflags:
+ self.unhandledKeyDialog.show()
+ self.hideUnhandledKeySymbolTimer.start(2000, True)
+
class InfoBarShowHide:
""" InfoBar show/hide control, accepts toggleShow and hide actions, might start
fancy animations. """
iPlayableService.evEOF: self.__evEOF,
iPlayableService.evSOF: self.__evSOF,
})
+ self.fast_winding_hint_message_showed = False
class InfoBarSeekActionMap(HelpableActionMap):
def __init__(self, screen, *args, **kwargs):
# print "seekable"
def __serviceStarted(self):
+ self.fast_winding_hint_message_showed = False
self.seekstate = self.SEEK_STATE_PLAY
self.__seekableStatusChanged()
self.showAfterSeek()
def seekFwd(self):
+ seek = self.getSeek()
+ if seek and not (seek.isCurrentlySeekable() & 2):
+ if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+ self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+ self.fast_winding_hint_message_showed = True
+ return
+ return 0 # trade as unhandled action
if self.seekstate == self.SEEK_STATE_PLAY:
self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value)))
elif self.seekstate == self.SEEK_STATE_PAUSE:
self.setSeekState(self.makeStateSlowMotion(speed))
def seekBack(self):
+ seek = self.getSeek()
+ if seek and not (seek.isCurrentlySeekable() & 2):
+ if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+ self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+ self.fast_winding_hint_message_showed = True
+ return
+ return 0 # trade as unhandled action
seekstate = self.seekstate
if seekstate == self.SEEK_STATE_PLAY:
self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \
SleepTimerEdit.py Ipkg.py RdsDisplay.py Globals.py DefaultWizard.py \
SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py \
- TextBox.py FactoryReset.py RecordPaths.py
+ TextBox.py FactoryReset.py RecordPaths.py UnhandledKey.py
currSat = self.nimConfig.advanced.sat[cur_orb_pos]
self.fillListWithAdvancedSatEntrys(currSat)
self.have_advanced = True
+ if self.nim.description == "Alps BSBE2" and config.usage.setup_level.index >= 2: # expert
+ self.list.append(getConfigListEntry(_("Tone Amplitude"), self.nimConfig.toneAmplitude))
elif self.nim.isCompatible("DVB-C"):
self.configMode = getConfigListEntry(_("Configuration Mode"), self.nimConfig.configMode)
self.list.append(self.configMode)
--- /dev/null
+from Screen import Screen
+from Components.Pixmap import Pixmap
+
+class UnhandledKey(Screen):
+ def __init__(self, session):
+ Screen.__init__(self, session)
+ self["UnhandledKeyPixmap"] = Pixmap()
RESULT eDVBServicePlay::isCurrentlySeekable()
{
- return m_is_pvr || m_timeshift_active;
+ int ret = 0;
+ if (m_decoder)
+ {
+ ret = (m_is_pvr || m_timeshift_active) ? 3 : 0; // fast forward/backward possible and seeking possible
+ if (m_decoder->getVideoWidth() == -1)
+ ret &= ~2;
+ }
+ return ret;
}
RESULT eDVBServicePlay::frontendInfo(ePtr<iFrontendInformation> &ptr)
RESULT eServiceMP3::isCurrentlySeekable()
{
- return 1;
+ int ret = 3; // seeking and fast/slow winding possible
+ GstElement *sink;
+
+ if (!m_gst_playbin)
+ return 0;
+ if (m_state != stRunning)
+ return 0;
+
+ g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+ // disable fast winding yet when a dvbvideosink or dvbaudiosink is used
+ // for this we must do some changes on different places.. (gstreamer.. our sinks.. enigma2)
+ if (sink) {
+ ret &= ~2; // only seeking possible
+ gst_object_unref(sink);
+ }
+ else {
+ g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+ if (sink) {
+ ret &= ~2; // only seeking possible
+ gst_object_unref(sink);
+ }
+ }
+
+ return ret;
}
RESULT eServiceMP3::info(ePtr<iServiceInformation>&i)
RESULT eServiceXine::isCurrentlySeekable()
{
- return 1;
+ return 3;
}
RESULT eServiceXine::info(ePtr<iServiceInformation>&i)