11# A 'WindowParent' is the only module that uses real stdwin functionality.
22# It is the root of the tree.
33# It should have exactly one child when realized.
4+ #
5+ # There is also some support for a standard main loop here.
46
57import stdwin
68from stdwinevents import *
911
1012Error = 'WindowParent.Error' # Exception
1113
14+ WindowList = [] # List containing all windows
15+
1216class WindowParent () = ManageOneChild ():
1317 #
1418 def create (self , (title , size )):
@@ -22,34 +26,55 @@ def _reset(self):
2226 self .win = 0
2327 self .itimer = 0
2428 self .do_mouse = 0
29+ self .do_keybd = 0
2530 self .do_timer = 0
31+ self .do_altdraw = 0
2632 #
2733 def destroy (self ):
34+ if self .win in WindowList :
35+ import util
36+ util .remove (self .win , WindowList )
2837 if self .child : self .child .destroy ()
2938 self ._reset ()
3039 #
3140 def need_mouse (self , child ): self .do_mouse = 1
3241 def no_mouse (self , child ): self .do_mouse = 0
3342 #
43+ def need_keybd (self , child ): self .do_keybd = 1
44+ def no_keybd (self , child ): self .do_keybd = 0
45+ #
3446 def need_timer (self , child ): self .do_timer = 1
3547 def no_timer (self , child ): self .do_timer = 0
3648 #
49+ def need_altdraw (self , child ): self .do_altdraw = 1
50+ def no_altdraw (self , child ): self .do_altdraw = 0
51+ #
3752 def realize (self ):
3853 if self .win :
3954 raise Error , 'realize(): called twice'
4055 if not self .child :
4156 raise Error , 'realize(): no child'
4257 size = self .child .minsize (self .beginmeasuring ())
4358 self .size = max (self .size [0 ], size [0 ]), \
44- max (self .size [1 ], size [1 ])
45- #stdwin.setdefwinsize(self.size)
59+ max (self .size [1 ], size [1 ])
60+ # XXX stdwin.setdefwinsize(self.size)
4661 # XXX Compensate stdwin bug:
47- stdwin .setdefwinsize (self .size [0 ]+ 4 , self .size [1 ]+ 2 )
62+ stdwin .setdefwinsize (self .size [0 ]+ 4 , min ( 300 , self .size [1 ]+ 2 ) )
4863 self .win = stdwin .open (self .title )
64+ self .win .setdocsize (self .size )
4965 if self .itimer :
5066 self .win .settimer (self .itimer )
5167 bounds = (0 , 0 ), self .win .getwinsize ()
5268 self .child .setbounds (bounds )
69+ self .child .realize ()
70+ self .win .dispatch = self .dispatch
71+ WindowList .append (self .win )
72+ #
73+ def fixup (self ):
74+ self .size = self .child .minsize (self .beginmeasuring ())
75+ self .win .setdocsize (self .size )
76+ bounds = (0 , 0 ), self .win .getwinsize ()
77+ self .child .setbounds (bounds )
5378 #
5479 def beginmeasuring (self ):
5580 # Return something with which a child can measure text
@@ -64,6 +89,12 @@ def begindrawing(self):
6489 else :
6590 raise Error , 'begindrawing(): not realized yet'
6691 #
92+ def getwindow (self ):
93+ if self .win :
94+ return self .win
95+ else :
96+ raise Error , 'getwindow(): not realized yet'
97+ #
6798 def change (self , area ):
6899 if self .win :
69100 self .win .change (area )
@@ -86,16 +117,42 @@ def dispatch(self, (type, win, detail)):
86117 elif type = WE_DRAW :
87118 d = self .win .begindrawing ()
88119 self .child .draw (d , detail )
120+ del d
121+ if self .do_altdraw : self .child .altdraw (detail )
89122 elif type = WE_MOUSE_DOWN :
90123 if self .do_mouse : self .child .mouse_down (detail )
91124 elif type = WE_MOUSE_MOVE :
92125 if self .do_mouse : self .child .mouse_move (detail )
93126 elif type = WE_MOUSE_UP :
94127 if self .do_mouse : self .child .mouse_up (detail )
128+ elif type in (WE_CHAR , WE_COMMAND ):
129+ if self .do_keybd : self .child .keybd (type , detail )
95130 elif type = WE_TIMER :
96131 if self .do_timer : self .child .timer ()
97132 elif type = WE_SIZE :
98- self .win . change (( 0 , 0 ), ( 10000 , 10000 )) # XXX
99- bounds = ( 0 , 0 ), self . win . getwinsize ()
100- self .child . setbounds ( bounds )
133+ self .fixup ()
134+ elif type = WE_CLOSE :
135+ self .destroy ( )
101136 #
137+
138+ def MainLoop ():
139+ while WindowList :
140+ Dispatch (stdwin .getevent ())
141+
142+ def Dispatch (event ):
143+ window = event [1 ]
144+ if window in WindowList :
145+ window .dispatch (event )
146+ else :
147+ stdwin .fleep ()
148+
149+ # Interface used by WindowSched:
150+
151+ def CountWindows ():
152+ return len (WindowList )
153+
154+ def AnyWindow ():
155+ if not WindowList :
156+ return None
157+ else :
158+ return WindowList [0 ]
0 commit comments