blob: 12ed90bba010edb3934c1b1a647dcbb9f5d04bd5 [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 Rossumbdfcfcc1992-01-01 19:35:13 +000052 if type == WE_DRAW:
Guido van Rossumc6360141990-10-13 19:23:40 +000053 w.draw(w, detail)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +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 Rossumbdfcfcc1992-01-01 19:35:13 +000057 elif type == WE_COMMAND:
Guido van Rossumc6360141990-10-13 19:23:40 +000058 treatcommand(w, detail)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000059 elif type == WE_CHAR:
Guido van Rossumc6360141990-10-13 19:23:40 +000060 w.char(w, detail)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +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 Rossumbdfcfcc1992-01-01 19:35:13 +000064 elif type == WE_MOUSE_MOVE:
Guido van Rossumc6360141990-10-13 19:23:40 +000065 w.mmove(w, detail)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +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 Rossumbdfcfcc1992-01-01 19:35:13 +000069 elif type == WE_SIZE:
Guido van Rossumc6360141990-10-13 19:23:40 +000070 w.size(w, w.getwinsize())
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000071 elif type == WE_ACTIVATE:
Guido van Rossumc6360141990-10-13 19:23:40 +000072 w.activate(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000073 elif type == WE_DEACTIVATE:
Guido van Rossumc6360141990-10-13 19:23:40 +000074 w.deactivate(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000075 elif type == WE_MOVE:
Guido van Rossumc6360141990-10-13 19:23:40 +000076 w.move(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000077 elif type == WE_TIMER:
Guido van Rossumc6360141990-10-13 19:23:40 +000078 w.timer(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000079 elif type == WE_CLOSE:
Guido van Rossuma4ddbd81990-12-26 15:37:05 +000080 w.close(w)
Guido van Rossumc6360141990-10-13 19:23:40 +000081
82def treatcommand(w, type): # Handle a we_command event
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000083 if type == WC_CLOSE:
Guido van Rossumc6360141990-10-13 19:23:40 +000084 w.close(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000085 elif type == WC_RETURN:
Guido van Rossumc6360141990-10-13 19:23:40 +000086 w.enter(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000087 elif type == WC_TAB:
Guido van Rossumc6360141990-10-13 19:23:40 +000088 w.tab(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +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 Rossumbdfcfcc1992-01-01 19:35:13 +0000104 if detail == WC_LEFT:
Guido van Rossumc6360141990-10-13 19:23:40 +0000105 w.kleft(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +0000106 elif detail == WC_UP:
Guido van Rossumc6360141990-10-13 19:23:40 +0000107 w.kup(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +0000108 elif detail == WC_RIGHT:
Guido van Rossumc6360141990-10-13 19:23:40 +0000109 w.kright(w)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +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