-
Notifications
You must be signed in to change notification settings - Fork 0
/
freeglut_internal.h
854 lines (735 loc) · 27.6 KB
/
freeglut_internal.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
/*
* freeglut_internal.h
*
* The freeglut library private include file.
*
* Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
* Written by Pawel W. Olszta, <[email protected]>
* Creation date: Thu Dec 2 1999
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef FREEGLUT_INTERNAL_H
#define FREEGLUT_INTERNAL_H
/* XXX Update these for each release! */
#define VERSION_MAJOR 2
#define VERSION_MINOR 2
#define VERSION_PATCH 0
/*
* Freeglut is meant to be available under all Unix/X11 and Win32 platforms.
*/
#if defined(_WIN32_WCE)
# define TARGET_HOST_UNIX_X11 0
# define TARGET_HOST_WIN32 0
# define TARGET_HOST_WINCE 1
#elif defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__)
# define TARGET_HOST_UNIX_X11 0
# define TARGET_HOST_WIN32 1
# define TARGET_HOST_WINCE 0
#else
# define TARGET_HOST_UNIX_X11 1
# define TARGET_HOST_WIN32 0
# define TARGET_HOST_WINCE 0
#endif
#define FREEGLUT_MAX_MENUS 3
/*
* Somehow all Win32 include headers depend on this one:
*/
#if TARGET_HOST_WIN32
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include <tchar.h>
#endif
#if defined(_MSC_VER)
#define strdup _strdup
#endif
/*
* Those files should be available on every platform.
*/
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <assert.h>
#include <stdarg.h>
#if TARGET_HOST_UNIX_X11
#include <unistd.h>
#include <sys/time.h>
#endif
/*
* The system-dependant include files should go here:
*/
#if TARGET_HOST_UNIX_X11
#include <GL/glx.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
#include <X11/extensions/xf86vmode.h>
#endif
#endif
/*
* Microsoft VisualC++ 5.0's <math.h> does not define the PI
*/
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif
#ifndef TRUE
# define TRUE 1
#endif
#ifndef FALSE
# define FALSE 0
#endif
/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
/*
* Freeglut callbacks type definitions
*/
typedef void (* FGCBDisplay )( void );
typedef void (* FGCBReshape )( int, int );
typedef void (* FGCBVisibility )( int );
typedef void (* FGCBKeyboard )( unsigned char, int, int );
typedef void (* FGCBSpecial )( int, int, int );
typedef void (* FGCBMouse )( int, int, int, int );
typedef void (* FGCBMouseWheel )( int, int, int, int );
typedef void (* FGCBMotion )( int, int );
typedef void (* FGCBPassive )( int, int );
typedef void (* FGCBEntry )( int );
typedef void (* FGCBWindowStatus )( int );
typedef void (* FGCBSelect )( int, int, int );
typedef void (* FGCBJoystick )( unsigned int, int, int, int );
typedef void (* FGCBKeyboardUp )( unsigned char, int, int );
typedef void (* FGCBSpecialUp )( int, int, int );
typedef void (* FGCBOverlayDisplay)( void );
typedef void (* FGCBSpaceMotion )( int, int, int );
typedef void (* FGCBSpaceRotation )( int, int, int );
typedef void (* FGCBSpaceButton )( int, int );
typedef void (* FGCBDials )( int, int );
typedef void (* FGCBButtonBox )( int, int );
typedef void (* FGCBTabletMotion )( int, int );
typedef void (* FGCBTabletButton )( int, int, int, int );
typedef void (* FGCBDestroy )( void );
/*
* The global callbacks type definitions
*/
typedef void (* FGCBIdle )( void );
typedef void (* FGCBTimer )( int );
typedef void (* FGCBMenuState )( int );
typedef void (* FGCBMenuStatus )( int, int, int );
/*
* The callback used when creating/using menus
*/
typedef void (* FGCBMenu )( int );
/*
* A list structure
*/
typedef struct tagSFG_List SFG_List;
struct tagSFG_List
{
void *First;
void *Last;
};
/*
* A list node structure
*/
typedef struct tagSFG_Node SFG_Node;
struct tagSFG_Node
{
void *Next;
void *Prev;
};
/*
* A helper structure holding two ints and a boolean
*/
typedef struct tagSFG_XYUse SFG_XYUse;
struct tagSFG_XYUse
{
GLint X, Y; /* The two integers... */
GLboolean Use; /* ...and a single boolean. */
};
/*
* A helper structure holding a timeval and a boolean
*/
typedef struct tagSFG_Time SFG_Time;
struct tagSFG_Time
{
#if TARGET_HOST_WIN32
DWORD Value;
#else
struct timeval Value;
#endif
GLboolean Set;
};
/*
* An enumeration containing the state of the GLUT execution:
* initializing, running, or stopping
*/
typedef enum
{
GLUT_EXEC_STATE_INIT,
GLUT_EXEC_STATE_RUNNING,
GLUT_EXEC_STATE_STOP
} fgExecutionState ;
/*
* This structure holds different freeglut settings
*/
typedef struct tagSFG_State SFG_State;
struct tagSFG_State
{
SFG_XYUse Position; /* The default windows' position */
SFG_XYUse Size; /* The default windows' size */
unsigned int DisplayMode; /* Display mode for new windows */
GLboolean Initialised; /* freeglut has been initialised */
int DirectContext; /* Direct rendering state */
GLboolean ForceIconic; /* New top windows are iconified */
GLboolean UseCurrentContext; /* New windows share with current */
GLboolean GLDebugSwitch; /* OpenGL state debugging switch */
GLboolean XSyncSwitch; /* X11 sync protocol switch */
int KeyRepeat; /* Global key repeat mode. */
int Modifiers; /* Current ALT/SHIFT/CTRL state */
GLuint FPSInterval; /* Interval between FPS printfs */
GLuint SwapCount; /* Count of glutSwapBuffer calls */
GLuint SwapTime; /* Time of last SwapBuffers */
SFG_Time Time; /* Time that glutInit was called */
SFG_List Timers; /* The freeglut timer hooks */
SFG_List FreeTimers; /* The unused timer hooks */
FGCBIdle IdleCallback; /* The global idle callback */
int ActiveMenus; /* Num. of currently active menus */
FGCBMenuState MenuStateCallback; /* Menu callbacks are global */
FGCBMenuStatus MenuStatusCallback;
SFG_XYUse GameModeSize; /* Game mode screen's dimensions */
int GameModeDepth; /* The pixel depth for game mode */
int GameModeRefresh; /* The refresh rate for game mode */
int ActionOnWindowClose; /* Action when user closes window */
fgExecutionState ExecState; /* Used for GLUT termination */
char *ProgramName; /* Name of the invoking program */
};
/*
* The structure used by display initialization in freeglut_init.c
*/
typedef struct tagSFG_Display SFG_Display;
struct tagSFG_Display
{
#if TARGET_HOST_UNIX_X11
Display* Display_; /* The display we are being run in. */
int Screen; /* The screen we are about to use. */
Window RootWindow; /* The screen's root window. */
int Connection; /* The display's connection number */
Atom DeleteWindow; /* The window deletion atom */
#ifdef X_XF86VidModeGetModeLine
/*
* XF86VidMode may be compilable even if it fails at runtime. Therefore,
* the validity of the VidMode has to be tracked
*/
int DisplayModeValid; /* Flag that indicates runtime status*/
XF86VidModeModeLine DisplayMode; /* Current screen's display settings */
int DisplayModeClock; /* The display mode's refresh rate */
int DisplayViewPortX; /* saved X location of the viewport */
int DisplayViewPortY; /* saved Y location of the viewport */
int DisplayPointerX; /* saved X location of the pointer */
int DisplayPointerY; /* saved Y location of the pointer */
#endif
#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
HINSTANCE Instance; /* The application's instance */
DEVMODE DisplayMode; /* Desktop's display settings */
#endif
int ScreenWidth; /* The screen's width in pixels */
int ScreenHeight; /* The screen's height in pixels */
int ScreenWidthMM; /* The screen's width in milimeters */
int ScreenHeightMM; /* The screen's height in milimeters */
};
/*
* The user can create any number of timer hooks
*/
typedef struct tagSFG_Timer SFG_Timer;
struct tagSFG_Timer
{
SFG_Node Node;
int ID; /* The timer ID integer */
FGCBTimer Callback; /* The timer callback */
long TriggerTime; /* The timer trigger time */
};
/*
* Make "freeglut" window handle and context types so that we don't need so
* much conditionally-compiled code later in the library.
*/
#if TARGET_HOST_UNIX_X11
typedef Window SFG_WindowHandleType ;
typedef GLXContext SFG_WindowContextType ;
#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
typedef HWND SFG_WindowHandleType ;
typedef HGLRC SFG_WindowContextType ;
#endif
/*
* A window and its OpenGL context. The contents of this structure
* are highly dependant on the target operating system we aim at...
*/
typedef struct tagSFG_Context SFG_Context;
struct tagSFG_Context
{
SFG_WindowHandleType Handle; /* The window's handle */
SFG_WindowContextType Context; /* The window's OpenGL/WGL context */
#if TARGET_HOST_UNIX_X11
XVisualInfo* VisualInfo; /* The window's visual information */
Pixmap Pixmap_; /* Used for offscreen rendering */
/* GLXPixmap GLXPixMap; */ /* Used for offscreen rendering */
#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
HDC Device; /* The window's device context */
#endif
int DoubleBuffered; /* Treat the window as double-buffered */
};
/*
* Window's state description. This structure should be kept portable.
*/
typedef struct tagSFG_WindowState SFG_WindowState;
struct tagSFG_WindowState
{
int Width; /* Window's width in pixels */
int Height; /* The same about the height */
int OldWidth; /* Window width from before a resize */
int OldHeight; /* " height " " " " */
GLboolean Redisplay; /* Do we have to redisplay? */
GLboolean Visible; /* Is the window visible now */
int Cursor; /* The currently selected cursor */
long JoystickPollRate; /* The joystick polling rate */
long JoystickLastPoll; /* When the last poll happened */
int MouseX, MouseY; /* The most recent mouse position */
GLboolean IgnoreKeyRepeat; /* Whether to ignore key repeat. */
GLboolean KeyRepeating; /* Currently in repeat mode */
GLboolean IsGameMode; /* Is this the game mode window? */
GLboolean NeedToResize; /* Do we need to resize the window? */
};
/*
* SET_WCB() is used as:
*
* SET_WCB( window, Visibility, func );
*
* ...where {window} is the freeglut window to set the callback,
* {Visibility} is the window-specific callback to set,
* {func} is a function-pointer.
*
* Originally, {FETCH_WCB( ... ) = func} was rather sloppily used,
* but this can cause warnings because the FETCH_WCB() macro type-
* casts its result, and a type-cast value shouldn't be an lvalue.
*
* The {if( FETCH_WCB( ... ) != func )} test is to do type-checking
* and for no other reason. Since it's hidden in the macro, the
* ugliness is felt to be rather benign.
*/
#define SET_WCB(window,cbname,func) \
do \
{ \
if( FETCH_WCB( window, cbname ) != func ) \
(((window).CallBacks[CB_ ## cbname]) = (void *) func); \
} while( 0 ) \
/*
* FETCH_WCB() is used as:
*
* FETCH_WCB( window, Visibility );
*
* ...where {window} is the freeglut window to fetch the callback from,
* {Visibility} is the window-specific callback to fetch.
*
* The result is correctly type-cast to the callback function pointer
* type.
*/
#define FETCH_WCB(window,cbname) \
((FGCB ## cbname)((window).CallBacks[CB_ ## cbname]))
/*
* INVOKE_WCB() is used as:
*
* INVOKE_WCB( window, Visibility, ( status ) );
*
* ...where {window} is the freeglut window,
* {Visibility} is the window-specific callback,
* {(status)} is the parameter list.
*
* The callback is invoked as:
*
* callback( status );
*
* ...so the parentheses are REQUIRED in the {arg_list}.
*
* NOTE that it does a sanity-check and also sets the
* current window.
*
*/
#define INVOKE_WCB(window,cbname,arg_list) \
do \
{ \
if( FETCH_WCB( window, cbname ) ) \
{ \
fgSetWindow( &window ); \
FETCH_WCB( window, cbname ) arg_list; \
} \
} while( 0 )
/*
* The window callbacks the user can supply us with. Should be kept portable.
*
* This enumeration provides the freeglut CallBack numbers.
* The symbolic constants are indices into a window's array of
* function callbacks. The names are formed by splicing a common
* prefix onto the callback's base name. (This was originally
* done so that an early stage of development could live side-by-
* side with the old callback code. The old callback code used
* the bare callback's name as a structure member, so I used a
* prefix for the array index name.)
*
* XXX For consistancy, perhaps the prefix should match the
* XXX FETCH* and INVOKE* macro suffices. I.e., WCB_, rather than
* XXX CB_.
*/
enum
{
CB_Display,
CB_Reshape,
CB_Keyboard,
CB_KeyboardUp,
CB_Special,
CB_SpecialUp,
CB_Mouse,
CB_MouseWheel,
CB_Motion,
CB_Passive,
CB_Entry,
CB_Visibility,
CB_WindowStatus,
CB_Joystick,
CB_Destroy,
/* Presently ignored */
CB_Select,
CB_OverlayDisplay,
CB_SpaceMotion,
CB_SpaceRotation,
CB_SpaceButton,
CB_Dials,
CB_ButtonBox,
CB_TabletMotion,
CB_TabletButton,
/* Always make this the LAST one */
TOTAL_CALLBACKS
};
/*
* This structure holds the OpenGL rendering context for all the menu windows
*/
typedef struct tagSFG_MenuContext SFG_MenuContext;
struct tagSFG_MenuContext
{
#if TARGET_HOST_UNIX_X11
XVisualInfo* VisualInfo; /* The window's visual information */
#endif
SFG_WindowContextType Context; /* The menu window's WGL context */
};
/*
* This structure describes a menu
*/
typedef struct tagSFG_Window SFG_Window;
typedef struct tagSFG_MenuEntry SFG_MenuEntry;
typedef struct tagSFG_Menu SFG_Menu;
struct tagSFG_Menu
{
SFG_Node Node;
void *UserData; /* User data passed back at callback */
int ID; /* The global menu ID */
SFG_List Entries; /* The menu entries list */
FGCBMenu Callback; /* The menu callback */
FGCBDestroy Destroy; /* Destruction callback */
GLboolean IsActive; /* Is the menu selected? */
int Width; /* Menu box width in pixels */
int Height; /* Menu box height in pixels */
int X, Y; /* Menu box raster position */
SFG_MenuEntry *ActiveEntry; /* Currently active entry in the menu */
SFG_Window *Window; /* Window for menu */
SFG_Window *ParentWindow; /* Window in which the menu is defined */
};
/*
* This is a menu entry
*/
struct tagSFG_MenuEntry
{
SFG_Node Node;
int ID; /* The menu entry ID (local) */
int Ordinal; /* The menu's ordinal number */
char* Text; /* The text to be displayed */
SFG_Menu* SubMenu; /* Optional sub-menu tree */
GLboolean IsActive; /* Is the entry highlighted? */
int Width; /* Label's width in pixels */
};
/*
* A window, making part of freeglut windows hierarchy.
* Should be kept portable.
*/
struct tagSFG_Window
{
SFG_Node Node;
int ID; /* Window's ID number */
SFG_Context Window; /* Window and OpenGL context */
SFG_WindowState State; /* The window state */
void *CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */
void *UserData ; /* For use by user */
SFG_Menu* Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window */
SFG_Menu* ActiveMenu; /* The window's active menu */
SFG_Window* Parent; /* The parent to this window */
SFG_List Children; /* The subwindows d.l. list */
GLboolean IsMenu; /* Set to 1 if we are a menu */
};
/*
* A linked list structure of windows
*/
typedef struct tagSFG_WindowList SFG_WindowList ;
struct tagSFG_WindowList
{
SFG_Node node;
SFG_Window *window ;
};
/*
* This holds information about all the windows, menus etc.
*/
typedef struct tagSFG_Structure SFG_Structure;
struct tagSFG_Structure
{
SFG_List Windows; /* The global windows list */
SFG_List Menus; /* The global menus list */
SFG_List WindowsToDestroy;
SFG_Window* Window; /* The currently active win. */
SFG_Menu* Menu; /* Same, but menu... */
SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */
SFG_Window* GameMode; /* The game mode window */
int WindowID; /* The new current window ID */
int MenuID; /* The new current menu ID */
};
/*
* This structure is used for the enumeration purposes.
* You can easily extend its functionalities by declaring
* a structure containing enumerator's contents and custom
* data, then casting its pointer to (SFG_Enumerator *).
*/
typedef struct tagSFG_Enumerator SFG_Enumerator;
struct tagSFG_Enumerator
{
GLboolean found; /* Used to terminate search */
void* data; /* Custom data pointer */
};
typedef void (* FGCBenumerator )( SFG_Window *, SFG_Enumerator * );
/*
* The bitmap font structure
*/
typedef struct tagSFG_Font SFG_Font;
struct tagSFG_Font
{
char* Name; /* The source font name */
int Quantity; /* Number of chars in font */
int Height; /* Height of the characters */
const GLubyte** Characters; /* The characters mapping */
float xorig, yorig; /* Relative origin of the character */
};
/*
* The stroke font structures
*/
typedef struct tagSFG_StrokeVertex SFG_StrokeVertex;
struct tagSFG_StrokeVertex
{
GLfloat X, Y;
};
typedef struct tagSFG_StrokeStrip SFG_StrokeStrip;
struct tagSFG_StrokeStrip
{
int Number;
const SFG_StrokeVertex* Vertices;
};
typedef struct tagSFG_StrokeChar SFG_StrokeChar;
struct tagSFG_StrokeChar
{
GLfloat Right;
int Number;
const SFG_StrokeStrip* Strips;
};
typedef struct tagSFG_StrokeFont SFG_StrokeFont;
struct tagSFG_StrokeFont
{
char* Name; /* The source font name */
int Quantity; /* Number of chars in font */
GLfloat Height; /* Height of the characters */
const SFG_StrokeChar** Characters; /* The characters mapping */
};
/* -- GLOBAL VARIABLES EXPORTS --------------------------------------------- */
/*
* Freeglut display related stuff (initialized once per session)
*/
extern SFG_Display fgDisplay;
/*
* Freeglut internal structure
*/
extern SFG_Structure fgStructure;
/*
* The current freeglut settings
*/
extern SFG_State fgState;
/* -- PRIVATE FUNCTION DECLARATIONS ---------------------------------------- */
/*
* A call to this function makes us sure that the Display and Structure
* subsystems have been properly initialized and are ready to be used
*/
#define freeglut_assert_ready assert( fgState.Initialised );
/*
* Following definitions are somewhat similiar to GLib's,
* but do not generate any log messages:
*/
#define freeglut_return_if_fail( expr ) \
if( !(expr) ) \
return;
#define freeglut_return_val_if_fail( expr, val ) \
if( !(expr) ) \
return val ;
/*
* A call to those macros assures us that there is a current
* window and menu set, respectively:
*/
#define freeglut_assert_window assert( fgStructure.Window != NULL );
#define freeglut_assert_menu assert( fgStructure.Menu != NULL );
/*
* The initialize and deinitialize functions get called on glutInit()
* and glutMainLoop() end respectively. They should create/clean up
* everything inside of the freeglut
*/
void fgInitialize( const char* displayName );
void fgDeinitialize( void );
/*
* Those two functions are used to create/destroy the freeglut internal
* structures. This actually happens when calling glutInit() and when
* quitting the glutMainLoop() (which actually happens, when all windows
* have been closed).
*/
void fgCreateStructure( void );
void fgDestroyStructure( void );
/*
* A helper function to check if a display mode is possible to use
*/
#if TARGET_HOST_UNIX_X11
XVisualInfo* fgChooseVisual( void );
#endif
/*
* The window procedure for Win32 events handling
*/
#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam );
GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
unsigned char layer_type );
#endif
/*
* Window creation, opening, closing and destruction.
* Also CallBack clearing/initialization.
* Defined in freeglut_structure.c, freeglut_window.c.
*/
SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,
int x, int y, int w, int h,
GLboolean gameMode, GLboolean isMenu );
void fgSetWindow ( SFG_Window *window );
void fgOpenWindow( SFG_Window* window, const char* title,
int x, int y, int w, int h, GLboolean gameMode,
GLboolean isSubWindow );
void fgCloseWindow( SFG_Window* window );
void fgAddToWindowDestroyList ( SFG_Window* window );
void fgCloseWindows ();
void fgDestroyWindow( SFG_Window* window );
void fgClearCallBacks( SFG_Window *window );
/*
* Menu creation and destruction. Defined in freeglut_structure.c
*/
SFG_Menu* fgCreateMenu( FGCBMenu menuCallback );
void fgDestroyMenu( SFG_Menu* menu );
/*
* Joystick device management functions, defined in freeglut_joystick.c
*/
void fgJoystickInit( int ident );
void fgJoystickClose( void );
void fgJoystickPollWindow( SFG_Window* window );
/*
* Helper function to enumerate through all registered windows
* and one to enumerate all of a window's subwindows...
*
* The GFunc callback for those functions will be defined as:
*
* void enumCallback( gpointer window, gpointer enumerator );
*
* where window is the enumerated (sub)window pointer (SFG_Window *),
* and userData is the a custom user-supplied pointer. Functions
* are defined and exported from freeglut_structure.c file.
*/
void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator );
void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,
SFG_Enumerator* enumerator );
/*
* fgWindowByHandle returns a (SFG_Window *) value pointing to the
* first window in the queue matching the specified window handle.
* The function is defined in freeglut_structure.c file.
*/
SFG_Window* fgWindowByHandle( SFG_WindowHandleType hWindow );
/*
* This function is similiar to the previous one, except it is
* looking for a specified (sub)window identifier. The function
* is defined in freeglut_structure.c file.
*/
SFG_Window* fgWindowByID( int windowID );
/*
* Looks up a menu given its ID. This is easier than fgWindowByXXX
* as all menus are placed in a single doubly linked list...
*/
SFG_Menu* fgMenuByID( int menuID );
/*
* The menu activation and deactivation the code. This is the meat
* of the menu user interface handling code...
*/
void fgActivateMenu( SFG_Window* window, int button );
void fgExecuteMenuCallback( SFG_Menu* menu );
GLboolean fgCheckActiveMenu ( SFG_Window *window, SFG_Menu *menu );
void fgDeactivateMenu( SFG_Window *window );
void fgDeactivateSubMenu( SFG_MenuEntry *menuEntry );
/*
* This function gets called just before the buffers swap, so that
* freeglut can display the pull-down menus via OpenGL. The function
* is defined in freeglut_menu.c file.
*/
void fgDisplayMenu( void );
/*
* Display the mouse cursor using OpenGL calls. The function
* is defined in freeglut_cursor.c file.
*/
void fgDisplayCursor( void );
/*
* Elapsed time as per glutGet(GLUT_ELAPSED_TIME).
*/
long fgElapsedTime( void );
/*
* List functions
*/
void fgListInit(SFG_List *list);
void fgListAppend(SFG_List *list, SFG_Node *node);
void fgListRemove(SFG_List *list, SFG_Node *node);
int fgListLength(SFG_List *list);
void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node);
/*
* Error Messages functions
*/
void fgError( const char *fmt, ... );
void fgWarning( const char *fmt, ... );
#endif /* FREEGLUT_INTERNAL_H */
/*** END OF FILE ***/