1
2 /* Copyright (c) Mark J. Kilgard, 1994. */
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 #include <assert.h>
9 #include <GL/glut_cgx.h>
10 #include "glutint.h"
11
12 /* CENTRY */
13 int APIENTRY
glutGet(GLenum param)14 glutGet(GLenum param)
15 {
16 Window win, root;
17 int x, y, value;
18 unsigned int width, height, border, depth;
19
20 switch (param) {
21 case GLUT_INIT_WINDOW_X:
22 return __glutInitX;
23 case GLUT_INIT_WINDOW_Y:
24 return __glutInitY;
25 case GLUT_INIT_WINDOW_WIDTH:
26 return __glutInitWidth;
27 case GLUT_INIT_WINDOW_HEIGHT:
28 return __glutInitHeight;
29 case GLUT_INIT_DISPLAY_MODE:
30 return __glutDisplayMode;
31 case GLUT_WINDOW_X:
32 XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
33 __glutRoot, 0, 0, &x, &y, &win);
34 return x;
35 case GLUT_WINDOW_Y:
36 XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
37 __glutRoot, 0, 0, &x, &y, &win);
38 return y;
39 case GLUT_WINDOW_WIDTH:
40 if (!__glutCurrentWindow->reshape) {
41 XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
42 &root, &x, &y,
43 &width, &height, &border, &depth);
44 return width;
45 }
46 return __glutCurrentWindow->width;
47 case GLUT_WINDOW_HEIGHT:
48 if (!__glutCurrentWindow->reshape) {
49 XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
50 &root, &x, &y,
51 &width, &height, &border, &depth);
52 return height;
53 }
54 return __glutCurrentWindow->height;
55
56 #define GET_CONFIG(attrib) { \
57 if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) { \
58 glXGetConfig(__glutDisplay, __glutCurrentWindow->vis, \
59 attrib, &value); \
60 } else { \
61 glXGetConfig(__glutDisplay, __glutCurrentWindow->overlay->vis, \
62 attrib, &value); \
63 } \
64 }
65
66 case GLUT_WINDOW_BUFFER_SIZE:
67 GET_CONFIG(GLX_BUFFER_SIZE);
68 return value;
69 case GLUT_WINDOW_STENCIL_SIZE:
70 GET_CONFIG(GLX_STENCIL_SIZE);
71 return value;
72 case GLUT_WINDOW_DEPTH_SIZE:
73 GET_CONFIG(GLX_DEPTH_SIZE);
74 return value;
75 case GLUT_WINDOW_RED_SIZE:
76 GET_CONFIG(GLX_RED_SIZE);
77 return value;
78 case GLUT_WINDOW_GREEN_SIZE:
79 GET_CONFIG(GLX_GREEN_SIZE);
80 return value;
81 case GLUT_WINDOW_BLUE_SIZE:
82 GET_CONFIG(GLX_BLUE_SIZE);
83 return value;
84 case GLUT_WINDOW_ALPHA_SIZE:
85 GET_CONFIG(GLX_ALPHA_SIZE);
86 return value;
87 case GLUT_WINDOW_ACCUM_RED_SIZE:
88 GET_CONFIG(GLX_ACCUM_RED_SIZE);
89 return value;
90 case GLUT_WINDOW_ACCUM_GREEN_SIZE:
91 GET_CONFIG(GLX_ACCUM_GREEN_SIZE);
92 return value;
93 case GLUT_WINDOW_ACCUM_BLUE_SIZE:
94 GET_CONFIG(GLX_ACCUM_BLUE_SIZE);
95 return value;
96 case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
97 GET_CONFIG(GLX_ACCUM_ALPHA_SIZE);
98 return value;
99 case GLUT_WINDOW_DOUBLEBUFFER:
100 GET_CONFIG(GLX_DOUBLEBUFFER);
101 return value;
102 case GLUT_WINDOW_RGBA:
103 GET_CONFIG(GLX_RGBA);
104 return value;
105 case GLUT_WINDOW_COLORMAP_SIZE:
106 GET_CONFIG(GLX_RGBA);
107 if (value) {
108 return 0;
109 } else {
110 #if defined(WIN32)
111 /* KLUDGE: we always assume 256 colors in CI mode on
112 Win32 */
113 return 256;
114 #else /* !WIN32 */
115 return __glutCurrentWindow->vis->visual->map_entries;
116 #endif /* WIN32 */
117 }
118 case GLUT_WINDOW_PARENT:
119 return __glutCurrentWindow->parent ?
120 __glutCurrentWindow->parent->num + 1 : 0;
121 case GLUT_WINDOW_NUM_CHILDREN:
122 {
123 int num = 0;
124 GLUTwindow *children = __glutCurrentWindow->children;
125
126 while (children) {
127 num++;
128 children = children->siblings;
129 }
130 return num;
131 }
132 case GLUT_WINDOW_NUM_SAMPLES:
133 #if defined(GLX_VERSION_1_1) && defined(GLX_SGIS_multisample)
134 if (__glutIsSupportedByGLX("GLX_SGIS_multisample")) {
135 GET_CONFIG(GLX_SAMPLES_SGIS);
136 return value;
137 } else {
138 return 0;
139 }
140 #else
141 /* Independent of GLX server support, multisampling not
142 supported by GLX client-side. */
143 return 0;
144 #endif
145 case GLUT_WINDOW_STEREO:
146 GET_CONFIG(GLX_STEREO);
147 return value;
148 case GLUT_WINDOW_CURSOR:
149 return __glutCurrentWindow->cursor;
150 case GLUT_SCREEN_WIDTH:
151 return DisplayWidth(__glutDisplay, __glutScreen);
152 case GLUT_SCREEN_HEIGHT:
153 return DisplayHeight(__glutDisplay, __glutScreen);
154 case GLUT_SCREEN_WIDTH_MM:
155 return DisplayWidthMM(__glutDisplay, __glutScreen);
156 case GLUT_SCREEN_HEIGHT_MM:
157 return DisplayHeightMM(__glutDisplay, __glutScreen);
158 case GLUT_MENU_NUM_ITEMS:
159 return __glutCurrentMenu->num;
160 case GLUT_DISPLAY_MODE_POSSIBLE:
161 {
162 XVisualInfo *vi;
163 Bool dummy, visAlloced;
164 #if defined(WIN32)
165 /* our fake glXChooseVisual (which is called by
166 __glutDetermineVisual) needs an HDC to work with, so grab one
167 from the "root" window. */
168 XHDC = GetDC(GetDesktopWindow());
169 #endif
170 vi = __glutDetermineWindowVisual(&dummy, &visAlloced);
171 #if defined(WIN32)
172 ReleaseDC(GetDesktopWindow(), XHDC);
173 #endif
174 if (vi) {
175 if (visAlloced)
176 XFree(vi);
177 return 1;
178 }
179 return 0;
180 }
181 case GLUT_ELAPSED_TIME:
182 {
183 struct timeval elapsed, beginning, now;
184
185 __glutInitTime(&beginning);
186 GETTIMEOFDAY(&now);
187 TIMEDELTA(elapsed, now, beginning);
188 /* Return elapsed milliseconds. */
189 #if defined(__vms)
190 return (int) (elapsed.val / TICKS_PER_MILLISECOND);
191 #else
192 return (int) ((elapsed.tv_sec * 1000) + (elapsed.tv_usec / 1000));
193 #endif
194 }
195 default:
196 __glutWarning("invalid glutGet parameter: %d", param);
197 return -1;
198 }
199 }
200 /* ENDCENTRY */
201