docs: def on_click(self, button, button_state, cursor_x, cursor_y):
          """ Mouse button clicked.
              Glut calls this function when a mouse button is
              clicked or released.
          """
          self.isdragging = False
          if button == glut.GLUT_LEFT_BUTTON and button_state == glut.GLUT_UP:
              # Left button released
              self.lastrot = copy.copy(self.thisrot)  # Set Last Static Rotation To Last Dynamic One
          elif button == glut.GLUT_LEFT_BUTTON and button_state == glut.GLUT_DOWN:
              # Left button clicked down
              self.lastrot = copy.copy(self.thisrot)  # Set Last Static Rotation To Last Dynamic One
              self.isdragging = True  # Prepare For Dragging
              mouse_pt = arcball.Point2fT(cursor_x, cursor_y)
              self.arcball.click(mouse_pt)  # Update Start Vector And Prepare For Dragging
          elif button == glut.GLUT_RIGHT_BUTTON and button_state == glut.GLUT_DOWN:
              # If a mouse click location was requested, return it to caller
              if hasattr(self, 'event_port'):
                  self.mouseclick_port = self.event_port
                  del self.event_port
              if hasattr(self, 'mouseclick_port'):
                  self.send_mouseclick_to_caller(cursor_x, cursor_y)
          elif button == glut.GLUT_MIDDLE_BUTTON and button_state == glut.GLUT_DOWN:
              # If a mouse click location was requested, return it to caller
              if hasattr(self, 'event_port'):
                  self.mouseclick_port = self.event_port
                  del self.event_port
              if hasattr(self, 'mouseclick_port'):
                  self.send_mouseclick_to_caller(cursor_x, cursor_y, button='middle')
          glut.glutPostRedisplay()