blob: 7e05a57c03296ce697f73a18777aad2eb3daf0c0 [file] [log] [blame]
Guido van Rossum504b0bf1999-01-02 21:28:54 +00001from Tkinter import *
2
3class WindowList:
4
5 def __init__(self):
6 self.dict = {}
Guido van Rossum5437ddf1999-02-17 17:19:37 +00007 self.callbacks = []
Guido van Rossum504b0bf1999-01-02 21:28:54 +00008
9 def add(self, window):
Guido van Rossum5437ddf1999-02-17 17:19:37 +000010 window.after_idle(self.call_callbacks)
Guido van Rossum504b0bf1999-01-02 21:28:54 +000011 self.dict[str(window)] = window
12
13 def delete(self, window):
14 try:
15 del self.dict[str(window)]
16 except KeyError:
17 # Sometimes, destroy() is called twice
18 pass
Guido van Rossumbe5f2f11999-02-17 17:34:25 +000019 self.call_callbacks()
Guido van Rossum504b0bf1999-01-02 21:28:54 +000020
21 def add_windows_to_menu(self, menu):
22 list = []
23 for key in self.dict.keys():
24 window = self.dict[key]
Guido van Rossumec119a31999-02-08 22:27:49 +000025 try:
26 title = window.get_title()
27 except TclError:
28 continue
Guido van Rossum504b0bf1999-01-02 21:28:54 +000029 list.append((title, window))
30 list.sort()
31 for title, window in list:
32 if title == "Python Shell":
33 # Hack -- until we have a better way to this
34 continue
35 menu.add_command(label=title, command=window.wakeup)
36
Guido van Rossum5437ddf1999-02-17 17:19:37 +000037 def register_callback(self, callback):
38 self.callbacks.append(callback)
39
40 def unregister_callback(self, callback):
41 try:
Tim Peters70c43782001-01-17 08:48:39 +000042 self.callbacks.remove(callback)
Guido van Rossum553fa442000-02-15 18:03:01 +000043 except ValueError:
Guido van Rossum5437ddf1999-02-17 17:19:37 +000044 pass
45
46 def call_callbacks(self):
47 for callback in self.callbacks:
48 try:
49 callback()
50 except:
51 print "warning: callback failed in WindowList", \
52 sys.exc_type, ":", sys.exc_value
53
Guido van Rossum504b0bf1999-01-02 21:28:54 +000054registry = WindowList()
55
Guido van Rossum5437ddf1999-02-17 17:19:37 +000056add_windows_to_menu = registry.add_windows_to_menu
57register_callback = registry.register_callback
58unregister_callback = registry.unregister_callback
Guido van Rossum5437ddf1999-02-17 17:19:37 +000059
Guido van Rossum504b0bf1999-01-02 21:28:54 +000060
61class ListedToplevel(Toplevel):
62
63 def __init__(self, master, **kw):
64 Toplevel.__init__(self, master, kw)
65 registry.add(self)
66
67 def destroy(self):
68 registry.delete(self)
69 Toplevel.destroy(self)
70
71 def get_title(self):
72 # Subclass can override
73 return self.wm_title()
74
75 def wakeup(self):
Guido van Rossum2403b0c1999-01-09 22:01:33 +000076 try:
Guido van Rossum36911a11999-01-18 15:18:57 +000077 if self.wm_state() == "iconic":
78 self.wm_deiconify()
79 else:
80 self.tkraise()
Guido van Rossum2403b0c1999-01-09 22:01:33 +000081 self.focus_set()
82 except TclError:
83 # This can happen when the window menu was torn off.
84 # Simply ignore it.
85 pass