Desktop/GLFW - Windows Xbox 360 DPad integration

Monkey Forums/Monkey Code/Desktop/GLFW - Windows Xbox 360 DPad integration

dopeyrulz(Posted 2014) [#1]
NO LONGER REQUIRED - FUNCTIONALITY HAS BEEN IMPLEMENTED INTO v77c

This code will allow you to enable Xbox 360 DPad integration for the Desktop [GLFW] target for the Windows platform. Works in v77b or better.

Replace the following functions in the glfw/src/win32_joystick.c file:

int _glfwPlatformGetJoystickParam( int joy, int param )
{
    JOYCAPS jc;
	int numbuttons;

//  return 0;

    // Is joystick present?
    if( !_glfwJoystickPresent( joy ) )
    {
        return 0;
    }

    // We got this far, the joystick is present
    if( param == GLFW_PRESENT )
    {
        return GL_TRUE;
    }

    // Get joystick capabilities
    _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );

    switch( param )
    {
    case GLFW_AXES:
        // Return number of joystick axes
        return jc.wNumAxes;

    case GLFW_BUTTONS:
        // Return number of joystick axes
		
	// CHANGE - Validate for DPad
	numbuttons = (int) jc.wNumButtons;
	if (jc.wCaps & JOYCAPS_HASPOV) numbuttons += 2;
	return numbuttons;

    default:
        break;
    }

    return 0;
}

int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,
    int numbuttons )
{
    JOYCAPS   jc;
    JOYINFOEX ji;
    int       button;
//  return 0;

    // Is joystick present?
    if( !_glfwJoystickPresent( joy ) )
    {
        return 0;
    }

    // Get joystick capabilities
    _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );

    // Get joystick state
    ji.dwSize = sizeof( JOYINFOEX );
    ji.dwFlags = JOY_RETURNBUTTONS;
    _glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji );

    // Get states of all requested buttons
    button = 0;
    while( button < numbuttons && button < (int) jc.wNumButtons )
    {
        buttons[ button ] = (unsigned char)
            (ji.dwButtons & (1UL << button) ? GLFW_PRESS : GLFW_RELEASE);
        button ++;
    }

    // CHANGE - Get state of DPad
    if (jc.wCaps & JOYCAPS_HASPOV)
    {
	int m, value = ji.dwPOV / 100 / 45;
	const int directions[9] = { 1, 3, 2, 6, 4, 12, 8, 9, 0 };
        const int mapButton[4] = { 9, 10, 11, 8 };
		
	if (value < 0 || value > 8) value = 8;
					
	// Map to required button index
        for (m = 0; m < 4 && button < numbuttons; m++)
        {
            buttons[mapButton[m]] = directions[value] & (1 << m) ? GLFW_PRESS : GLFW_RELEASE;
	}
    }
    return button;
}


The main changes involve extending the number of found buttons by 2 if the DPad is found (glfwPlatformGetJoystickParam) so we can map the results correctly (glfwPlatformGetJoystickButtons).