Merge commit 'origin/gallium-master-merge'
[mesa.git] / src / glut / glx / glutint.h
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__ */