summaryrefslogtreecommitdiffstats
path: root/Lib/stdwin
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/stdwin')
-rwxr-xr-xLib/stdwin/mainloop.py72
-rwxr-xr-xLib/stdwin/stdwinq.py53
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)