static int collect_events(struct in_sdl_state *state, int *one_kc, int *one_down) { SDL_Event events[4]; Uint32 mask = state->joy ? JOY_EVENTS : (SDL_ALLEVENTS & ~JOY_EVENTS); int count, maxcount; int i, ret, retval = 0; int num_events, num_peeped_events; SDL_Event *event; maxcount = (one_kc != NULL) ? 1 : sizeof(events) / sizeof(events[0]); SDL_PumpEvents(); num_events = SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, mask); for (num_peeped_events = 0; num_peeped_events < num_events; num_peeped_events += count) { count = SDL_PeepEvents(events, maxcount, SDL_GETEVENT, mask); if (count <= 0) break; for (i = 0; i < count; i++) { event = &events[i]; if (state->joy) ret = handle_joy_event(state, event, one_kc, one_down); else ret = handle_event(state, event, one_kc, one_down); if (ret < 0) { switch (ret) { case -2: SDL_PushEvent(event); break; default: if (ext_event_handler != NULL) ext_event_handler(event); break; } continue; } retval |= ret; if (one_kc != NULL && ret) { // don't lose events other devices might want to handle for (i++; i < count; i++) SDL_PushEvent(&events[i]); goto out; } } } out: return retval; }
void handle_events(const SDL_Event& event) { switch (event.type) { #ifdef USE_SDL2 case SDL_WINDOWEVENT: handle_window_event(event); break; case SDL_TEXTINPUT: handle_text_event(event); break; case SDL_MOUSEWHEEL: handle_mouse_event(event); break; case SDL_FINGERMOTION: handle_mouse_event(event); break; case SDL_FINGERUP: handle_mouse_event(event); break; case SDL_FINGERDOWN: handle_mouse_event(event); break; #endif case SDL_KEYDOWN: handle_key_event(event); break; case SDL_KEYUP: handle_key_event(event); break; case SDL_MOUSEMOTION: handle_mouse_event(event); break; case SDL_MOUSEBUTTONUP: handle_mouse_event(event); break; case SDL_MOUSEBUTTONDOWN: handle_mouse_event(event); break; case SDL_JOYAXISMOTION: handle_joy_event(event); break; case SDL_JOYBUTTONDOWN: handle_joy_event(event); break; case SDL_JOYBUTTONUP: handle_joy_event(event); break; case SDL_QUIT: quit(0); break; default: #ifdef OUYA if(event.type == OuyaControllerManager::BUTTON_DOWN_EVENT) { if(OuyaController::ButtonEnum(int(event.user.data1)) == OuyaController::BUTTON_O) input_continue = true; else if(OuyaController::ButtonEnum(int(event.user.data1)) == OuyaController::BUTTON_DPAD_UP) scroll_amount = 5; else if(OuyaController::ButtonEnum(int(event.user.data1)) == OuyaController::BUTTON_DPAD_DOWN) scroll_amount = -5; else if(OuyaController::ButtonEnum(int(event.user.data1)) == OuyaController::BUTTON_MENU) sendFakeKeyDownEvent(SDLK_ESCAPE); key_press_event = 1; } else if(event.type == OuyaControllerManager::AXIS_EVENT) { const OuyaController& c = OuyaControllerManager::getController(event.user.code); // This should not be in an event or else it's jerky. float v = c.getAxisValue(OuyaController::AXIS_LS_Y) + c.getAxisValue(OuyaController::AXIS_RS_Y); if(fabs(v) > OuyaController::DEADZONE) scroll_amount = -5*v; } #endif break; } }