Minor tweaks to get the fbconfig list returned by __driCreateNewScreen
[mesa.git] / src / glut / beos / glutBlocker.cpp
1 /***********************************************************
2 * Copyright (C) 1997, Be Inc. All rights reserved.
3 *
4 * FILE: glutBlocker.cpp
5 *
6 * DESCRIPTION: helper class for GLUT event loop.
7 * if a window receives an event, wake up the event loop.
8 ***********************************************************/
9
10 /***********************************************************
11 * Headers
12 ***********************************************************/
13 #include "glutBlocker.h"
14
15 /***********************************************************
16 * Global variable
17 ***********************************************************/
18 GlutBlocker gBlock;
19
20 /***********************************************************
21 * Member functions
22 ***********************************************************/
23 GlutBlocker::GlutBlocker() {
24 gSem = create_sem(1, "gSem");
25 eSem = create_sem(0, "eSem");
26 events = false;
27 sleeping = false;
28 }
29
30 GlutBlocker::~GlutBlocker() {
31 delete_sem(eSem);
32 delete_sem(gSem);
33 }
34
35 void GlutBlocker::WaitEvent() {
36 acquire_sem(gSem);
37 if(!events) { // wait for new event
38 sleeping = true;
39 release_sem(gSem);
40 acquire_sem(eSem); // next event will release eSem
41 } else {
42 release_sem(gSem);
43 }
44 }
45
46 void GlutBlocker::WaitEvent(bigtime_t usecs) {
47 acquire_sem(gSem);
48 if(!events) { // wait for new event
49 sleeping = true;
50 release_sem(gSem);
51 acquire_sem_etc(eSem, 1, B_TIMEOUT, usecs); // wait for next event or timeout
52 } else {
53 release_sem(gSem);
54 }
55 }
56
57 void GlutBlocker::NewEvent() {
58 acquire_sem(gSem);
59 events = true; // next call to WaitEvent returns immediately
60 if(sleeping) {
61 sleeping = false;
62 release_sem(eSem); // if event loop is blocking, wake it up
63 }
64 release_sem(gSem);
65 }