# 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 #