diff options
Diffstat (limited to 'Lib/lib-stdwin/mainloop.py')
-rw-r--r-- | Lib/lib-stdwin/mainloop.py | 256 |
1 files changed, 0 insertions, 256 deletions
diff --git a/Lib/lib-stdwin/mainloop.py b/Lib/lib-stdwin/mainloop.py deleted file mode 100644 index aa40c34..0000000 --- a/Lib/lib-stdwin/mainloop.py +++ /dev/null @@ -1,256 +0,0 @@ -# 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 = [] - - -# Last window that ever received an event -# -last_window = None - - -# 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): - global last_window - if win == last_window: - last_window = None - if win in windows: - windows.remove(win) # Not in 0.9.1 - # 0.9.1 solution: - #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 - - -# NEW: register any number of file descriptors -# -fdlist = [] -select_args = None -select_handlers = None -# -def registerfd(fd, mode, handler): - if mode not in ('r', 'w', 'x'): - raise ValueError, 'mode must be r, w or x' - if type(fd) <> type(0): - fd = fd.fileno() # If this fails it's not a proper select arg - for i in range(len(fdlist)): - if fdlist[i][:2] == (fd, mode): - raise ValueError, \ - '(fd, mode) combination already registered' - fdlist.append((fd, mode, handler)) - make_select_args() -# -def unregisterfd(fd, *args): - if type(fd) <> type(0): - fd = fd.fileno() # If this fails it's not a proper select arg - args = (fd,) + args - n = len(args) - for i in range(len(fdlist)): - if fdlist[i][:n] == args: - del fdlist[i] - make_select_args() -# -def make_select_args(): - global select_args, select_handlers - rlist, wlist, xlist = [], [], [] - rhandlers, whandlers, xhandlers = {}, {}, {} - for fd, mode, handler in fdlist: - if mode == 'r': - rlist.append(fd) - rhandlers[`fd`] = handler - if mode == 'w': - wlist.append(fd) - whandlers[`fd`] = handler - if mode == 'x': - xlist.append(fd) - xhandlers[`fd`] = handler - if rlist or wlist or xlist: - select_args = rlist, wlist, xlist - select_handlers = rhandlers, whandlers, xhandlers - else: - select_args = None - select_handlers = None -# -def do_select(): - import select - reply = apply(select.select, select_args) - for mode in 0, 1, 2: - list = reply[mode] - for fd in list: - handler = select_handlers[mode][`fd`] - handler(fd, 'rwx'[mode]) - - -# 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. -# -recursion_level = 0 # Hack to make it reentrant -def mainloop(): - global recursion_level - recursion_level = recursion_level + 1 - try: - stdwin_select_handler() # Process events already in queue - while 1: - if windows and not fdlist: - while windows and not fdlist: - try: - event = stdwinq.getevent() - except KeyboardInterrupt: - event = (WE_COMMAND, \ - None, WC_CANCEL) - dispatch(event) - elif windows and fdlist: - fd = stdwin.fileno() - 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() - 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 -# -def stdwin_select_handler(*args): - while 1: - try: - event = stdwinq.pollevent() - except KeyboardInterrupt: - event = (WE_COMMAND, None, WC_CANCEL) - if event is None: - break - dispatch(event) - - -# Run a modal dialog loop for a window. The dialog window must have -# been registered first. This prohibits most events (except size/draw -# events) to other windows. The modal dialog loop ends when the -# dialog window unregisters itself. -# -passthrough = WE_SIZE, WE_DRAW -beeping = WE_MOUSE_DOWN, WE_COMMAND, WE_CHAR, WE_KEY, WE_CLOSE, WE_MENU -# -def modaldialog(window): - if window not in windows: - raise ValueError, 'modaldialog window not registered' - while window in windows: - try: - event = stdwinq.getevent() - except KeyboardInterrupt: - event = WE_COMMAND, None, WC_CANCEL - etype, ewindow, edetail = event - if etype not in passthrough and ewindow <> window: - if etype in beeping: - stdwin.fleep() - continue - dispatch(event) - - -# Dispatch a single event. -# Events for the no window in particular are sent to the active window -# or to the last window that received an event (these hacks are for the -# WE_LOST_SEL event, which is directed to no particular window). -# Windows not in the windows list don't get their events: -# events for such windows are silently ignored. -# -def dispatch(event): - global last_window - if event[1] == None: - active = stdwin.getactive() - if active: last_window = active - else: - last_window = event[1] - if last_window in windows: - last_window.dispatch(event) - - -# Dialog base class -# -class Dialog: - # - def __init__(self, title): - self.window = stdwin.open(title) - self.window.dispatch = self.dispatch - register(self.window) - # - def close(self): - unregister(self.window) - del self.window.dispatch - self.window.close() - # - def dispatch(self, event): - etype, ewindow, edetail = event - if etype == WE_CLOSE: - self.close() - - -# Standard modal dialogs -# XXX implemented using stdwin dialogs for now -# -def askstr(prompt, default): - return stdwin.askstr(prompt, default) -# -def askync(prompt, yesorno): - return stdwin.askync(prompt, yesorno) -# -def askfile(prompt, default, new): - return stdwin.askfile(prompt, default, new) -# -def message(msg): - stdwin.message(msg) |