Clarify portability and main program.
[python/dscho.git] / Demo / sgi / gl / glstdwin / glstdwwin.py
blobb880b9a1f9a494f2902410fe649230a3625b854c
1 # Define window operations for STDWIN
3 import gl
4 from stdwinevents import *
5 from glstdwin import G # Global variables
6 from glstdwin import MASK # Tunable constant
8 class WindowObject:
10 def _init(self, title):
11 self._docsize = (0, 0)
12 self._fg = G.fg
13 self._bg = G.bg
14 self._title = title
15 self._font = G.font
16 self._size = G.size
17 self._menus = []
18 self._gid = gl.winopen(title)
19 gl.winconstraints() # To remove prefsize() effect
20 self._fixviewport()
21 self._needredraw()
22 return self
24 def close(self):
25 del G.windowmap[`self._gid`]
26 gl.winclose(self._gid)
27 self._gid = 0
29 def _needredraw(self):
30 if self in G.drawqueue:
31 G.drawqueue.remove(self)
32 G.drawqueue.append(self)
34 def begindrawing(self):
35 from glstdwdraw import DrawingObject
36 return DrawingObject()._init(self)
38 def change(self, area):
39 self._needredraw()
40 # XXX Should record the area to be drawn?
42 def gettitle(self):
43 return self._title
45 def getdocsize(self):
46 return self._docsize
48 def getorigin(self):
49 return self._area[0]
51 def getwinsize(self):
52 return self._area[1]
54 def scroll(self, area, by):
55 # XXX ought to use gl.rectcopy()
56 if by <> (0, 0):
57 self.change(area)
59 def setdocsize(self, docsize):
60 self._docsize = docsize
62 def setorigin(self, origin):
63 pass # XXX
65 def settimer(self, decisecs):
66 pass # XXX
68 def settitle(self, title):
69 self._title = title
70 gl.wintitle(title)
72 def show(self, area):
73 pass # XXX
75 def _fixviewport(self):
77 # Called after redraw or resize, and initially.
79 # Fix the coordinate system so that (0, 0) is top left,
80 # units are pixels, and positive axes point right and down.
82 # Make the viewport slightly larger than the window,
83 # and set the screenmask exactly to the window; this
84 # help fixing character clipping.
86 # Set self._area to the window rectangle in STDWIN coords.
88 gl.winset(self._gid)
89 gl.reshapeviewport()
90 x0, x1, y0, y1 = gl.getviewport()
91 width, height = x1-x0, y1-y0
92 gl.viewport(x0-MASK, x1+MASK, y0-MASK, y1+MASK)
93 gl.scrmask(x0, x1, y0, y1)
94 gl.ortho2(-MASK, width+MASK, height+MASK, -MASK)
95 self._area = (0, 0), (width, height)
97 def menucreate(self, title):
98 from glstdwmenu import MenuObject
99 menu = MenuObject()._init(self, title)
100 self._menus.append(menu)
101 return menu
103 def _domenu(self):
104 if not self._menus:
105 return None
106 if len(self._menus) == 1:
107 pup = self._menus[0]._makepup(0)
108 val = gl.dopup(pup)
109 gl.freepup(pup)
110 if val < 0:
111 return None
112 return WE_MENU, self, (self._menus[0], val)
114 # More than one menu: use nested menus.
116 pups = []
117 firstitem = 0
118 for menu in self._menus:
119 pups.append(menu._makepup(firstitem))
120 firstitem = firstitem + 100
121 pup = gl.newpup()
122 for i in range(len(self._menus)):
123 gl.addtopup(pup, self._menus[i]._title + '%m', pups[i])
124 val = gl.dopup(pup)
125 gl.freepup(pup)
126 for pup in pups:
127 gl.freepup(pup)
128 if val < 0:
129 return None
130 i_menu, i_item = divmod(val, 100)
131 return WE_MENU, self, (self._menus[i_menu], i_item)
133 def _doshortcut(self, char):
134 for menu in self._menus:
135 i = menu._checkshortcut(char)
136 if i >= 0:
137 return WE_MENU, self, (menu, i)
138 return None