static int handle_key_up(SDL_Event *e) { int d = 1; int c = e->key.keysym.sym; switch (c) { case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 0); break; case KEY_EXIT: d = st_keybd(KEY_EXIT, 0); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0); else d = st_keybd(e->key.keysym.sym, 0); } return d; }
static int handle_key_dn(SDL_Event *e) { int d = 1; int c = e->key.keysym.sym; /* SDL made me do it. */ #ifdef __APPLE__ if (c == SDLK_q && e->key.keysym.mod & KMOD_META) return 0; #endif #ifdef WIN32 if (c == SDLK_F4 && e->key.keysym.mod & KMOD_ALT) return 0; #endif switch (c) { case KEY_SCREENSHOT: shot_prep(); break; case KEY_FPS: config_tgl_d(CONFIG_FPS); break; case KEY_WIREFRAME: if (config_cheat()) toggle_wire(); break; case KEY_LERP: if (config_cheat()) toggle_lerp(); break; case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case SDLK_ESCAPE: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 1); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), -1.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), +1.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), -1.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), +1.0f); /* FIXME: SDL_EnableUNICODE() is not available */ /*if (SDL_EnableUNICODE(-1)) d = st_keybd(e->key.keysym.unicode, 1); else*/ d = st_keybd(e->key.keysym.sym, 1); } return d; }
static int handle_key_dn(SDL_Event *e) { int d = 1; int c = e->key.keysym.sym; /* SDL made me do it. */ #ifdef __APPLE__ if (c == SDLK_q && e->key.keysym.mod & KMOD_GUI) return 0; #endif #ifdef _WIN32 if (c == SDLK_F4 && e->key.keysym.mod & KMOD_ALT) return 0; #endif switch (c) { case KEY_SCREENSHOT: shot(); break; case KEY_FPS: config_tgl_d(CONFIG_FPS); break; case KEY_WIREFRAME: if (config_cheat()) toggle_wire(); break; case KEY_RESOURCES: if (config_cheat()) { light_load(); mtrl_reload(); } break; case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case KEY_EXIT: d = st_keybd(KEY_EXIT, 1); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), -1.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), +1.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), -1.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), +1.0f); else d = st_keybd(e->key.keysym.sym, 1); } return d; }
static int loop(void) { SDL_Event e; int d = 1; int c; /* 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: c = e.key.keysym.sym; if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), -JOY_MAX); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), +JOY_MAX); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), -JOY_MAX); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), +JOY_MAX); else switch (c) { case SDLK_F10: shot(); break; case SDLK_F9: config_tgl_d(CONFIG_FPS); break; case SDLK_F8: config_tgl_d(CONFIG_NICE); break; case SDLK_F7: if (config_cheat()) toggle_wire(); break; case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case SDLK_ESCAPE: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 1); break; default: if (SDL_EnableUNICODE(-1)) d = st_keybd(e.key.keysym.unicode, 1); else d = st_keybd(e.key.keysym.sym, 1); } break; case SDL_KEYUP: c = e.key.keysym.sym; if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), 1); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), 1); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), 1); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), 1); else switch (c) { case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 0); break; case SDLK_ESCAPE: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 0); break; default: d = st_keybd(e.key.keysym.sym, 0); } case SDL_ACTIVEEVENT: if (e.active.state == SDL_APPINPUTFOCUS) if (e.active.gain == 0 && video_get_grab()) goto_pause(); break; case SDL_JOYAXISMOTION: st_stick(e.jaxis.axis, 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((int) tilt_get_x(), (int) 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, -JOY_MAX); else if (pad[1] && !pad[0]) st_stick(X, +JOY_MAX); else st_stick(X, 1); if (pad[2] && !pad[3]) st_stick(Y, -JOY_MAX); else if (pad[3] && !pad[2]) st_stick(Y, +JOY_MAX); else st_stick(Y, 1); } else d = st_buttn(b, s); } } return d; }
static int loop(void) { SDL_Event e; int d = 1; int c; while (d && SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) return 0; switch (e.type) { case SDL_MOUSEMOTION: st_point(+e.motion.x, -e.motion.y + config_get_d(CONFIG_HEIGHT), +e.motion.xrel, -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: c = e.key.keysym.sym; #ifdef __APPLE__ if (c == SDLK_q && e.key.keysym.mod & KMOD_META) { d = 0; break; } #endif #ifdef WIN32 if (c == SDLK_F4 && e.key.keysym.mod & KMOD_ALT) { d = 0; break; } #endif switch (c) { case KEY_SCREENSHOT: shot_prep(); break; case KEY_FPS: config_tgl_d(CONFIG_FPS); break; case KEY_WIREFRAME: toggle_wire(); break; case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case SDLK_ESCAPE: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 1); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), -1.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), +1.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), -1.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), +1.0f); d = st_keybd(e.key.keysym.sym, 1); } break; case SDL_KEYUP: c = e.key.keysym.sym; switch (c) { case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 0); break; case SDLK_ESCAPE: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 0); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), 0.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), 0.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), 0.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), 0.0f); d = st_keybd(e.key.keysym.sym, 0); } 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_pause(&st_over, 0); 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; } } return d; }
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; int c; while (d && SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) return 0; switch (e.type) { case SDL_MOUSEMOTION: st_point(+e.motion.x, -e.motion.y + config_get_d(CONFIG_HEIGHT), +e.motion.xrel, -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: c = e.key.keysym.sym; #ifdef __APPLE__ if (c == SDLK_q && e.key.keysym.mod & KMOD_GUI) { d = 0; break; } #endif #ifdef _WIN32 if (c == SDLK_F4 && e.key.keysym.mod & KMOD_ALT) { d = 0; break; } #endif switch (c) { case KEY_SCREENSHOT: shot(); break; case KEY_FPS: config_tgl_d(CONFIG_FPS); break; case KEY_WIREFRAME: toggle_wire(); break; case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case SDLK_ESCAPE: if (video_get_grab()) d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_START), 1); else d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_B), 1); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), -1.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), +1.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), -1.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), +1.0f); else d = st_keybd(e.key.keysym.sym, 1); } break; case SDL_KEYUP: c = e.key.keysym.sym; switch (c) { case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 0); break; case SDLK_ESCAPE: if (video_get_grab()) d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_START), 0); else d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_B), 0); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0.0f); else d = st_keybd(e.key.keysym.sym, 0); } break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_FOCUS_LOST: if (video_get_grab()) goto_pause(&st_over); break; case SDL_WINDOWEVENT_MOVED: if (config_get_d(CONFIG_DISPLAY) != video_display()) config_set_d(CONFIG_DISPLAY, video_display()); break; } 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; } } return d; }
static int loop(void) { SDL_Event e; int d = 1; int c; int ax, ay, dx, dy; while (d && SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) return 0; switch (e.type) { case SDL_MOUSEMOTION: /* Convert to OpenGL coordinates. */ ax = +e.motion.x; ay = -e.motion.y + video.window_h; dx = +e.motion.xrel; dy = -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_FINGERMOTION: case SDL_FINGERDOWN: case SDL_FINGERUP: /* Convert to OpenGL coordinates. */ if (video.device_orientation & VIDEO_ORIENTATION_ROTATE) { ax = e.tfinger.y * video.window_w; ay = e.tfinger.x * video.window_h; dx = e.tfinger.dy * video.window_w; dy = e.tfinger.dx * video.window_h; if (video.device_orientation & VIDEO_ORIENTATION_MIRROR) { ax = video.window_w - ax; ay = video.window_h - ay; dx *= -1; dy *= -1; } } else { ax = e.tfinger.x * video.window_w; ay = e.tfinger.y * video.window_h; dx = e.tfinger.dx * video.window_w; dy = e.tfinger.dy * video.window_h; if (video.device_orientation & VIDEO_ORIENTATION_MIRROR) { ax = video.window_w - ax; dx *= -1; } else { ay = video.window_h - ay; dy *= -1; } } /* 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); if (e.type == SDL_FINGERDOWN) { d = st_click(SDL_BUTTON_LEFT, 1); } else if (e.type == SDL_FINGERUP) { d = st_click(SDL_BUTTON_LEFT, 0); st_point(0, 0, 0, 0); } break; case SDL_KEYDOWN: c = e.key.keysym.sym; #ifdef __APPLE__ if (c == SDLK_q && e.key.keysym.mod & KMOD_GUI) { d = 0; break; } #endif #ifdef _WIN32 if (c == SDLK_F4 && e.key.keysym.mod & KMOD_ALT) { d = 0; break; } #endif switch (c) { case KEY_SCREENSHOT: shot(); break; case KEY_FPS: config_tgl_d(CONFIG_FPS); break; case KEY_WIREFRAME: toggle_wire(); break; case SDLK_RETURN: case SDLK_KP_ENTER: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case SDLK_ESCAPE: if (video_get_grab()) d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_START), 1); else d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_B), 1); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), -1.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), +1.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), -1.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), +1.0f); else d = st_keybd(e.key.keysym.sym, 1); } break; case SDL_KEYUP: c = e.key.keysym.sym; switch (c) { case SDLK_RETURN: case SDLK_KP_ENTER: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 0); break; case SDLK_ESCAPE: if (video_get_grab()) d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_START), 0); else d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_B), 0); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0.0f); else d = st_keybd(e.key.keysym.sym, 0); } break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_FOCUS_LOST: if (video_get_grab()) goto_pause(&st_over); break; case SDL_WINDOWEVENT_MOVED: if (config_get_d(CONFIG_DISPLAY) != video_display()) config_set_d(CONFIG_DISPLAY, video_display()); break; } 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; } } 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; }