| # Module 'gwin' | 
 | # Generic stdwin windows | 
 |  | 
 | # This is used as a base class from which to derive other window types. | 
 | # XXX DON'T USE THIS CODE ANY MORE!  It is ages old! | 
 |  | 
 | import stdwin, stdwinq | 
 | from stdwinevents import * | 
 | from mainloop import mainloop, register, unregister, windows | 
 |  | 
 | # Open a window | 
 |  | 
 | def open(title):			# Open a generic window | 
 | 	w = stdwin.open(title) | 
 | 	stdwin.setdefwinsize(0, 0) | 
 | 	# Set default event handlers | 
 | 	w.draw = nop | 
 | 	w.char = nop | 
 | 	w.mdown = nop | 
 | 	w.mmove = nop | 
 | 	w.mup = nop | 
 | 	w.m2down = m2down | 
 | 	w.m2up = m2up | 
 | 	w.size = nop | 
 | 	w.move = nop | 
 | 	w.activate = w.deactivate = nop | 
 | 	w.timer = nop | 
 | 	# default command handlers | 
 | 	w.close = close | 
 | 	w.tab = tab | 
 | 	w.enter = enter | 
 | 	w.backspace = backspace | 
 | 	w.arrow = arrow | 
 | 	w.kleft = w.kup = w.kright = w.kdown = nop | 
 | 	w.dispatch = treatevent | 
 | 	register(w) | 
 | 	return w | 
 |  | 
 |  | 
 | def treatevent(e):			# Handle a stdwin event | 
 | 	type, w, detail = e | 
 | 	if type == WE_DRAW: | 
 | 		w.draw(w, detail) | 
 | 	elif type == WE_MENU: | 
 | 		m, item = detail | 
 | 		m.action[item](w, m, item) | 
 | 	elif type == WE_COMMAND: | 
 | 		treatcommand(w, detail) | 
 | 	elif type == WE_CHAR: | 
 | 		w.char(w, detail) | 
 | 	elif type == WE_MOUSE_DOWN: | 
 | 		if detail[1] > 1: w.m2down(w, detail) | 
 | 		else: w.mdown(w, detail) | 
 | 	elif type == WE_MOUSE_MOVE: | 
 | 		w.mmove(w, detail) | 
 | 	elif type == WE_MOUSE_UP: | 
 | 		if detail[1] > 1: w.m2up(w, detail) | 
 | 		else: w.mup(w, detail) | 
 | 	elif type == WE_SIZE: | 
 | 		w.size(w, w.getwinsize()) | 
 | 	elif type == WE_ACTIVATE: | 
 | 		w.activate(w) | 
 | 	elif type == WE_DEACTIVATE: | 
 | 		w.deactivate(w) | 
 | 	elif type == WE_MOVE: | 
 | 		w.move(w) | 
 | 	elif type == WE_TIMER: | 
 | 		w.timer(w) | 
 | 	elif type == WE_CLOSE: | 
 | 		w.close(w) | 
 |  | 
 | def treatcommand(w, type):		# Handle a we_command event | 
 | 	if type == WC_CLOSE: | 
 | 		w.close(w) | 
 | 	elif type == WC_RETURN: | 
 | 		w.enter(w) | 
 | 	elif type == WC_TAB: | 
 | 		w.tab(w) | 
 | 	elif type == WC_BACKSPACE: | 
 | 		w.backspace(w) | 
 | 	elif type in (WC_LEFT, WC_UP, WC_RIGHT, WC_DOWN): | 
 | 		w.arrow(w, type) | 
 |  | 
 |  | 
 | # Methods | 
 |  | 
 | def close(w):				# Close method | 
 | 	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: | 
 | 		w.kleft(w) | 
 | 	elif detail == WC_UP: | 
 | 		w.kup(w) | 
 | 	elif detail == WC_RIGHT: | 
 | 		w.kright(w) | 
 | 	elif detail == WC_DOWN: | 
 | 		w.kdown(w) | 
 |  | 
 |  | 
 | # Trivial methods | 
 |  | 
 | def tab(w): w.char(w, '\t') | 
 | def enter(w): w.char(w, '\n')		# 'return' is a Python reserved word | 
 | 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 |