diff options
Diffstat (limited to 'Lib/stdwin')
-rwxr-xr-x | Lib/stdwin/mainloop.py | 72 | ||||
-rwxr-xr-x | Lib/stdwin/stdwinq.py | 53 |
2 files changed, 125 insertions, 0 deletions
diff --git a/Lib/stdwin/mainloop.py b/Lib/stdwin/mainloop.py new file mode 100755 index 0000000..9142d02 --- /dev/null +++ b/Lib/stdwin/mainloop.py @@ -0,0 +1,72 @@ +# Standard main loop for *all* STDWIN applications. +# This requires that applications: +# - register their windows on creation and unregister them when closed +# - have a 'dispatch' function as a window member + + +import stdwin, stdwinq +from stdwinevents import * + + +# List of windows known to the main loop. +# +windows = [] + + +# Function to register a window. +# +def register(win): + # First test the dispatch function by passing it a null event -- + # this catches registration of unconforming windows. + win.dispatch(WE_NULL, win, None) + if win not in windows: + windows.append(win) + + +# Function to unregister a window. +# It is not an error to unregister an already unregistered window +# (this is useful for cleanup actions). +# +def unregister(win): + if win in windows: + windows.remove(win) # Not in 0.9.1 + for i in range(len(windows)): + if windows[i] = win: + del windows[i] + break + + +# Interfaces used by WindowSched. +# +def countwindows(): + return len(windows) +# +def anywindow(): + if windows: + return windows[0] + else: + return None + + +# Event processing main loop. +# Return when there are no windows left, or when an unhandled +# exception occurs. (It is safe to restart the main loop after +# an unsuccessful exit.) +# Python's stdwin.getevent() turns WE_COMMAND/WC_CANCEL events +# into KeyboardInterrupt exceptions; these are turned back in events. +# +def mainloop(): + while windows: + try: + dispatch(stdwinq.getevent()) + except KeyboardInterrupt: + dispatch(WE_COMMAND, stdwin.getactive(), WC_CANCEL) + + +# Dispatch a single event. +# Windows not in the windows list don't get their events: +# events for such windows are silently ignored. +# +def dispatch(event): + if event[1] in windows: + event[1].dispatch(event) diff --git a/Lib/stdwin/stdwinq.py b/Lib/stdwin/stdwinq.py new file mode 100755 index 0000000..af72986 --- /dev/null +++ b/Lib/stdwin/stdwinq.py @@ -0,0 +1,53 @@ +# Replacements for getevent() and pollevent(), +# and new functions ungetevent() and sync(). + + +# Every library module should ideally use this instead of +# stdwin.{get,poll}event(), so applications can use the services +# of ungetevent() and sync(). + + +import stdwin + + +# Events read ahead are stored in this queue. +# +queue = [] + + +# Replacement for getevent(). +# +def getevent(): + if queue: + event = queue[0] + del queue[0] + return event + else: + return stdwin.getevent() + + +# Replacement for pollevent(). +# +def pollevent(): + if queue: + return getevent() + else: + return stdwin.pollevent() + + +# Push an event back in the queue. +# +def ungetevent(event): + queue.insert(0, event) + + +# Synchronize the display. It turns out that this is the way to +# force STDWIN to call XSync(), which some (esoteric) applications need. +# (This is stronger than just flushing -- it actually waits for a +# positive response from the X server on the last command issued.) +# +def sync(): + while 1: + event = stdwin.pollevent() + if not event: break + queue.append(event) |