aboutsummaryrefslogtreecommitdiffstats
path: root/src/glut/beos/glutBlocker.h
blob: fc9e4cc309b9495803bc958eca7cb3ecba1f07c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/***********************************************************
 *      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;