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