1 /* **************************************************************************
3 * **************************************************************************
5 * Copyright (C) 1998 Uwe Maurer - uwe_maurer@t-online.de
6 * Copyright (C) 1999 James Simmons
7 * Copyright (C) 1999 Jon Taylor
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
19 * You should have received a copy of the GNU Library General Public
20 * License along with this library; if not, write to the Free
21 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 * **************************************************************************
25 * - Make everything use the portable ggi_* types
29 #define BUILDING_GGIGLUT
33 #define GRAPHTYPE_RGB GT_16BIT
34 #define GRAPHTYPE_INDEX GT_8BIT
36 /*************************************************************************/
45 #include "GL/ggimesa.h"
51 int _ggiglutDebugSync
= 0;
52 uint32 _ggiglutDebugState
= 0;
54 char *__glutProgramName
= "GGI";
56 static ggi_visual_t __glut_vis
;
58 static ggi_mesa_context_t __glut_ctx
;
60 //static int __glut_width = WIDTH;
61 //static int __glut_height = HEIGHT;
62 //static ggi_graphtype __glut_gt_rgb = GRAPHTYPE_RGB;
63 //static ggi_graphtype __glut_gt_index = GRAPHTYPE_INDEX;
64 static int __glut_width
= GGI_AUTO
;
65 static int __glut_height
= GGI_AUTO
;
66 static ggi_graphtype __glut_gt_rgb
= GT_AUTO
;
67 static ggi_graphtype __glut_gt_index
= GT_8BIT
;
68 static int __glut_init
= GL_FALSE
;
70 static int mousex
= WIDTH
/ 2;
71 static int mousey
= HEIGHT
/ 2;
72 static int mouse_moved
= GL_FALSE
;
73 static int mouse_down
= GL_FALSE
;
74 static int mouse_showcursor
= GL_FALSE
;
76 static void (*__glut_reshape
)(int, int);
77 static void (*__glut_display
)(void);
78 static void (*__glut_idle
)(void);
79 static void (*__glut_keyboard
)(unsigned char, int, int);
80 static void (*__glut_special
)(int, int, int);
81 static void (*__glut_mouse
)(int, int, int, int);
82 static void (*__glut_motion
)(int, int);
83 static void (*__glut_passive_motion
)(int, int);
84 static void (*__glut_visibility
)(int);
86 static unsigned int __glut_mode
= GLUT_RGB
| GLUT_SINGLE
| GLUT_DEPTH
;
88 static int __glut_mod_keys
= 0;
90 static int __glut_redisplay
= GL_FALSE
;
93 static int __glut_menubutton
= -1;
94 static int __glut_menuactive
= GL_FALSE
;
96 #define MAX_ENTRIES 64
100 char *label
[MAX_ENTRIES
];
101 int value
[MAX_ENTRIES
];
102 struct menu_s
* submenu
[MAX_ENTRIES
];
108 static menu_t
*mainmenu
;
109 static menu_t
*curmenu
;
110 static menu_t
*activemenu
;
112 void glutInit(int *argc
, char **argv
)
118 GGIGLUTDPRINT_CORE("glutInit() called\n");
120 #define REMOVE {for (k=i;k<*argc-1;k++) argv[k]=argv[k+1]; \
123 if (__glut_init
) return;
125 str
= getenv("GGIGLUT_DEBUG");
127 _ggiglutDebugState
= atoi(str
);
128 fprintf(stderr
, "Debugging=%d\n", _ggiglutDebugState
);
129 GGIGLUTDPRINT_CORE("Debugging=%d\n", _ggiglutDebugState
);
132 str
= getenv("GGIGLUT_DEBUGSYNC");
134 _ggiglutDebugSync
= 1;
140 for (i
= 1; i
< *argc
; i
++)
142 if (strcmp(argv
[i
], "-mouse") == 0)
144 mouse_showcursor
= GL_TRUE
;
148 if (strcmp(argv
[i
], "-bpp") == 0 && (i
+ 1) < (*argc
))
150 switch(atoi(argv
[i
+ 1]))
152 case 4: gt
= GT_4BIT
; break;
153 case 8: gt
= GT_8BIT
; break;
154 case 15: gt
= GT_15BIT
; break;
155 case 16: gt
= GT_16BIT
; break;
156 case 24: gt
= GT_24BIT
; break;
157 case 32: gt
= GT_32BIT
; break;
159 ggiPanic("\"%s\" bits per pixel?\n", argv
[i
+1]);
161 __glut_gt_rgb
= __glut_gt_index
= gt
;
166 if (strcmp(argv
[i
], "-size") == 0 && (i
+ 2) < (*argc
))
168 __glut_width
= atoi(argv
[i
+ 1]);
169 __glut_height
= atoi(argv
[i
+ 2]);
179 ggiPanic("ggiInit() failed!\n");
181 __glut_init
= GL_TRUE
;
186 void glutInitWindowPosition(int x
, int y
)
188 GGIGLUTDPRINT_CORE("glutInitWindowPosition() called\n");
191 void glutInitWindowSize(int x
, int y
)
193 GGIGLUTDPRINT_CORE("glutInitWindowsSize() called\n");
196 void glutFullScreen(void)
198 GGIGLUTDPRINT_CORE("glutFullScreen() called\n");
201 void glutInitDisplayMode(unsigned int mode
)
203 GGIGLUTDPRINT_CORE("glutInitDisplayMode() called\n");
208 void glutInitDisplayString(const char *string
)
210 GGIGLUTDPRINT_CORE("glutInitDisplayString(%s) called\n", string
);
213 int glutCreateWindow(const char *title
)
219 { GGI_AUTO
, GGI_AUTO
},
220 { GGI_AUTO
, GGI_AUTO
},
223 { GGI_AUTO
, GGI_AUTO
}
229 GGIGLUTDPRINT_CORE("glutCreateWindow() called\n");
232 glutInit(NULL
, NULL
);
234 GGIGLUTDPRINT("GGIGLUT: %s\n", title
);
236 rgb
= !(__glut_mode
& GLUT_INDEX
);
237 frames
= (__glut_mode
& GLUT_DOUBLE
) ? 2 : 1;
239 gt
= (rgb
) ? __glut_gt_rgb
: __glut_gt_index
;
241 __glut_vis
= ggiOpen(NULL
);
242 if (__glut_vis
== NULL
)
244 ggiPanic("ggiOpen() failed!\n");
245 /* return GL_FALSE; */
248 ggiSetFlags(__glut_vis
, GGIFLAG_ASYNC
);
250 ggiCheckMode(__glut_vis
, &mode
);
252 err
= ggiSetMode(__glut_vis
, &mode
);
255 ggiPanic("Can't set graphic mode!\n");
256 /* return GL_FALSE; */
259 if (ggiMesaExtendVisual(__glut_vis
, GL_FALSE
, GL_FALSE
,
260 16, 0, 0, 0, 0, 0, 1) < 0)
262 ggiPanic("GGIMesaSetVisual failed!\n");
265 __glut_ctx
= ggiMesaCreateContext(__glut_vis
);
267 if (__glut_ctx
== NULL
)
268 ggiPanic("Can't create mesa-context\n");
270 ggiGetMode(__glut_vis
, &mode
);
273 __glut_width
= mode
.visible
.x
;
274 __glut_height
= mode
.visible
.y
;
276 mousex
= mode
.visible
.x
/ 2;
277 mousey
= mode
.visible
.y
/ 2;
279 ggiMesaMakeCurrent(__glut_ctx
, __glut_vis
);
282 __glut_reshape(__glut_width
, __glut_height
);
287 void glutReshapeFunc(void (*func
)(int, int))
289 GGIGLUTDPRINT_CORE("glutReshapeFunc() called\n");
291 __glut_reshape
= func
;
292 if (__glut_vis
&& __glut_reshape
)
293 __glut_reshape(__glut_width
, __glut_height
);
296 void glutKeyboardFunc(void (*keyboard
)(unsigned char key
, int x
, int y
))
298 GGIGLUTDPRINT_CORE("glutKeyBoardFunc() called\n");
300 __glut_keyboard
= keyboard
;
303 int glutGetModifiers(void)
305 GGIGLUTDPRINT_CORE("glutGetModifiers() called\n");
307 return __glut_mod_keys
;
310 void glutEntryFunc(void (*func
)(int state
))
312 GGIGLUTDPRINT_CORE("glutEntryFunc() called\n");
315 void glutVisibilitFunc(void (*func
)(int state
))
317 GGIGLUTDPRINT_CORE("glutVisibilityFunc() called\n");
320 void glutTimerFunc(unsigned int millis
, void (*func
)(int value
), int value
)
322 GGIGLUTDPRINT_CORE("glutTimerFunc() called\n");
325 void glutMenuStateFunc(void (*func
)(int state
))
327 GGIGLUTDPRINT_CORE("glutMenuStateFunc() called\n");
330 int glutGet(GLenum type
)
332 GGIGLUTDPRINT_CORE("glutGet() called\n");
340 case GLUT_WINDOW_WIDTH
:
342 case GLUT_WINDOW_HEIGHT
:
343 return __glut_height
;
344 case GLUT_MENU_NUM_ITEMS
:
346 return curmenu
->num_entries
;
350 GGIGLUTDPRINT("glutGet: unknown type %i\n", type
);
355 void glutSpecialFunc(void (*special
)(int key
, int x
, int y
))
357 GGIGLUTDPRINT_CORE("glutSpecialFunc() called\n");
359 __glut_special
=special
;
362 void glutDisplayFunc(void (*disp
)(void))
364 GGIGLUTDPRINT_CORE("glutDisplayFunc() called\n");
368 void glutSetColor(int index
, GLfloat red
, GLfloat green
, GLfloat blue
)
373 GGIGLUTDPRINT_CORE("glutSetColor() called\n");
375 if (red
> 1.0) red
= 1.0;
376 if (red
< 0.0) red
= 0.0;
377 if (green
> 1.0) green
= 1.0;
378 if (green
< 0.0) green
= 0.0;
379 if (blue
> 1.0) blue
= 1.0;
380 if (blue
< 0.0) blue
= 0.0;
382 max
= (float)((1 << GGI_COLOR_PRECISION
) - 1);
384 c
.r
= (int)(max
* red
);
385 c
.g
= (int)(max
* green
);
386 c
.b
= (int)(max
* blue
);
387 ggiSetPalette(__glut_vis
, index
, 1, &c
);
390 void glutPostRedisplay(void)
392 GGIGLUTDPRINT_CORE("glutPostRedisplay() called\n");
394 __glut_redisplay
= GL_TRUE
;
397 void glutPostWindowRedisplay(int win
)
399 GGIGLUTDPRINT_CORE("glutPostWindowRedisplay() called\n");
401 __glut_redisplay
= GL_TRUE
;
404 void glutSwapBuffers(void)
406 GGIGLUTDPRINT_CORE("glutSwapBuffers() called\n");
408 GGIMesaSwapBuffers();
411 void glutIdleFunc(void (*idle
)(void))
413 GGIGLUTDPRINT_CORE("glutIdleFunc() called\n");
418 static void keyboard(ggi_event
*ev
)
421 int modifer
= 0, key
= 0;
423 GGIGLUTDPRINT_CORE("keyboard() called\n");
427 modifer
= ev
->key
.modifiers
;
428 if (modifer
== GII_KM_SHIFT
)
429 __glut_mod_keys
|= GLUT_ACTIVE_SHIFT
;
430 if (modifer
== GII_KM_CTRL
)
431 __glut_mod_keys
|= GLUT_ACTIVE_CTRL
;
432 if (modifer
== GII_KM_ALT
)
433 __glut_mod_keys
|= GLUT_ACTIVE_ALT
;
435 /* if (__glut_special && key) __glut_special(GII_KTYP(key),0,0); */
438 // __glut_keyboard(GII_UNICODE(sym), 0, 0);
439 __glut_keyboard(sym
, 0, 0);
442 static void mouseabs(ggi_event
*ev
)
447 mousex
= ev
->pmove
.x
;
448 mousey
= ev
->pmove
.y
;
450 if (mousex
< 0) mousex
= 0;
451 if (mousey
< 0) mousey
= 0;
452 if (mousex
>= __glut_width
) mousex
= __glut_width
- 1;
453 if (mousey
>= __glut_height
) mousey
= __glut_height
- 1;
455 if (mousex
!= oldx
|| mousey
!= oldy
) mouse_moved
= GL_TRUE
;
458 static void mouse(ggi_event
*ev
)
463 GGIGLUTDPRINT_CORE("mouse() called\n");
465 mousex
+= ev
->pmove
.x
>> 1;
466 mousey
+= ev
->pmove
.y
>> 1;
468 if (mousex
< 0) mousex
= 0;
469 if (mousey
< 0) mousey
= 0;
470 if (mousex
>= __glut_width
) mousex
= __glut_width
- 1;
471 if (mousey
>= __glut_height
) mousey
= __glut_height
- 1;
473 if (mousex
!= oldx
|| mousey
!= oldy
) mouse_moved
= GL_TRUE
;
477 static void showmenu(void);
478 static int clickmenu(void);
479 static void updatemouse(void);
480 static void drawmouse(void);
482 static void mousemove(void)
484 GGIGLUTDPRINT_CORE("mousemove() called\n");
487 if (__glut_motion
&& mouse_down
) {
488 __glut_motion(mousex
,mousey
);
491 if (__glut_passive_motion
&& (!mouse_down
)) {
492 __glut_passive_motion(mousex
,mousey
);
495 if (__glut_menuactive
) updatemouse();
496 mouse_moved
=GL_FALSE
;
500 static void button(ggi_event
*ev
)
510 GGIGLUTDPRINT_CORE("button() called\n");
514 if (ev
->pbutton
.button
<= 3) { /* GGI can have >3 buttons ! */
515 char state
= ev
->any
.type
== evPtrButtonPress
? GLUT_DOWN
: GLUT_UP
;
516 if (__glut_menuactive
) {
517 if (state
== GLUT_UP
&& clickmenu()) {
519 __glut_menuactive
= GL_FALSE
;
522 if (btn
[ev
->pbutton
.button
] == __glut_menubutton
) {
523 __glut_menuactive
= GL_TRUE
;
524 activemenu
= mainmenu
;
528 __glut_mouse(btn
[ev
->pbutton
.button
], state
, mousex
, mousey
);
530 if (state
== GLUT_DOWN
) {
531 mouse_down
|= (1 << (ev
->pbutton
.button
- 1));
533 else mouse_down
&= ~( 1 << (ev
->pbutton
.button
- 1));
537 void glutMainLoop(void)
540 ggi_event_mask evmask
= (emKeyPress
| emKeyRepeat
| emPtrMove
| emPtrButton
);
542 GGIGLUTDPRINT_CORE("glutMainLoop() called\n");
544 ggiSetEventMask(__glut_vis
, evmask
);
548 if (__glut_visibility
)
549 __glut_visibility(GLUT_VISIBLE
);
553 if (!__glut_menuactive
)
557 if (__glut_redisplay
&& __glut_display
)
559 __glut_redisplay
= GL_FALSE
;
566 struct timeval t
= {0, 0};
568 if (ggiEventPoll(__glut_vis
, evmask
, &t
) == 0)
571 ggiEventRead(__glut_vis
, &ev
, evmask
);
585 case evPtrButtonPress
:
586 case evPtrButtonRelease
:
595 static void showmenu()
598 ggi_color col
= { 0xffff, 0xffff, 0xffff };
600 GGIGLUTDPRINT_CORE("showmenu() called\n");
602 ggiSetGCForeground(__glut_vis
,ggiMapColor(__glut_vis
,&col
));
603 ggiSetOrigin(__glut_vis
,0,0);
605 for (y
= i
= 0; i
< activemenu
->num_entries
; i
++, y
+= 8) {
606 ggiPuts(__glut_vis
, 0, y
, activemenu
->label
[i
]);
611 static int clickmenu(void)
616 GGIGLUTDPRINT_CORE("clickmenu() called\n");
620 if (i
>= activemenu
->num_entries
) return GL_TRUE
;
621 if (mousex
>= 8 * strlen(activemenu
->label
[i
])) return GL_TRUE
;
623 if (activemenu
->submenu
[i
]) {
624 ggi_color col
={0,0,0};
625 ggiSetGCForeground(__glut_vis
,ggiMapColor(__glut_vis
,&col
));
626 h
=activemenu
->num_entries
*8;
627 w
=activemenu
->max_strlen
*8;
628 ggiDrawBox(__glut_vis
,0,0,w
,h
);
629 activemenu
=activemenu
->submenu
[i
];
634 activemenu
->func(activemenu
->value
[i
]);
640 static char buffer
[16*16*4];
642 static void updatemouse()
644 GGIGLUTDPRINT_CORE("updatemouse() called\n");
646 ggiPutBox(__glut_vis
,oldx
,oldy
,16,16,buffer
);
650 static void drawmouse()
654 GGIGLUTDPRINT_CORE("drawmouse() called\n");
660 ggiGetBox(__glut_vis
,x
,y
,16,16,buffer
);
661 ggiDrawLine(__glut_vis
,mousex
-2,mousey
,mousex
+2,mousey
);
662 ggiDrawLine(__glut_vis
,mousex
,mousey
-2,mousex
,mousey
+2);
667 int glutCreateMenu(void(*func
)(int))
671 GGIGLUTDPRINT_CORE("glutCreateMenu() called\n");
673 m
=malloc(sizeof(menu_t
));
674 memset(m
,0,sizeof(menu_t
));
680 static void addEntry(const char *label
,int value
,menu_t
*submenu
)
682 int i
=curmenu
->num_entries
;
684 GGIGLUTDPRINT_CORE("addEntry() called\n");
686 /* printf("%i %i %s %p\n",i,value,label,submenu); */
688 curmenu
->label
[i
]=strdup(label
);
689 curmenu
->value
[i
]=value
;
690 curmenu
->submenu
[i
]=submenu
;
692 if (strlen(label
)>curmenu
->max_strlen
)
693 curmenu
->max_strlen
=strlen(label
);
694 curmenu
->num_entries
++;
698 void glutAddMenuEntry(const char *label
,int value
)
700 GGIGLUTDPRINT_CORE("glutAddMenuEntry() called\n");
702 addEntry(label
,value
,NULL
);
705 void glutAddSubMenu(const char *label
,int submenu
)
709 GGIGLUTDPRINT_CORE("glutAddSubMenu() called\n");
711 if (!curmenu
) return;
712 strncpy(text
,label
,98);
714 text
[strlen(text
)+1]=0;
715 text
[strlen(text
)]='>';
717 addEntry(text
,0,(menu_t
*) submenu
);
720 void glutAttachMenu(int button
)
722 GGIGLUTDPRINT_CORE("glutAttachMenu() called\n");
725 __glut_menubutton
=button
;
728 void glutDetachMenu(int button
)
730 GGIGLUTDPRINT_CORE("glutDetachMenu() called\n");
733 void glutVisibilityFunc(void (*func
)(int state
))
735 GGIGLUTDPRINT_CORE("glutVisibilityFunc() called\n");
737 __glut_visibility
=func
;
740 void glutMouseFunc(void (*mouse
)(int, int, int, int))
742 GGIGLUTDPRINT_CORE("glutMouseFunc() called\n");
747 void glutMotionFunc(void (*motion
)(int,int))
749 GGIGLUTDPRINT_CORE("glutMotionFunc() called\n");
751 __glut_motion
=motion
;
754 void glutPassiveMotionFunc(void (*motion
)(int,int))
756 GGIGLUTDPRINT_CORE("glutPassiveMotionFunc() called\n");
758 __glut_passive_motion
=motion
;
761 void glutSetWindowTitle(const char *title
)
763 GGIGLUTDPRINT_CORE("glutSetWindowTitle() called\n");
766 void glutSetIconTitle(const char *title
)
768 GGIGLUTDPRINT_CORE("glutSetIconTitle() called\n");
771 void glutChangeToMenuEntry(int item
,const char *label
,int value
)
773 GGIGLUTDPRINT_CORE("glutChangeToMenuEntry() called\n");
775 if (item
>0 && item
<=curmenu
->num_entries
) {
777 free(curmenu
->label
[item
]);
778 curmenu
->label
[item
]=strdup(label
);
779 curmenu
->value
[item
]=value
;
780 curmenu
->submenu
[item
]=NULL
;
783 void glutChangeToSubMenu(int item
,const char *label
,int submenu
)
785 GGIGLUTDPRINT_CORE("glutChengeToSubMenu() called\n");
787 if (item
>0 && item
<=curmenu
->num_entries
) {
789 free(curmenu
->label
[item
]);
790 curmenu
->label
[item
]=strdup(label
);
791 curmenu
->value
[item
]=0;
792 curmenu
->submenu
[item
]=(menu_t
*)submenu
;
796 void glutDestroyMenu(int menu
)
798 menu_t
*m
=(menu_t
*)menu
;
801 GGIGLUTDPRINT_CORE("glutDestroyMenu() called\n");
803 for (i
=0;i
<m
->num_entries
;i
++) {
809 int glutCreateSubWindow(int win
,int x
,int y
,int w
,int h
)
811 GGIGLUTDPRINT_CORE("glutCreateSubWindow() called\n");
816 void glutDestroyWindow(int win
)
818 GGIGLUTDPRINT_CORE("glutDestroyWindow() called\n");
821 int glutGetWindow(void)
823 GGIGLUTDPRINT_CORE("glutGetWindow() called\n");
828 void glutSetWindow(int win
)
830 GGIGLUTDPRINT_CORE("glutSetWindow() called\n");
833 void glutPositionWindow(int x
,int y
)
835 GGIGLUTDPRINT_CORE("glutPositionWindow() called\n");
838 void glutReshapeWindow(int x
,int y
)
840 GGIGLUTDPRINT_CORE("glutReshapeWindow() called\n");
843 void glutPushWindow(void)
845 GGIGLUTDPRINT_CORE("glutPushWindow() called\n");
848 void glutPopWindow(void)
850 GGIGLUTDPRINT_CORE("glutPopWindow() called\n");
853 void glutIconifyWindow(void)
855 GGIGLUTDPRINT_CORE("glutIconifyWindow() called\n");
858 void glutShowWindow()
860 GGIGLUTDPRINT_CORE("glutShowWindow() called\n");
863 void glutHideWindow()
865 GGIGLUTDPRINT_CORE("glutHideWindow() called\n");
868 void glutSetCursor(int cursor
)
870 GGIGLUTDPRINT_CORE("glutSetCursor() called\n");
873 void glutWarpPointer(int x
,int y
)
875 GGIGLUTDPRINT_CORE("glutWarpPointer() called\n");
878 void glutEstablishOverlay(void)
880 GGIGLUTDPRINT_CORE("glutEstablishOverlay() called\n");
883 void glutRemoveOverlay(void)
885 GGIGLUTDPRINT_CORE("glutRemoveOverlay() called\n");
888 void glutUseLayer(GLenum layer
)
890 GGIGLUTDPRINT_CORE("glutUseLayer() called\n");
893 int glutLayerGet(GLenum type
)
895 GGIGLUTDPRINT_CORE("glutLayerGet() called\n");
899 void glutPostOverlayRedisplay(void)
901 GGIGLUTDPRINT_CORE("glutPostOverlayRedisplay() called\n");
904 void glutPostWindowOverlayRedisplay(int w
)
906 GGIGLUTDPRINT_CORE("glutPostWindowOverlayRedisplay() called\n");
909 void glutShowOverlay(void)
911 GGIGLUTDPRINT_CORE("glutShowOverlay() called\n");
914 void glutHideOverlay(void)
916 GGIGLUTDPRINT_CORE("glutHideOverlay() called\n");
919 int glutGetMenu(void)
921 GGIGLUTDPRINT_CORE("glutGetMenu() called\n");
925 void glutSetMenu(int menu
)
927 GGIGLUTDPRINT_CORE("glutSetMenu() called\n");
930 void glutRemoveMenuItem(int item
)
932 GGIGLUTDPRINT_CORE("glutRemoveMenuItem() called\n");
935 void glutSpaceBallMotionFunc(void (*func
)(int key
,int x
,int y
))
937 GGIGLUTDPRINT_CORE("glutSpaceBallMotionFunc() called\n");
940 void glutSpaceBallRotateFunc(void (*func
)(int x
,int y
,int z
))
942 GGIGLUTDPRINT_CORE("glutSpaceBallRotateFunc() called\n");
945 void glutSpaceBallButtonFunc(void (*func
)(int button
,int state
))
947 GGIGLUTDPRINT_CORE("glutSpaceBallButtonFunc() called\n");
950 void glutCopyColormap(int win
)
952 GGIGLUTDPRINT_CORE("glutCopyColormap() called\n");
955 int glutDeviceGet(GLenum param
)
957 GGIGLUTDPRINT_CORE("glutDeviceGet() called\n");