-            if not self.init:
-                self.InitGL()
-                self.init = True
-
-            self.OnDraw()
-
-        def OnMouseDown(self, evt):
-            self.CaptureMouse()
-
-        def OnMouseUp(self, evt):
-            self.ReleaseMouse()
-
-        def OnMouseMotion(self, evt):
-            if evt.Dragging() and evt.LeftIsDown():
-                self.x, self.y = self.lastx, self.lasty
-                self.x, self.y = evt.GetPosition()
-                self.Refresh(False)
-
-
-    class CubeCanvas(MyCanvasBase):
-        def InitGL(self):
-            # set viewing projection
-            glcanvas.glMatrixMode(glcanvas.GL_PROJECTION);
-            glcanvas.glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);
-
-            # position viewer
-            glcanvas.glMatrixMode(glcanvas.GL_MODELVIEW);
-            glcanvas.glTranslatef(0.0, 0.0, -2.0);
-
-            # position object
-            glcanvas.glRotatef(self.y, 1.0, 0.0, 0.0);
-            glcanvas.glRotatef(self.x, 0.0, 1.0, 0.0);
-
-            glcanvas.glEnable(glcanvas.GL_DEPTH_TEST);
-            glcanvas.glEnable(glcanvas.GL_LIGHTING);
-            glcanvas.glEnable(glcanvas.GL_LIGHT0);
-
-
-        def OnDraw(self):
-            # clear color and depth buffers
-            glcanvas.glClear(glcanvas.GL_COLOR_BUFFER_BIT | glcanvas.GL_DEPTH_BUFFER_BIT)
-
-            # draw six faces of a cube
-            glcanvas.glBegin(glcanvas.GL_QUADS)
-            glcanvas.glNormal3f( 0.0, 0.0, 1.0)
-            glcanvas.glVertex3f( 0.5, 0.5, 0.5)
-            glcanvas.glVertex3f(-0.5, 0.5, 0.5)
-            glcanvas.glVertex3f(-0.5,-0.5, 0.5)
-            glcanvas.glVertex3f( 0.5,-0.5, 0.5)
-
-            glcanvas.glNormal3f( 0.0, 0.0,-1.0)
-            glcanvas.glVertex3f(-0.5,-0.5,-0.5)
-            glcanvas.glVertex3f(-0.5, 0.5,-0.5)
-            glcanvas.glVertex3f( 0.5, 0.5,-0.5)
-            glcanvas.glVertex3f( 0.5,-0.5,-0.5)
-
-            glcanvas.glNormal3f( 0.0, 1.0, 0.0)
-            glcanvas.glVertex3f( 0.5, 0.5, 0.5)
-            glcanvas.glVertex3f( 0.5, 0.5,-0.5)
-            glcanvas.glVertex3f(-0.5, 0.5,-0.5)
-            glcanvas.glVertex3f(-0.5, 0.5, 0.5)
-
-            glcanvas.glNormal3f( 0.0,-1.0, 0.0)
-            glcanvas.glVertex3f(-0.5,-0.5,-0.5)
-            glcanvas.glVertex3f( 0.5,-0.5,-0.5)
-            glcanvas.glVertex3f( 0.5,-0.5, 0.5)
-            glcanvas.glVertex3f(-0.5,-0.5, 0.5)
-
-            glcanvas.glNormal3f( 1.0, 0.0, 0.0)
-            glcanvas.glVertex3f( 0.5, 0.5, 0.5)
-            glcanvas.glVertex3f( 0.5,-0.5, 0.5)
-            glcanvas.glVertex3f( 0.5,-0.5,-0.5)
-            glcanvas.glVertex3f( 0.5, 0.5,-0.5)
-
-            glcanvas.glNormal3f(-1.0, 0.0, 0.0)
-            glcanvas.glVertex3f(-0.5,-0.5,-0.5)
-            glcanvas.glVertex3f(-0.5,-0.5, 0.5)
-            glcanvas.glVertex3f(-0.5, 0.5, 0.5)
-            glcanvas.glVertex3f(-0.5, 0.5,-0.5)
-            glcanvas.glEnd()
-
-            glcanvas.glRotatef((self.lasty - self.y)/100., 1.0, 0.0, 0.0);
-            glcanvas.glRotatef((self.lastx - self.x)/100., 0.0, 1.0, 0.0);
-
-            self.SwapBuffers()
-
-
-    class ConeCanvas(MyCanvasBase):
-        def InitGL( self ):
-            glcanvas.glMatrixMode(glcanvas.GL_PROJECTION);
-            # camera frustrum setup
-            glcanvas.glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);
-            glcanvas.glMaterial(glcanvas.GL_FRONT, glcanvas.GL_AMBIENT, [0.2, 0.2, 0.2, 1.0])
-            glcanvas.glMaterial(glcanvas.GL_FRONT, glcanvas.GL_DIFFUSE, [0.8, 0.8, 0.8, 1.0])
-            glcanvas.glMaterial(glcanvas.GL_FRONT, glcanvas.GL_SPECULAR, [1.0, 0.0, 1.0, 1.0])
-            glcanvas.glMaterial(glcanvas.GL_FRONT, glcanvas.GL_SHININESS, 50.0)
-            glcanvas.glLight(glcanvas.GL_LIGHT0, glcanvas.GL_AMBIENT, [0.0, 1.0, 0.0, 1.0])
-            glcanvas.glLight(glcanvas.GL_LIGHT0, glcanvas.GL_DIFFUSE, [1.0, 1.0, 1.0, 1.0])
-            glcanvas.glLight(glcanvas.GL_LIGHT0, glcanvas.GL_SPECULAR, [1.0, 1.0, 1.0, 1.0])
-            glcanvas.glLight(glcanvas.GL_LIGHT0, glcanvas.GL_POSITION, [1.0, 1.0, 1.0, 0.0]);
-            glcanvas.glLightModel(glcanvas.GL_LIGHT_MODEL_AMBIENT, [0.2, 0.2, 0.2, 1.0])
-            glcanvas.glEnable(glcanvas.GL_LIGHTING)
-            glcanvas.glEnable(glcanvas.GL_LIGHT0)
-            glcanvas.glDepthFunc(glcanvas.GL_LESS)
-            glcanvas.glEnable(glcanvas.GL_DEPTH_TEST)
-            glcanvas.glClear(glcanvas.GL_COLOR_BUFFER_BIT | glcanvas.GL_DEPTH_BUFFER_BIT)
-            # position viewer
-            glcanvas.glMatrixMode(glcanvas.GL_MODELVIEW);
-
-
-        def OnDraw(self):
-            # clear color and depth buffers
-            glcanvas.glClear(glcanvas.GL_COLOR_BUFFER_BIT | glcanvas.GL_DEPTH_BUFFER_BIT);
-            # use a fresh transformation matrix
-            glcanvas.glPushMatrix()
-            # position object
-            glcanvas.glTranslate(0.0, 0.0, -2.0);
-            glcanvas.glRotate(30.0, 1.0, 0.0, 0.0);
-            glcanvas.glRotate(30.0, 0.0, 1.0, 0.0);
-
-            glcanvas.glTranslate(0, -1, 0)
-            glcanvas.glRotate(250, 1, 0, 0)
-            glcanvas.glutSolidCone(0.5, 1, 30, 5)
-            glcanvas.glPopMatrix()
-            glcanvas.glRotatef((self.lasty - self.y)/100., 0.0, 0.0, 1.0);
-            glcanvas.glRotatef(0.0, (self.lastx - self.x)/100., 1.0, 0.0);
-            # push into visible buffer
-            self.SwapBuffers()