blob: fc9e4cc309b9495803bc958eca7cb3ecba1f07c7 [file] [log] [blame]
/***********************************************************
* 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;