/*********************************************************** * Copyright (C) 1997, Be Inc. Copyright (C) 1999, Jake Hamby. * * This program is freely distributable without licensing fees * and is provided without guarantee or warrantee expressed or * implied. This program is -not- in the public domain. * * FILE: glutBlocker.cpp * * DESCRIPTION: helper class for GLUT event loop. * if a window receives an event, wake up the event loop. ***********************************************************/ /*********************************************************** * Headers ***********************************************************/ #include "glutBlocker.h" /*********************************************************** * Global variable ***********************************************************/ GlutBlocker gBlock; /*********************************************************** * Member functions ***********************************************************/ GlutBlocker::GlutBlocker() { gSem = create_sem(1, "gSem"); eSem = create_sem(0, "eSem"); events = false; sleeping = false; } GlutBlocker::~GlutBlocker() { delete_sem(eSem); delete_sem(gSem); } void GlutBlocker::WaitEvent() { acquire_sem(gSem); if(!events) { // wait for new event sleeping = true; release_sem(gSem); acquire_sem(eSem); // next event will release eSem } else { release_sem(gSem); } } void GlutBlocker::WaitEvent(bigtime_t usecs) { acquire_sem(gSem); if(!events) { // wait for new event sleeping = true; release_sem(gSem); acquire_sem_etc(eSem, 1, B_TIMEOUT, usecs); // wait for next event or timeout } else { release_sem(gSem); } } void GlutBlocker::NewEvent() { acquire_sem(gSem); events = true; // next call to WaitEvent returns immediately if(sleeping) { sleeping = false; release_sem(eSem); // if event loop is blocking, wake it up } release_sem(gSem); }