| @@ -20,23 +20,25 @@ static int sdl_match_gamepad(SDL_JoystickID id, void* data) { | |||||
| SDL_GameControllerGetJoystick(gamepad)) | SDL_GameControllerGetJoystick(gamepad)) | ||||
| == id); | == id); | ||||
| } | } | ||||
| /* | |||||
| static int sdl_event_filter(void*, SDL_Event* event) { | static int sdl_event_filter(void*, SDL_Event* event) { | ||||
| return ( SDL_QUIT == event->type || | return ( SDL_QUIT == event->type || | ||||
| SDL_KEYDOWN == event->type || | SDL_KEYDOWN == event->type || | ||||
| SDL_KEYUP == event->type || | SDL_KEYUP == event->type || | ||||
| SDL_CONTROLLERBUTTONDOWN == event->type || | |||||
| SDL_CONTROLLERBUTTONUP == event->type || | |||||
| SDL_CONTROLLERDEVICEADDED == event->type || | SDL_CONTROLLERDEVICEADDED == event->type || | ||||
| SDL_CONTROLLERDEVICEREMOVED == event->type | SDL_CONTROLLERDEVICEREMOVED == event->type | ||||
| ); | ); | ||||
| } | } | ||||
| */ | |||||
| static int sdl_input_init(nes_Input_Reader* reader) { | static int sdl_input_init(nes_Input_Reader* reader) { | ||||
| int status = SDL_Init(SDL_INIT_EVENTS | | int status = SDL_Init(SDL_INIT_EVENTS | | ||||
| SDL_INIT_GAMECONTROLLER); | SDL_INIT_GAMECONTROLLER); | ||||
| if (status == 0) { | if (status == 0) { | ||||
| reader->data = sdl_find_gamepad(); | reader->data = sdl_find_gamepad(); | ||||
| SDL_SetEventFilter(sdl_event_filter, NULL); | |||||
| // SDL_SetEventFilter(sdl_event_filter, NULL); | |||||
| } | } | ||||
| return status; | return status; | ||||
| @@ -57,13 +59,7 @@ static const int sdl_keycodes[nes_controller_num_buttons] = { | |||||
| SDLK_RIGHT, | SDLK_RIGHT, | ||||
| }; | }; | ||||
| static int button_index(int keycode) { | |||||
| int index = nes_controller_num_buttons - 1; | |||||
| for ( ; index > 0 && keycode != sdl_keycodes[index]; --index); | |||||
| return index; | |||||
| } | |||||
| static const int sdl_gamepad_buttons[nes_controller_num_buttons] = { | |||||
| static const int sdl_buttons[nes_controller_num_buttons] = { | |||||
| SDL_CONTROLLER_BUTTON_A, | SDL_CONTROLLER_BUTTON_A, | ||||
| SDL_CONTROLLER_BUTTON_B, | SDL_CONTROLLER_BUTTON_B, | ||||
| SDL_CONTROLLER_BUTTON_BACK, | SDL_CONTROLLER_BUTTON_BACK, | ||||
| @@ -74,6 +70,12 @@ static const int sdl_gamepad_buttons[nes_controller_num_buttons] = { | |||||
| SDL_CONTROLLER_BUTTON_DPAD_RIGHT, | SDL_CONTROLLER_BUTTON_DPAD_RIGHT, | ||||
| }; | }; | ||||
| static int button_index(int keycode, const int* codes) { | |||||
| int index = nes_controller_num_buttons - 1; | |||||
| for ( ; index >= 0 && keycode != codes[index]; --index); | |||||
| return index; | |||||
| } | |||||
| static int sdl_input_update(nes_Input_Reader* reader, | static int sdl_input_update(nes_Input_Reader* reader, | ||||
| nes_input* input) { | nes_input* input) { | ||||
| int status = 0; | int status = 0; | ||||
| @@ -86,12 +88,28 @@ static int sdl_input_update(nes_Input_Reader* reader, | |||||
| } else if ( SDL_KEYDOWN == event.type || | } else if ( SDL_KEYDOWN == event.type || | ||||
| SDL_KEYUP == event.type) { | SDL_KEYUP == event.type) { | ||||
| int index = button_index(event.key.keysym.sym); | |||||
| uint8_t mask = (1 << index); | |||||
| if (SDL_KEYDOWN == event.type) { | |||||
| input->controllers[0].buttons |= mask; | |||||
| } else { | |||||
| input->controllers[0].buttons &= ~mask; | |||||
| int index = button_index(event.key.keysym.sym, | |||||
| sdl_keycodes); | |||||
| if (index >= 0) { | |||||
| uint8_t mask = (1 << index); | |||||
| if (SDL_KEYDOWN == event.type) { | |||||
| input->controllers[0].buttons |= mask; | |||||
| } else { | |||||
| input->controllers[0].buttons &= ~mask; | |||||
| } | |||||
| } | |||||
| } else if ( SDL_CONTROLLERBUTTONDOWN == event.type || | |||||
| SDL_CONTROLLERBUTTONUP == event.type) { | |||||
| int index = button_index(event.cbutton.button, | |||||
| sdl_buttons); | |||||
| if (index >= 0) { | |||||
| uint8_t mask = (1 << index); | |||||
| if (SDL_CONTROLLERBUTTONDOWN == event.type) { | |||||
| input->controllers[0].buttons |= mask; | |||||
| } else { | |||||
| input->controllers[0].buttons &= ~mask; | |||||
| } | |||||
| } | } | ||||
| } else if (SDL_CONTROLLERDEVICEADDED == event.type) { | } else if (SDL_CONTROLLERDEVICEADDED == event.type) { | ||||
| @@ -108,19 +126,6 @@ static int sdl_input_update(nes_Input_Reader* reader, | |||||
| } | } | ||||
| } | } | ||||
| if (NULL != reader->data) { | |||||
| SDL_GameController* gamepad = (SDL_GameController*)reader->data; | |||||
| for (int b = 0; b < nes_controller_num_buttons; ++b) { | |||||
| if (SDL_GameControllerGetButton( | |||||
| gamepad, sdl_gamepad_buttons[b])) { | |||||
| input->controllers[0].buttons |= (1 << b); | |||||
| } else { | |||||
| input->controllers[0].buttons &= ~(1 << b); | |||||
| } | |||||
| } | |||||
| } | |||||
| return status; | return status; | ||||
| } | } | ||||