1 from Tools import RedirectOutput
5 from Components.Language import language
8 print "language set to", language.getLanguage()
9 eServiceEvent.setEPGLanguage(language.getLanguage())
11 language.addCallback(setEPGLanguage)
14 import Screens.InfoBar
15 from Screens.SimpleSummary import SimpleSummary
20 import ServiceReference
22 from Navigation import Navigation
24 from skin import readSkin, applyAllAttributes
26 from Components.config import configfile
27 from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS
29 eDVBDB.getInstance().reloadBouquets()
35 from twisted.internet import reactor
40 print "twisted not available"
44 # initialize autorun plugins and plugin menu entries
45 from Components.PluginComponent import plugins
47 from Screens.Wizard import wizardManager
48 from Screens.ImageWizard import *
49 from Screens.StartWizard import *
50 from Screens.TutorialWizard import *
51 from Tools.BoundFunction import boundFunction
52 from Plugins.Plugin import PluginDescriptor
56 def dump(dir, p = ""):
57 if isinstance(dir, dict):
58 for (entry, val) in dir.items():
59 dump(val, p + "(dict)/" + entry)
60 if hasattr(dir, "__dict__"):
61 for name, value in dir.__dict__.items():
62 if not had.has_key(str(value)):
64 dump(value, p + "/" + str(name))
66 print p + "/" + str(name) + ":" + str(dir.__class__) + "(cycle)"
68 print p + ":" + str(dir)
70 # + ":" + str(dir.__class__)
75 def create(self, screen): pass
79 class HTMLOutputDevice(OutputDevice):
80 def create(self, comp):
81 print comp.produceHTML()
83 html = HTMLOutputDevice()
85 class GUIOutputDevice(OutputDevice):
87 def create(self, comp, desktop):
88 comp.createGUIScreen(self.parent, desktop)
91 # * push current active dialog ('current_dialog') onto stack
92 # * call execEnd for this dialog
93 # * clear in_exec flag
95 # * instantiate new dialog into 'current_dialog'
96 # * create screens, components
98 # * create GUI for screen
99 # * call execBegin for new dialog
102 # * call components' / screen's onExecBegin
103 # ... screen is active, until it calls 'close'...
106 # * save return value
107 # * start deferred close handler ('onClose')
116 def __init__(self, desktop = None, summary_desktop = None, navigation = None):
117 self.desktop = desktop
118 self.summary_desktop = summary_desktop
119 self.nav = navigation
120 self.delay_timer = eTimer()
121 self.delay_timer.timeout.get().append(self.processDelay)
123 self.current_dialog = None
125 self.dialog_stack = [ ]
126 self.summary_stack = [ ]
131 for p in plugins.getPlugins(PluginDescriptor.WHERE_SESSIONSTART):
132 p(reason=0, session=self)
134 def processDelay(self):
135 callback = self.current_dialog.callback
137 retval = self.current_dialog.returnValue
139 if self.current_dialog.isTmp:
140 self.current_dialog.doClose()
141 # dump(self.current_dialog)
142 del self.current_dialog
144 del self.current_dialog.callback
147 if callback is not None:
150 def execBegin(self, first=True):
151 assert not self.in_exec
153 c = self.current_dialog
155 # when this is an execbegin after a execend of a "higher" dialog,
156 # popSummary already did the right thing.
159 summary = c.createSummary() or SimpleSummary
160 self.summary = self.instantiateSummaryDialog(summary, c)
162 c.addSummary(self.summary)
166 # when execBegin opened a new dialog, don't bother showing the old one.
167 if c == self.current_dialog:
170 def execEnd(self, last=True):
174 self.current_dialog.execEnd()
175 self.current_dialog.hide()
178 self.current_dialog.removeSummary(self.summary)
181 def create(self, screen, arguments, **kwargs):
182 # creates an instance of 'screen' (which is a class)
184 return screen(self, *arguments, **kwargs)
186 errstr = "Screen %s(%s, %s): %s" % (str(screen), str(arguments), str(kwargs), sys.exc_info()[0])
188 traceback.print_exc(file=sys.stdout)
191 def instantiateDialog(self, screen, *arguments, **kwargs):
192 return self.doInstantiateDialog(screen, arguments, kwargs, self.desktop)
194 def instantiateSummaryDialog(self, screen, *arguments, **kwargs):
195 return self.doInstantiateDialog(screen, arguments, kwargs, self.summary_desktop)
197 def doInstantiateDialog(self, screen, arguments, kwargs, desktop):
201 dlg = self.create(screen, arguments, **kwargs)
203 print 'EXCEPTION IN DIALOG INIT CODE, ABORTING:'
205 traceback.print_exc(file=sys.stdout)
213 readSkin(dlg, None, dlg.skinName, desktop)
215 # create GUI view of this dialog
216 assert desktop is not None
220 for (key, value) in dlg.skinAttributes:
221 if key == "zPosition":
226 dlg.instance = eWindow(desktop, z)
228 applyAllAttributes(dlg.instance, desktop, dlg.skinAttributes)
229 gui = GUIOutputDevice()
230 gui.parent = dlg.instance
231 gui.create(dlg, desktop)
235 def pushCurrent(self):
236 if self.current_dialog is not None:
237 self.dialog_stack.append(self.current_dialog)
238 self.execEnd(last=False)
240 def popCurrent(self):
241 if len(self.dialog_stack):
242 self.current_dialog = self.dialog_stack.pop()
243 self.execBegin(first=False)
245 self.current_dialog = None
247 def execDialog(self, dialog):
249 self.current_dialog = dialog
250 self.current_dialog.isTmp = False
251 self.current_dialog.callback = None # would cause re-entrancy problems.
254 def openWithCallback(self, callback, screen, *arguments, **kwargs):
255 dlg = self.open(screen, *arguments, **kwargs)
256 dlg.callback = callback
259 def open(self, screen, *arguments, **kwargs):
260 if len(self.dialog_stack) and not self.in_exec:
261 raise "modal open are allowed only from a screen which is modal!"
262 # ...unless it's the very first screen.
265 dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs)
271 def keyEvent(self, code):
272 print "code " + str(code)
274 def close(self, screen, *retval):
276 print "close after exec!"
279 # be sure that the close is for the right dialog!
280 # if it's not, you probably closed after another dialog
281 # was opened. this can happen if you open a dialog
282 # onExecBegin, and forget to do this only once.
283 # after close of the top dialog, the underlying will
284 # gain focus again (for a short time), thus triggering
285 # the onExec, which opens the dialog again, closing the loop.
286 assert screen == self.current_dialog
288 self.current_dialog.returnValue = retval
289 self.delay_timer.start(0, 1)
292 def pushSummary(self):
293 if self.summary is not None:
295 self.summary_stack.append(self.summary)
298 def popSummary(self):
299 if self.summary is not None:
300 self.summary.doClose()
301 self.summary = self.summary_stack.pop()
302 if self.summary is not None:
305 from Screens.Volume import Volume
306 from Screens.Mute import Mute
307 from GlobalActions import globalActionMap
308 from Components.config import ConfigSubsection, configSequence, configElement, configsequencearg
310 #TODO .. move this to a own .py file
312 """Volume control, handles volUp, volDown, volMute actions and display
313 a corresponding dialog"""
314 def __init__(self, session):
315 global globalActionMap
316 globalActionMap.actions["volumeUp"]=self.volUp
317 globalActionMap.actions["volumeDown"]=self.volDown
318 globalActionMap.actions["volumeMute"]=self.volMute
320 config.audio = ConfigSubsection()
321 config.audio.volume = configElement("config.audio.volume", configSequence, [100], configsequencearg.get("INTEGER", (0, 100)))
323 self.volumeDialog = session.instantiateDialog(Volume)
324 self.muteDialog = session.instantiateDialog(Mute)
326 self.hideVolTimer = eTimer()
327 self.hideVolTimer.timeout.get().append(self.volHide)
329 vol = config.audio.volume.value[0]
330 self.volumeDialog.setValue(vol)
331 eDVBVolumecontrol.getInstance().setVolume(vol, vol)
334 config.audio.volume.value = eDVBVolumecontrol.getInstance().getVolume()
335 config.audio.volume.save()
338 if (eDVBVolumecontrol.getInstance().isMuted()):
340 eDVBVolumecontrol.getInstance().volumeUp()
341 self.volumeDialog.show()
342 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
344 self.hideVolTimer.start(3000, True)
347 if (eDVBVolumecontrol.getInstance().isMuted()):
349 eDVBVolumecontrol.getInstance().volumeDown()
350 self.volumeDialog.show()
351 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
353 self.hideVolTimer.start(3000, True)
356 self.volumeDialog.hide()
359 eDVBVolumecontrol.getInstance().volumeToggleMute()
360 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
362 if (eDVBVolumecontrol.getInstance().isMuted()):
363 self.muteDialog.show()
365 self.muteDialog.hide()
367 from Screens.Standby import Standby
370 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
372 def __init__(self, session):
373 self.session = session
374 self.powerKeyTimer = eTimer()
375 self.powerKeyTimer.timeout.get().append(self.powertimer)
376 globalActionMap.actions["powerdown"]=self.powerdown
377 globalActionMap.actions["powerup"]=self.powerup
378 self.standbyblocked = 0
379 # self["PowerKeyActions"] = HelpableActionMap(self, "PowerKeyActions",
381 #"powerdown": self.powerdown,
382 #"powerup": self.powerup,
383 #"discreteStandby": (self.standby, "Go standby"),
384 #"discretePowerOff": (self.quit, "Go to deep standby"),
387 def powertimer(self):
388 print "PowerOff - Now!"
392 self.standbyblocked = 0
393 self.powerKeyTimer.start(3000, True)
396 self.powerKeyTimer.stop()
397 if self.standbyblocked == 0:
398 self.standbyblocked = 1
402 self.session.open(Standby, self)
409 plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
411 session = Session(desktop = getDesktop(0), summary_desktop = getDesktop(1), navigation = Navigation())
415 for p in plugins.getPlugins(PluginDescriptor.WHERE_WIZARD):
416 screensToRun.append(p.__call__)
418 screensToRun += wizardManager.getWizards()
420 screensToRun.append(Screens.InfoBar.InfoBar)
422 ePythonConfigQuery.setQueryFunc(configfile.getResolvedKey)
424 def runNextScreen(session, screensToRun, *result):
426 quitMainloop(*result)
429 screen = screensToRun[0]
431 if len(screensToRun):
432 session.openWithCallback(boundFunction(runNextScreen, session, screensToRun[1:]), screen)
436 runNextScreen(session, screensToRun)
438 CONNECT(keyPressedSignal(), session.keyEvent)
440 vol = VolumeControl(session)
441 power = PowerKey(session)
447 from Tools.DreamboxHardware import setFPWakeuptime
448 from time import time
449 nextRecordingTime = session.nav.RecordTimer.getNextRecordingTime()
450 if nextRecordingTime != -1:
451 if (nextRecordingTime - time() < 330): # no time to switch box back on
452 setFPWakeuptime(time() + 30) # so switch back on in 30 seconds
454 setFPWakeuptime(nextRecordingTime - (300))
456 session.nav.shutdown()
461 keymapparser.readKeymap()
463 skin.loadSkinData(getDesktop(0))
465 import Components.InputDevice
466 Components.InputDevice.InitInputDevices()
468 import Components.AVSwitch
469 Components.AVSwitch.InitAVSwitch()
471 import Components.RecordingConfig
472 Components.RecordingConfig.InitRecordingConfig()
474 import Components.UsageConfig
475 Components.UsageConfig.InitUsageConfig()
477 import Components.Network
478 Components.Network.InitNetwork()
480 import Components.Lcd
481 Components.Lcd.InitLcd()
483 import Components.SetupDevices
484 Components.SetupDevices.InitSetupDevices()
486 import Components.RFmod
487 Components.RFmod.InitRFmod()
489 import Components.NimManager
491 # first, setup a screen
497 print 'EXCEPTION IN PYTHON STARTUP CODE:'
499 traceback.print_exc(file=sys.stdout)