summaryrefslogtreecommitdiffstats
path: root/src/glut/glx/glut_fcb.c
blob: c8a3422b3602b70b739e75f2be420d5bba79e89b (plain)
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

/* Copyright (c) Mark J. Kilgard, 1998.  */

/* This program is freely distributable without licensing fees
   and is provided without guarantee or warrantee expressed or
   implied. This program is -not- in the public domain. */

/* I appreciate the guidance from William Mitchell
   (mitchell@cam.nist.gov) in developing this friend interface
   for use by the f90gl package.  See ../../README.fortran */

#include "glutint.h"

/* FCB stands for Fortran CallBack. */

/* There is only one idleFunc, menuStateFunc, and menuStatusFunc, so they
   can be saved in the wrappers for Fortran rather than the C structures. */

/* Set a Fortran callback function. */

void APIENTRY
__glutSetFCB(int which, GLUTproc func)
{
#ifdef SUPPORT_FORTRAN
  switch (which) {
  case GLUT_FCB_DISPLAY:
    __glutCurrentWindow->fdisplay = (GLUTdisplayFCB) func;
    break;
  case GLUT_FCB_RESHAPE:
    __glutCurrentWindow->freshape = (GLUTreshapeFCB) func;
    break;
  case GLUT_FCB_MOUSE:
    __glutCurrentWindow->fmouse = (GLUTmouseFCB) func;
    break;
  case GLUT_FCB_MOTION:
    __glutCurrentWindow->fmotion = (GLUTmotionFCB) func;
    break;
  case GLUT_FCB_PASSIVE:
    __glutCurrentWindow->fpassive = (GLUTpassiveFCB) func;
    break;
  case GLUT_FCB_ENTRY:
    __glutCurrentWindow->fentry = (GLUTentryFCB) func;
    break;
  case GLUT_FCB_KEYBOARD:
    __glutCurrentWindow->fkeyboard = (GLUTkeyboardFCB) func;
    break;
  case GLUT_FCB_KEYBOARD_UP:
    __glutCurrentWindow->fkeyboardUp = (GLUTkeyboardFCB) func;
    break;
  case GLUT_FCB_WINDOW_STATUS:
    __glutCurrentWindow->fwindowStatus = (GLUTwindowStatusFCB) func;
    break;
  case GLUT_FCB_VISIBILITY:
    __glutCurrentWindow->fvisibility = (GLUTvisibilityFCB) func;
    break;
  case GLUT_FCB_SPECIAL:
    __glutCurrentWindow->fspecial = (GLUTspecialFCB) func;
    break;
  case GLUT_FCB_SPECIAL_UP:
    __glutCurrentWindow->fspecialUp = (GLUTspecialFCB) func;
    break;
  case GLUT_FCB_BUTTON_BOX:
    __glutCurrentWindow->fbuttonBox = (GLUTbuttonBoxFCB) func;
    break;
  case GLUT_FCB_DIALS:
    __glutCurrentWindow->fdials = (GLUTdialsFCB) func;
    break;
  case GLUT_FCB_SPACE_MOTION:
    __glutCurrentWindow->fspaceMotion = (GLUTspaceMotionFCB) func;
    break;
  case GLUT_FCB_SPACE_ROTATE:
    __glutCurrentWindow->fspaceRotate = (GLUTspaceRotateFCB) func;
    break;
  case GLUT_FCB_SPACE_BUTTON:
    __glutCurrentWindow->fspaceButton = (GLUTspaceButtonFCB) func;
    break;
  case GLUT_FCB_TABLET_MOTION:
    __glutCurrentWindow->ftabletMotion = (GLUTtabletMotionFCB) func;
    break;
  case GLUT_FCB_TABLET_BUTTON:
    __glutCurrentWindow->ftabletButton = (GLUTtabletButtonFCB) func;
    break;
#ifdef _WIN32
  case GLUT_FCB_JOYSTICK:
    __glutCurrentWindow->fjoystick = (GLUTjoystickFCB) func;
    break;
#endif
  case GLUT_FCB_OVERLAY_DISPLAY:
    __glutCurrentWindow->overlay->fdisplay = (GLUTdisplayFCB) func;
    break;
  case GLUT_FCB_SELECT:
    __glutCurrentMenu->fselect = (GLUTselectFCB) func;
    break;
  case GLUT_FCB_TIMER:
    __glutNewTimer->ffunc = (GLUTtimerFCB) func;
    break;
  }
#endif
}

/* Get a Fortran callback function. */

GLUTproc APIENTRY
__glutGetFCB(int which)
{
#ifdef SUPPORT_FORTRAN
  switch (which) {
  case GLUT_FCB_DISPLAY:
    return __glutCurrentWindow->fdisplay;
  case GLUT_FCB_RESHAPE:
    return __glutCurrentWindow->freshape;
  case GLUT_FCB_MOUSE:
    return __glutCurrentWindow->fmouse;
  case GLUT_FCB_MOTION:
    return __glutCurrentWindow->fmotion;
  case GLUT_FCB_PASSIVE:
    return __glutCurrentWindow->fpassive;
  case GLUT_FCB_ENTRY:
    return __glutCurrentWindow->fentry;
  case GLUT_FCB_KEYBOARD:
    return __glutCurrentWindow->fkeyboard;
  case GLUT_FCB_KEYBOARD_UP:
    return __glutCurrentWindow->fkeyboardUp;
  case GLUT_FCB_WINDOW_STATUS:
    return __glutCurrentWindow->fwindowStatus;
  case GLUT_FCB_VISIBILITY:
    return __glutCurrentWindow->fvisibility;
  case GLUT_FCB_SPECIAL:
    return __glutCurrentWindow->fspecial;
  case GLUT_FCB_SPECIAL_UP:
    return __glutCurrentWindow->fspecialUp;
  case GLUT_FCB_BUTTON_BOX:
    return __glutCurrentWindow->fbuttonBox;
  case GLUT_FCB_DIALS:
    return __glutCurrentWindow->fdials;
  case GLUT_FCB_SPACE_MOTION:
    return __glutCurrentWindow->fspaceMotion;
  case GLUT_FCB_SPACE_ROTATE:
    return __glutCurrentWindow->fspaceRotate;
  case GLUT_FCB_SPACE_BUTTON:
    return __glutCurrentWindow->fspaceButton;
  case GLUT_FCB_TABLET_MOTION:
    return __glutCurrentWindow->ftabletMotion;
  case GLUT_FCB_TABLET_BUTTON:
    return __glutCurrentWindow->ftabletButton;
  case GLUT_FCB_JOYSTICK:
#ifdef _WIN32
    return __glutCurrentWindow->fjoystick;
#else
    return NULL;
#endif
  case GLUT_FCB_OVERLAY_DISPLAY:
    return __glutCurrentWindow->overlay->fdisplay;
  case GLUT_FCB_SELECT:
    return __glutCurrentMenu->fselect;
  case GLUT_FCB_TIMER:
     return __glutTimerList ? __glutTimerList->ffunc : NULL;
  default:
    return NULL;
  }
#else
  return NULL;
#endif
}