|  |  |  | @ -311,6 +311,13 @@ static void pollJoystickEvents(void) | 
			
		
	
		
			
				
					|  |  |  |  |                     (_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->axes, j); | 
			
		
	
		
			
				
					|  |  |  |  |                 axes->value = getElementValue(joystick, axes); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             for (j = 0;  j < joystick->numHats;  j++) | 
			
		
	
		
			
				
					|  |  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |  |                 _glfwJoystickElement* hat = | 
			
		
	
		
			
				
					|  |  |  |  |                     (_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->hats, j); | 
			
		
	
		
			
				
					|  |  |  |  |                 hat->value = getElementValue(joystick, hat); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | @ -502,7 +509,7 @@ int _glfwPlatformGetJoystickParam(int joy, int param) | 
			
		
	
		
			
				
					|  |  |  |  |             return (int) CFArrayGetCount(_glfwJoysticks[joy].axes); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         case GLFW_BUTTONS: | 
			
		
	
		
			
				
					|  |  |  |  |             return (int) CFArrayGetCount(_glfwJoysticks[joy].buttons); | 
			
		
	
		
			
				
					|  |  |  |  |             return (int) CFArrayGetCount(_glfwJoysticks[joy].buttons) + ((int) CFArrayGetCount(_glfwJoysticks[joy].hats)) * 4; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         default: | 
			
		
	
		
			
				
					|  |  |  |  |             break; | 
			
		
	
	
		
			
				
					|  |  |  | @ -565,7 +572,7 @@ int _glfwPlatformGetJoystickPos(int joy, float* pos, int numaxes) | 
			
		
	
		
			
				
					|  |  |  |  | int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, | 
			
		
	
		
			
				
					|  |  |  |  |                                     int numbuttons) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     int i; | 
			
		
	
		
			
				
					|  |  |  |  |     int button; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_LAST) | 
			
		
	
		
			
				
					|  |  |  |  |         return 0; | 
			
		
	
	
		
			
				
					|  |  |  | @ -578,17 +585,31 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, | 
			
		
	
		
			
				
					|  |  |  |  |         return 0; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     numbuttons = numbuttons < joystick.numButtons ? numbuttons : joystick.numButtons; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // Update joystick state | 
			
		
	
		
			
				
					|  |  |  |  |     pollJoystickEvents(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     for (i = 0;  i < numbuttons;  i++) | 
			
		
	
		
			
				
					|  |  |  |  |     for (button = 0;  button < numbuttons && button < joystick.numButtons;  button++) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         _glfwJoystickElement* button = (_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick.buttons, i); | 
			
		
	
		
			
				
					|  |  |  |  |         buttons[i] = button->value ? GLFW_PRESS : GLFW_RELEASE; | 
			
		
	
		
			
				
					|  |  |  |  |         _glfwJoystickElement* element = (_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick.buttons, button); | 
			
		
	
		
			
				
					|  |  |  |  |         buttons[button] = element->value ? GLFW_PRESS : GLFW_RELEASE; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return numbuttons; | 
			
		
	
		
			
				
					|  |  |  |  |     // Virtual buttons - Inject data from hats | 
			
		
	
		
			
				
					|  |  |  |  |     // Each hat is exposed as 4 buttons which exposes 8 directions with concurrent button presses | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     const int directions[9] = { 1, 3, 2, 6, 4, 12, 8, 9, 0 }; // Bit fields of button presses for each direction, including nil | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     for (int i = 0;  i < joystick.numHats;  i++) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         _glfwJoystickElement* hat = (_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick.hats, i); | 
			
		
	
		
			
				
					|  |  |  |  |         int value = hat->value; | 
			
		
	
		
			
				
					|  |  |  |  |         if (value < 0 || value > 8) value = 8; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         for (int j = 0; j < 4 && button < numbuttons; j++) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             buttons[button++] = directions[value] & (1 << j) ? GLFW_PRESS : GLFW_RELEASE; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return button; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |