1c041511dScube
2c041511dScube/* Copyright (c) Mark J. Kilgard, 1998.  */
3c041511dScube
4c041511dScube/* This program is freely distributable without licensing fees
5c041511dScube   and is provided without guarantee or warrantee expressed or
6c041511dScube   implied. This program is -not- in the public domain. */
7c041511dScube
8c041511dScube/* I appreciate the guidance from William Mitchell
9c041511dScube   (mitchell@cam.nist.gov) in developing this friend interface
10c041511dScube   for use by the f90gl package.  See ../../README.fortran */
11c041511dScube
12c041511dScube#include "glutint.h"
13c041511dScube
14c041511dScube/* FCB stands for Fortran CallBack. */
15c041511dScube
16c041511dScube/* There is only one idleFunc, menuStateFunc, and menuStatusFunc, so they
17c041511dScube   can be saved in the wrappers for Fortran rather than the C structures. */
18c041511dScube
19c041511dScube/* Set a Fortran callback function. */
20c041511dScube
21c041511dScubevoid APIENTRY
22c041511dScube__glutSetFCB(int which, GLUTproc func)
23c041511dScube{
24c041511dScube#ifdef SUPPORT_FORTRAN
25c041511dScube  switch (which) {
26c041511dScube  case GLUT_FCB_DISPLAY:
27c041511dScube    __glutCurrentWindow->fdisplay = (GLUTdisplayFCB) func;
28c041511dScube    break;
29c041511dScube  case GLUT_FCB_RESHAPE:
30c041511dScube    __glutCurrentWindow->freshape = (GLUTreshapeFCB) func;
31c041511dScube    break;
32c041511dScube  case GLUT_FCB_MOUSE:
33c041511dScube    __glutCurrentWindow->fmouse = (GLUTmouseFCB) func;
34c041511dScube    break;
35c041511dScube  case GLUT_FCB_MOTION:
36c041511dScube    __glutCurrentWindow->fmotion = (GLUTmotionFCB) func;
37c041511dScube    break;
38c041511dScube  case GLUT_FCB_PASSIVE:
39c041511dScube    __glutCurrentWindow->fpassive = (GLUTpassiveFCB) func;
40c041511dScube    break;
41c041511dScube  case GLUT_FCB_ENTRY:
42c041511dScube    __glutCurrentWindow->fentry = (GLUTentryFCB) func;
43c041511dScube    break;
44c041511dScube  case GLUT_FCB_KEYBOARD:
45c041511dScube    __glutCurrentWindow->fkeyboard = (GLUTkeyboardFCB) func;
46c041511dScube    break;
47c041511dScube  case GLUT_FCB_KEYBOARD_UP:
48c041511dScube    __glutCurrentWindow->fkeyboardUp = (GLUTkeyboardFCB) func;
49c041511dScube    break;
50c041511dScube  case GLUT_FCB_WINDOW_STATUS:
51c041511dScube    __glutCurrentWindow->fwindowStatus = (GLUTwindowStatusFCB) func;
52c041511dScube    break;
53c041511dScube  case GLUT_FCB_VISIBILITY:
54c041511dScube    __glutCurrentWindow->fvisibility = (GLUTvisibilityFCB) func;
55c041511dScube    break;
56c041511dScube  case GLUT_FCB_SPECIAL:
57c041511dScube    __glutCurrentWindow->fspecial = (GLUTspecialFCB) func;
58c041511dScube    break;
59c041511dScube  case GLUT_FCB_SPECIAL_UP:
60c041511dScube    __glutCurrentWindow->fspecialUp = (GLUTspecialFCB) func;
61c041511dScube    break;
62c041511dScube  case GLUT_FCB_BUTTON_BOX:
63c041511dScube    __glutCurrentWindow->fbuttonBox = (GLUTbuttonBoxFCB) func;
64c041511dScube    break;
65c041511dScube  case GLUT_FCB_DIALS:
66c041511dScube    __glutCurrentWindow->fdials = (GLUTdialsFCB) func;
67c041511dScube    break;
68c041511dScube  case GLUT_FCB_SPACE_MOTION:
69c041511dScube    __glutCurrentWindow->fspaceMotion = (GLUTspaceMotionFCB) func;
70c041511dScube    break;
71c041511dScube  case GLUT_FCB_SPACE_ROTATE:
72c041511dScube    __glutCurrentWindow->fspaceRotate = (GLUTspaceRotateFCB) func;
73c041511dScube    break;
74c041511dScube  case GLUT_FCB_SPACE_BUTTON:
75c041511dScube    __glutCurrentWindow->fspaceButton = (GLUTspaceButtonFCB) func;
76c041511dScube    break;
77c041511dScube  case GLUT_FCB_TABLET_MOTION:
78c041511dScube    __glutCurrentWindow->ftabletMotion = (GLUTtabletMotionFCB) func;
79c041511dScube    break;
80c041511dScube  case GLUT_FCB_TABLET_BUTTON:
81c041511dScube    __glutCurrentWindow->ftabletButton = (GLUTtabletButtonFCB) func;
82c041511dScube    break;
83c041511dScube#ifdef _WIN32
84c041511dScube  case GLUT_FCB_JOYSTICK:
85c041511dScube    __glutCurrentWindow->fjoystick = (GLUTjoystickFCB) func;
86c041511dScube    break;
87c041511dScube#endif
88c041511dScube  case GLUT_FCB_OVERLAY_DISPLAY:
89c041511dScube    __glutCurrentWindow->overlay->fdisplay = (GLUTdisplayFCB) func;
90c041511dScube    break;
91c041511dScube  case GLUT_FCB_SELECT:
92c041511dScube    __glutCurrentMenu->fselect = (GLUTselectFCB) func;
93c041511dScube    break;
94c041511dScube  case GLUT_FCB_TIMER:
95c041511dScube    __glutNewTimer->ffunc = (GLUTtimerFCB) func;
96c041511dScube    break;
97c041511dScube  }
98c041511dScube#endif
99c041511dScube}
100c041511dScube
101c041511dScube/* Get a Fortran callback function. */
102c041511dScube
103c041511dScubeGLUTproc APIENTRY
104c041511dScube__glutGetFCB(int which)
105c041511dScube{
106c041511dScube#ifdef SUPPORT_FORTRAN
107c041511dScube  switch (which) {
108c041511dScube  case GLUT_FCB_DISPLAY:
109c041511dScube    return __glutCurrentWindow->fdisplay;
110c041511dScube  case GLUT_FCB_RESHAPE:
111c041511dScube    return __glutCurrentWindow->freshape;
112c041511dScube  case GLUT_FCB_MOUSE:
113c041511dScube    return __glutCurrentWindow->fmouse;
114c041511dScube  case GLUT_FCB_MOTION:
115c041511dScube    return __glutCurrentWindow->fmotion;
116c041511dScube  case GLUT_FCB_PASSIVE:
117c041511dScube    return __glutCurrentWindow->fpassive;
118c041511dScube  case GLUT_FCB_ENTRY:
119c041511dScube    return __glutCurrentWindow->fentry;
120c041511dScube  case GLUT_FCB_KEYBOARD:
121c041511dScube    return __glutCurrentWindow->fkeyboard;
122c041511dScube  case GLUT_FCB_KEYBOARD_UP:
123c041511dScube    return __glutCurrentWindow->fkeyboardUp;
124c041511dScube  case GLUT_FCB_WINDOW_STATUS:
125c041511dScube    return __glutCurrentWindow->fwindowStatus;
126c041511dScube  case GLUT_FCB_VISIBILITY:
127c041511dScube    return __glutCurrentWindow->fvisibility;
128c041511dScube  case GLUT_FCB_SPECIAL:
129c041511dScube    return __glutCurrentWindow->fspecial;
130c041511dScube  case GLUT_FCB_SPECIAL_UP:
131c041511dScube    return __glutCurrentWindow->fspecialUp;
132c041511dScube  case GLUT_FCB_BUTTON_BOX:
133c041511dScube    return __glutCurrentWindow->fbuttonBox;
134c041511dScube  case GLUT_FCB_DIALS:
135c041511dScube    return __glutCurrentWindow->fdials;
136c041511dScube  case GLUT_FCB_SPACE_MOTION:
137c041511dScube    return __glutCurrentWindow->fspaceMotion;
138c041511dScube  case GLUT_FCB_SPACE_ROTATE:
139c041511dScube    return __glutCurrentWindow->fspaceRotate;
140c041511dScube  case GLUT_FCB_SPACE_BUTTON:
141c041511dScube    return __glutCurrentWindow->fspaceButton;
142c041511dScube  case GLUT_FCB_TABLET_MOTION:
143c041511dScube    return __glutCurrentWindow->ftabletMotion;
144c041511dScube  case GLUT_FCB_TABLET_BUTTON:
145c041511dScube    return __glutCurrentWindow->ftabletButton;
146c041511dScube  case GLUT_FCB_JOYSTICK:
147c041511dScube#ifdef _WIN32
148c041511dScube    return __glutCurrentWindow->fjoystick;
149c041511dScube#else
150c041511dScube    return NULL;
151c041511dScube#endif
152c041511dScube  case GLUT_FCB_OVERLAY_DISPLAY:
153c041511dScube    return __glutCurrentWindow->overlay->fdisplay;
154c041511dScube  case GLUT_FCB_SELECT:
155c041511dScube    return __glutCurrentMenu->fselect;
156c041511dScube  case GLUT_FCB_TIMER:
157c041511dScube     return __glutTimerList ? __glutTimerList->ffunc : NULL;
158c041511dScube  default:
159c041511dScube    return NULL;
160c041511dScube  }
161c041511dScube#else
162c041511dScube  return NULL;
163c041511dScube#endif
164c041511dScube}
165