aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2006-04-18 18:49:26 +0000
committerFelix Domke <tmbinc@elitedvb.net>2006-04-18 18:49:26 +0000
commitb0ce62b0d959fd0d2d20022d803acb1c100d2bb5 (patch)
tree063dfe044b083b06b785a7a9c1d4f22b26ffa8fd
parent7e5b8dd9905ecfc6491ff035bcc81ac0a37279d0 (diff)
downloadenigma2-b0ce62b0d959fd0d2d20022d803acb1c100d2bb5.tar.gz
enigma2-b0ce62b0d959fd0d2d20022d803acb1c100d2bb5.zip
fix Scart.py, add some asserts to find this kind of bugs earlier
-rw-r--r--lib/python/Screens/Scart.py6
-rw-r--r--lib/python/Screens/Screen.py2
-rw-r--r--mytest.py44
3 files changed, 46 insertions, 6 deletions
diff --git a/lib/python/Screens/Scart.py b/lib/python/Screens/Scart.py
index cae46b23..e8b7a4a7 100644
--- a/lib/python/Screens/Scart.py
+++ b/lib/python/Screens/Scart.py
@@ -13,11 +13,13 @@ class Scart(Screen):
self.avswitch.setInput("SCART")
- self.onShown.append(self.showMessageBox)
+ self.onExecBegin.append(self.showMessageBox)
def showMessageBox(self):
+ # only open messagebox on first execBegin
+ self.onShown.remove(self.showMessageBox)
self.session.openWithCallback(self.switchToTV, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR)
- def switchToTV(self, val):
+ def switchToTV(self, *val):
self.avswitch.setInput("ENCODER")
self.close()
diff --git a/lib/python/Screens/Screen.py b/lib/python/Screens/Screen.py
index d4b3d729..e6abdef9 100644
--- a/lib/python/Screens/Screen.py
+++ b/lib/python/Screens/Screen.py
@@ -74,7 +74,7 @@ class Screen(dict, HTMLSkin, GUISkin):
self.__dict__.clear()
def close(self, *retval):
- self.session.close(*retval)
+ self.session.close(self, *retval)
def setFocus(self, o):
self.instance.setFocus(o.instance)
diff --git a/mytest.py b/mytest.py
index d594af38..76f0d333 100644
--- a/mytest.py
+++ b/mytest.py
@@ -87,6 +87,31 @@ class GUIOutputDevice(OutputDevice):
def create(self, comp, desktop):
comp.createGUIScreen(self.parent, desktop)
+# Session.open:
+# * push current active dialog ('current_dialog') onto stack
+# * call execEnd for this dialog
+# * clear in_exec flag
+# * hide screen
+# * instantiate new dialog into 'current_dialog'
+# * create screens, components
+# * read, apply skin
+# * create GUI for screen
+# * call execBegin for new dialog
+# * set in_exec
+# * show gui screen
+# * call components' / screen's onExecBegin
+# ... screen is active, until it calls 'close'...
+# Session.close:
+# * assert in_exec
+# * save return value
+# * start deferred close handler ('onClose')
+# * execEnd
+# * clear in_exec
+# * hide screen
+# .. a moment later:
+# Session.doClose:
+# * destroy screen
+
class Session:
def __init__(self, desktop = None, summary_desktop = None, navigation = None):
self.desktop = desktop
@@ -204,7 +229,7 @@ class Session:
return dlg
def pushCurrent(self):
- if self.current_dialog:
+ if self.current_dialog is not None:
self.dialog_stack.append(self.current_dialog)
self.execEnd()
@@ -227,6 +252,10 @@ class Session:
dlg.callback = callback
def open(self, screen, *arguments, **kwargs):
+ if len(self.dialog_stack) and not self.in_exec:
+ raise "modal open are allowed only from a screen which is modal!"
+ # ...unless it's the very first screen.
+
self.pushCurrent()
dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs)
dlg.isTmp = True
@@ -237,11 +266,20 @@ class Session:
def keyEvent(self, code):
print "code " + str(code)
- def close(self, *retval):
+ def close(self, screen, *retval):
if not self.in_exec:
print "close after exec!"
return
-
+
+ # be sure that the close is for the right dialog!
+ # if it's not, you probably closed after another dialog
+ # was opened. this can happen if you open a dialog
+ # onExecBegin, and forget to do this only once.
+ # after close of the top dialog, the underlying will
+ # gain focus again (for a short time), thus triggering
+ # the onExec, which opens the dialog again, closing the loop.
+ assert screen == self.current_dialog
+
self.current_dialog.returnValue = retval
self.delay_timer.start(0, 1)
self.execEnd()