/** ** Handle interactive input event. ** ** @param callbacks Callback structure for events. ** @param event SDL event structure pointer. */ static void SdlDoEvent(const EventCallback &callbacks, SDL_Event &event) { #if (defined(USE_OPENGL) || defined(USE_GLES)) // Scale mouse-coordinates to viewport if (ZoomNoResize && (event.type & (SDL_MOUSEBUTTONUP | SDL_MOUSEBUTTONDOWN | SDL_MOUSEMOTION))) { event.button.x = (Uint16)floorf(event.button.x * float(Video.Width) / Video.ViewportWidth); event.button.y = (Uint16)floorf(event.button.y * float(Video.Height) / Video.ViewportHeight); } #endif switch (event.type) { case SDL_MOUSEBUTTONDOWN: InputMouseButtonPress(callbacks, SDL_GetTicks(), event.button.button); break; case SDL_MOUSEBUTTONUP: InputMouseButtonRelease(callbacks, SDL_GetTicks(), event.button.button); break; // FIXME: check if this is only useful for the cursor // FIXME: if this is the case we don't need this. case SDL_MOUSEMOTION: InputMouseMove(callbacks, SDL_GetTicks(), event.motion.x, event.motion.y); // FIXME: Same bug fix from X11 if ((UI.MouseWarpPos.x != -1 || UI.MouseWarpPos.y != -1) && (event.motion.x != UI.MouseWarpPos.x || event.motion.y != UI.MouseWarpPos.y)) { int xw = UI.MouseWarpPos.x; int yw = UI.MouseWarpPos.y; UI.MouseWarpPos.x = -1; UI.MouseWarpPos.y = -1; SDL_WarpMouse(xw, yw); } break; case SDL_ACTIVEEVENT: if (event.active.state & SDL_APPMOUSEFOCUS) { static bool InMainWindow = true; if (InMainWindow && !event.active.gain) { InputMouseExit(callbacks, SDL_GetTicks()); } InMainWindow = (event.active.gain != 0); } if (!IsNetworkGame() && Preference.PauseOnLeave && (event.active.state & SDL_APPACTIVE || SDL_GetAppState() & SDL_APPACTIVE)) { static bool DoTogglePause = false; if (IsSDLWindowVisible && !event.active.gain) { IsSDLWindowVisible = false; if (!GamePaused) { DoTogglePause = true; UiTogglePause(); } } else if (!IsSDLWindowVisible && event.active.gain) { IsSDLWindowVisible = true; if (GamePaused && DoTogglePause) { DoTogglePause = false; UiTogglePause(); } } } break; case SDL_KEYDOWN: if (GLShaderPipelineSupported && event.key.keysym.sym == SDLK_SLASH && event.key.keysym.mod & KMOD_ALT && event.key.keysym.mod & KMOD_CTRL) { LoadShaders(); break; } InputKeyButtonPress(callbacks, SDL_GetTicks(), event.key.keysym.sym, event.key.keysym.unicode); break; case SDL_KEYUP: InputKeyButtonRelease(callbacks, SDL_GetTicks(), event.key.keysym.sym, event.key.keysym.unicode); break; case SDL_QUIT: Exit(0); break; } if (&callbacks == GetCallbacks()) { handleInput(&event); } }
/** ** Handle interactive input event. ** ** @param callbacks Callback structure for events. ** @param event SDL event structure pointer. */ static void SdlDoEvent(const EventCallback *callbacks, const SDL_Event *event) { #ifdef DUMP_SDL_EVENTS DumpSdlEvent(event); #endif switch (event->type) { case SDL_MOUSEBUTTONDOWN: if (event->motion.which != 0) return; // temporary ignore multitouch InputMouseButtonPress(callbacks, SDL_GetTicks(), event->button.button); break; case SDL_MOUSEBUTTONUP: if (event->motion.which != 0) return; // temporary ignore multitouch InputMouseButtonRelease(callbacks, SDL_GetTicks(), event->button.button); break; // FIXME: check if this is only useful for the cursor // FIXME: if this is the case we don't need this. case SDL_MOUSEMOTION: if (event->motion.which != 0) return; // temporary ignore multitouch InputMouseMove(callbacks, SDL_GetTicks(), event->motion.x, event->motion.y); // FIXME: Same bug fix from X11 if ((UI.MouseWarpX != -1 || UI.MouseWarpY != -1) && (event->motion.x != UI.MouseWarpX || event->motion.y != UI.MouseWarpY)) { int xw = UI.MouseWarpX; int yw = UI.MouseWarpY; UI.MouseWarpX = -1; UI.MouseWarpY = -1; SDL_WarpMouse(xw, yw); } break; case SDL_ACTIVEEVENT: if (event->active.state & SDL_APPMOUSEFOCUS) { static bool InMainWindow = true; if (InMainWindow && !event->active.gain) { InputMouseExit(callbacks, SDL_GetTicks()); } InMainWindow = (event->active.gain != 0); } if (event->active.state & SDL_APPACTIVE) { static bool IsVisible = true; static bool DoTogglePause = false; if (IsVisible && !event->active.gain) { IsVisible = false; if (!GamePaused) { DoTogglePause = true; UiTogglePause(); } } else if (!IsVisible && event->active.gain) { IsVisible = true; if (GamePaused && DoTogglePause) { DoTogglePause = false; UiTogglePause(); } if (UseOpenGL) { Video.ResizeScreen(Video.Width, Video.Height); } } } break; case SDL_KEYDOWN: InputKeyButtonPress(callbacks, SDL_GetTicks(), event->key.keysym.sym, event->key.keysym.unicode); break; case SDL_KEYUP: InputKeyButtonRelease(callbacks, SDL_GetTicks(), event->key.keysym.sym, event->key.keysym.unicode); break; case SDL_QUIT: Exit(0); break; } if (callbacks == GetCallbacks()) { handleInput(event); } }