From fea2af1e9b0c99cac6cb8806c4af651a38e92d07 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 4 Jan 1993 09:16:51 +0000 Subject: * More changes due to stricter argument passing rules * Fixed calendar.py, mimetools.py, whrandom.py to cope with time.time() returning a floating point number. (And fix old bug in calendar) * Add recursion level to mainloop.mainloop(), to make it reentrant. --- Lib/lib-stdwin/mainloop.py | 48 +++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) (limited to 'Lib/lib-stdwin/mainloop.py') diff --git a/Lib/lib-stdwin/mainloop.py b/Lib/lib-stdwin/mainloop.py index f1fe6170b1..6b574cf2a4 100644 --- a/Lib/lib-stdwin/mainloop.py +++ b/Lib/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 -- cgit v1.2.1