summaryrefslogtreecommitdiffstats
path: root/Lib/stdwin/mainloop.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/stdwin/mainloop.py')
-rwxr-xr-xLib/stdwin/mainloop.py48
1 files changed, 33 insertions, 15 deletions
diff --git a/Lib/stdwin/mainloop.py b/Lib/stdwin/mainloop.py
index f1fe617..6b574cf 100755
--- a/Lib/stdwin/mainloop.py
+++ b/Lib/stdwin/mainloop.py
@@ -4,6 +4,9 @@
# - have a 'dispatch' function as a window member
+# XXX This is UNIX specific! For the Mac we need to use a simpler version!
+
+
import stdwin, stdwinq
from stdwinevents import *
@@ -123,23 +126,38 @@ def do_select():
# Python's stdwin.getevent() turns WE_COMMAND/WC_CANCEL events
# into KeyboardInterrupt exceptions; these are turned back in events.
#
+recursion_level = 0 # Hack to make it reentrant
def mainloop():
- stdwin_select_handler() # Process events already in stdwin queue
- fd = stdwin.fileno()
- while 1:
- if windows:
- registerfd(fd, 'r', stdwin_select_handler)
- try:
- while windows:
+ global recursion_level
+ recursion_level = recursion_level + 1
+ try:
+ stdwin_select_handler() # Process events already in queue
+ fd = stdwin.fileno()
+ while 1:
+ if windows:
+ if recursion_level == 1:
+ registerfd(fd, 'r', stdwin_select_handler)
+ try:
+ while windows:
+ do_select()
+ stdwin_select_handler()
+ finally:
+ if recursion_level == 1:
+ unregisterfd(fd)
+ elif fdlist:
+ while fdlist and not windows:
do_select()
- stdwin_select_handler()
- finally:
- unregisterfd(fd)
- elif fdlist:
- while fdlist and not windows:
- do_select()
- else:
- break
+ else:
+ break
+ finally:
+ recursion_level = recursion_level - 1
+
+
+# Check for events without ever blocking
+#
+def check():
+ stdwin_select_handler()
+ # XXX Should check for socket stuff as well
# Handle stdwin events until none are left