blob: bc74348f569c95a1c9d3ebab2de1d28a38ff0ac2 [file] [log] [blame]
Georg Brandl14fc4272008-05-17 18:39:55 +00001from tkinter import *
David Scherer7aced172000-08-15 01:13:23 +00002
3class WindowList:
4
5 def __init__(self):
6 self.dict = {}
7 self.callbacks = []
8
9 def add(self, window):
10 window.after_idle(self.call_callbacks)
11 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
19 self.call_callbacks()
20
21 def add_windows_to_menu(self, menu):
22 list = []
Kurt B. Kaisere0712772007-08-23 05:25:55 +000023 for key in self.dict:
David Scherer7aced172000-08-15 01:13:23 +000024 window = self.dict[key]
25 try:
26 title = window.get_title()
27 except TclError:
28 continue
Amaury Forgeot d'Arc47c2b602008-11-28 23:28:42 +000029 list.append((title, key, window))
David Scherer7aced172000-08-15 01:13:23 +000030 list.sort()
Amaury Forgeot d'Arc47c2b602008-11-28 23:28:42 +000031 for title, key, window in list:
David Scherer7aced172000-08-15 01:13:23 +000032 menu.add_command(label=title, command=window.wakeup)
33
34 def register_callback(self, callback):
35 self.callbacks.append(callback)
36
37 def unregister_callback(self, callback):
38 try:
Steven M. Gava817a76c2001-07-12 05:35:17 +000039 self.callbacks.remove(callback)
David Scherer7aced172000-08-15 01:13:23 +000040 except ValueError:
41 pass
42
43 def call_callbacks(self):
44 for callback in self.callbacks:
45 try:
46 callback()
47 except:
Guido van Rossum69e80842006-04-17 23:13:00 +000048 t, v, tb = sys.exc_info()
Guido van Rossumbe19ed72007-02-09 05:37:30 +000049 print("warning: callback failed in WindowList", t, ":", v)
David Scherer7aced172000-08-15 01:13:23 +000050
51registry = WindowList()
52
53add_windows_to_menu = registry.add_windows_to_menu
54register_callback = registry.register_callback
55unregister_callback = registry.unregister_callback
56
57
58class ListedToplevel(Toplevel):
59
60 def __init__(self, master, **kw):
61 Toplevel.__init__(self, master, kw)
62 registry.add(self)
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000063 self.focused_widget = self
David Scherer7aced172000-08-15 01:13:23 +000064
65 def destroy(self):
66 registry.delete(self)
67 Toplevel.destroy(self)
Kurt B. Kaiserbeb6bd92002-10-04 21:54:41 +000068 # If this is Idle's last window then quit the mainloop
69 # (Needed for clean exit on Windows 98)
70 if not registry.dict:
71 self.quit()
David Scherer7aced172000-08-15 01:13:23 +000072
Kurt B. Kaiser260cb902003-06-06 21:58:38 +000073 def update_windowlist_registry(self, window):
74 registry.call_callbacks()
75
David Scherer7aced172000-08-15 01:13:23 +000076 def get_title(self):
77 # Subclass can override
78 return self.wm_title()
79
80 def wakeup(self):
81 try:
82 if self.wm_state() == "iconic":
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000083 self.wm_withdraw()
David Scherer7aced172000-08-15 01:13:23 +000084 self.wm_deiconify()
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000085 self.tkraise()
86 self.focused_widget.focus_set()
David Scherer7aced172000-08-15 01:13:23 +000087 except TclError:
88 # This can happen when the window menu was torn off.
89 # Simply ignore it.
90 pass