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