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