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