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); }
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; }
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); }