/*
 * freeglut_misc.c
*
 * Adapted from the FreeGLUT library by Hans de Ruiter.
 * The FreeGLUT license holds for this file.
 *
 * Functions that didn't fit anywhere else...
 *
 * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
 * Written by Pawel W. Olszta, <olszta@sourceforge.net>
 * Creation date: Thu Dec 9 1999
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include <GL/glut.h>
#include "glut_internal.h"

/*
 * TODO BEFORE THE STABLE RELEASE:
 *
 *  glutSetColor()     --
 *  glutGetColor()     --
 *  glutCopyColormap() --
 *  glutSetKeyRepeat() -- this is evil and should be removed from API
 */

/* -- INTERFACE FUNCTIONS -------------------------------------------------- */

/*
 * This functions checks if an OpenGL extension is supported or not
 *
 * XXX Wouldn't this be simpler and clearer if we used strtok()?
 */
int glut_GLUTExtensionSupported(struct GlutIFace *Self, const char* extension )
{
    GLUTcontext ctx = (GLUTcontext)GET_INSTANCE(Self);

    const char *extensions, *start;
    const int len = strlen( extension );

    /* Make sure there is a current window, and thus a current context available */
    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutExtensionSupported" );

    if (strchr(extension, ' '))
      return 0;

	if(ctx->__glutContext)
	{
		start = extensions = (const char *) ctx->__glutContext->GLGetString(GL_EXTENSIONS);

	    /* XXX consider printing a warning to stderr that there's no current
	     * rendering context.
	     */
	    freeglut_return_val_if_fail( extensions != NULL, 0 );

	    while (1) {
	       const char *p = strstr(extensions, extension);
	       if (!p)
	          return 0;  /* not found */
	       /* check that the match isn't a super string */
	       if ((p == start || p[-1] == ' ') && (p[len] == ' ' || p[len] == 0))
	          return 1;
	       /* skip the false match and continue */
	       extensions = p + len;
	    }
	}
	return 0 ;
}

/*
 * Set global auto-repeat of keystrokes
 *
 * RepeatMode should be either:
 *    GLUT_KEY_REPEAT_OFF
 *    GLUT_KEY_REPEAT_ON
 *    GLUT_KEY_REPEAT_DEFAULT
 */
void glut_GLUTSetKeyRepeat(struct GlutIFace *Self,  int repeatMode )
{
    GLUTcontext ctx = (GLUTcontext)GET_INSTANCE(Self);

	FREEGLUT_EXIT_IF_NOT_INITIALISED_NR ( "glutSetKeyRepeat" );

    switch( repeatMode )
    {
    case GLUT_KEY_REPEAT_OFF:
    case GLUT_KEY_REPEAT_ON:
	 ctx->keyRepeatMode = repeatMode;
     break;

    case GLUT_KEY_REPEAT_DEFAULT:
     ctx->keyRepeatMode = GLUT_KEY_REPEAT_ON;
     break;

    default:
        fgError ("Invalid glutSetKeyRepeat mode: %d", repeatMode);
        break;
    }
}

/*
 * Forces the joystick callback to be executed
 */
void glut_GLUTForceJoystickFunc(struct GlutIFace *Self)
{
    GLUTcontext ctx = (GLUTcontext)GET_INSTANCE(Self);

	FREEGLUT_EXIT_IF_NOT_INITIALISED_NR ( "glutForceJoystickFunc" );

	ctx->GlutEvent |= GLUTEVENT_JOYSTICK;
}

/*
 *
 */
void glut_GLUTSetColor(struct GlutIFace *Self,  int nColor, GLfloat red, GLfloat green, GLfloat blue )
{
    GLUTcontext ctx = (GLUTcontext)GET_INSTANCE(Self);

	FREEGLUT_EXIT_IF_NOT_INITIALISED_NR ( "glutSetColor" );
    /* We really need to do something here. */
}

/*
 *
 */
GLfloat glut_GLUTGetColor(struct GlutIFace *Self,  int color, int component )
{
    GLUTcontext ctx = (GLUTcontext)GET_INSTANCE(Self);

    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetColor" );
    /* We really need to do something here. */
    return( 0.0f );
}

/*
 *
 */
void glut_GLUTCopyColormap(struct GlutIFace *Self,  int window )
{
    GLUTcontext ctx = (GLUTcontext)GET_INSTANCE(Self);

	FREEGLUT_EXIT_IF_NOT_INITIALISED_NR ( "glutCopyColormap" );
    /* We really need to do something here. */
}

/*** END OF FILE ***/
