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