blob: b2488b28cabe7ef363eafcf77f972e9af5458cf8 [file] [log] [blame]
Georg Brandl14fc4272008-05-17 18:39:55 +00001from tkinter import *
David Scherer7aced172000-08-15 01:13:23 +00002
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -04003
David Scherer7aced172000-08-15 01:13:23 +00004class WindowList:
5
6 def __init__(self):
7 self.dict = {}
8 self.callbacks = []
9
10 def add(self, window):
11 window.after_idle(self.call_callbacks)
12 self.dict[str(window)] = window
13
14 def delete(self, window):
15 try:
16 del self.dict[str(window)]
17 except KeyError:
18 # Sometimes, destroy() is called twice
19 pass
20 self.call_callbacks()
21
22 def add_windows_to_menu(self, menu):
23 list = []
Kurt B. Kaisere0712772007-08-23 05:25:55 +000024 for key in self.dict:
David Scherer7aced172000-08-15 01:13:23 +000025 window = self.dict[key]
26 try:
27 title = window.get_title()
28 except TclError:
29 continue
Amaury Forgeot d'Arc47c2b602008-11-28 23:28:42 +000030 list.append((title, key, window))
David Scherer7aced172000-08-15 01:13:23 +000031 list.sort()
Amaury Forgeot d'Arc47c2b602008-11-28 23:28:42 +000032 for title, key, window in list:
David Scherer7aced172000-08-15 01:13:23 +000033 menu.add_command(label=title, command=window.wakeup)
34
35 def register_callback(self, callback):
36 self.callbacks.append(callback)
37
38 def unregister_callback(self, callback):
39 try:
Steven M. Gava817a76c2001-07-12 05:35:17 +000040 self.callbacks.remove(callback)
David Scherer7aced172000-08-15 01:13:23 +000041 except ValueError:
42 pass
43
44 def call_callbacks(self):
45 for callback in self.callbacks:
46 try:
47 callback()
48 except:
Guido van Rossum69e80842006-04-17 23:13:00 +000049 t, v, tb = sys.exc_info()
Guido van Rossumbe19ed72007-02-09 05:37:30 +000050 print("warning: callback failed in WindowList", t, ":", v)
David Scherer7aced172000-08-15 01:13:23 +000051
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -040052
David Scherer7aced172000-08-15 01:13:23 +000053registry = WindowList()
54
55add_windows_to_menu = registry.add_windows_to_menu
56register_callback = registry.register_callback
57unregister_callback = registry.unregister_callback
58
59
60class ListedToplevel(Toplevel):
61
62 def __init__(self, master, **kw):
63 Toplevel.__init__(self, master, kw)
64 registry.add(self)
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000065 self.focused_widget = self
David Scherer7aced172000-08-15 01:13:23 +000066
67 def destroy(self):
68 registry.delete(self)
69 Toplevel.destroy(self)
Kurt B. Kaiserbeb6bd92002-10-04 21:54:41 +000070 # If this is Idle's last window then quit the mainloop
71 # (Needed for clean exit on Windows 98)
72 if not registry.dict:
73 self.quit()
David Scherer7aced172000-08-15 01:13:23 +000074
Kurt B. Kaiser260cb902003-06-06 21:58:38 +000075 def update_windowlist_registry(self, window):
76 registry.call_callbacks()
77
David Scherer7aced172000-08-15 01:13:23 +000078 def get_title(self):
79 # Subclass can override
80 return self.wm_title()
81
82 def wakeup(self):
83 try:
84 if self.wm_state() == "iconic":
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000085 self.wm_withdraw()
David Scherer7aced172000-08-15 01:13:23 +000086 self.wm_deiconify()
Kurt B. Kaiser183403a2004-08-22 05:14:32 +000087 self.tkraise()
88 self.focused_widget.focus_set()
David Scherer7aced172000-08-15 01:13:23 +000089 except TclError:
Terry Jan Reedya361e892018-06-20 21:25:59 -040090 # This can happen when the Window menu was torn off.
David Scherer7aced172000-08-15 01:13:23 +000091 # Simply ignore it.
92 pass
Terry Jan Reedy4d921582018-06-19 19:12:52 -040093
94
95if __name__ == "__main__":
96 from unittest import main
Terry Jan Reedya361e892018-06-20 21:25:59 -040097 main('idlelib.idle_test.test_window', verbosity=2)