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