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