mirror of
				https://github.com/glfw/glfw.git
				synced 2025-11-03 22:04:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			311 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			311 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
//========================================================================
 | 
						|
// GLFW - An OpenGL framework
 | 
						|
// Platform:    Any
 | 
						|
// API version: 3.0
 | 
						|
// WWW:         http://www.glfw.org/
 | 
						|
//------------------------------------------------------------------------
 | 
						|
// Copyright (c) 2002-2006 Marcus Geelnard
 | 
						|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
 | 
						|
//
 | 
						|
// 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 enableMouseCursor( 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 disableMouseCursor( 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;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Enable sticky keys
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void enableStickyKeys( void )
 | 
						|
{
 | 
						|
    _glfwInput.StickyKeys = 1;
 | 
						|
}
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Disable sticky keys
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void disableStickyKeys( 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;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Enable sticky mouse buttons
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void enableStickyMouseButtons( void )
 | 
						|
{
 | 
						|
    _glfwInput.StickyMouseButtons = 1;
 | 
						|
}
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Disable sticky mouse buttons
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void disableStickyMouseButtons( 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;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Enable system keys
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void enableSystemKeys( void )
 | 
						|
{
 | 
						|
    if( !_glfwWin.sysKeysDisabled )
 | 
						|
    {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    _glfwPlatformEnableSystemKeys();
 | 
						|
 | 
						|
    // Indicate that system keys are no longer disabled
 | 
						|
    _glfwWin.sysKeysDisabled = GL_FALSE;
 | 
						|
}
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Disable system keys
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void disableSystemKeys( void )
 | 
						|
{
 | 
						|
    if( _glfwWin.sysKeysDisabled )
 | 
						|
    {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    _glfwPlatformDisableSystemKeys();
 | 
						|
 | 
						|
    // Indicate that system keys are now disabled
 | 
						|
    _glfwWin.sysKeysDisabled = GL_TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Enable key repeat
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void enableKeyRepeat( void )
 | 
						|
{
 | 
						|
    _glfwInput.KeyRepeat = 1;
 | 
						|
}
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Disable key repeat
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void disableKeyRepeat( void )
 | 
						|
{
 | 
						|
    _glfwInput.KeyRepeat = 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Enable automatic event polling
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void enableAutoPollEvents( void )
 | 
						|
{
 | 
						|
    _glfwWin.autoPollEvents = 1;
 | 
						|
}
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Disable automatic event polling
 | 
						|
//========================================================================
 | 
						|
 | 
						|
static void disableAutoPollEvents( void )
 | 
						|
{
 | 
						|
    _glfwWin.autoPollEvents = 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
//************************************************************************
 | 
						|
//****                    GLFW user functions                         ****
 | 
						|
//************************************************************************
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Enable certain GLFW/window/system functions.
 | 
						|
//========================================================================
 | 
						|
 | 
						|
GLFWAPI void glfwEnable( int token )
 | 
						|
{
 | 
						|
    // Is GLFW initialized?
 | 
						|
    if( !_glfwInitialized )
 | 
						|
    {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    switch( token )
 | 
						|
    {
 | 
						|
        case GLFW_MOUSE_CURSOR:
 | 
						|
            enableMouseCursor();
 | 
						|
            break;
 | 
						|
        case GLFW_STICKY_KEYS:
 | 
						|
            enableStickyKeys();
 | 
						|
            break;
 | 
						|
        case GLFW_STICKY_MOUSE_BUTTONS:
 | 
						|
            enableStickyMouseButtons();
 | 
						|
            break;
 | 
						|
        case GLFW_SYSTEM_KEYS:
 | 
						|
            enableSystemKeys();
 | 
						|
            break;
 | 
						|
        case GLFW_KEY_REPEAT:
 | 
						|
            enableKeyRepeat();
 | 
						|
            break;
 | 
						|
        case GLFW_AUTO_POLL_EVENTS:
 | 
						|
            enableAutoPollEvents();
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//========================================================================
 | 
						|
// Disable certain GLFW/window/system functions.
 | 
						|
//========================================================================
 | 
						|
 | 
						|
GLFWAPI void glfwDisable( int token )
 | 
						|
{
 | 
						|
    // Is GLFW initialized?
 | 
						|
    if( !_glfwInitialized )
 | 
						|
    {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    switch( token )
 | 
						|
    {
 | 
						|
        case GLFW_MOUSE_CURSOR:
 | 
						|
            disableMouseCursor();
 | 
						|
            break;
 | 
						|
        case GLFW_STICKY_KEYS:
 | 
						|
            disableStickyKeys();
 | 
						|
            break;
 | 
						|
        case GLFW_STICKY_MOUSE_BUTTONS:
 | 
						|
            disableStickyMouseButtons();
 | 
						|
            break;
 | 
						|
        case GLFW_SYSTEM_KEYS:
 | 
						|
            disableSystemKeys();
 | 
						|
            break;
 | 
						|
        case GLFW_KEY_REPEAT:
 | 
						|
            disableKeyRepeat();
 | 
						|
            break;
 | 
						|
        case GLFW_AUTO_POLL_EVENTS:
 | 
						|
            disableAutoPollEvents();
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |