//========================================================================
// GLFW - An OpenGL framework
// File:        enable.c
// Platform:    Any
// API version: 2.6
// WWW:         http://glfw.sourceforge.net
//------------------------------------------------------------------------
// Copyright (c) 2002-2006 Camilla Berglund
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
//    claim that you wrote the original software. If you use this software
//    in a product, an acknowledgment in the product documentation would
//    be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not
//    be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
//    distribution.
//
//========================================================================

#include "internal.h"


//************************************************************************
//****                  GLFW internal functions                       ****
//************************************************************************

//========================================================================
// Enable (show) mouse cursor
//========================================================================

static void _glfwEnableMouseCursor( void )
{
    int CenterPosX, CenterPosY;

    if( !_glfwWin.Opened || !_glfwWin.MouseLock )
    {
        return;
    }

    // Show mouse cursor
    _glfwPlatformShowMouseCursor();

    CenterPosX = _glfwWin.Width / 2;
    CenterPosY = _glfwWin.Height / 2;

    if( CenterPosX != _glfwInput.MousePosX || CenterPosY != _glfwInput.MousePosY )
    {
	_glfwPlatformSetMouseCursorPos( CenterPosX, CenterPosY );

	_glfwInput.MousePosX = CenterPosX;
	_glfwInput.MousePosY = CenterPosY;

	if( _glfwWin.MousePosCallback )
	{
	    _glfwWin.MousePosCallback( _glfwInput.MousePosX, 
				       _glfwInput.MousePosY );
	}
    }

    // From now on the mouse is unlocked
    _glfwWin.MouseLock = GL_FALSE;
}

//========================================================================
// Disable (hide) mouse cursor
//========================================================================

static void _glfwDisableMouseCursor( void )
{
    if( !_glfwWin.Opened || _glfwWin.MouseLock )
    {
        return;
    }

    // Hide mouse cursor
    _glfwPlatformHideMouseCursor();

    // Move cursor to the middle of the window
    _glfwPlatformSetMouseCursorPos( _glfwWin.Width>>1,
                                    _glfwWin.Height>>1 );

    // From now on the mouse is locked
    _glfwWin.MouseLock = GL_TRUE;
}


//========================================================================
// _glfwEnableStickyKeys() - Enable sticky keys
// _glfwDisableStickyKeys() - Disable sticky keys
//========================================================================

static void _glfwEnableStickyKeys( void )
{
    _glfwInput.StickyKeys = 1;
}

static void _glfwDisableStickyKeys( void )
{
    int i;

    _glfwInput.StickyKeys = 0;

    // Release all sticky keys
    for( i = 0; i <= GLFW_KEY_LAST; i ++ )
    {
        if( _glfwInput.Key[ i ] == 2 )
        {
            _glfwInput.Key[ i ] = 0;
        }
    }
}


//========================================================================
// _glfwEnableStickyMouseButtons() - Enable sticky mouse buttons
// _glfwDisableStickyMouseButtons() - Disable sticky mouse buttons
//========================================================================

static void _glfwEnableStickyMouseButtons( void )
{
    _glfwInput.StickyMouseButtons = 1;
}

static void _glfwDisableStickyMouseButtons( void )
{
    int i;

    _glfwInput.StickyMouseButtons = 0;

    // Release all sticky mouse buttons
    for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ )
    {
        if( _glfwInput.MouseButton[ i ] == 2 )
        {
            _glfwInput.MouseButton[ i ] = 0;
        }
    }
}


//========================================================================
// _glfwEnableSystemKeys() - Enable system keys
// _glfwDisableSystemKeys() - Disable system keys
//========================================================================

static void _glfwEnableSystemKeys( void )
{
    if( !_glfwWin.SysKeysDisabled )
    {
        return;
    }

    _glfwPlatformEnableSystemKeys();

    // Indicate that system keys are no longer disabled
    _glfwWin.SysKeysDisabled = GL_FALSE;
}

static void _glfwDisableSystemKeys( void )
{
    if( _glfwWin.SysKeysDisabled )
    {
        return;
    }

    _glfwPlatformDisableSystemKeys();

    // Indicate that system keys are now disabled
    _glfwWin.SysKeysDisabled = GL_TRUE;
}


//========================================================================
// _glfwEnableKeyRepeat() - Enable key repeat
// _glfwDisableKeyRepeat() - Disable key repeat
//========================================================================

static void _glfwEnableKeyRepeat( void )
{
    _glfwInput.KeyRepeat = 1;
}

static void _glfwDisableKeyRepeat( void )
{
    _glfwInput.KeyRepeat = 0;
}


//========================================================================
// _glfwEnableAutoPollEvents() - Enable automatic event polling
// _glfwDisableAutoPollEvents() - Disable automatic event polling
//========================================================================

static void _glfwEnableAutoPollEvents( void )
{
    _glfwWin.AutoPollEvents = 1;
}

static void _glfwDisableAutoPollEvents( void )
{
    _glfwWin.AutoPollEvents = 0;
}



//************************************************************************
//****                    GLFW user functions                         ****
//************************************************************************

//========================================================================
// glfwEnable() - Enable certain GLFW/window/system functions.
//========================================================================

GLFWAPI void GLFWAPIENTRY glfwEnable( int token )
{
    // Is GLFW initialized?
    if( !_glfwInitialized )
    {
        return;
    }

    switch( token )
    {
    case GLFW_MOUSE_CURSOR:
        _glfwEnableMouseCursor();
        break;
    case GLFW_STICKY_KEYS:
        _glfwEnableStickyKeys();
        break;
    case GLFW_STICKY_MOUSE_BUTTONS:
        _glfwEnableStickyMouseButtons();
        break;
    case GLFW_SYSTEM_KEYS:
        _glfwEnableSystemKeys();
        break;
    case GLFW_KEY_REPEAT:
        _glfwEnableKeyRepeat();
        break;
    case GLFW_AUTO_POLL_EVENTS:
        _glfwEnableAutoPollEvents();
        break;
    default:
        break;
    }
}


//========================================================================
// glfwDisable() - Disable certain GLFW/window/system functions.
//========================================================================

GLFWAPI void GLFWAPIENTRY glfwDisable( int token )
{
    // Is GLFW initialized?
    if( !_glfwInitialized )
    {
        return;
    }

    switch( token )
    {
    case GLFW_MOUSE_CURSOR:
        _glfwDisableMouseCursor();
        break;
    case GLFW_STICKY_KEYS:
        _glfwDisableStickyKeys();
        break;
    case GLFW_STICKY_MOUSE_BUTTONS:
        _glfwDisableStickyMouseButtons();
        break;
    case GLFW_SYSTEM_KEYS:
        _glfwDisableSystemKeys();
        break;
    case GLFW_KEY_REPEAT:
        _glfwDisableKeyRepeat();
        break;
    case GLFW_AUTO_POLL_EVENTS:
        _glfwDisableAutoPollEvents();
        break;
    default:
        break;
    }
}