Mercurial > cpython-lru_cache-weakref
annotate Lib/lib-stdwin/mainloop.py @ 5817:48b94de85bf3 legacy-trunk
Extensive changes by AMK.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Thu, 17 Jul 1997 16:29:42 +0000 |
| parents | 560ec7030817 |
| children |
| rev | line source |
|---|---|
| 364 | 1 # Standard main loop for *all* STDWIN applications. |
| 2 # This requires that applications: | |
| 3 # - register their windows on creation and unregister them when closed | |
| 4 # - have a 'dispatch' function as a window member | |
| 5 | |
| 6 | |
| 7 import stdwin, stdwinq | |
| 8 from stdwinevents import * | |
| 9 | |
| 10 | |
| 11 # List of windows known to the main loop. | |
| 12 # | |
| 13 windows = [] | |
| 14 | |
| 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 | 21 # Function to register a window. |
| 22 # | |
| 23 def register(win): | |
| 24 # First test the dispatch function by passing it a null event -- | |
| 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 | 27 if win not in windows: |
| 28 windows.append(win) | |
| 29 | |
| 30 | |
| 31 # Function to unregister a window. | |
| 32 # It is not an error to unregister an already unregistered window | |
| 33 # (this is useful for cleanup actions). | |
| 34 # | |
| 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 | 39 if win in windows: |
| 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 | 46 |
| 47 | |
| 48 # Interfaces used by WindowSched. | |
| 49 # | |
| 50 def countwindows(): | |
| 51 return len(windows) | |
| 52 # | |
| 53 def anywindow(): | |
| 54 if windows: | |
| 55 return windows[0] | |
| 56 else: | |
| 57 return None | |
| 58 | |
| 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 | 119 # Event processing main loop. |
| 120 # Return when there are no windows left, or when an unhandled | |
| 121 # exception occurs. (It is safe to restart the main loop after | |
| 122 # an unsuccessful exit.) | |
| 123 # Python's stdwin.getevent() turns WE_COMMAND/WC_CANCEL events | |
| 124 # into KeyboardInterrupt exceptions; these are turned back in events. | |
| 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 | 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 | 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 | 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 | 203 |
| 204 | |
| 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 | 209 # Windows not in the windows list don't get their events: |
| 210 # events for such windows are silently ignored. | |
| 211 # | |
| 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) |
