annotate Lib/lib-stdwin/mainloop.py @ 6719:faebc1940432 legacy-trunk

Understand -Xlinker option.
author Guido van Rossum <guido@python.org>
date Tue, 02 Dec 1997 20:38:11 +0000
parents 560ec7030817
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Standard main loop for *all* STDWIN applications.
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 # This requires that applications:
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # - register their windows on creation and unregister them when closed
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # - have a 'dispatch' function as a window member
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 import stdwin, stdwinq
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 from stdwinevents import *
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # List of windows known to the main loop.
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 #
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 windows = []
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
16 # Last window that ever received an event
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
17 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
18 last_window = None
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
19
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
20
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 # Function to register a window.
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 #
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 def register(win):
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 # First test the dispatch function by passing it a null event --
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 # this catches registration of unconforming windows.
1110
1d06b1499eb9 * Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents: 1095
diff changeset
26 win.dispatch((WE_NULL, win, None))
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 if win not in windows:
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 windows.append(win)
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 # Function to unregister a window.
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 # It is not an error to unregister an already unregistered window
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 # (this is useful for cleanup actions).
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 #
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 def unregister(win):
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
36 global last_window
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
37 if win == last_window:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
38 last_window = None
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 if win in windows:
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 windows.remove(win) # Not in 0.9.1
444
1f64f55a52e8 Comment 0.9.1 alternative to windows.remove(win) out.
Guido van Rossum <guido@python.org>
parents: 364
diff changeset
41 # 0.9.1 solution:
1f64f55a52e8 Comment 0.9.1 alternative to windows.remove(win) out.
Guido van Rossum <guido@python.org>
parents: 364
diff changeset
42 #for i in range(len(windows)):
1f64f55a52e8 Comment 0.9.1 alternative to windows.remove(win) out.
Guido van Rossum <guido@python.org>
parents: 364
diff changeset
43 # if windows[i] = win:
1f64f55a52e8 Comment 0.9.1 alternative to windows.remove(win) out.
Guido van Rossum <guido@python.org>
parents: 364
diff changeset
44 # del windows[i]
1f64f55a52e8 Comment 0.9.1 alternative to windows.remove(win) out.
Guido van Rossum <guido@python.org>
parents: 364
diff changeset
45 # break
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 # Interfaces used by WindowSched.
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 #
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 def countwindows():
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 return len(windows)
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 #
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 def anywindow():
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 if windows:
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 return windows[0]
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 else:
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 return None
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
60 # NEW: register any number of file descriptors
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
61 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
62 fdlist = []
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
63 select_args = None
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
64 select_handlers = None
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
65 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
66 def registerfd(fd, mode, handler):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
67 if mode not in ('r', 'w', 'x'):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
68 raise ValueError, 'mode must be r, w or x'
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
69 if type(fd) <> type(0):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
70 fd = fd.fileno() # If this fails it's not a proper select arg
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
71 for i in range(len(fdlist)):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
72 if fdlist[i][:2] == (fd, mode):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
73 raise ValueError, \
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
74 '(fd, mode) combination already registered'
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
75 fdlist.append((fd, mode, handler))
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
76 make_select_args()
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
77 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
78 def unregisterfd(fd, *args):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
79 if type(fd) <> type(0):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
80 fd = fd.fileno() # If this fails it's not a proper select arg
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
81 args = (fd,) + args
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
82 n = len(args)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
83 for i in range(len(fdlist)):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
84 if fdlist[i][:n] == args:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
85 del fdlist[i]
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
86 make_select_args()
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
87 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
88 def make_select_args():
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
89 global select_args, select_handlers
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
90 rlist, wlist, xlist = [], [], []
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
91 rhandlers, whandlers, xhandlers = {}, {}, {}
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
92 for fd, mode, handler in fdlist:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
93 if mode == 'r':
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
94 rlist.append(fd)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
95 rhandlers[`fd`] = handler
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
96 if mode == 'w':
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
97 wlist.append(fd)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
98 whandlers[`fd`] = handler
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
99 if mode == 'x':
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
100 xlist.append(fd)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
101 xhandlers[`fd`] = handler
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
102 if rlist or wlist or xlist:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
103 select_args = rlist, wlist, xlist
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
104 select_handlers = rhandlers, whandlers, xhandlers
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
105 else:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
106 select_args = None
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
107 select_handlers = None
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
108 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
109 def do_select():
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
110 import select
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
111 reply = apply(select.select, select_args)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
112 for mode in 0, 1, 2:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
113 list = reply[mode]
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
114 for fd in list:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
115 handler = select_handlers[mode][`fd`]
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
116 handler(fd, 'rwx'[mode])
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
117
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
118
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 # Event processing main loop.
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 # Return when there are no windows left, or when an unhandled
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 # exception occurs. (It is safe to restart the main loop after
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 # an unsuccessful exit.)
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 # Python's stdwin.getevent() turns WE_COMMAND/WC_CANCEL events
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 # into KeyboardInterrupt exceptions; these are turned back in events.
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 #
1178
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
126 recursion_level = 0 # Hack to make it reentrant
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 def mainloop():
1178
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
128 global recursion_level
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
129 recursion_level = recursion_level + 1
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
130 try:
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
131 stdwin_select_handler() # Process events already in queue
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
132 while 1:
1190
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
133 if windows and not fdlist:
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
134 while windows and not fdlist:
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
135 try:
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
136 event = stdwinq.getevent()
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
137 except KeyboardInterrupt:
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
138 event = (WE_COMMAND, \
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
139 None, WC_CANCEL)
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
140 dispatch(event)
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
141 elif windows and fdlist:
ea8d4cce782b * Add some more tests for numbers
Guido van Rossum <guido@python.org>
parents: 1178
diff changeset
142 fd = stdwin.fileno()
1178
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
143 if recursion_level == 1:
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
144 registerfd(fd, 'r', stdwin_select_handler)
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
145 try:
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
146 while windows:
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
147 do_select()
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
148 stdwin_select_handler()
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
149 finally:
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
150 if recursion_level == 1:
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
151 unregisterfd(fd)
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
152 elif fdlist:
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
153 while fdlist and not windows:
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
154 do_select()
1178
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
155 else:
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
156 break
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
157 finally:
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
158 recursion_level = recursion_level - 1
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
159
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
160
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
161 # Check for events without ever blocking
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
162 #
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
163 def check():
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
164 stdwin_select_handler()
f9bbb01388d5 * More changes due to stricter argument passing rules
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
165 # XXX Should check for socket stuff as well
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
166
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
167
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
168 # Handle stdwin events until none are left
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
169 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
170 def stdwin_select_handler(*args):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
171 while 1:
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 try:
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
173 event = stdwinq.pollevent()
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 except KeyboardInterrupt:
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
175 event = (WE_COMMAND, None, WC_CANCEL)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
176 if event is None:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
177 break
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
178 dispatch(event)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
179
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
180
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
181 # Run a modal dialog loop for a window. The dialog window must have
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
182 # been registered first. This prohibits most events (except size/draw
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
183 # events) to other windows. The modal dialog loop ends when the
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
184 # dialog window unregisters itself.
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
185 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
186 passthrough = WE_SIZE, WE_DRAW
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
187 beeping = WE_MOUSE_DOWN, WE_COMMAND, WE_CHAR, WE_KEY, WE_CLOSE, WE_MENU
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
188 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
189 def modaldialog(window):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
190 if window not in windows:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
191 raise ValueError, 'modaldialog window not registered'
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
192 while window in windows:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
193 try:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
194 event = stdwinq.getevent()
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
195 except KeyboardInterrupt:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
196 event = WE_COMMAND, None, WC_CANCEL
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
197 etype, ewindow, edetail = event
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
198 if etype not in passthrough and ewindow <> window:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
199 if etype in beeping:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
200 stdwin.fleep()
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
201 continue
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
202 dispatch(event)
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 # Dispatch a single event.
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
206 # Events for the no window in particular are sent to the active window
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
207 # or to the last window that received an event (these hacks are for the
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
208 # WE_LOST_SEL event, which is directed to no particular window).
364
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 # Windows not in the windows list don't get their events:
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 # events for such windows are silently ignored.
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 #
0bf825f55ac1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 def dispatch(event):
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
213 global last_window
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
214 if event[1] == None:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
215 active = stdwin.getactive()
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
216 if active: last_window = active
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
217 else:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
218 last_window = event[1]
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
219 if last_window in windows:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
220 last_window.dispatch(event)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
221
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
222
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
223 # Dialog base class
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
224 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
225 class Dialog:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
226 #
1435
560ec7030817 * Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents: 1190
diff changeset
227 def __init__(self, title):
1095
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
228 self.window = stdwin.open(title)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
229 self.window.dispatch = self.dispatch
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
230 register(self.window)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
231 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
232 def close(self):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
233 unregister(self.window)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
234 del self.window.dispatch
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
235 self.window.close()
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
236 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
237 def dispatch(self, event):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
238 etype, ewindow, edetail = event
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
239 if etype == WE_CLOSE:
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
240 self.close()
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
241
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
242
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
243 # Standard modal dialogs
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
244 # XXX implemented using stdwin dialogs for now
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
245 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
246 def askstr(prompt, default):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
247 return stdwin.askstr(prompt, default)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
248 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
249 def askync(prompt, yesorno):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
250 return stdwin.askync(prompt, yesorno)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
251 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
252 def askfile(prompt, default, new):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
253 return stdwin.askfile(prompt, default, new)
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
254 #
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
255 def message(msg):
ac0828ef68f2 * mainloop.py: added facility for calling select(). Also added
Guido van Rossum <guido@python.org>
parents: 444
diff changeset
256 stdwin.message(msg)