xref: /haiku/src/libs/glut/glutGet.cpp (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 /***********************************************************
2  *      Copyright (C) 1997, Be Inc.  Copyright (C) 1999, Jake Hamby.
3  *
4  * This program is freely distributable without licensing fees
5  * and is provided without guarantee or warrantee expressed or
6  * implied. This program is -not- in the public domain.
7  *
8  *
9  *  FILE:	glutGet.cpp
10  *
11  *	DESCRIPTION:	get state information from GL
12  ***********************************************************/
13 
14 /***********************************************************
15  *	Headers
16  ***********************************************************/
17 #include <GL/glut.h>
18 #include <string.h>
19 #include <Autolock.h>
20 #include <Screen.h>
21 
22 #include "glutint.h"
23 #include "glutState.h"
24 
25 /***********************************************************
26  *	Global variables
27  ***********************************************************/
28 // rough guess, since we don't know how big the monitor really is
29 const float dots_per_mm = (72/25.4);	// dots per millimeter
30 
31 /***********************************************************
32  *	FUNCTION:	glutGet (9.1)
33  *
34  *	DESCRIPTION:  retrieve window and GL state
35  ***********************************************************/
36 int glutGet(GLenum state) {
37 	switch(state) {
38 	case GLUT_WINDOW_X:
39 		{BAutolock winlock(gState.currentWindow->Window());	// need to lock the window
40 		if (gState.currentWindow->parent)
41 			return (int)gState.currentWindow->Frame().left;
42 		else
43 			return (int)gState.currentWindow->Window()->Frame().left;
44 		}
45 	case GLUT_WINDOW_Y:
46 		{BAutolock winlock(gState.currentWindow->Window());
47 		if (gState.currentWindow->parent)
48 			return (int)gState.currentWindow->Frame().top;
49 		else
50 			return (int)gState.currentWindow->Window()->Frame().top;
51 		}
52 	case GLUT_WINDOW_WIDTH:
53 		{BAutolock winlock(gState.currentWindow->Window());
54 		return gState.currentWindow->m_width;
55 		}
56 	case GLUT_WINDOW_HEIGHT:
57 		{BAutolock winlock(gState.currentWindow->Window());
58 		return gState.currentWindow->m_height;
59 		}
60 	case GLUT_WINDOW_PARENT:
61 		{BAutolock winlock(gState.currentWindow->Window());
62 		if(gState.currentWindow->parent)
63 			return gState.currentWindow->parent->num + 1;
64 		else
65 			return 0;
66 		}
67 	case GLUT_WINDOW_NUM_CHILDREN:
68 		{BAutolock winlock(gState.currentWindow->Window());
69 		int num = 0;
70 		GlutWindow *children = gState.currentWindow->children;
71 		while (children) {
72 			num++;
73 			children = children->siblings;
74 		}
75 		return num;
76 		}
77   case GLUT_WINDOW_BUFFER_SIZE:	// best guesses
78   case GLUT_WINDOW_DEPTH_SIZE:
79         return 32;
80 
81   case GLUT_WINDOW_STENCIL_SIZE:
82   case GLUT_WINDOW_RED_SIZE:		// always 24-bit color
83   case GLUT_WINDOW_GREEN_SIZE:
84   case GLUT_WINDOW_BLUE_SIZE:
85   case GLUT_WINDOW_ALPHA_SIZE:
86   case GLUT_WINDOW_ACCUM_RED_SIZE:
87   case GLUT_WINDOW_ACCUM_GREEN_SIZE:
88   case GLUT_WINDOW_ACCUM_BLUE_SIZE:
89   case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
90         return 8;
91 
92   case GLUT_WINDOW_DOUBLEBUFFER:	// always double-buffered RGBA
93   case GLUT_WINDOW_RGBA:
94         return 1;
95 
96   case GLUT_WINDOW_COLORMAP_SIZE:	// don't support these
97   case GLUT_WINDOW_NUM_SAMPLES:
98   case GLUT_WINDOW_STEREO:
99         return 0;
100 
101  	case GLUT_WINDOW_CURSOR:
102  		return gState.currentWindow->cursor;	// don't need to lock window since it won't change
103 
104 	case GLUT_SCREEN_WIDTH:
105 		return (int)(BScreen().Frame().Width()) + 1;
106 	case GLUT_SCREEN_HEIGHT:
107 		return (int)(BScreen().Frame().Height()) + 1;
108 	case GLUT_SCREEN_WIDTH_MM:
109 		return (int)((BScreen().Frame().Width() + 1) / dots_per_mm);
110 	case GLUT_SCREEN_HEIGHT_MM:
111 		return (int)((BScreen().Frame().Height() + 1) / dots_per_mm);
112 	case GLUT_MENU_NUM_ITEMS:
113 		return gState.currentMenu->num;
114 	case GLUT_DISPLAY_MODE_POSSIBLE:
115 		return __glutConvertDisplayMode(0);	// returns 1 if possible
116 	case GLUT_INIT_DISPLAY_MODE:
117 		return gState.displayMode;
118 	case GLUT_INIT_WINDOW_X:
119 		return gState.initX;
120 	case GLUT_INIT_WINDOW_Y:
121 		return gState.initY;
122 	case GLUT_INIT_WINDOW_WIDTH:
123 		return gState.initWidth;
124 	case GLUT_INIT_WINDOW_HEIGHT:
125 		return gState.initHeight;
126 	case GLUT_ELAPSED_TIME:
127 		bigtime_t elapsed, beginning, now;
128 		__glutInitTime(&beginning);
129 		now = system_time();
130 		elapsed = now - beginning;
131 		return (int) (elapsed / 1000);	// 1000 ticks in a millisecond
132 	default:
133 		__glutWarning("invalid glutGet parameter: %d", state);
134 		return -1;
135 	}
136 }
137 
138 /***********************************************************
139  *	FUNCTION:	glutLayerGet (9.2)
140  *
141  *	DESCRIPTION:  since we don't support layers, this is easy
142  ***********************************************************/
143 int glutLayerGet(GLenum info) {
144 	switch(info) {
145 	case GLUT_OVERLAY_POSSIBLE:
146 	case GLUT_HAS_OVERLAY:
147 		return 0;
148 	case GLUT_LAYER_IN_USE:
149 		return GLUT_NORMAL;
150 	case GLUT_TRANSPARENT_INDEX:
151 		return -1;
152 	case GLUT_NORMAL_DAMAGED:
153 		return gState.currentWindow->displayEvent;
154 	case GLUT_OVERLAY_DAMAGED:
155 		return -1;
156 	default:
157 		__glutWarning("invalid glutLayerGet param: %d", info);
158 		return -1;
159 	}
160 }
161 
162 /***********************************************************
163  *	FUNCTION:	glutDeviceGet (9.3)
164  *
165  *	DESCRIPTION:  get info about I/O devices we support
166  *		easy, since BeOS only supports a keyboard and mouse now
167  ***********************************************************/
168 int glutDeviceGet(GLenum info) {
169 	switch(info) {
170 	case GLUT_HAS_KEYBOARD:
171 	case GLUT_HAS_MOUSE:
172 		return 1;
173 
174 	case GLUT_HAS_SPACEBALL:
175 	case GLUT_NUM_SPACEBALL_BUTTONS:
176 	case GLUT_HAS_DIAL_AND_BUTTON_BOX:
177 	case GLUT_NUM_DIALS:
178 	case GLUT_NUM_BUTTON_BOX_BUTTONS:
179 	case GLUT_HAS_TABLET:
180 	case GLUT_NUM_TABLET_BUTTONS:
181 	case GLUT_HAS_JOYSTICK:
182 	case GLUT_JOYSTICK_POLL_RATE:
183 	case GLUT_JOYSTICK_BUTTONS:
184 	case GLUT_JOYSTICK_AXES:
185 		return 0;
186 
187 	case GLUT_NUM_MOUSE_BUTTONS:
188 	    {
189 		int32 mouseButtons = 3;		// good guess
190 		if(get_mouse_type(&mouseButtons) != B_OK) {
191 			__glutWarning("error getting number of mouse buttons");
192 		}
193 		return mouseButtons;
194 	    }
195 
196 	case GLUT_DEVICE_IGNORE_KEY_REPEAT:
197 		if (gState.currentWindow)
198 			return gState.currentWindow->ignoreKeyRepeat;
199  		return 0;
200 
201 	case GLUT_DEVICE_KEY_REPEAT:
202 		return GLUT_KEY_REPEAT_DEFAULT;
203 
204 	default:
205 		__glutWarning("invalid glutDeviceGet parameter: %d", info);
206 		return -1;
207 	}
208 }
209 
210 /***********************************************************
211  *	FUNCTION:	glutGetModifiers (9.4)
212  *
213  *	DESCRIPTION:  get the modifier key state for the current window
214  ***********************************************************/
215 int glutGetModifiers() {
216 	if(gState.modifierKeys == (int) ~0) {
217 	  __glutWarning(
218 		"glutCurrentModifiers: do not call outside core input callback.");
219     return 0;
220 	}
221 	return gState.modifierKeys;
222 }
223 
224 
225 #ifdef __HAIKU__
226 
227 extern "C" {
228 GLUTproc __glutGetProcAddress(const char* procName);
229 }
230 
231 GLUTproc
232 __glutGetProcAddress(const char* procName)
233 {
234 	if (gState.currentWindow)
235 		return (GLUTproc) gState.currentWindow->GetGLProcAddress(procName);
236 	return NULL;
237 }
238 
239 #endif
240