blob: c2ec11f9270f6a2411fa6c2f56f5952f937ebc03 [file] [log] [blame]
Guido van Rossumc6360141990-10-13 19:23:40 +00001# Module 'gwin'
2# Generic stdwin windows
3
4# This is used as a base class from which to derive other window types.
5# The mainloop() function here is an event dispatcher for all window types.
6
Guido van Rossum61f9d0d1991-12-26 13:04:16 +00007# XXX This is really obsoleted by "mainloop.py".
8# XXX Also you should to it class-oriented...
9
Guido van Rossum0b744801991-08-16 13:24:58 +000010import stdwin, stdwinq
Guido van Rossuma4ddbd81990-12-26 15:37:05 +000011from stdwinevents import *
Guido van Rossumc6360141990-10-13 19:23:40 +000012
Guido van Rossumc6360141990-10-13 19:23:40 +000013windows = [] # List of open windows
14
15
16# Open a window
17
18def open(title): # Open a generic window
19 w = stdwin.open(title)
20 stdwin.setdefwinsize(0, 0)
21 # Set default event handlers
22 w.draw = nop
23 w.char = nop
24 w.mdown = nop
25 w.mmove = nop
26 w.mup = nop
27 w.m2down = m2down
28 w.m2up = m2up
29 w.size = nop
30 w.move = nop
31 w.activate = w.deactivate = nop
32 w.timer = nop
33 # default command handlers
34 w.close = close
35 w.tab = tab
36 w.enter = enter
37 w.backspace = backspace
38 w.arrow = arrow
39 w.kleft = w.kup = w.kright = w.kdown = nop
40 windows.append(w)
41 return w
42
43
44# Generic event dispatching
45
46def mainloop(): # Handle events until no windows left
47 while windows:
Guido van Rossum0b744801991-08-16 13:24:58 +000048 treatevent(stdwinq.getevent())
Guido van Rossumc6360141990-10-13 19:23:40 +000049
50def treatevent(e): # Handle a stdwin event
51 type, w, detail = e
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000052 if type = WE_DRAW:
Guido van Rossumc6360141990-10-13 19:23:40 +000053 w.draw(w, detail)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000054 elif type = WE_MENU:
Guido van Rossumc6360141990-10-13 19:23:40 +000055 m, item = detail
56 m.action[item](w, m, item)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000057 elif type = WE_COMMAND:
Guido van Rossumc6360141990-10-13 19:23:40 +000058 treatcommand(w, detail)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000059 elif type = WE_CHAR:
Guido van Rossumc6360141990-10-13 19:23:40 +000060 w.char(w, detail)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000061 elif type = WE_MOUSE_DOWN:
Guido van Rossumc6360141990-10-13 19:23:40 +000062 if detail[1] > 1: w.m2down(w, detail)
63 else: w.mdown(w, detail)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000064 elif type = WE_MOUSE_MOVE:
Guido van Rossumc6360141990-10-13 19:23:40 +000065 w.mmove(w, detail)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000066 elif type = WE_MOUSE_UP:
Guido van Rossumc6360141990-10-13 19:23:40 +000067 if detail[1] > 1: w.m2up(w, detail)
68 else: w.mup(w, detail)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000069 elif type = WE_SIZE:
Guido van Rossumc6360141990-10-13 19:23:40 +000070 w.size(w, w.getwinsize())
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000071 elif type = WE_ACTIVATE:
Guido van Rossumc6360141990-10-13 19:23:40 +000072 w.activate(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000073 elif type = WE_DEACTIVATE:
Guido van Rossumc6360141990-10-13 19:23:40 +000074 w.deactivate(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000075 elif type = WE_MOVE:
Guido van Rossumc6360141990-10-13 19:23:40 +000076 w.move(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000077 elif type = WE_TIMER:
Guido van Rossumc6360141990-10-13 19:23:40 +000078 w.timer(w)
Guido van Rossuma4ddbd81990-12-26 15:37:05 +000079 elif type = WE_CLOSE:
80 w.close(w)
Guido van Rossumc6360141990-10-13 19:23:40 +000081
82def treatcommand(w, type): # Handle a we_command event
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000083 if type = WC_CLOSE:
Guido van Rossumc6360141990-10-13 19:23:40 +000084 w.close(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000085 elif type = WC_RETURN:
Guido van Rossumc6360141990-10-13 19:23:40 +000086 w.enter(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000087 elif type = WC_TAB:
Guido van Rossumc6360141990-10-13 19:23:40 +000088 w.tab(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000089 elif type = WC_BACKSPACE:
Guido van Rossumc6360141990-10-13 19:23:40 +000090 w.backspace(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +000091 elif type in (WC_LEFT, WC_UP, WC_RIGHT, WC_DOWN):
Guido van Rossumc6360141990-10-13 19:23:40 +000092 w.arrow(w, type)
93
94
95# Methods
96
97def close(w): # Close method
98 for i in range(len(windows)):
99 if windows[i] is w:
100 del windows[i]
101 break
102
103def arrow(w, detail): # Arrow key method
Guido van Rossum61f9d0d1991-12-26 13:04:16 +0000104 if detail = WC_LEFT:
Guido van Rossumc6360141990-10-13 19:23:40 +0000105 w.kleft(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +0000106 elif detail = WC_UP:
Guido van Rossumc6360141990-10-13 19:23:40 +0000107 w.kup(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +0000108 elif detail = WC_RIGHT:
Guido van Rossumc6360141990-10-13 19:23:40 +0000109 w.kright(w)
Guido van Rossum61f9d0d1991-12-26 13:04:16 +0000110 elif detail = WC_DOWN:
Guido van Rossumc6360141990-10-13 19:23:40 +0000111 w.kdown(w)
112
113
114# Trivial methods
115
116def tab(w): w.char(w, '\t')
117def enter(w): w.char(w, '\n') # 'return' is a Python reserved word
118def backspace(w): w.char(w, '\b')
119def m2down(w, detail): w.mdown(w, detail)
120def m2up(w, detail): w.mup(w, detail)
121def nop(args): pass