Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #ifndef __glutint_h__
  2. #define __glutint_h__
  3.  
  4. /* Copyright (c) Mark J. Kilgard, 1994, 1997, 1998. */
  5.  
  6. /* This program is freely distributable without licensing fees
  7.    and is provided without guarantee or warrantee expressed or
  8.    implied. This program is -not- in the public domain. */
  9.  
  10. #ifdef __VMS
  11. #include <GL/vms_x_fix.h>
  12. #endif
  13.  
  14. #if defined(__CYGWIN32__)
  15. #include <sys/time.h>
  16. #endif
  17.  
  18. #define SUPPORT_FORTRAN  /* With GLUT 3.7, everyone supports Fortran. */
  19.  
  20. #if defined(_WIN32)
  21. #include "glutwin32.h"
  22. #else
  23. #include <X11/Xlib.h>
  24. #include <X11/Xutil.h>
  25. #define GLX_GLXEXT_PROTOTYPES
  26. #include <GL/glx.h>
  27. #endif
  28.  
  29. #ifndef GLUT_BUILDING_LIB
  30. #define GLUT_BUILDING_LIB  /* Building the GLUT library itself. */
  31. #endif
  32.  
  33. #include <GL/glut.h>
  34.  
  35. #ifndef _WIN32
  36. /* added by BrianP: */
  37. #ifndef APIENTRY
  38. #define APIENTRY GLAPIENTRY
  39. #endif
  40. #define __cdecl GLAPIENTRY
  41. #define CDECL GLAPIENTRY
  42. #endif
  43.  
  44. /* GLUT_BUILDING_LIB is used by <GL/glut.h> to 1) not #pragma link
  45.    with the GLUT library, and 2) avoid the Win32 atexit hack. */
  46.  
  47. #ifdef SUPPORT_FORTRAN
  48. #include <GL/glutf90.h>
  49. #endif
  50.  
  51. #ifdef __vms
  52. #if ( __VMS_VER < 70000000 )
  53. #define OLD_VMS
  54. struct timeval6 {
  55.   __int64 val;
  56. };
  57. extern int sys$gettim(struct timeval6 *);
  58. #else
  59. #include <time.h>
  60. #endif
  61. #else
  62. #include <sys/types.h>
  63. #if !defined(_WIN32) || defined(__CYGWIN32__)
  64. #include <sys/time.h>
  65. #else
  66. #include <winsock.h>
  67. #endif
  68. #endif
  69. #if defined(__vms) && ( __VMS_VER < 70000000 )
  70.  
  71. /* For VMS6.2 or lower :
  72.    One TICK on VMS is 100 nanoseconds; 0.1 microseconds or
  73.    0.0001 milliseconds. This means that there are 0.01
  74.    ticks/ns, 10 ticks/us, 10,000 ticks/ms and 10,000,000
  75.    ticks/second. */
  76.  
  77. #define TICKS_PER_MILLISECOND 10000
  78. #define TICKS_PER_SECOND      10000000
  79.  
  80. #define GETTIMEOFDAY(_x) (void) sys$gettim (_x);
  81.  
  82. #define ADD_TIME(dest, src1, src2) { \
  83.   (dest).val = (src1).val + (src2).val; \
  84. }
  85.  
  86. #define TIMEDELTA(dest, src1, src2) { \
  87.   (dest).val = (src1).val - (src2).val; \
  88. }
  89.  
  90. #define IS_AFTER(t1, t2) ((t2).val > (t1).val)
  91.  
  92. #define IS_AT_OR_AFTER(t1, t2) ((t2).val >= (t1).val)
  93.  
  94. #else
  95. #if defined(SVR4) && !defined(sun)  /* Sun claims SVR4, but
  96.                                        wants 2 args. */
  97. #define GETTIMEOFDAY(_x) gettimeofday(_x)
  98. #else
  99. #define GETTIMEOFDAY(_x) gettimeofday(_x, NULL)
  100. #endif
  101. #define ADD_TIME(dest, src1, src2) { \
  102.   if(((dest).tv_usec = \
  103.     (src1).tv_usec + (src2).tv_usec) >= 1000000) { \
  104.     (dest).tv_usec -= 1000000; \
  105.     (dest).tv_sec = (src1).tv_sec + (src2).tv_sec + 1; \
  106.   } else { \
  107.     (dest).tv_sec = (src1).tv_sec + (src2).tv_sec; \
  108.     if(((dest).tv_sec >= 1) && (((dest).tv_usec <0))) { \
  109.       (dest).tv_sec --;(dest).tv_usec += 1000000; \
  110.     } \
  111.   } \
  112. }
  113. #define TIMEDELTA(dest, src1, src2) { \
  114.   if(((dest).tv_usec = (src1).tv_usec - (src2).tv_usec) < 0) { \
  115.     (dest).tv_usec += 1000000; \
  116.     (dest).tv_sec = (src1).tv_sec - (src2).tv_sec - 1; \
  117.   } else { \
  118.      (dest).tv_sec = (src1).tv_sec - (src2).tv_sec; \
  119.   } \
  120. }
  121. #define IS_AFTER(t1, t2) \
  122.   (((t2).tv_sec > (t1).tv_sec) || \
  123.   (((t2).tv_sec == (t1).tv_sec) && \
  124.   ((t2).tv_usec > (t1).tv_usec)))
  125. #define IS_AT_OR_AFTER(t1, t2) \
  126.   (((t2).tv_sec > (t1).tv_sec) || \
  127.   (((t2).tv_sec == (t1).tv_sec) && \
  128.   ((t2).tv_usec >= (t1).tv_usec)))
  129. #endif
  130.  
  131. #define IGNORE_IN_GAME_MODE() \
  132.   { if (__glutGameModeWindow) return; }
  133.  
  134. #define GLUT_WIND_IS_RGB(x)         (((x) & GLUT_INDEX) == 0)
  135. #define GLUT_WIND_IS_INDEX(x)       (((x) & GLUT_INDEX) != 0)
  136. #define GLUT_WIND_IS_SINGLE(x)      (((x) & GLUT_DOUBLE) == 0)
  137. #define GLUT_WIND_IS_DOUBLE(x)      (((x) & GLUT_DOUBLE) != 0)
  138. #define GLUT_WIND_HAS_ACCUM(x)      (((x) & GLUT_ACCUM) != 0)
  139. #define GLUT_WIND_HAS_ALPHA(x)      (((x) & GLUT_ALPHA) != 0)
  140. #define GLUT_WIND_HAS_DEPTH(x)      (((x) & GLUT_DEPTH) != 0)
  141. #define GLUT_WIND_HAS_STENCIL(x)    (((x) & GLUT_STENCIL) != 0)
  142. #define GLUT_WIND_IS_MULTISAMPLE(x) (((x) & GLUT_MULTISAMPLE) != 0)
  143. #define GLUT_WIND_IS_STEREO(x)      (((x) & GLUT_STEREO) != 0)
  144. #define GLUT_WIND_IS_LUMINANCE(x)   (((x) & GLUT_LUMINANCE) != 0)
  145. #define GLUT_MAP_WORK               (1 << 0)
  146. #define GLUT_EVENT_MASK_WORK        (1 << 1)
  147. #define GLUT_REDISPLAY_WORK         (1 << 2)
  148. #define GLUT_CONFIGURE_WORK         (1 << 3)
  149. #define GLUT_COLORMAP_WORK          (1 << 4)
  150. #define GLUT_DEVICE_MASK_WORK       (1 << 5)
  151. #define GLUT_FINISH_WORK            (1 << 6)
  152. #define GLUT_DEBUG_WORK             (1 << 7)
  153. #define GLUT_DUMMY_WORK             (1 << 8)
  154. #define GLUT_FULL_SCREEN_WORK       (1 << 9)
  155. #define GLUT_OVERLAY_REDISPLAY_WORK (1 << 10)
  156. #define GLUT_REPAIR_WORK            (1 << 11)
  157. #define GLUT_OVERLAY_REPAIR_WORK    (1 << 12)
  158.  
  159. /* Frame buffer capability macros and types. */
  160. #define RGBA                    0
  161. #define BUFFER_SIZE             1
  162. #define DOUBLEBUFFER            2
  163. #define STEREO                  3
  164. #define AUX_BUFFERS             4
  165. #define RED_SIZE                5  /* Used as mask bit for
  166.                                       "color selected". */
  167. #define GREEN_SIZE              6
  168. #define BLUE_SIZE               7
  169. #define ALPHA_SIZE              8
  170. #define DEPTH_SIZE              9
  171. #define STENCIL_SIZE            10
  172. #define ACCUM_RED_SIZE          11  /* Used as mask bit for
  173.                                        "acc selected". */
  174. #define ACCUM_GREEN_SIZE        12
  175. #define ACCUM_BLUE_SIZE         13
  176. #define ACCUM_ALPHA_SIZE        14
  177. #define LEVEL                   15
  178.  
  179. #define NUM_GLXCAPS             (LEVEL + 1)
  180.  
  181. #define XVISUAL                 (NUM_GLXCAPS + 0)
  182. #define TRANSPARENT             (NUM_GLXCAPS + 1)
  183. #define SAMPLES                 (NUM_GLXCAPS + 2)
  184. #define XSTATICGRAY             (NUM_GLXCAPS + 3)  /* Used as
  185.                                                       mask bit
  186.                                                       for "any
  187.                                                      visual type
  188.                                                      selected". */
  189. #define XGRAYSCALE              (NUM_GLXCAPS + 4)
  190. #define XSTATICCOLOR            (NUM_GLXCAPS + 5)
  191. #define XPSEUDOCOLOR            (NUM_GLXCAPS + 6)
  192. #define XTRUECOLOR              (NUM_GLXCAPS + 7)
  193. #define XDIRECTCOLOR            (NUM_GLXCAPS + 8)
  194. #define SLOW                    (NUM_GLXCAPS + 9)
  195. #define CONFORMANT              (NUM_GLXCAPS + 10)
  196.  
  197. #define NUM_CAPS                (NUM_GLXCAPS + 11)
  198.  
  199. /* Frame buffer capablities that don't have a corresponding
  200.    FrameBufferMode entry.  These get used as mask bits. */
  201. #define NUM                     (NUM_CAPS + 0)
  202. #define RGBA_MODE               (NUM_CAPS + 1)
  203. #define CI_MODE                 (NUM_CAPS + 2)
  204. #define LUMINANCE_MODE          (NUM_CAPS + 3)
  205.  
  206. #define NONE                    0
  207. #define EQ                      1
  208. #define NEQ                     2
  209. #define LTE                     3
  210. #define GTE                     4
  211. #define GT                      5
  212. #define LT                      6
  213. #define MIN                     7
  214.  
  215. typedef struct _Criterion {
  216.   int capability;
  217.   int comparison;
  218.   int value;
  219. } Criterion;
  220.  
  221. typedef struct _FrameBufferMode {
  222.   XVisualInfo *vi;
  223. #if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_fbconfig)
  224.  
  225.   /* fbc is non-NULL when the XVisualInfo* is not OpenGL-capable
  226.      (ie, GLX_USE_GL is false), but the SGIX_fbconfig extension shows
  227.      the visual's fbconfig is OpenGL-capable.  The reason for this is typically
  228.      an RGBA luminance fbconfig such as 16-bit StaticGray that could
  229.      not be advertised as a GLX visual since StaticGray visuals are
  230.      required (by the GLX specification) to be color index.  The
  231.      SGIX_fbconfig allows StaticGray visuals to instead advertised as
  232.      fbconfigs that can provide RGBA luminance support. */
  233.  
  234.   GLXFBConfigSGIX fbc;
  235. #endif
  236.   int valid;
  237.   int cap[NUM_CAPS];
  238. } FrameBufferMode;
  239.  
  240. /* DisplayMode capability macros for game mode. */
  241. #define DM_WIDTH        0  /* "width" */
  242. #define DM_HEIGHT       1  /* "height" */
  243. #define DM_PIXEL_DEPTH  2  /* "bpp" (bits per pixel) */
  244. #define DM_HERTZ        3  /* "hertz" */
  245. #define DM_NUM          4  /* "num" */
  246.  
  247. #define NUM_DM_CAPS     (DM_NUM+1)
  248.  
  249. typedef struct _DisplayMode {
  250. #ifdef _WIN32
  251.   DEVMODE devmode;
  252. #else
  253.   /* XXX The X Window System does not have a standard
  254.      mechanism for display setting changes.  On SGI
  255.      systems, GLUT could use the XSGIvc (SGI X video
  256.      control extension).  Perhaps this can be done in
  257.      a future release of GLUT. */
  258. #endif
  259.   int valid;
  260.   int cap[NUM_DM_CAPS];
  261. } DisplayMode;
  262.  
  263. /* GLUT  function types */
  264. typedef void (GLUTCALLBACK *GLUTdisplayCB) (void);
  265. typedef void (GLUTCALLBACK *GLUTreshapeCB) (int, int);
  266. typedef void (GLUTCALLBACK *GLUTkeyboardCB) (unsigned char, int, int);
  267. typedef void (GLUTCALLBACK *GLUTmouseCB) (int, int, int, int);
  268. typedef void (GLUTCALLBACK *GLUTmotionCB) (int, int);
  269. typedef void (GLUTCALLBACK *GLUTpassiveCB) (int, int);
  270. typedef void (GLUTCALLBACK *GLUTentryCB) (int);
  271. typedef void (GLUTCALLBACK *GLUTvisibilityCB) (int);
  272. typedef void (GLUTCALLBACK *GLUTwindowStatusCB) (int);
  273. typedef void (GLUTCALLBACK *GLUTidleCB) (void);
  274. typedef void (GLUTCALLBACK *GLUTtimerCB) (int);
  275. typedef void (GLUTCALLBACK *GLUTmenuStateCB) (int);  /* DEPRICATED. */
  276. typedef void (GLUTCALLBACK *GLUTmenuStatusCB) (int, int, int);
  277. typedef void (GLUTCALLBACK *GLUTselectCB) (int);
  278. typedef void (GLUTCALLBACK *GLUTspecialCB) (int, int, int);
  279. typedef void (GLUTCALLBACK *GLUTspaceMotionCB) (int, int, int);
  280. typedef void (GLUTCALLBACK *GLUTspaceRotateCB) (int, int, int);
  281. typedef void (GLUTCALLBACK *GLUTspaceButtonCB) (int, int);
  282. typedef void (GLUTCALLBACK *GLUTdialsCB) (int, int);
  283. typedef void (GLUTCALLBACK *GLUTbuttonBoxCB) (int, int);
  284. typedef void (GLUTCALLBACK *GLUTtabletMotionCB) (int, int);
  285. typedef void (GLUTCALLBACK *GLUTtabletButtonCB) (int, int, int, int);
  286. typedef void (GLUTCALLBACK *GLUTjoystickCB) (unsigned int buttonMask, int x, int y, int z);
  287.  
  288. typedef struct _GLUTcolorcell GLUTcolorcell;
  289. struct _GLUTcolorcell {
  290.   /* GLUT_RED, GLUT_GREEN, GLUT_BLUE */
  291.   GLfloat component[3];
  292. };
  293.  
  294. typedef struct _GLUTcolormap GLUTcolormap;
  295. struct _GLUTcolormap {
  296.   Visual *visual;       /* visual of the colormap */
  297.   Colormap cmap;        /* X colormap ID */
  298.   int refcnt;           /* number of windows using colormap */
  299.   int size;             /* number of cells in colormap */
  300.   int transparent;      /* transparent pixel, or -1 if opaque */
  301.   GLUTcolorcell *cells; /* array of cells */
  302.   GLUTcolormap *next;   /* next colormap in list */
  303. };
  304.  
  305. typedef struct _GLUTwindow GLUTwindow;
  306. typedef struct _GLUToverlay GLUToverlay;
  307. struct _GLUTwindow {
  308.   int num;              /* Small integer window id (0-based). */
  309.  
  310.   /* Window system related state. */
  311. #if defined(_WIN32)
  312.   int pf;               /* Pixel format. */
  313.   HDC hdc;              /* Window's Win32 device context. */
  314. #endif
  315.   Window win;           /* X window for GLUT window */
  316.   GLXContext ctx;       /* OpenGL context GLUT glut window */
  317.   XVisualInfo *vis;     /* visual for window */
  318.   Bool visAlloced;      /* if vis needs deallocate on destroy */
  319.   Colormap cmap;        /* RGB colormap for window; None if CI */
  320.   GLUTcolormap *colormap;  /* colormap; NULL if RGBA */
  321.   GLUToverlay *overlay; /* overlay; NULL if no overlay */
  322. #if defined(_WIN32)
  323.   HDC renderDc;         /* Win32's device context for rendering. */
  324. #endif
  325.   Window renderWin;     /* X window for rendering (might be
  326.                            overlay) */
  327.   GLXContext renderCtx; /* OpenGL context for rendering (might
  328.                            be overlay) */
  329.   /* GLUT settable or visible window state. */
  330.   int width;            /* window width in pixels */
  331.   int height;           /* window height in pixels */
  332.   int cursor;           /* cursor name */
  333.   int visState;         /* visibility state (-1 is unknown) */
  334.   int shownState;       /* if window mapped */
  335.   int entryState;       /* entry state (-1 is unknown) */
  336. #define GLUT_MAX_MENUS              3
  337.  
  338.   int menu[GLUT_MAX_MENUS];  /* attatched menu nums */
  339.   /* Window relationship state. */
  340.   GLUTwindow *parent;   /* parent window */
  341.   GLUTwindow *children; /* list of children */
  342.   GLUTwindow *siblings; /* list of siblings */
  343.   /* Misc. non-API visible (hidden) state. */
  344.   Bool treatAsSingle;   /* treat this window as single-buffered
  345.                            (it might be "fake" though) */
  346.   Bool forceReshape;    /* force reshape before display */
  347. #if !defined(_WIN32)
  348.   Bool isDirect;        /* if direct context (X11 only) */
  349. #endif
  350.   Bool usedSwapBuffers; /* if swap buffers used last display */
  351.   long eventMask;       /* mask of X events selected for */
  352.   int buttonUses;       /* number of button uses, ref cnt */
  353.   int tabletPos[2];     /* tablet position (-1 is invalid) */
  354.   /* Work list related state. */
  355.   unsigned int workMask;  /* mask of window work to be done */
  356.   GLUTwindow *prevWorkWin;  /* link list of windows to work on */
  357.   Bool desiredMapState; /* how to mapped window if on map work
  358.                            list */
  359.   Bool ignoreKeyRepeat;  /* if window ignores autorepeat */
  360.   int desiredConfMask;  /* mask of desired window configuration
  361.                          */
  362.   int desiredX;         /* desired X location */
  363.   int desiredY;         /* desired Y location */
  364.   int desiredWidth;     /* desired window width */
  365.   int desiredHeight;    /* desired window height */
  366.   int desiredStack;     /* desired window stack */
  367.   /* Per-window callbacks. */
  368.   GLUTdisplayCB display;  /* redraw */
  369.   GLUTreshapeCB reshape;  /* resize (width,height) */
  370.   GLUTmouseCB mouse;    /* mouse (button,state,x,y) */
  371.   GLUTmotionCB motion;  /* motion (x,y) */
  372.   GLUTpassiveCB passive;  /* passive motion (x,y) */
  373.   GLUTentryCB entry;    /* window entry/exit (state) */
  374.   GLUTkeyboardCB keyboard;  /* keyboard (ASCII,x,y) */
  375.   GLUTkeyboardCB keyboardUp;  /* keyboard up (ASCII,x,y) */
  376.   GLUTwindowStatusCB windowStatus;  /* window status */
  377.   GLUTvisibilityCB visibility;  /* visibility */
  378.   GLUTspecialCB special;  /* special key */
  379.   GLUTspecialCB specialUp;  /* special up key */
  380.   GLUTbuttonBoxCB buttonBox;  /* button box */
  381.   GLUTdialsCB dials;    /* dials */
  382.   GLUTspaceMotionCB spaceMotion;  /* Spaceball motion */
  383.   GLUTspaceRotateCB spaceRotate;  /* Spaceball rotate */
  384.   GLUTspaceButtonCB spaceButton;  /* Spaceball button */
  385.   GLUTtabletMotionCB tabletMotion;  /* tablet motion */
  386.   GLUTtabletButtonCB tabletButton;  /* tablet button */
  387. #ifdef _WIN32
  388.   GLUTjoystickCB joystick;  /* joystick */
  389.   int joyPollInterval; /* joystick polling interval */
  390. #endif
  391. #ifdef SUPPORT_FORTRAN
  392.   GLUTdisplayFCB fdisplay;  /* Fortran display  */
  393.   GLUTreshapeFCB freshape;  /* Fortran reshape  */
  394.   GLUTmouseFCB fmouse;  /* Fortran mouse  */
  395.   GLUTmotionFCB fmotion;  /* Fortran motion  */
  396.   GLUTpassiveFCB fpassive;  /* Fortran passive  */
  397.   GLUTentryFCB fentry;  /* Fortran entry  */
  398.   GLUTkeyboardFCB fkeyboard;  /* Fortran keyboard  */
  399.   GLUTkeyboardFCB fkeyboardUp;  /* Fortran keyboard up */
  400.   GLUTwindowStatusFCB fwindowStatus;  /* Fortran window status */
  401.   GLUTvisibilityFCB fvisibility;  /* Fortran visibility */
  402.   GLUTspecialFCB fspecial;  /* special key */
  403.   GLUTspecialFCB fspecialUp;  /* special key up */
  404.   GLUTbuttonBoxFCB fbuttonBox;  /* button box */
  405.   GLUTdialsFCB fdials;  /* dials */
  406.   GLUTspaceMotionFCB fspaceMotion;  /* Spaceball motion */
  407.   GLUTspaceRotateFCB fspaceRotate;  /* Spaceball rotate */
  408.   GLUTspaceButtonFCB fspaceButton;  /* Spaceball button */
  409.   GLUTtabletMotionFCB ftabletMotion;  /* tablet motion */
  410.   GLUTtabletButtonFCB ftabletButton;  /* tablet button */
  411. #ifdef _WIN32
  412.   GLUTjoystickFCB fjoystick;  /* joystick */
  413. #endif
  414. #endif
  415. };
  416.  
  417. struct _GLUToverlay {
  418. #if defined(_WIN32)
  419.   int pf;
  420.   HDC hdc;
  421. #endif
  422.   Window win;
  423.   GLXContext ctx;
  424.   XVisualInfo *vis;     /* visual for window */
  425.   Bool visAlloced;      /* if vis needs deallocate on destroy */
  426.   Colormap cmap;        /* RGB colormap for window; None if CI */
  427.   GLUTcolormap *colormap;  /* colormap; NULL if RGBA */
  428.   int shownState;       /* if overlay window mapped */
  429.   Bool treatAsSingle;   /* treat as single-buffered */
  430. #if !defined(_WIN32)
  431.   Bool isDirect;        /* if direct context */
  432. #endif
  433.   int transparentPixel; /* transparent pixel value */
  434.   GLUTdisplayCB display;  /* redraw  */
  435. #ifdef SUPPORT_FORTRAN
  436.   GLUTdisplayFCB fdisplay;  /* redraw  */
  437. #endif
  438. };
  439.  
  440. typedef struct _GLUTstale GLUTstale;
  441. struct _GLUTstale {
  442.   GLUTwindow *window;
  443.   Window win;
  444.   GLUTstale *next;
  445. };
  446.  
  447. extern GLUTstale *__glutStaleWindowList;
  448.  
  449. #define GLUT_OVERLAY_EVENT_FILTER_MASK \
  450.   (ExposureMask | \
  451.   StructureNotifyMask | \
  452.   EnterWindowMask | \
  453.   LeaveWindowMask)
  454. #define GLUT_DONT_PROPAGATE_FILTER_MASK \
  455.   (ButtonReleaseMask | \
  456.   ButtonPressMask | \
  457.   KeyPressMask | \
  458.   KeyReleaseMask | \
  459.   PointerMotionMask | \
  460.   Button1MotionMask | \
  461.   Button2MotionMask | \
  462.   Button3MotionMask)
  463. #define GLUT_HACK_STOP_PROPAGATE_MASK \
  464.   (KeyPressMask | \
  465.   KeyReleaseMask)
  466.  
  467. typedef struct _GLUTmenu GLUTmenu;
  468. typedef struct _GLUTmenuItem GLUTmenuItem;
  469. struct _GLUTmenu {
  470.   int id;               /* small integer menu id (0-based) */
  471.   Window win;           /* X window for the menu */
  472.   GLUTselectCB select;  /*  function of menu */
  473.   GLUTmenuItem *list;   /* list of menu entries */
  474.   int num;              /* number of entries */
  475. #if !defined(_WIN32)
  476.   Bool managed;         /* are the InputOnly windows size
  477.                            validated? */
  478.   Bool searched;        /* help detect menu loops */
  479.   int pixheight;        /* height of menu in pixels */
  480.   int pixwidth;         /* width of menu in pixels */
  481. #endif
  482.   int submenus;         /* number of submenu entries */
  483.   GLUTmenuItem *highlighted;  /* pointer to highlighted menu
  484.                                  entry, NULL not highlighted */
  485.   GLUTmenu *cascade;    /* currently cascading this menu  */
  486.   GLUTmenuItem *anchor; /* currently anchored to this entry */
  487.   int x;                /* current x origin relative to the
  488.                            root window */
  489.   int y;                /* current y origin relative to the
  490.                            root window */
  491. #ifdef SUPPORT_FORTRAN
  492.   GLUTselectFCB fselect;  /*  function of menu */
  493. #endif
  494. };
  495.  
  496. struct _GLUTmenuItem {
  497.   Window win;           /* InputOnly X window for entry */
  498.   GLUTmenu *menu;       /* menu entry belongs to */
  499.   Bool isTrigger;       /* is a submenu trigger? */
  500.   int value;            /* value to return for selecting this
  501.                            entry; doubles as submenu id
  502.                            (0-base) if submenu trigger */
  503. #if defined(_WIN32)
  504.   UINT unique;          /* unique menu item id (Win32 only) */
  505. #endif
  506.   char *label;          /* __glutStrdup'ed label string */
  507.   int len;              /* length of label string */
  508.   int pixwidth;         /* width of X window in pixels */
  509.   GLUTmenuItem *next;   /* next menu entry on list for menu */
  510. };
  511.  
  512. typedef struct _GLUTtimer GLUTtimer;
  513. struct _GLUTtimer {
  514.   GLUTtimer *next;      /* list of timers */
  515. #ifdef OLD_VMS
  516.    struct timeval6 timeout;  /* time to be called */
  517. #else
  518.    struct timeval timeout;  /* time to be called */
  519. #endif
  520.    GLUTtimerCB func;     /* timer  (value) */
  521.   int value;            /*  return value */
  522. #ifdef SUPPORT_FORTRAN
  523.   GLUTtimerFCB ffunc;   /* Fortran timer  */
  524. #endif
  525. };
  526.  
  527. typedef struct _GLUTeventParser GLUTeventParser;
  528. struct _GLUTeventParser {
  529.   int (*func) (XEvent *);
  530.   GLUTeventParser *next;
  531. };
  532.  
  533. /* Declarations to implement glutFullScreen support with
  534.    mwm/4Dwm. */
  535.  
  536. /* The following X property format is defined in Motif 1.1's
  537.    Xm/MwmUtils.h, but GLUT should not depend on that header
  538.    file. Note: Motif 1.2 expanded this structure with
  539.    uninteresting fields (to GLUT) so just stick with the
  540.    smaller Motif 1.1 structure. */
  541. typedef struct {
  542. #define MWM_HINTS_DECORATIONS   2
  543.   long flags;
  544.   long functions;
  545.   long decorations;
  546.   long input_mode;
  547. } MotifWmHints;
  548.  
  549. /* Make current and buffer swap macros. */
  550. #ifdef _WIN32
  551. #define MAKE_CURRENT_LAYER(window)                                    \
  552.   {                                                                   \
  553.     HGLRC currentContext = wglGetCurrentContext();                    \
  554.     HDC currentDc = wglGetCurrentDC();                                \
  555.                                                                       \
  556.     if (currentContext != window->renderCtx                           \
  557.       || currentDc != window->renderDc) {                             \
  558.       wglMakeCurrent(window->renderDc, window->renderCtx);            \
  559.     }                                                                 \
  560.   }
  561. #define MAKE_CURRENT_WINDOW(window)                                   \
  562.   {                                                                   \
  563.     HGLRC currentContext = wglGetCurrentContext();                    \
  564.     HDC currentDc = wglGetCurrentDC();                                \
  565.                                                                       \
  566.     if (currentContext != window->ctx || currentDc != window->hdc) {  \
  567.       wglMakeCurrent(window->hdc, window->ctx);                       \
  568.     }                                                                 \
  569.   }
  570. #define MAKE_CURRENT_OVERLAY(overlay) \
  571.   wglMakeCurrent(overlay->hdc, overlay->ctx)
  572. #define UNMAKE_CURRENT() \
  573.   wglMakeCurrent(NULL, NULL)
  574. #define SWAP_BUFFERS_WINDOW(window) \
  575.   SwapBuffers(window->hdc)
  576. #define SWAP_BUFFERS_LAYER(window) \
  577.   SwapBuffers(window->renderDc)
  578. #else
  579. #define MAKE_CURRENT_LAYER(window) \
  580.   glXMakeCurrent(__glutDisplay, window->renderWin, window->renderCtx)
  581. #define MAKE_CURRENT_WINDOW(window) \
  582.   glXMakeCurrent(__glutDisplay, window->win, window->ctx)
  583. #define MAKE_CURRENT_OVERLAY(overlay) \
  584.   glXMakeCurrent(__glutDisplay, overlay->win, overlay->ctx)
  585. #define UNMAKE_CURRENT() \
  586.   glXMakeCurrent(__glutDisplay, None, NULL)
  587. #define SWAP_BUFFERS_WINDOW(window) \
  588.   glXSwapBuffers(__glutDisplay, window->win)
  589. #define SWAP_BUFFERS_LAYER(window) \
  590.   glXSwapBuffers(__glutDisplay, window->renderWin)
  591. #endif
  592.  
  593. /* private variables from glut_event.c */
  594. extern GLUTwindow *__glutWindowWorkList;
  595. extern int __glutWindowDamaged;
  596. #ifdef SUPPORT_FORTRAN
  597. extern GLUTtimer *__glutTimerList;
  598. extern GLUTtimer *__glutNewTimer;
  599. #endif
  600. extern GLUTmenu *__glutMappedMenu;
  601.  
  602. extern void (*__glutUpdateInputDeviceMaskFunc) (GLUTwindow *);
  603. #if !defined(_WIN32)
  604. extern void (*__glutMenuItemEnterOrLeave)(GLUTmenuItem * item,
  605.   int num, int type);
  606. extern void (*__glutFinishMenu)(Window win, int x, int y);
  607. extern void (*__glutPaintMenu)(GLUTmenu * menu);
  608. extern void (*__glutStartMenu)(GLUTmenu * menu,
  609.   GLUTwindow * window, int x, int y, int x_win, int y_win);
  610. extern GLUTmenu * (*__glutGetMenuByNum)(int menunum);
  611. extern GLUTmenuItem * (*__glutGetMenuItem)(GLUTmenu * menu,
  612.   Window win, int *which);
  613. extern GLUTmenu * (*__glutGetMenu)(Window win);
  614. #endif
  615.  
  616. /* private variables from glut_init.c */
  617. extern Atom __glutWMDeleteWindow;
  618. extern Display *__glutDisplay;
  619. extern unsigned int __glutDisplayMode;
  620. extern char *__glutDisplayString;
  621. extern XVisualInfo *(*__glutDetermineVisualFromString) (char *string, Bool * treatAsSingle,
  622.   Criterion * requiredCriteria, int nRequired, int requiredMask, void **fbc);
  623. extern GLboolean __glutDebug;
  624. extern GLboolean __glutForceDirect;
  625. extern GLboolean __glutIconic;
  626. extern GLboolean __glutTryDirect;
  627. extern Window __glutRoot;
  628. extern XSizeHints __glutSizeHints;
  629. extern char **__glutArgv;
  630. extern char *__glutProgramName;
  631. extern int __glutArgc;
  632. extern int __glutConnectionFD;
  633. extern int __glutInitHeight;
  634. extern int __glutInitWidth;
  635. extern int __glutInitX;
  636. extern int __glutInitY;
  637. extern int __glutScreen;
  638. extern int __glutScreenHeight;
  639. extern int __glutScreenWidth;
  640. extern Atom __glutMotifHints;
  641. extern unsigned int __glutModifierMask;
  642. #ifdef _WIN32
  643. extern void (__cdecl *__glutExitFunc)(int retval);
  644. #endif
  645. extern char *__glutPPMFile;
  646.  
  647. /* private variables from glut_menu.c */
  648. extern GLUTmenuItem *__glutItemSelected;
  649. extern GLUTmenu **__glutMenuList;
  650. extern void (GLUTCALLBACK *__glutMenuStatusFunc) (int, int, int);
  651. extern void __glutMenuModificationError(void);
  652. extern void __glutSetMenuItem(GLUTmenuItem * item,
  653.   const char *label, int value, Bool isTrigger);
  654.  
  655. /* private variables from glut_win.c */
  656. extern GLUTwindow **__glutWindowList;
  657. extern GLUTwindow *__glutCurrentWindow;
  658. extern GLUTwindow *__glutMenuWindow;
  659. extern GLUTmenu *__glutCurrentMenu;
  660. extern int __glutWindowListSize;
  661. extern void (*__glutFreeOverlayFunc) (GLUToverlay *);
  662. extern void __glutFreeOverlay(GLUToverlay * overlay);
  663. extern XVisualInfo *__glutDetermineWindowVisual(Bool * treatAsSingle,
  664.   Bool * visAlloced, void **fbc);
  665.  
  666. /* private variables from glut_ppm.c */
  667. extern void __glutWritePPMFile(void);
  668.  
  669. /* private variables from glut_mesa.c */
  670. extern int __glutMesaSwapHackSupport;
  671.  
  672. /* private variables from glut_gamemode.c */
  673. extern GLUTwindow *__glutGameModeWindow;
  674.  
  675. /* private routines from glut_cindex.c */
  676. extern GLUTcolormap * __glutAssociateNewColormap(XVisualInfo * vis);
  677. extern void __glutFreeColormap(GLUTcolormap *);
  678.  
  679. /* private routines from glut_cmap.c */
  680. extern void __glutSetupColormap(
  681.   XVisualInfo * vi,
  682.   GLUTcolormap ** colormap,
  683.   Colormap * cmap);
  684. #if !defined(_WIN32)
  685. extern void __glutEstablishColormapsProperty(
  686.   GLUTwindow * window);
  687. extern GLUTwindow *__glutToplevelOf(GLUTwindow * window);
  688. #endif
  689.  
  690. /* private routines from glut_cursor.c */
  691. extern void __glutSetCursor(GLUTwindow *window);
  692.  
  693. /* private routines from glut_event.c */
  694. extern void __glutPutOnWorkList(GLUTwindow * window,
  695.   int work_mask);
  696. extern void __glutRegisterEventParser(GLUTeventParser * parser);
  697. extern void __glutPostRedisplay(GLUTwindow * window, int layerMask);
  698. extern void handleTimeouts(void);
  699.  
  700. /* private routines from glut_init.c */
  701. #if !defined(_WIN32)
  702. extern void __glutOpenXConnection(char *display);
  703. #else
  704. extern void __glutOpenWin32Connection(char *display);
  705. #endif
  706. #ifdef OLD_VMS
  707. extern void __glutInitTime(struct timeval6 *beginning);
  708. #else
  709. extern void __glutInitTime(struct timeval *beginning);
  710. #endif
  711.  
  712. /* private routines for glut_menu.c (or win32_menu.c) */
  713. #if defined(_WIN32)
  714. extern GLUTmenu *__glutGetMenu(Window win);
  715. extern GLUTmenu *__glutGetMenuByNum(int menunum);
  716. extern GLUTmenuItem *__glutGetMenuItem(GLUTmenu * menu,
  717.   Window win, int *which);
  718. extern void __glutStartMenu(GLUTmenu * menu,
  719.   GLUTwindow * window, int x, int y, int x_win, int y_win);
  720. extern void __glutFinishMenu(Window win, int x, int y);
  721. #endif
  722. extern void __glutSetMenu(GLUTmenu * menu);
  723.  
  724. /* private routines from glut_util.c */
  725. extern char * __glutStrdup(const char *string);
  726. extern void __glutWarning(char *format,...);
  727. extern void __glutFatalError(char *format,...);
  728. extern void __glutFatalUsage(char *format,...);
  729.  
  730. /* private routines from glut_win.c */
  731. extern GLUTwindow *__glutGetWindow(Window win);
  732. extern void __glutChangeWindowEventMask(long mask, Bool add);
  733. extern XVisualInfo *__glutDetermineVisual(
  734.   unsigned int mode,
  735.   Bool * fakeSingle,
  736.   XVisualInfo * (getVisualInfo) (unsigned int));
  737. extern XVisualInfo *__glutGetVisualInfo(unsigned int mode);
  738. extern void __glutSetWindow(GLUTwindow * window);
  739. extern void __glutReshapeFunc(GLUTreshapeCB reshapeFunc,
  740.   int callingConvention);
  741. extern void GLUTCALLBACK __glutDefaultReshape(int, int);
  742. extern GLUTwindow *__glutCreateWindow(
  743.   GLUTwindow * parent,
  744.   int x, int y, int width, int height, int gamemode);
  745. extern void __glutDestroyWindow(
  746.   GLUTwindow * window,
  747.   GLUTwindow * initialWindow);
  748.  
  749. #if !defined(_WIN32)
  750. /* private routines from glut_glxext.c */
  751. extern int __glutIsSupportedByGLX(char *);
  752. extern int __glut_glXBindChannelToWindowSGIX(Display *dpy, int screen,
  753.                                              int channel, Window window);
  754. extern int __glut_glXChannelRectSGIX(Display *dpy, int screen, int channel,
  755.                                      int x, int y, int w, int h);
  756. extern int __glut_glXQueryChannelRectSGIX(Display *dpy, int screen,
  757.                                           int channel, int *x, int *y,
  758.                                           int *w, int *h);
  759. extern int __glut_glXQueryChannelDeltasSGIX(Display *dpy, int screen,
  760.                                             int channel, int *dx, int *dy,
  761.                                             int *dw, int *dh);
  762. extern int __glut_glXChannelRectSyncSGIX(Display *dpy, int screen, int channel,
  763.                                          GLenum synctype);
  764. extern GLXContext __glut_glXCreateContextWithConfigSGIX(Display *dpy,
  765.                                                         GLXFBConfigSGIX config,
  766.                                                         int render_type,
  767.                                                         GLXContext share_list,
  768.                                                         Bool direct);
  769. extern int __glut_glXGetFBConfigAttribSGIX(Display *dpy,
  770.                                            GLXFBConfigSGIX config,
  771.                                            int attribute,
  772.                                            int *value);
  773. extern GLXFBConfigSGIX __glut_glXGetFBConfigFromVisualSGIX(Display *dpy,
  774.                                                            XVisualInfo *vis);
  775. #endif
  776.  
  777. /* private routines from glut_input.c */
  778. extern void  __glutUpdateInputDeviceMask(GLUTwindow * window);
  779.  
  780. /* private routines from glut_mesa.c */
  781. extern void __glutDetermineMesaSwapHackSupport(void);
  782.  
  783. /* private routines from glut_gameglut.c */
  784. extern void __glutCloseDownGameMode(void);
  785.  
  786. /* private variables from glut_swap.c (BrianP) */
  787. extern GLint __glutFPS;
  788. extern GLint __glutSwapCount;
  789. extern GLint __glutSwapTime;
  790.  
  791. #if defined(_WIN32)
  792. /* private routines from win32_*.c */
  793. extern LONG WINAPI __glutWindowProc(HWND win, UINT msg, WPARAM w, LPARAM l);
  794. extern HDC XHDC;
  795. #endif
  796.  
  797.  
  798. #endif /* __glutint_h__ */
  799.