bool context_linux::update() { XEvent event; do { XNextEvent(dpy, &event); switch (event.type) { case KeyPress: { KeySym keysym; XKeyEvent *kevent; char buffer[1]; /* It is necessary to convert the keycode to a * keysym before checking if it is an escape */ kevent = (XKeyEvent *) & event; if ((XLookupString((XKeyEvent *) & event, buffer, 1, &keysym, NULL) == 1) && (keysym == (KeySym) XK_Escape)) exit(0); break; } case ButtonPress: XButtonEvent *buttonevt; buttonevt = (XButtonEvent *) & event; break; case ConfigureNotify: glViewport(0, 0, event.xconfigure.width, event.xconfigure.height); /* fall through... */ case Expose: break; default: break; } } while (XPending(dpy)); /* loop to compress events */ // update animation state // spawn new layers // go through layers and cleanup glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (save_to_video) appendVideoFrame(); glXSwapBuffers(dpy, win); return true; }
void UBQuickTimeFile::run() { EnterMoviesOnThread(kCSAcceptThreadSafeComponentsOnlyMode); mSouldStopCompression = false; mPendingFrames = 0; createCompressionSession(); mCompressionSessionRunning = true; emit compressionSessionStarted(); while(!mSouldStopCompression) { frameQueueMutex.lock(); //qDebug() << "run .... wait" << QTime::currentTime(); frameBufferNotEmpty.wait(&UBQuickTimeFile::frameQueueMutex); //qDebug() << "awakend ..." << QTime::currentTime(); if (!frameQueue.isEmpty()) { QQueue<VideoFrame> localQueue = frameQueue; frameQueue.clear(); frameQueueMutex.unlock(); while (!localQueue.isEmpty()) { VideoFrame frame = localQueue.dequeue(); appendVideoFrame(frame.buffer, frame.timestamp); } } else { frameQueueMutex.unlock(); } } flushPendingFrames(); }