+ return 1;
+}
+
+static int handle_joy_event(struct in_sdl_state *state, SDL_Event *event,
+ int *kc_out, int *down_out)
+{
+ int kc = -1, down = 0, ret = 0;
+
+ /* FIXME: should ckeck .which */
+ /* TODO: remaining axis */
+ switch (event->type) {
+ case SDL_JOYAXISMOTION:
+ if (event->jaxis.axis > 1)
+ break;
+ if (-16384 <= event->jaxis.value && event->jaxis.value <= 16384) {
+ kc = state->axis_keydown[event->jaxis.axis];
+ state->axis_keydown[event->jaxis.axis] = 0;
+ ret = 1;
+ }
+ else if (event->jaxis.value < -16384) {
+ kc = state->axis_keydown[event->jaxis.axis];
+ if (kc)
+ update_keystate(state->keystate, kc, 0);
+ kc = event->jaxis.axis ? SDLK_UP : SDLK_LEFT;
+ state->axis_keydown[event->jaxis.axis] = kc;
+ down = 1;
+ ret = 1;
+ }
+ else if (event->jaxis.value > 16384) {
+ kc = state->axis_keydown[event->jaxis.axis];
+ if (kc)
+ update_keystate(state->keystate, kc, 0);
+ kc = event->jaxis.axis ? SDLK_DOWN : SDLK_RIGHT;
+ state->axis_keydown[event->jaxis.axis] = kc;
+ down = 1;
+ ret = 1;
+ }
+ break;
+
+ case SDL_JOYBUTTONDOWN:
+ case SDL_JOYBUTTONUP:
+ kc = (int)event->jbutton.button + SDLK_WORLD_0;
+ down = event->jbutton.state == SDL_PRESSED;
+ ret = 1;
+ break;
+ }
+
+ if (ret)
+ update_keystate(state->keystate, kc, down);
+ if (kc_out != NULL)
+ *kc_out = kc;
+ if (down_out != NULL)
+ *down_out = down;
+
+ return ret;
+}
+
+#define JOY_EVENTS (SDL_JOYAXISMOTIONMASK | SDL_JOYBALLMOTIONMASK | SDL_JOYHATMOTIONMASK \
+ | SDL_JOYBUTTONDOWNMASK | SDL_JOYBUTTONUPMASK)
+
+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;
+
+ maxcount = (one_kc != NULL) ? 1 : sizeof(events) / sizeof(events[0]);
+
+ SDL_PumpEvents();
+ while (1) {
+ count = SDL_PeepEvents(events, maxcount, SDL_GETEVENT, mask);
+ if (count <= 0)
+ break;
+ for (i = 0; i < count; i++) {
+ if (state->joy)
+ ret = handle_joy_event(state,
+ &events[i], one_kc, one_down);
+ else
+ ret = handle_event(state,
+ &events[i], one_kc, one_down);
+ retval |= ret;
+ if (one_kc != NULL && ret)
+ goto out;
+ }