static int loop(void) { SDL_Event e; int d = 1; int ax, ay, dx, dy; /* Process SDL events. */ while (d && SDL_PollEvent(&e)) { switch (e.type) { case SDL_QUIT: return 0; case SDL_MOUSEMOTION: /* Convert to OpenGL coordinates. */ ax = +e.motion.x; ay = -e.motion.y + video.window_h; dx = +e.motion.xrel; dy = (config_get_d(CONFIG_MOUSE_INVERT) ? +e.motion.yrel : -e.motion.yrel); /* Convert to pixels. */ ax = ROUND(ax * video.device_scale); ay = ROUND(ay * video.device_scale); dx = ROUND(dx * video.device_scale); dy = ROUND(dy * video.device_scale); st_point(ax, ay, dx, dy); break; case SDL_MOUSEBUTTONDOWN: d = st_click(e.button.button, 1); break; case SDL_MOUSEBUTTONUP: d = st_click(e.button.button, 0); break; case SDL_KEYDOWN: d = handle_key_dn(&e); break; case SDL_KEYUP: d = handle_key_up(&e); break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_FOCUS_LOST: if (video_get_grab()) goto_state(&st_pause); break; case SDL_WINDOWEVENT_MOVED: if (config_get_d(CONFIG_DISPLAY) != video_display()) config_set_d(CONFIG_DISPLAY, video_display()); break; case SDL_WINDOWEVENT_RESIZED: log_printf("Resize event (%u, %dx%d)\n", e.window.windowID, e.window.data1, e.window.data2); break; case SDL_WINDOWEVENT_SIZE_CHANGED: log_printf("Size change event (%u, %dx%d)\n", e.window.windowID, e.window.data1, e.window.data2); break; } break; case SDL_TEXTINPUT: text_input_str(e.text.text, 1); break; case SDL_JOYAXISMOTION: st_stick(e.jaxis.axis, JOY_VALUE(e.jaxis.value)); break; case SDL_JOYBUTTONDOWN: d = st_buttn(e.jbutton.button, 1); break; case SDL_JOYBUTTONUP: d = st_buttn(e.jbutton.button, 0); break; case SDL_MOUSEWHEEL: st_wheel(e.wheel.x, e.wheel.y); break; } } /* Process events via the tilt sensor API. */ if (tilt_stat()) { int b; int s; st_angle(tilt_get_x(), tilt_get_z()); while (tilt_get_button(&b, &s)) { const int X = config_get_d(CONFIG_JOYSTICK_AXIS_X0); const int Y = config_get_d(CONFIG_JOYSTICK_AXIS_Y0); const int L = config_get_d(CONFIG_JOYSTICK_DPAD_L); const int R = config_get_d(CONFIG_JOYSTICK_DPAD_R); const int U = config_get_d(CONFIG_JOYSTICK_DPAD_U); const int D = config_get_d(CONFIG_JOYSTICK_DPAD_D); if (b == L || b == R || b == U || b == D) { static int pad[4] = { 0, 0, 0, 0 }; /* Track the state of the D-pad buttons. */ if (b == L) pad[0] = s; else if (b == R) pad[1] = s; else if (b == U) pad[2] = s; else if (b == D) pad[3] = s; /* Convert D-pad button events into joystick axis motion. */ if (pad[0] && !pad[1]) st_stick(X, -1.0f); else if (pad[1] && !pad[0]) st_stick(X, +1.0f); else st_stick(X, 0.0f); if (pad[2] && !pad[3]) st_stick(Y, -1.0f); else if (pad[3] && !pad[2]) st_stick(Y, +1.0f); else st_stick(Y, 0.0f); } else d = st_buttn(b, s); } } return d; }
static int loop(void) { SDL_Event e; int d = 1; /* Process SDL events. */ while (d && SDL_PollEvent(&e)) { switch (e.type) { case SDL_QUIT: return 0; case SDL_MOUSEMOTION: st_point(+e.motion.x, -e.motion.y + config_get_d(CONFIG_HEIGHT), +e.motion.xrel, config_get_d(CONFIG_MOUSE_INVERT) ? +e.motion.yrel : -e.motion.yrel); break; case SDL_MOUSEBUTTONDOWN: d = st_click(e.button.button, 1); break; case SDL_MOUSEBUTTONUP: d = st_click(e.button.button, 0); break; case SDL_KEYDOWN: d = handle_key_dn(&e); break; case SDL_KEYUP: d = handle_key_up(&e); break; /* FIXME: SDL_ACTIVEEVENT not available. * http://instead.googlecode.com/svn/trunk/src/sdl-instead/input.c */ /* case SDL_ACTIVEEVENT: if (e.active.state == SDL_APPINPUTFOCUS) if (e.active.gain == 0 && video_get_grab()) goto_state(&st_pause); break; */ case SDL_JOYAXISMOTION: st_stick(e.jaxis.axis, JOY_VALUE(e.jaxis.value)); break; case SDL_JOYBUTTONDOWN: d = st_buttn(e.jbutton.button, 1); break; case SDL_JOYBUTTONUP: d = st_buttn(e.jbutton.button, 0); break; } } /* Process events via the tilt sensor API. */ if (tilt_stat()) { int b; int s; st_angle(tilt_get_x(), tilt_get_z()); while (tilt_get_button(&b, &s)) { const int X = config_get_d(CONFIG_JOYSTICK_AXIS_X); const int Y = config_get_d(CONFIG_JOYSTICK_AXIS_Y); const int L = config_get_d(CONFIG_JOYSTICK_DPAD_L); const int R = config_get_d(CONFIG_JOYSTICK_DPAD_R); const int U = config_get_d(CONFIG_JOYSTICK_DPAD_U); const int D = config_get_d(CONFIG_JOYSTICK_DPAD_D); if (b == L || b == R || b == U || b == D) { static int pad[4] = { 0, 0, 0, 0 }; /* Track the state of the D-pad buttons. */ if (b == L) pad[0] = s; else if (b == R) pad[1] = s; else if (b == U) pad[2] = s; else if (b == D) pad[3] = s; /* Convert D-pad button events into joystick axis motion. */ if (pad[0] && !pad[1]) st_stick(X, -1.0f); else if (pad[1] && !pad[0]) st_stick(X, +1.0f); else st_stick(X, 0.0f); if (pad[2] && !pad[3]) st_stick(Y, -1.0f); else if (pad[3] && !pad[2]) st_stick(Y, +1.0f); else st_stick(Y, 0.0f); } else d = st_buttn(b, s); } } return d; }