diff options
Diffstat (limited to 'Demo/sgi/gl/glstdwin/glstdwwin.py')
-rw-r--r-- | Demo/sgi/gl/glstdwin/glstdwwin.py | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/Demo/sgi/gl/glstdwin/glstdwwin.py b/Demo/sgi/gl/glstdwin/glstdwwin.py new file mode 100644 index 0000000..e024545 --- /dev/null +++ b/Demo/sgi/gl/glstdwin/glstdwwin.py @@ -0,0 +1,139 @@ +# Define window operations for STDWIN + +import gl +from stdwinevents import * +from glstdwin import G # Global variables +from glstdwin import MASK # Tunable constant + +class WindowObject: + # + def _init(self, title): + self._docsize = (0, 0) + self._fg = G.fg + self._bg = G.bg + self._title = title + self._font = G.font + self._size = G.size + self._menus = [] + self._gid = gl.winopen(title) + gl.winconstraints() # To remove prefsize() effect + self._fixviewport() + self._needredraw() + return self + # + def close(self): + del G.windowmap[`self._gid`] + gl.winclose(self._gid) + self._gid = 0 + # + def _needredraw(self): + if self in G.drawqueue: + G.drawqueue.remove(self) + G.drawqueue.append(self) + # + def begindrawing(self): + from glstdwdraw import DrawingObject + return DrawingObject()._init(self) + # + def change(self, area): + self._needredraw() + # XXX Should record the area to be drawn? + # + def gettitle(self): + return self._title + # + def getdocsize(self): + return self._docsize + # + def getorigin(self): + return self._area[0] + # + def getwinsize(self): + return self._area[1] + # + def scroll(self, (area, by)): + # XXX ought to use gl.rectcopy() + if by <> (0, 0): + self.change(area) + # + def setdocsize(self, docsize): + self._docsize = docsize + # + def setorigin(self, origin): + pass # XXX + # + def settimer(self, decisecs): + pass # XXX + # + def settitle(self, title): + self._title = title + gl.wintitle(title) + # + def show(self, area): + pass # XXX + # + def _fixviewport(self): + # + # Called after redraw or resize, and initially. + # + # Fix the coordinate system so that (0, 0) is top left, + # units are pixels, and positive axes point right and down. + # + # Make the viewport slightly larger than the window, + # and set the screenmask exactly to the window; this + # help fixing character clipping. + # + # Set self._area to the window rectangle in STDWIN coords. + # + gl.winset(self._gid) + gl.reshapeviewport() + x0, x1, y0, y1 = gl.getviewport() + width, height = x1-x0, y1-y0 + gl.viewport(x0-MASK, x1+MASK, y0-MASK, y1+MASK) + gl.scrmask(x0, x1, y0, y1) + gl.ortho2(-MASK, width+MASK, height+MASK, -MASK) + self._area = (0, 0), (width, height) + # + def menucreate(self, title): + from glstdwmenu import MenuObject + menu = MenuObject()._init(self, title) + self._menus.append(menu) + return menu + # + def _domenu(self): + if not self._menus: + return None + if len(self._menus) == 1: + pup = self._menus[0]._makepup(0) + val = gl.dopup(pup) + gl.freepup(pup) + if val < 0: + return None + return WE_MENU, self, (self._menus[0], val) + # + # More than one menu: use nested menus. + # + pups = [] + firstitem = 0 + for menu in self._menus: + pups.append(menu._makepup(firstitem)) + firstitem = firstitem + 100 + pup = gl.newpup() + for i in range(len(self._menus)): + gl.addtopup(pup, self._menus[i]._title + '%m', pups[i]) + val = gl.dopup(pup) + gl.freepup(pup) + for pup in pups: + gl.freepup(pup) + if val < 0: + return None + i_menu, i_item = divmod(val, 100) + return WE_MENU, self, (self._menus[i_menu], i_item) + # + def _doshortcut(self, char): + for menu in self._menus: + i = menu._checkshortcut(char) + if i >= 0: + return WE_MENU, self, (menu, i) + return None + # |