int input(struct inp_event *inp, int wait) { int rc; SDL_Event event; SDL_Event peek; memset(&event, 0, sizeof(event)); memset(&peek, 0, sizeof(peek)); if (wait) { rc = SDL_WaitEvent(&event); } else rc = SDL_PollEvent(&event); if (!rc) return 0; inp->sym[0] = 0; inp->type = 0; inp->count = 1; switch(event.type){ #if SDL_VERSION_ATLEAST(2,0,0) case SDL_MULTIGESTURE: case SDL_FINGERMOTION: if (DIRECT_MODE && !game_paused()) return AGAIN; if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, event.type, event.type) > 0) return AGAIN; /* to avoid flickering */ break; case SDL_FINGERUP: #ifdef IOS touch_num = 0; #endif case SDL_FINGERDOWN: #ifdef IOS if (event.type == SDL_FINGERDOWN) { if (gfx_ticks() - touch_stamp > 100) { touch_num = 0; touch_stamp = gfx_ticks(); } touch_num ++; if (touch_num >= 3) { inp->type = KEY_DOWN; inp->code = 0; strncpy(inp->sym, "escape", sizeof(inp->sym)); break; } } #endif gfx_finger_pos_scale(event.tfinger.x, event.tfinger.y, &inp->x, &inp->y); inp->type = (event.type == SDL_FINGERDOWN) ? FINGER_DOWN : FINGER_UP; data2hex(&event.tfinger.fingerId, sizeof(event.tfinger.fingerId), inp->sym); inp->sym[sizeof(event.tfinger.fingerId) * 2] = ':'; data2hex(&event.tfinger.touchId, sizeof(event.tfinger.touchId), inp->sym + sizeof(event.tfinger.fingerId) * 2 + 1); inp->sym[sizeof(event.tfinger.fingerId) * 2 + 1 + sizeof(event.tfinger.touchId) * 2] = 0; break; case SDL_WINDOWEVENT: switch (event.window.event) { /* case SDL_WINDOWEVENT_SHOWN: */ /* case SDL_WINDOWEVENT_RESIZED: */ case SDL_WINDOWEVENT_SIZE_CHANGED: gfx_resize(event.window.data1, event.window.data2); case SDL_WINDOWEVENT_EXPOSED: gfx_flip(); gfx_commit(); break; case SDL_WINDOWEVENT_MINIMIZED: #if defined(ANDROID) gfx_set_mode(gfx_width, gfx_height, gfx_fs); /* reset window size */ #endif case SDL_WINDOWEVENT_RESTORED: m_minimized = (event.window.event == SDL_WINDOWEVENT_MINIMIZED && !opt_fs); snd_pause(!nopause_sw && m_minimized); break; case SDL_WINDOWEVENT_ENTER: case SDL_WINDOWEVENT_FOCUS_GAINED: m_focus = 1; if (opt_fs) mouse_cursor(0); break; case SDL_WINDOWEVENT_LEAVE: m_focus = 0; if (opt_fs) mouse_cursor(1); /* is it hack?*/ break; default: break; } if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_WINDOWEVENT, SDL_WINDOWEVENT) > 0) return AGAIN; /* to avoid flickering */ return 0; #else case SDL_ACTIVEEVENT: if (event.active.state & SDL_APPACTIVE) { m_minimized = !event.active.gain; snd_pause(!nopause_sw && m_minimized); } if (event.active.state & (SDL_APPMOUSEFOCUS | SDL_APPINPUTFOCUS)) { if (event.active.gain) { m_focus = 1; if (opt_fs) mouse_cursor(0); } else if (event.active.state & SDL_APPMOUSEFOCUS) { m_focus = 0; if (opt_fs) mouse_cursor(1); /* is it hack?*/ } } #if SDL_VERSION_ATLEAST(1,3,0) if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_ACTIVEEVENT, SDL_ACTIVEEVENT) > 0) #else if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_EVENTMASK(SDL_ACTIVEEVENT)) > 0) #endif return AGAIN; /* to avoid flickering */ return 0; #endif case SDL_USEREVENT: { void (*p) (void*) = (void (*)(void*))event.user.data1; p(event.user.data2); return AGAIN; } case SDL_QUIT: game_running = 0; return -1; case SDL_KEYDOWN: /* A key has been pressed */ #if SDL_VERSION_ATLEAST(2,0,0) if (event.key.repeat) { if (DIRECT_MODE && !game_paused()) /* do not send key repeats */ return AGAIN; if (gfx_ticks() - last_press_ms < INPUT_REP_DELAY_MS) return AGAIN; if ((gfx_ticks() - last_repeat_ms) < INPUT_REP_INTERVAL_MS) return AGAIN; last_repeat_ms = gfx_ticks(); } else { last_press_ms = gfx_ticks(); last_repeat_ms = gfx_ticks(); } #endif inp->type = KEY_DOWN; inp->code = event.key.keysym.scancode; #if SDL_VERSION_ATLEAST(1,3,0) strncpy(inp->sym, SDL_GetScancodeName(inp->code), sizeof(inp->sym)); #else strncpy(inp->sym, SDL_GetKeyName(event.key.keysym.sym), sizeof(inp->sym)); #endif inp->sym[sizeof(inp->sym) - 1] = 0; tolow(inp->sym); #if SDL_VERSION_ATLEAST(1,3,0) key_compat(inp); #endif #if SDL_VERSION_ATLEAST(1,3,0) /* strange bug in some SDL2 env, with up/down events storm */ if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_KEYDOWN, SDL_KEYUP) > 0) { if (peek.key.keysym.scancode == event.key.keysym.scancode && peek.key.repeat == 0) return AGAIN; } #endif break; case SDL_KEYUP: inp->type = KEY_UP; inp->code = event.key.keysym.scancode; #if SDL_VERSION_ATLEAST(1,3,0) strncpy(inp->sym, SDL_GetScancodeName(inp->code), sizeof(inp->sym)); #else strncpy(inp->sym, SDL_GetKeyName(event.key.keysym.sym), sizeof(inp->sym)); #endif inp->sym[sizeof(inp->sym) - 1] = 0; tolow(inp->sym); #if SDL_VERSION_ATLEAST(1,3,0) key_compat(inp); #endif #if SDL_VERSION_ATLEAST(1,3,0) /* strange bug in some SDL2 env, with up/down events storm */ if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_KEYDOWN, SDL_KEYUP) > 0) { if (event.key.keysym.scancode == peek.key.keysym.scancode && peek.key.repeat == 0) return AGAIN; } #endif break; case SDL_MOUSEMOTION: m_focus = 1; /* ahhh */ if (DIRECT_MODE && !game_paused()) return AGAIN; inp->type = MOUSE_MOTION; inp->x = event.button.x; inp->y = event.button.y; #if SDL_VERSION_ATLEAST(1,3,0) while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION) > 0) { #else while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)) > 0) { #endif inp->x = peek.button.x; inp->y = peek.button.y; } break; case SDL_MOUSEBUTTONUP: inp->type = MOUSE_UP; inp->x = event.button.x; inp->y = event.button.y; inp->code = event.button.button; if (event.button.button == 4) inp->type = 0; else if (event.button.button == 5) inp->type = 0; break; #if SDL_VERSION_ATLEAST(2,0,0) case SDL_MOUSEWHEEL: if (DIRECT_MODE && !game_paused()) return AGAIN; inp->type = (event.wheel.y > 0) ? MOUSE_WHEEL_UP : MOUSE_WHEEL_DOWN; while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_MOUSEWHEEL, SDL_MOUSEWHEEL) > 0) { if (!((event.wheel.y > 0 && inp->type == MOUSE_WHEEL_UP) || (event.wheel.y < 0 && inp->type == MOUSE_WHEEL_DOWN))) break; inp->count ++; } break; #endif case SDL_MOUSEBUTTONDOWN: m_focus = 1; /* ahhh */ inp->type = MOUSE_DOWN; inp->x = event.button.x; inp->y = event.button.y; inp->code = event.button.button; if (event.button.button == 4) inp->type = MOUSE_WHEEL_UP; else if (event.button.button == 5) inp->type = MOUSE_WHEEL_DOWN; #if SDL_VERSION_ATLEAST(1,3,0) while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONDOWN) > 0) { #else while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEBUTTONDOWN)) > 0) { #endif if (!((event.button.button == 4 && inp->type == MOUSE_WHEEL_UP) || (event.button.button == 5 && inp->type == MOUSE_WHEEL_DOWN))) break; inp->count ++; } break; default: break; } return 1; }
void eventhandler() { SDL_Event event; int b; Sint16 true_x, true_y, virtual_x, virtual_y; keystate = SDL_GetKeyState(NULL); while ( SDL_PollEvent(&event) ) { switch (event.type) { case SDL_KEYDOWN: switch(event.key.keysym.sym){ case SDLK_F12: wants_screenshot=1; break; case SDLK_F2: case SDLK_RCTRL: case SDLK_LCTRL: settings.opt_mousemode ^= 4; Play_SoundFX(WAV_LOCK,0); break; case SDLK_F11: gfx_fullscreen = !gfx_fullscreen; gfx_resize(); break; case SDLK_ESCAPE : must_quit=1; break; default: break; } ik_inchar = event.key.keysym.unicode & 0xff; break; case SDL_MOUSEBUTTONDOWN: b = (event.button.button == SDL_BUTTON_LEFT) + 2*(event.button.button == SDL_BUTTON_RIGHT) + 4*(event.button.button == SDL_BUTTON_MIDDLE); ik_mouse_c = b; ik_mouse_b |= b; case SDL_MOUSEMOTION: true_x = event.motion.x; true_y = event.motion.y; g_scaled_video->mapTrueToVirtual( true_x, true_y, &virtual_x, &virtual_y); ik_mouse_x = virtual_x; ik_mouse_y = virtual_y; break; case SDL_MOUSEBUTTONUP: b = (event.button.button == SDL_BUTTON_LEFT) + 2*(event.button.button == SDL_BUTTON_RIGHT) + 4*(event.button.button == SDL_BUTTON_MIDDLE); ik_mouse_b &= (7-b); break; case SDL_ACTIVEEVENT: ActiveApp = event.active.gain; if (ActiveApp) { gfx_redraw = 1; } break; case SDL_VIDEORESIZE: /* DON'T change gfx_width/height; those are * virtual dimensions */ gfx_window_width = event.resize.w; gfx_window_height = event.resize.h; gfx_resize(); /* fallthrough */ case SDL_VIDEOEXPOSE: ActiveApp = 1; break; case SDL_QUIT: must_quit = 1; break; default: break; } } }
/** * Window resize callback * Resize the camera aspect */ void resize_callback(uint width, uint height) { app_window_resize(width, height); gfx_resize(width, height); }