Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
    }
}