Esempio n. 1
0
imeth objrtn ObjectPool_im_gDispose(object self)
{ ObjectPool_iv_t *iv = GetIVs(ObjectPool, self);
	object ass; 

	while (ass = gFirst(iv->iObjects)) 
		gDisposeObject(self, (object) gPointerValue(gKey(ass))); 
	gDeepDispose(iv->iObjects); 
	return oSuper(ObjectPool_c, gDispose, self)(self); 
} 
Esempio n. 2
0
imeth objrtn ObjectPool_im_gDisposeObject(object self, object obj)
{ ObjectPool_iv_t *iv = GetIVs(ObjectPool, self);
	object pobj = gNewWithPtr(Pointer, obj); 
	object val = gFindValue(iv->iObjects, pobj); 
	if (val) { 
		if (IsObj(obj)) { 
			long v1 = gObjectSerialNumber(obj); 
			long v2 = gLongValue(gValue(val)); 
			if (v1 == v2) 
				gShortValue(gKey(val)) ? gDeepDispose(obj) : gDispose(obj); 
		} 
		gDeepDisposeObj(iv->iObjects, pobj); 
	} 
	gDispose(pobj); 
	return NULL; 
} 
Esempio n. 3
0
void glutMainLoop()
{
	char buffer[10]={0};

	char pressed = 0;
	int i;

	XAllowEvents(dpy, AsyncBoth, CurrentTime);

	while (gRunning)
	{

      while (XPending(dpy) > 0)
      {
         XEvent event;
         XNextEvent(dpy, &event);
         switch (event.type)
         {
         	case ClientMessage:
         		if (event.xclient.data.l[0] == (signed)wmDeleteMessage) // quit!
         			gRunning = 0;
	         	break;
         	case Expose: 
         		break; // Update event! Should do draw here.
         	case ConfigureNotify:
				if (gReshape)
	      			gReshape(event.xconfigure.width, event.xconfigure.height);
				else
				{
					glViewport(0, 0, event.xconfigure.width, event.xconfigure.height);
				}
				animate = 1;
      			break;
      		case KeyPress:
      		case KeyRelease:

      			if (event.type == KeyPress)
	      		{	if ((gKey)){
	      			gKey(event.xkey.keycode, event.xkey.x, event.xkey.y,event.xkey.state & ShiftMask ? 1 : 0);
	      			gKeymap[(int)buffer[0]] = 1;
	      		}
	      		}
	      		else
	      		{	if (gKeyUp) gKeyUp(buffer[0], 0, 0,0); gKeymap[(int)buffer[0]] = 0;}
      			break;
			case ButtonPress:
				gButtonPressed[event.xbutton.button] = 1;
				if (gMouseFunc != NULL)
					gMouseFunc(GLUT_LEFT_BUTTON, GLUT_DOWN, event.xbutton.x, event.xbutton.y);
				break;
			case ButtonRelease:
				gButtonPressed[event.xbutton.button] = 0;
				if (gMouseFunc != NULL)
					gMouseFunc(GLUT_LEFT_BUTTON, GLUT_UP, event.xbutton.x, event.xbutton.y);
				break;
		case MotionNotify:
				pressed = 0;
				for (i = 0; i < 5; i++)
					if (gButtonPressed[i]) pressed = 1;
					if (pressed && gMouseDragged)
						gMouseDragged(event.xbutton.x, event.xbutton.y);
					else
					if (gMouseMoved)
						gMouseMoved(event.xbutton.x, event.xbutton.y);
				break;

		default:
			break;
         }

      }
      
      if (animate)
      {
      	animate = 0;
		if (gDisplay)
		  	gDisplay();
		else
			printf("No display function!\n");
      }
		else
		if (gIdle) gIdle();
      checktimers();
   }

	glXMakeCurrent(dpy, None, NULL);
   glXDestroyContext(dpy, ctx);
   XDestroyWindow(dpy, win);
   XCloseDisplay(dpy);
}