/*********************************************************** * 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;