* Got entirely rid of path.py.
* Many modules: fixes for new, stricter, argument passing rules
  (most changes were automatic ones -- not all of this is tested!).
* gwin.py: now uses mainloop.py for its main loop and window admin.
* mainloop.py: always call dispatch() with event as a tuple!
* Fix bug in pdb's 'clear' command -- don't set the bpt but clear it!
diff --git a/Lib/bdb.py b/Lib/bdb.py
index 8a722fe..66d3457 100644
--- a/Lib/bdb.py
+++ b/Lib/bdb.py
@@ -217,8 +217,9 @@
 	
 	# 
 	
-	def format_stack_entry(self, (frame, lineno)):
+	def format_stack_entry(self, frame_lineno):
 		import codehack, linecache, repr, string
+		frame, lineno = frame_lineno
 		filename = frame.f_code.co_filename
 		s = filename + '(' + `lineno` + ')'
 		s = s + codehack.getcodename(frame.f_code)
diff --git a/Lib/dircmp.py b/Lib/dircmp.py
index cbbce1b..1227aa7 100644
--- a/Lib/dircmp.py
+++ b/Lib/dircmp.py
@@ -13,46 +13,46 @@
 #
 class dircmp:
 	#
-	def new(dd, (a, b)): # Initialize
-		dd.a = a
-		dd.b = b
-		# Properties that caller may change before calling dd.run():
-		dd.hide = [os.curdir, os.pardir] # Names never to be shown
-		dd.ignore = ['RCS', 'tags'] # Names ignored in comparison
+	def new(self, a, b): # Initialize
+		self.a = a
+		self.b = b
+		# Properties that caller may change before calling self.run():
+		self.hide = [os.curdir, os.pardir] # Names never to be shown
+		self.ignore = ['RCS', 'tags'] # Names ignored in comparison
 		#
-		return dd
+		return self
 	#
-	def run(dd): # Compare everything except common subdirectories
-		dd.a_list = filter(dircache.listdir(dd.a), dd.hide)
-		dd.b_list = filter(dircache.listdir(dd.b), dd.hide)
-		dd.a_list.sort()
-		dd.b_list.sort()
-		dd.phase1()
-		dd.phase2()
-		dd.phase3()
+	def run(self): # Compare everything except common subdirectories
+		self.a_list = filter(dircache.listdir(self.a), self.hide)
+		self.b_list = filter(dircache.listdir(self.b), self.hide)
+		self.a_list.sort()
+		self.b_list.sort()
+		self.phase1()
+		self.phase2()
+		self.phase3()
 	#
-	def phase1(dd): # Compute common names
-		dd.a_only = []
-		dd.common = []
-		for x in dd.a_list:
-			if x in dd.b_list:
-				dd.common.append(x)
+	def phase1(self): # Compute common names
+		self.a_only = []
+		self.common = []
+		for x in self.a_list:
+			if x in self.b_list:
+				self.common.append(x)
 			else:
-				dd.a_only.append(x)
+				self.a_only.append(x)
 		#
-		dd.b_only = []
-		for x in dd.b_list:
-			if x not in dd.common:
-				dd.b_only.append(x)
+		self.b_only = []
+		for x in self.b_list:
+			if x not in self.common:
+				self.b_only.append(x)
 	#
-	def phase2(dd): # Distinguish files, directories, funnies
-		dd.common_dirs = []
-		dd.common_files = []
-		dd.common_funny = []
+	def phase2(self): # Distinguish files, directories, funnies
+		self.common_dirs = []
+		self.common_files = []
+		self.common_funny = []
 		#
-		for x in dd.common:
-			a_path = os.path.join(dd.a, x)
-			b_path = os.path.join(dd.b, x)
+		for x in self.common:
+			a_path = os.path.join(self.a, x)
+			b_path = os.path.join(self.b, x)
 			#
 			ok = 1
 			try:
@@ -70,74 +70,74 @@
 				a_type = S_IFMT(a_stat[ST_MODE])
 				b_type = S_IFMT(b_stat[ST_MODE])
 				if a_type <> b_type:
-					dd.common_funny.append(x)
+					self.common_funny.append(x)
 				elif S_ISDIR(a_type):
-					dd.common_dirs.append(x)
+					self.common_dirs.append(x)
 				elif S_ISREG(a_type):
-					dd.common_files.append(x)
+					self.common_files.append(x)
 				else:
-					dd.common_funny.append(x)
+					self.common_funny.append(x)
 			else:
-				dd.common_funny.append(x)
+				self.common_funny.append(x)
 	#
-	def phase3(dd): # Find out differences between common files
-		xx = cmpfiles(dd.a, dd.b, dd.common_files)
-		dd.same_files, dd.diff_files, dd.funny_files = xx
+	def phase3(self): # Find out differences between common files
+		xx = cmpfiles(self.a, self.b, self.common_files)
+		self.same_files, self.diff_files, self.funny_files = xx
 	#
-	def phase4(dd): # Find out differences between common subdirectories
+	def phase4(self): # Find out differences between common subdirectories
 		# A new dircmp object is created for each common subdirectory,
 		# these are stored in a dictionary indexed by filename.
 		# The hide and ignore properties are inherited from the parent
-		dd.subdirs = {}
-		for x in dd.common_dirs:
-			a_x = os.path.join(dd.a, x)
-			b_x = os.path.join(dd.b, x)
-			dd.subdirs[x] = newdd = dircmp().new(a_x, b_x)
-			newdd.hide = dd.hide
-			newdd.ignore = dd.ignore
+		self.subdirs = {}
+		for x in self.common_dirs:
+			a_x = os.path.join(self.a, x)
+			b_x = os.path.join(self.b, x)
+			self.subdirs[x] = newdd = dircmp().new(a_x, b_x)
+			newdd.hide = self.hide
+			newdd.ignore = self.ignore
 			newdd.run()
 	#
-	def phase4_closure(dd): # Recursively call phase4() on subdirectories
-		dd.phase4()
-		for x in dd.subdirs.keys():
-			dd.subdirs[x].phase4_closure()
+	def phase4_closure(self): # Recursively call phase4() on subdirectories
+		self.phase4()
+		for x in self.subdirs.keys():
+			self.subdirs[x].phase4_closure()
 	#
-	def report(dd): # Print a report on the differences between a and b
+	def report(self): # Print a report on the differences between a and b
 		# Assume that phases 1 to 3 have been executed
 		# Output format is purposely lousy
-		print 'diff', dd.a, dd.b
-		if dd.a_only:
-			print 'Only in', dd.a, ':', dd.a_only
-		if dd.b_only:
-			print 'Only in', dd.b, ':', dd.b_only
-		if dd.same_files:
-			print 'Identical files :', dd.same_files
-		if dd.diff_files:
-			print 'Differing files :', dd.diff_files
-		if dd.funny_files:
-			print 'Trouble with common files :', dd.funny_files
-		if dd.common_dirs:
-			print 'Common subdirectories :', dd.common_dirs
-		if dd.common_funny:
-			print 'Common funny cases :', dd.common_funny
+		print 'diff', self.a, self.b
+		if self.a_only:
+			print 'Only in', self.a, ':', self.a_only
+		if self.b_only:
+			print 'Only in', self.b, ':', self.b_only
+		if self.same_files:
+			print 'Identical files :', self.same_files
+		if self.diff_files:
+			print 'Differing files :', self.diff_files
+		if self.funny_files:
+			print 'Trouble with common files :', self.funny_files
+		if self.common_dirs:
+			print 'Common subdirectories :', self.common_dirs
+		if self.common_funny:
+			print 'Common funny cases :', self.common_funny
 	#
-	def report_closure(dd): # Print reports on dd and on subdirs
+	def report_closure(self): # Print reports on self and on subdirs
 		# If phase 4 hasn't been done, no subdir reports are printed
-		dd.report()
+		self.report()
 		try:
-			x = dd.subdirs
+			x = self.subdirs
 		except AttributeError:
 			return # No subdirectories computed
-		for x in dd.subdirs.keys():
+		for x in self.subdirs.keys():
 			print
-			dd.subdirs[x].report_closure()
+			self.subdirs[x].report_closure()
 	#
-	def report_phase4_closure(dd): # Report and do phase 4 recursively
-		dd.report()
-		dd.phase4()
-		for x in dd.subdirs.keys():
+	def report_phase4_closure(self): # Report and do phase 4 recursively
+		self.report()
+		self.phase4()
+		for x in self.subdirs.keys():
 			print
-			dd.subdirs[x].report_phase4_closure()
+			self.subdirs[x].report_phase4_closure()
 
 
 # Compare common files in two directories.
diff --git a/Lib/irix5/flp.py b/Lib/irix5/flp.py
index 39b45dc..0904efe 100755
--- a/Lib/irix5/flp.py
+++ b/Lib/irix5/flp.py
@@ -208,7 +208,7 @@
 class _newobj:
     def init(self):
 	return self
-    def add(self, (name, value)):
+    def add(self, name, value):
 	self.__dict__[name] = value
     def make(self, dict):
 	for name in dict.keys():
@@ -299,9 +299,9 @@
 	    if datum == FORMLINE:
 		file.seek(pos)
 	    return obj
-	if type(datum) <> type(()):
+	if type(datum) <> type(()) or len(datum) <> 2:
 	    raise error, 'Parse error, illegal line in object: '+datum
-	obj.add(datum)
+	obj.add(datum[0], datum[1])
 
 #################################################################
 #   Part 2 - High-level object/form creation routines            #
diff --git a/Lib/lib-stdwin/Abstract.py b/Lib/lib-stdwin/Abstract.py
index c6fe137..51bd305 100644
--- a/Lib/lib-stdwin/Abstract.py
+++ b/Lib/lib-stdwin/Abstract.py
@@ -30,7 +30,7 @@
 	def getwindow(self): return unimpl() # Only for very special cases
 	#
 	def change(self, area): unimpl()
-	def scroll(self, (area, (dh, dv))): unimpl()
+	def scroll(self, area, (dh, dv)): unimpl()
 	def settimer(self, itimer): unimpl()
 
 class AbstractChild:
@@ -40,10 +40,10 @@
 	def destroy(self): unimpl()
 	#
 	def realize(self): return unimpl()
-	def getminsize(self, (m, (width, height))): return unimpl()
+	def getminsize(self, m, (width, height)): return unimpl()
 	def getbounds(self): return unimpl()
 	def setbounds(self, bounds): unimpl()
-	def draw(self, (d, area)): unimpl()
+	def draw(self, d, area): unimpl()
 	#
 	# Downcalls only made after certain upcalls
 	#
diff --git a/Lib/lib-stdwin/BoxParent.py b/Lib/lib-stdwin/BoxParent.py
index d042e88..a44995d 100644
--- a/Lib/lib-stdwin/BoxParent.py
+++ b/Lib/lib-stdwin/BoxParent.py
@@ -2,13 +2,13 @@
 
 class BoxParent(TransParent):
 	#
-	def create(self, (parent, (dh, dv))):
+	def create(self, parent, (dh, dv)):
 		self = TransParent.create(self, parent)
 		self.dh = dh
 		self.dv = dv
 		return self
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		width = max(0, width - 2*self.dh)
 		height = max(0, height - 2*self.dv)
 		width, height = self.child.getminsize(m, (width, height))
diff --git a/Lib/lib-stdwin/Buttons.py b/Lib/lib-stdwin/Buttons.py
index d1435d3..9a99707 100644
--- a/Lib/lib-stdwin/Buttons.py
+++ b/Lib/lib-stdwin/Buttons.py
@@ -35,7 +35,7 @@
 	#
 	# Size enquiry
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		width = max(width, m.textwidth(self.text) + 6)
 		height = max(height, m.lineheight() + 6)
 		return width, height
@@ -108,8 +108,8 @@
 			d.erase(self.bounds)
 			self.draw(d, self.bounds)
 	#
-	def draw(self, (d, area)):
-		area = _rect.intersect(area, self.bounds)
+	def draw(self, d, area):
+		area = _rect.intersect([area, self.bounds])
 		if area == _rect.empty:
 			return
 		d.cliprect(area)
@@ -145,7 +145,7 @@
 
 class StrutAppearance(LabelAppearance):
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		height = max(height, m.lineheight() + 6)
 		return width, height
 	#
@@ -175,7 +175,7 @@
 #
 class CheckAppearance(LabelAppearance):
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		minwidth = m.textwidth(self.text) + 6
 		minheight = m.lineheight() + 6
 		width = max(width, minwidth + minheight + m.textwidth(' '))
@@ -382,7 +382,7 @@
 	def destroy(self):
 		self.parent = 0
 	#
-	def definetext(self, (parent, text)):
+	def definetext(self, parent, text):
 		self = self.define(parent)
 		self.settext(text)
 		return self
diff --git a/Lib/lib-stdwin/CSplit.py b/Lib/lib-stdwin/CSplit.py
index 90d137e..90d5111 100644
--- a/Lib/lib-stdwin/CSplit.py
+++ b/Lib/lib-stdwin/CSplit.py
@@ -9,7 +9,7 @@
 
 class CSplit(Split):
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		# Since things look best if the children are spaced evenly
 		# along the circle (and often all children have the same
 		# size anyway) we compute the max child size and assume
@@ -65,5 +65,5 @@
 			right, bottom = \
 				left + child_width, \
 				top + child_height
-			child.setbounds((left, top), (right, bottom))
+			child.setbounds(((left, top), (right, bottom)))
 	#
diff --git a/Lib/lib-stdwin/DirList.py b/Lib/lib-stdwin/DirList.py
index 00e9a8c..4b98b1d 100644
--- a/Lib/lib-stdwin/DirList.py
+++ b/Lib/lib-stdwin/DirList.py
@@ -11,7 +11,7 @@
 
 class DirList(VSplit):
 	#
-	def create(self, (parent, dirname)):
+	def create(self, parent, dirname):
 		self = VSplit.create(self, parent)
 		names = os.listdir(dirname)
 		for name in names:
diff --git a/Lib/lib-stdwin/FormSplit.py b/Lib/lib-stdwin/FormSplit.py
index 16f3293..271cb23 100644
--- a/Lib/lib-stdwin/FormSplit.py
+++ b/Lib/lib-stdwin/FormSplit.py
@@ -20,7 +20,7 @@
 		self.last_child = None
 		return Split.create(self, parent)
 	#
-	def getminsize(self, (m, sugg_size)):
+	def getminsize(self, m, sugg_size):
 		max_width, max_height = 0, 0
 		for c in self.children:
 			c.form_width, c.form_height = c.getminsize(m, (0, 0))
@@ -38,9 +38,9 @@
 		for c in self.children:
 			left, top = c.form_left + fleft, c.form_top + ftop
 			right, bottom = left + c.form_width, top + c.form_height
-			c.setbounds((left, top), (right, bottom))
+			c.setbounds(((left, top), (right, bottom)))
 	#
-	def placenext(self, (left, top)):
+	def placenext(self, left, top):
 		self.next_left = left
 		self.next_top = top
 		self.last_child = None
diff --git a/Lib/lib-stdwin/HVSplit.py b/Lib/lib-stdwin/HVSplit.py
index 9790b7b..c42327d 100644
--- a/Lib/lib-stdwin/HVSplit.py
+++ b/Lib/lib-stdwin/HVSplit.py
@@ -9,13 +9,13 @@
 
 class HVSplit(Split):
 	#
-	def create(self, (parent, hv)):
+	def create(self, parent, hv):
 		# hv is 0 for HSplit, 1 for VSplit
 		self = Split.create(self, parent)
 		self.hv = hv
 		return self
 	#
-	def getminsize(self, (m, sugg_size)):
+	def getminsize(self, m, sugg_size):
 		hv, vh = self.hv, 1 - self.hv
 		size = [0, 0]
 		sugg_size = [sugg_size[0], sugg_size[1]]
@@ -46,8 +46,8 @@
 			corner = [0, 0]
 			corner[vh] = end[vh]
 			corner[hv] = origin[hv] + size[hv]
-			c.setbounds((origin[0], origin[1]), \
-					(corner[0], corner[1]))
+			c.setbounds(((origin[0], origin[1]), \
+					(corner[0], corner[1])))
 			origin[hv] = corner[hv]
 			# XXX stretch
 			# XXX too-small
diff --git a/Lib/lib-stdwin/Histogram.py b/Lib/lib-stdwin/Histogram.py
index 27ae673..74a75f3 100644
--- a/Lib/lib-stdwin/Histogram.py
+++ b/Lib/lib-stdwin/Histogram.py
@@ -12,7 +12,7 @@
 		self.scale = (0, 100)
 		return self
 	#
-	def setdata(self, (ydata, scale)):
+	def setdata(self, ydata, scale):
 		self.ydata = ydata
 		self.scale = scale # (min, max)
 		self.parent.change(self.bounds)
diff --git a/Lib/lib-stdwin/Sliders.py b/Lib/lib-stdwin/Sliders.py
index 0a709d6..cbf776d 100644
--- a/Lib/lib-stdwin/Sliders.py
+++ b/Lib/lib-stdwin/Sliders.py
@@ -69,12 +69,12 @@
 	def sethook(self, hook):
 		self.hook = hook
 	#
-	def setminvalmax(self, (min, val, max)):
+	def setminvalmax(self, min, val, max):
 		self.min = min
 		self.max = max
 		self.setval(val)
 	#
-	def settexts(self, (pretext, postext)):
+	def settexts(self, pretext, postext):
 		self.pretext = pretext
 		self.postext = postext
 		self.recalctext()
@@ -95,7 +95,7 @@
 	#
 
 class DragSlider(DragSliderReactivity, DragSliderAppearance, Define):
-	def definetext(self, (parent, text)):
+	def definetext(self, parent, text):
 		raise RuntimeError, 'DragSlider.definetext() not supported'
 
 
@@ -108,7 +108,7 @@
 		return self
 	def setstep(self, step):
 		self.step = step
-	def definetextstep(self, (parent, text, step)):
+	def definetextstep(self, parent, text, step):
 		self = self.definetext(parent, text)
 		self.setstep(step)
 		return self
@@ -145,7 +145,7 @@
 	#
 	# Override HSplit methods
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		w1, h1 = self.downbutton.getminsize(m, (0, height))
 		w3, h3 = self.upbutton.getminsize(m, (0, height))
 		w1 = max(w1, h1)
@@ -156,10 +156,10 @@
 	def setbounds(self, bounds):
 		(left, top), (right, bottom) = self.bounds = bounds
 		size = bottom - top
-		self.downbutton.setbounds((left, top), (left+size, bottom))
-		self.dragbutton.setbounds((left+size, top), \
-						(right-size, bottom))
-		self.upbutton.setbounds((right-size, top), (right, bottom))
+		self.downbutton.setbounds(((left, top), (left+size, bottom)))
+		self.dragbutton.setbounds(((left+size, top), \
+						(right-size, bottom)))
+		self.upbutton.setbounds(((right-size, top), (right, bottom)))
 	#
 	# Pass other Slider methods on to dragbutton
 	#
diff --git a/Lib/lib-stdwin/Soundogram.py b/Lib/lib-stdwin/Soundogram.py
index a68d4b3..e3c797e 100644
--- a/Lib/lib-stdwin/Soundogram.py
+++ b/Lib/lib-stdwin/Soundogram.py
@@ -5,7 +5,7 @@
 
 class Soundogram(Histogram):
 	#
-	def define(self, (win, chunk)):
+	def define(self, win, chunk):
 		width, height = corner = win.getwinsize()
 		bounds = (0, 0), corner
 		self.chunk = chunk
diff --git a/Lib/lib-stdwin/Split.py b/Lib/lib-stdwin/Split.py
index aacfa98..8eb0254 100644
--- a/Lib/lib-stdwin/Split.py
+++ b/Lib/lib-stdwin/Split.py
@@ -39,7 +39,7 @@
 		self.mouse_focus = None
 		self.keybd_focus = None
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		return unimpl()			# Should ask children
 	def getbounds(self):
 		return unimpl()
diff --git a/Lib/lib-stdwin/StripChart.py b/Lib/lib-stdwin/StripChart.py
index 5bce412..afec007 100644
--- a/Lib/lib-stdwin/StripChart.py
+++ b/Lib/lib-stdwin/StripChart.py
@@ -8,7 +8,7 @@
 
 class StripChart(LabelAppearance, NoReactivity):
 	#
-	def define(self, (parent, scale)):
+	def define(self, parent, scale):
 		self.parent = parent
 		parent.addchild(self)
 		self.init_appearance()
@@ -49,8 +49,8 @@
 			area = (left+i-1, top), (left+i, bottom)
 			self.draw(self.parent.begindrawing(), area)
 	#
-	def draw(self, (d, area)):
-		area = rect.intersect(area, self.bounds)
+	def draw(self, d, area):
+		area = rect.intersect([area, self.bounds])
 		if area == rect.empty:
 			return
 		d.cliprect(area)
diff --git a/Lib/lib-stdwin/TextEdit.py b/Lib/lib-stdwin/TextEdit.py
index 698a7d5..e08e496 100644
--- a/Lib/lib-stdwin/TextEdit.py
+++ b/Lib/lib-stdwin/TextEdit.py
@@ -7,7 +7,7 @@
 
 class TextEdit:
 	#
-	def create(self, (parent, (cols, rows))):
+	def create(self, parent, (cols, rows)):
 		parent.addchild(self)
 		self.parent = parent
 		self.cols = cols
@@ -18,7 +18,7 @@
 		self.dh = self.dv = 0
 		return self
 	#
-	def createboxed(self, (parent, (cols, rows), (dh, dv))):
+	def createboxed(self, parent, (cols, rows), (dh, dv)):
 		self = self.create(parent, (cols, rows))
 		self.dh = max(0, dh)
 		self.dv = max(0, dv)
@@ -37,7 +37,7 @@
 		del self.editor
 		del self.window
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		width = max(0, width - 2*self.dh)
 		height = max(0, height - 2*self.dv)
 		if width > 0 and self.editor:
@@ -96,7 +96,7 @@
 		self.parent.need_keybd(self)
 		self.parent.need_altdraw(self)
 	#
-	def draw(self, (d, area)):
+	def draw(self, d, area):
 		if self.dh and self.dv:
 			d.box(self.bounds)
 	#
@@ -114,7 +114,7 @@
 	def mouse_up(self, detail):
 		x = self.editor.event(WE_MOUSE_UP, self.window, detail)
 	#
-	def keybd(self, (type, detail)):
+	def keybd(self, type, detail):
 		x = self.editor.event(type, self.window, detail)
 	#
 	def activate(self):
diff --git a/Lib/lib-stdwin/WindowParent.py b/Lib/lib-stdwin/WindowParent.py
index 697ed07..1964d38 100644
--- a/Lib/lib-stdwin/WindowParent.py
+++ b/Lib/lib-stdwin/WindowParent.py
@@ -14,7 +14,7 @@
 
 class WindowParent(ManageOneChild):
 	#
-	def create(self, (title, size)):
+	def create(self, title, size):
 		self.title = title
 		self.size = size		# (width, height)
 		self._reset()
@@ -47,7 +47,7 @@
 	def close_trigger(self):
 		if self.close_hook: self.close_hook(self)
 	#
-	def menu_trigger(self, (menu, item)):
+	def menu_trigger(self, menu, item):
 		if self.menu_hook:
 			self.menu_hook(self, menu, item)
 	#
@@ -94,7 +94,7 @@
 			width = self.size[0]
 		if self.vbar:
 			height = self.size[1]
-		self.child.setbounds((0, 0), (width, height))
+		self.child.setbounds(((0, 0), (width, height)))
 		self.child.realize()
 		self.win.dispatch = self.dispatch
 		mainloop.register(self.win)
@@ -109,7 +109,7 @@
 			width = self.size[0]
 		if self.vbar:
 			height = self.size[1]
-		self.child.setbounds((0, 0), (width, height))
+		self.child.setbounds(((0, 0), (width, height)))
 		# Force a redraw of the entire window:
 		self.win.change((0, 0), self.size)
 	#
diff --git a/Lib/lib-stdwin/formatter.py b/Lib/lib-stdwin/formatter.py
index b2d4add..ac34ce9 100644
--- a/Lib/lib-stdwin/formatter.py
+++ b/Lib/lib-stdwin/formatter.py
@@ -13,7 +13,7 @@
 	# Pass the window's drawing object, and left, top, right
 	# coordinates of the drawing space as arguments.
 	#
-	def init(self, (d, left, top, right)):
+	def init(self, d, left, top, right):
 		self.d = d		# Drawing object
 		self.left = left	# Left margin
 		self.right = right	# Right margin
@@ -50,10 +50,10 @@
 	# of the current font's space width.
 	# (Two variations: one without, one with explicit stretch factor.)
 	#
-	def addword(self, (word, spacefactor)):
+	def addword(self, word, spacefactor):
 		self.addwordstretch(word, spacefactor, spacefactor)
 	#
-	def addwordstretch(self, (word, spacefactor, stretchfactor)):
+	def addwordstretch(self, word, spacefactor, stretchfactor):
 		width = self.d.textwidth(word)
 		if width > self.avail_width:
 			self._flush(1)
diff --git a/Lib/lib-stdwin/gwin.py b/Lib/lib-stdwin/gwin.py
index 12ed90b..626c8fa 100644
--- a/Lib/lib-stdwin/gwin.py
+++ b/Lib/lib-stdwin/gwin.py
@@ -2,16 +2,11 @@
 # Generic stdwin windows
 
 # This is used as a base class from which to derive other window types.
-# The mainloop() function here is an event dispatcher for all window types.
-
-# XXX This is really obsoleted by "mainloop.py".
-# XXX Also you should to it class-oriented...
+# XXX DON'T USE THIS CODE ANY MORE!  It is ages old!
 
 import stdwin, stdwinq
 from stdwinevents import *
-
-windows = []				# List of open windows
-
+from mainloop import mainloop, register, unregister, windows
 
 # Open a window
 
@@ -37,16 +32,11 @@
 	w.backspace = backspace
 	w.arrow = arrow
 	w.kleft = w.kup = w.kright = w.kdown = nop
-	windows.append(w)
+	w.dispatch = treatevent
+	register(w)
 	return w
 
 
-# Generic event dispatching
-
-def mainloop():				# Handle events until no windows left
-	while windows:
-		treatevent(stdwinq.getevent())
-
 def treatevent(e):			# Handle a stdwin event
 	type, w, detail = e
 	if type == WE_DRAW:
@@ -95,10 +85,9 @@
 # Methods
 
 def close(w):				# Close method
-	for i in range(len(windows)):
-		if windows[i] is w:
-			del windows[i]
-			break
+	unregister(w)
+	del w.close	# Delete our close function
+	w.close()	# Call the close method
 
 def arrow(w, detail):			# Arrow key method
 	if detail == WC_LEFT:
@@ -118,4 +107,4 @@
 def backspace(w): w.char(w, '\b')
 def m2down(w, detail): w.mdown(w, detail)
 def m2up(w, detail): w.mup(w, detail)
-def nop(args): pass
+def nop(*args): pass
diff --git a/Lib/lib-stdwin/mainloop.py b/Lib/lib-stdwin/mainloop.py
index ab8ad3a..f1fe617 100644
--- a/Lib/lib-stdwin/mainloop.py
+++ b/Lib/lib-stdwin/mainloop.py
@@ -23,7 +23,7 @@
 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)
+	win.dispatch((WE_NULL, win, None))
 	if win not in windows:
 		windows.append(win)
 
diff --git a/Lib/mutex.py b/Lib/mutex.py
index c939b1a..374f457 100644
--- a/Lib/mutex.py
+++ b/Lib/mutex.py
@@ -40,7 +40,7 @@
 	# If the mutex is already locked, place function and argument
 	# in the queue.
 	#
-	def lock(self, (function, argument)):
+	def lock(self, function, argument):
 		if self.testandset():
 			function(argument)
 		else:
diff --git a/Lib/pdb.py b/Lib/pdb.py
index fa35fc4..48d0b27 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -105,7 +105,7 @@
 			print '*** Error in argument:', `arg`
 			return
 		filename = self.curframe.f_code.co_filename
-		err = self.set_break(filename, lineno)
+		err = self.clear_break(filename, lineno)
 		if err: print '***', err
 	do_cl = do_clear # 'c' is already an abbreviation for 'continue'
 	
diff --git a/Lib/plat-irix5/flp.py b/Lib/plat-irix5/flp.py
index 39b45dc..0904efe 100755
--- a/Lib/plat-irix5/flp.py
+++ b/Lib/plat-irix5/flp.py
@@ -208,7 +208,7 @@
 class _newobj:
     def init(self):
 	return self
-    def add(self, (name, value)):
+    def add(self, name, value):
 	self.__dict__[name] = value
     def make(self, dict):
 	for name in dict.keys():
@@ -299,9 +299,9 @@
 	    if datum == FORMLINE:
 		file.seek(pos)
 	    return obj
-	if type(datum) <> type(()):
+	if type(datum) <> type(()) or len(datum) <> 2:
 	    raise error, 'Parse error, illegal line in object: '+datum
-	obj.add(datum)
+	obj.add(datum[0], datum[1])
 
 #################################################################
 #   Part 2 - High-level object/form creation routines            #
diff --git a/Lib/sched.py b/Lib/sched.py
index 685b2bc..29ccc2a 100644
--- a/Lib/sched.py
+++ b/Lib/sched.py
@@ -34,7 +34,7 @@
 	#
 	# Initialize a new instance, passing the time and delay functions
 	#
-	def init(self, (timefunc, delayfunc)):
+	def init(self, timefunc, delayfunc):
 		self.queue = []
 		self.timefunc = timefunc
 		self.delayfunc = delayfunc
@@ -44,14 +44,15 @@
 	# Returns an ID for the event which can be used
 	# to remove it, if necessary.
 	#
-	def enterabs(self, event):
+	def enterabs(self, time, priority, action, argument):
+		event = time, priority, action, argument
 		bisect.insort(self.queue, event)
 		return event # The ID
 	#
 	# A variant that specifies the time as a relative time.
 	# This is actually the more commonly used interface.
 	#
-	def enter(self, (delay, priority, action, argument)):
+	def enter(self, delay, priority, action, argument):
 		time = self.timefunc() + delay
 		return self.enterabs(time, priority, action, argument)
 	#
@@ -95,6 +96,6 @@
 				self.delayfunc(time - now)
 			else:
 				del q[0]
-				void = action(argument)
+				void = apply(action, argument)
 				self.delayfunc(0) # Let other threads run
 	#
diff --git a/Lib/stdwin/Abstract.py b/Lib/stdwin/Abstract.py
index c6fe137..51bd305 100755
--- a/Lib/stdwin/Abstract.py
+++ b/Lib/stdwin/Abstract.py
@@ -30,7 +30,7 @@
 	def getwindow(self): return unimpl() # Only for very special cases
 	#
 	def change(self, area): unimpl()
-	def scroll(self, (area, (dh, dv))): unimpl()
+	def scroll(self, area, (dh, dv)): unimpl()
 	def settimer(self, itimer): unimpl()
 
 class AbstractChild:
@@ -40,10 +40,10 @@
 	def destroy(self): unimpl()
 	#
 	def realize(self): return unimpl()
-	def getminsize(self, (m, (width, height))): return unimpl()
+	def getminsize(self, m, (width, height)): return unimpl()
 	def getbounds(self): return unimpl()
 	def setbounds(self, bounds): unimpl()
-	def draw(self, (d, area)): unimpl()
+	def draw(self, d, area): unimpl()
 	#
 	# Downcalls only made after certain upcalls
 	#
diff --git a/Lib/stdwin/BoxParent.py b/Lib/stdwin/BoxParent.py
index d042e88..a44995d 100755
--- a/Lib/stdwin/BoxParent.py
+++ b/Lib/stdwin/BoxParent.py
@@ -2,13 +2,13 @@
 
 class BoxParent(TransParent):
 	#
-	def create(self, (parent, (dh, dv))):
+	def create(self, parent, (dh, dv)):
 		self = TransParent.create(self, parent)
 		self.dh = dh
 		self.dv = dv
 		return self
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		width = max(0, width - 2*self.dh)
 		height = max(0, height - 2*self.dv)
 		width, height = self.child.getminsize(m, (width, height))
diff --git a/Lib/stdwin/Buttons.py b/Lib/stdwin/Buttons.py
index d1435d3..9a99707 100755
--- a/Lib/stdwin/Buttons.py
+++ b/Lib/stdwin/Buttons.py
@@ -35,7 +35,7 @@
 	#
 	# Size enquiry
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		width = max(width, m.textwidth(self.text) + 6)
 		height = max(height, m.lineheight() + 6)
 		return width, height
@@ -108,8 +108,8 @@
 			d.erase(self.bounds)
 			self.draw(d, self.bounds)
 	#
-	def draw(self, (d, area)):
-		area = _rect.intersect(area, self.bounds)
+	def draw(self, d, area):
+		area = _rect.intersect([area, self.bounds])
 		if area == _rect.empty:
 			return
 		d.cliprect(area)
@@ -145,7 +145,7 @@
 
 class StrutAppearance(LabelAppearance):
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		height = max(height, m.lineheight() + 6)
 		return width, height
 	#
@@ -175,7 +175,7 @@
 #
 class CheckAppearance(LabelAppearance):
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		minwidth = m.textwidth(self.text) + 6
 		minheight = m.lineheight() + 6
 		width = max(width, minwidth + minheight + m.textwidth(' '))
@@ -382,7 +382,7 @@
 	def destroy(self):
 		self.parent = 0
 	#
-	def definetext(self, (parent, text)):
+	def definetext(self, parent, text):
 		self = self.define(parent)
 		self.settext(text)
 		return self
diff --git a/Lib/stdwin/CSplit.py b/Lib/stdwin/CSplit.py
index 90d137e..90d5111 100755
--- a/Lib/stdwin/CSplit.py
+++ b/Lib/stdwin/CSplit.py
@@ -9,7 +9,7 @@
 
 class CSplit(Split):
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		# Since things look best if the children are spaced evenly
 		# along the circle (and often all children have the same
 		# size anyway) we compute the max child size and assume
@@ -65,5 +65,5 @@
 			right, bottom = \
 				left + child_width, \
 				top + child_height
-			child.setbounds((left, top), (right, bottom))
+			child.setbounds(((left, top), (right, bottom)))
 	#
diff --git a/Lib/stdwin/DirList.py b/Lib/stdwin/DirList.py
index 00e9a8c..4b98b1d 100755
--- a/Lib/stdwin/DirList.py
+++ b/Lib/stdwin/DirList.py
@@ -11,7 +11,7 @@
 
 class DirList(VSplit):
 	#
-	def create(self, (parent, dirname)):
+	def create(self, parent, dirname):
 		self = VSplit.create(self, parent)
 		names = os.listdir(dirname)
 		for name in names:
diff --git a/Lib/stdwin/FormSplit.py b/Lib/stdwin/FormSplit.py
index 16f3293..271cb23 100755
--- a/Lib/stdwin/FormSplit.py
+++ b/Lib/stdwin/FormSplit.py
@@ -20,7 +20,7 @@
 		self.last_child = None
 		return Split.create(self, parent)
 	#
-	def getminsize(self, (m, sugg_size)):
+	def getminsize(self, m, sugg_size):
 		max_width, max_height = 0, 0
 		for c in self.children:
 			c.form_width, c.form_height = c.getminsize(m, (0, 0))
@@ -38,9 +38,9 @@
 		for c in self.children:
 			left, top = c.form_left + fleft, c.form_top + ftop
 			right, bottom = left + c.form_width, top + c.form_height
-			c.setbounds((left, top), (right, bottom))
+			c.setbounds(((left, top), (right, bottom)))
 	#
-	def placenext(self, (left, top)):
+	def placenext(self, left, top):
 		self.next_left = left
 		self.next_top = top
 		self.last_child = None
diff --git a/Lib/stdwin/HVSplit.py b/Lib/stdwin/HVSplit.py
index 9790b7b..c42327d 100755
--- a/Lib/stdwin/HVSplit.py
+++ b/Lib/stdwin/HVSplit.py
@@ -9,13 +9,13 @@
 
 class HVSplit(Split):
 	#
-	def create(self, (parent, hv)):
+	def create(self, parent, hv):
 		# hv is 0 for HSplit, 1 for VSplit
 		self = Split.create(self, parent)
 		self.hv = hv
 		return self
 	#
-	def getminsize(self, (m, sugg_size)):
+	def getminsize(self, m, sugg_size):
 		hv, vh = self.hv, 1 - self.hv
 		size = [0, 0]
 		sugg_size = [sugg_size[0], sugg_size[1]]
@@ -46,8 +46,8 @@
 			corner = [0, 0]
 			corner[vh] = end[vh]
 			corner[hv] = origin[hv] + size[hv]
-			c.setbounds((origin[0], origin[1]), \
-					(corner[0], corner[1]))
+			c.setbounds(((origin[0], origin[1]), \
+					(corner[0], corner[1])))
 			origin[hv] = corner[hv]
 			# XXX stretch
 			# XXX too-small
diff --git a/Lib/stdwin/Histogram.py b/Lib/stdwin/Histogram.py
index 27ae673..74a75f3 100755
--- a/Lib/stdwin/Histogram.py
+++ b/Lib/stdwin/Histogram.py
@@ -12,7 +12,7 @@
 		self.scale = (0, 100)
 		return self
 	#
-	def setdata(self, (ydata, scale)):
+	def setdata(self, ydata, scale):
 		self.ydata = ydata
 		self.scale = scale # (min, max)
 		self.parent.change(self.bounds)
diff --git a/Lib/stdwin/Sliders.py b/Lib/stdwin/Sliders.py
index 0a709d6..cbf776d 100755
--- a/Lib/stdwin/Sliders.py
+++ b/Lib/stdwin/Sliders.py
@@ -69,12 +69,12 @@
 	def sethook(self, hook):
 		self.hook = hook
 	#
-	def setminvalmax(self, (min, val, max)):
+	def setminvalmax(self, min, val, max):
 		self.min = min
 		self.max = max
 		self.setval(val)
 	#
-	def settexts(self, (pretext, postext)):
+	def settexts(self, pretext, postext):
 		self.pretext = pretext
 		self.postext = postext
 		self.recalctext()
@@ -95,7 +95,7 @@
 	#
 
 class DragSlider(DragSliderReactivity, DragSliderAppearance, Define):
-	def definetext(self, (parent, text)):
+	def definetext(self, parent, text):
 		raise RuntimeError, 'DragSlider.definetext() not supported'
 
 
@@ -108,7 +108,7 @@
 		return self
 	def setstep(self, step):
 		self.step = step
-	def definetextstep(self, (parent, text, step)):
+	def definetextstep(self, parent, text, step):
 		self = self.definetext(parent, text)
 		self.setstep(step)
 		return self
@@ -145,7 +145,7 @@
 	#
 	# Override HSplit methods
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		w1, h1 = self.downbutton.getminsize(m, (0, height))
 		w3, h3 = self.upbutton.getminsize(m, (0, height))
 		w1 = max(w1, h1)
@@ -156,10 +156,10 @@
 	def setbounds(self, bounds):
 		(left, top), (right, bottom) = self.bounds = bounds
 		size = bottom - top
-		self.downbutton.setbounds((left, top), (left+size, bottom))
-		self.dragbutton.setbounds((left+size, top), \
-						(right-size, bottom))
-		self.upbutton.setbounds((right-size, top), (right, bottom))
+		self.downbutton.setbounds(((left, top), (left+size, bottom)))
+		self.dragbutton.setbounds(((left+size, top), \
+						(right-size, bottom)))
+		self.upbutton.setbounds(((right-size, top), (right, bottom)))
 	#
 	# Pass other Slider methods on to dragbutton
 	#
diff --git a/Lib/stdwin/Soundogram.py b/Lib/stdwin/Soundogram.py
index a68d4b3..e3c797e 100755
--- a/Lib/stdwin/Soundogram.py
+++ b/Lib/stdwin/Soundogram.py
@@ -5,7 +5,7 @@
 
 class Soundogram(Histogram):
 	#
-	def define(self, (win, chunk)):
+	def define(self, win, chunk):
 		width, height = corner = win.getwinsize()
 		bounds = (0, 0), corner
 		self.chunk = chunk
diff --git a/Lib/stdwin/Split.py b/Lib/stdwin/Split.py
index aacfa98..8eb0254 100755
--- a/Lib/stdwin/Split.py
+++ b/Lib/stdwin/Split.py
@@ -39,7 +39,7 @@
 		self.mouse_focus = None
 		self.keybd_focus = None
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		return unimpl()			# Should ask children
 	def getbounds(self):
 		return unimpl()
diff --git a/Lib/stdwin/StripChart.py b/Lib/stdwin/StripChart.py
index 5bce412..afec007 100755
--- a/Lib/stdwin/StripChart.py
+++ b/Lib/stdwin/StripChart.py
@@ -8,7 +8,7 @@
 
 class StripChart(LabelAppearance, NoReactivity):
 	#
-	def define(self, (parent, scale)):
+	def define(self, parent, scale):
 		self.parent = parent
 		parent.addchild(self)
 		self.init_appearance()
@@ -49,8 +49,8 @@
 			area = (left+i-1, top), (left+i, bottom)
 			self.draw(self.parent.begindrawing(), area)
 	#
-	def draw(self, (d, area)):
-		area = rect.intersect(area, self.bounds)
+	def draw(self, d, area):
+		area = rect.intersect([area, self.bounds])
 		if area == rect.empty:
 			return
 		d.cliprect(area)
diff --git a/Lib/stdwin/TextEdit.py b/Lib/stdwin/TextEdit.py
index 698a7d5..e08e496 100755
--- a/Lib/stdwin/TextEdit.py
+++ b/Lib/stdwin/TextEdit.py
@@ -7,7 +7,7 @@
 
 class TextEdit:
 	#
-	def create(self, (parent, (cols, rows))):
+	def create(self, parent, (cols, rows)):
 		parent.addchild(self)
 		self.parent = parent
 		self.cols = cols
@@ -18,7 +18,7 @@
 		self.dh = self.dv = 0
 		return self
 	#
-	def createboxed(self, (parent, (cols, rows), (dh, dv))):
+	def createboxed(self, parent, (cols, rows), (dh, dv)):
 		self = self.create(parent, (cols, rows))
 		self.dh = max(0, dh)
 		self.dv = max(0, dv)
@@ -37,7 +37,7 @@
 		del self.editor
 		del self.window
 	#
-	def getminsize(self, (m, (width, height))):
+	def getminsize(self, m, (width, height)):
 		width = max(0, width - 2*self.dh)
 		height = max(0, height - 2*self.dv)
 		if width > 0 and self.editor:
@@ -96,7 +96,7 @@
 		self.parent.need_keybd(self)
 		self.parent.need_altdraw(self)
 	#
-	def draw(self, (d, area)):
+	def draw(self, d, area):
 		if self.dh and self.dv:
 			d.box(self.bounds)
 	#
@@ -114,7 +114,7 @@
 	def mouse_up(self, detail):
 		x = self.editor.event(WE_MOUSE_UP, self.window, detail)
 	#
-	def keybd(self, (type, detail)):
+	def keybd(self, type, detail):
 		x = self.editor.event(type, self.window, detail)
 	#
 	def activate(self):
diff --git a/Lib/stdwin/WindowParent.py b/Lib/stdwin/WindowParent.py
index 697ed07..1964d38 100755
--- a/Lib/stdwin/WindowParent.py
+++ b/Lib/stdwin/WindowParent.py
@@ -14,7 +14,7 @@
 
 class WindowParent(ManageOneChild):
 	#
-	def create(self, (title, size)):
+	def create(self, title, size):
 		self.title = title
 		self.size = size		# (width, height)
 		self._reset()
@@ -47,7 +47,7 @@
 	def close_trigger(self):
 		if self.close_hook: self.close_hook(self)
 	#
-	def menu_trigger(self, (menu, item)):
+	def menu_trigger(self, menu, item):
 		if self.menu_hook:
 			self.menu_hook(self, menu, item)
 	#
@@ -94,7 +94,7 @@
 			width = self.size[0]
 		if self.vbar:
 			height = self.size[1]
-		self.child.setbounds((0, 0), (width, height))
+		self.child.setbounds(((0, 0), (width, height)))
 		self.child.realize()
 		self.win.dispatch = self.dispatch
 		mainloop.register(self.win)
@@ -109,7 +109,7 @@
 			width = self.size[0]
 		if self.vbar:
 			height = self.size[1]
-		self.child.setbounds((0, 0), (width, height))
+		self.child.setbounds(((0, 0), (width, height)))
 		# Force a redraw of the entire window:
 		self.win.change((0, 0), self.size)
 	#
diff --git a/Lib/stdwin/formatter.py b/Lib/stdwin/formatter.py
index b2d4add..ac34ce9 100755
--- a/Lib/stdwin/formatter.py
+++ b/Lib/stdwin/formatter.py
@@ -13,7 +13,7 @@
 	# Pass the window's drawing object, and left, top, right
 	# coordinates of the drawing space as arguments.
 	#
-	def init(self, (d, left, top, right)):
+	def init(self, d, left, top, right):
 		self.d = d		# Drawing object
 		self.left = left	# Left margin
 		self.right = right	# Right margin
@@ -50,10 +50,10 @@
 	# of the current font's space width.
 	# (Two variations: one without, one with explicit stretch factor.)
 	#
-	def addword(self, (word, spacefactor)):
+	def addword(self, word, spacefactor):
 		self.addwordstretch(word, spacefactor, spacefactor)
 	#
-	def addwordstretch(self, (word, spacefactor, stretchfactor)):
+	def addwordstretch(self, word, spacefactor, stretchfactor):
 		width = self.d.textwidth(word)
 		if width > self.avail_width:
 			self._flush(1)
diff --git a/Lib/stdwin/gwin.py b/Lib/stdwin/gwin.py
index 12ed90b..626c8fa 100755
--- a/Lib/stdwin/gwin.py
+++ b/Lib/stdwin/gwin.py
@@ -2,16 +2,11 @@
 # Generic stdwin windows
 
 # This is used as a base class from which to derive other window types.
-# The mainloop() function here is an event dispatcher for all window types.
-
-# XXX This is really obsoleted by "mainloop.py".
-# XXX Also you should to it class-oriented...
+# XXX DON'T USE THIS CODE ANY MORE!  It is ages old!
 
 import stdwin, stdwinq
 from stdwinevents import *
-
-windows = []				# List of open windows
-
+from mainloop import mainloop, register, unregister, windows
 
 # Open a window
 
@@ -37,16 +32,11 @@
 	w.backspace = backspace
 	w.arrow = arrow
 	w.kleft = w.kup = w.kright = w.kdown = nop
-	windows.append(w)
+	w.dispatch = treatevent
+	register(w)
 	return w
 
 
-# Generic event dispatching
-
-def mainloop():				# Handle events until no windows left
-	while windows:
-		treatevent(stdwinq.getevent())
-
 def treatevent(e):			# Handle a stdwin event
 	type, w, detail = e
 	if type == WE_DRAW:
@@ -95,10 +85,9 @@
 # Methods
 
 def close(w):				# Close method
-	for i in range(len(windows)):
-		if windows[i] is w:
-			del windows[i]
-			break
+	unregister(w)
+	del w.close	# Delete our close function
+	w.close()	# Call the close method
 
 def arrow(w, detail):			# Arrow key method
 	if detail == WC_LEFT:
@@ -118,4 +107,4 @@
 def backspace(w): w.char(w, '\b')
 def m2down(w, detail): w.mdown(w, detail)
 def m2up(w, detail): w.mup(w, detail)
-def nop(args): pass
+def nop(*args): pass
diff --git a/Lib/stdwin/mainloop.py b/Lib/stdwin/mainloop.py
index ab8ad3a..f1fe617 100755
--- a/Lib/stdwin/mainloop.py
+++ b/Lib/stdwin/mainloop.py
@@ -23,7 +23,7 @@
 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)
+	win.dispatch((WE_NULL, win, None))
 	if win not in windows:
 		windows.append(win)