root/src/libs/glut/glutBlocker.h
/***********************************************************
 *      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.h
 *
 *      DESCRIPTION:    helper class for GLUT event loop.
 *              if a window receives an event, wake up the event loop.
 ***********************************************************/

/***********************************************************
 *      Headers
 ***********************************************************/
#include <kernel/OS.h>

/***********************************************************
 *      CLASS:  GlutBlocker
 *
 *      DESCRIPTION:  Fairly naive, but safe implementation.
 *              global semaphore controls access to state
 *              event semaphore blocks WaitEvent() call if necessary
 *              (this is basically a condition variable class)
 ***********************************************************/
class GlutBlocker {
public:
        GlutBlocker();
        ~GlutBlocker();
        void WaitEvent();               // wait for new event
        void WaitEvent(bigtime_t usecs);        // wait with timeout
        void NewEvent();                // new event from a window (may need to wakeup main thread)
        void QuickNewEvent() { events = true; } // new event from main thread
        void ClearEvents() { events = false; }          // clear counter at beginning of event loop
        bool PendingEvent() { return events; }          // XPending() equivalent
private:
        sem_id gSem;
        sem_id eSem;
        bool events;    // are there any new events?
        bool sleeping;  // is someone sleeping on eSem?
};

/***********************************************************
 *      Global variable
 ***********************************************************/
extern GlutBlocker gBlock;