minsize->getminsize
Keyboard focus policy
more?
diff --git a/Lib/lib-stdwin/WindowParent.py b/Lib/lib-stdwin/WindowParent.py
index 2388443..7b965f9 100644
--- a/Lib/lib-stdwin/WindowParent.py
+++ b/Lib/lib-stdwin/WindowParent.py
@@ -2,23 +2,23 @@
 # It is the root of the tree.
 # It should have exactly one child when realized.
 #
-# There is also some support for a standard main loop here.
+# There is also an alternative interface to "mainloop" here.
 
 import stdwin
 from stdwinevents import *
+import mainloop
 
 from TransParent import ManageOneChild
 
 Error = 'WindowParent.Error'	# Exception
 
-WindowList = []			# List containing all windows
-
 class WindowParent() = ManageOneChild():
 	#
 	def create(self, (title, size)):
 		self.title = title
 		self.size = size		# (width, height)
 		self._reset()
+		self.close_hook = WindowParent.delayed_destroy
 		return self
 	#
 	def _reset(self):
@@ -31,10 +31,10 @@
 		self.do_altdraw = 0
 		self.pending_destroy = 0
 		self.close_hook = None
+		self.menu_hook = None
 	#
 	def destroy(self):
-		if self.win in WindowList:
-			WindowList.remove(self.win)
+		mainloop.unregister(self.win)
 		if self.child: self.child.destroy()
 		self._reset()
 	#
@@ -47,11 +47,19 @@
 	def close_trigger(self):
 		if self.close_hook: self.close_hook(self)
 	#
+	def menu_trigger(self, (menu, item)):
+		if self.menu_hook:
+			self.menu_hook(self, menu, item)
+	#
 	def need_mouse(self, child): self.do_mouse = 1
 	def no_mouse(self, child): self.do_mouse = 0
 	#
-	def need_keybd(self, child): self.do_keybd = 1
-	def no_keybd(self, child): self.do_keybd = 0
+	def need_keybd(self, child):
+		self.do_keybd = 1
+		self.child.activate()
+	def no_keybd(self, child):
+		self.do_keybd = 0
+		self.child.deactivate()
 	#
 	def need_timer(self, child): self.do_timer = 1
 	def no_timer(self, child): self.do_timer = 0
@@ -64,28 +72,46 @@
 			raise Error, 'realize(): called twice'
 		if not self.child:
 			raise Error, 'realize(): no child'
-		size = self.child.minsize(self.beginmeasuring())
-		self.size = max(self.size[0], size[0]), \
-					max(self.size[1], size[1])
-		# XXX Don't... stdwin.setdefscrollbars(0, 0)
-		stdwin.setdefwinsize(self.size)
+		# Compute suggested size
+		self.size = self.child.getminsize(self.beginmeasuring(), \
+						  self.size)
+		save_defsize = stdwin.getdefwinsize()
+		scrwidth, scrheight = stdwin.getscrsize()
+		width, height = self.size
+		if width > scrwidth:
+			width = scrwidth * 2/3
+		if height > scrheight:
+			height = scrheight * 2/3
+		stdwin.setdefwinsize(width, height)
+		self.hbar, self.vbar = stdwin.getdefscrollbars()
 		self.win = stdwin.open(self.title)
+		stdwin.setdefwinsize(save_defsize)
 		self.win.setdocsize(self.size)
 		if self.itimer:
 			self.win.settimer(self.itimer)
-		bounds = (0, 0), self.win.getwinsize()
-		self.child.setbounds(bounds)
+		width, height = self.win.getwinsize()
+		if self.hbar:
+			width = self.size[0]
+		if self.vbar:
+			height = self.size[1]
+		self.child.setbounds((0, 0), (width, height))
 		self.child.realize()
 		self.win.dispatch = self.dispatch
-		WindowList.append(self.win)
+		mainloop.register(self.win)
 	#
 	def fixup(self):
-		self.size = self.child.minsize(self.beginmeasuring())
+		# XXX This could share code with realize() above
+		self.size = self.child.getminsize(self.beginmeasuring(), \
+					          self.win.getwinsize())
 		self.win.setdocsize(self.size)
-		bounds = (0, 0), self.win.getwinsize()
-		self.child.setbounds(bounds)
+		width, height = self.win.getwinsize()
+		if self.hbar:
+			width = self.size[0]
+		if self.vbar:
+			height = self.size[1]
+		self.child.setbounds((0, 0), (width, height))
 		# Force a redraw of the entire window:
-		self.win.change((0, 0), (10000, 10000))
+		self.win.change((0, 0), self.size)
 	#
 	def beginmeasuring(self):
 		# Return something with which a child can measure text
@@ -142,28 +168,22 @@
 			self.fixup()
 		elif type = WE_CLOSE:
 			self.close_trigger()
+		elif type = WE_MENU:
+			self.menu_trigger(detail)
 		if self.pending_destroy:
 			self.destroy()
 	#
 
 def MainLoop():
-	while WindowList:
-		Dispatch(stdwin.getevent())
+	mainloop.mainloop()
 
 def Dispatch(event):
-	window = event[1]
-	if window in WindowList:
-		window.dispatch(event)
-	else:
-		stdwin.fleep()
+	mainloop.dispatch(event)
 
 # Interface used by WindowSched:
 
 def CountWindows():
-	return len(WindowList)
+	return mainloop.countwindows()
 
 def AnyWindow():
-	if not WindowList:
-		return None
-	else:
-		return WindowList[0]
+	return mainloop.anywindow()