void Android_PumpEvents(_THIS) { static int isPaused = 0; #if SDL_ANDROID_BLOCK_ON_PAUSE static int isPausing = 0; #endif /* No polling necessary */ android_handle_bledid(SDL_TRUE); /* * Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume * When the pause semaphore is signaled, if SDL_ANDROID_BLOCK_ON_PAUSE is defined the event loop will block until the resume signal is emitted. */ #if SDL_ANDROID_BLOCK_ON_PAUSE if (isPaused && !isPausing) { /* Make sure this is the last thing we do before pausing */ android_egl_context_backup(); AndroidAUD_PauseDevices(); if(SDL_SemWait(Android_ResumeSem) == 0) { #else if (isPaused) { if(SDL_SemTryWait(Android_ResumeSem) == 0) { #endif isPaused = 0; AndroidAUD_ResumeDevices(); /* Restore the GL Context from here, as this operation is thread dependent */ if (!SDL_HasEvent(SDL_QUIT)) { android_egl_context_restore(); } } } else { #if SDL_ANDROID_BLOCK_ON_PAUSE if( isPausing || SDL_SemTryWait(Android_PauseSem) == 0 ) { /* We've been signaled to pause, but before we block ourselves, we need to make sure that certain key events have reached the app */ if (SDL_HasEvent(SDL_WINDOWEVENT) || SDL_HasEvent(SDL_APP_WILLENTERBACKGROUND) || SDL_HasEvent(SDL_APP_DIDENTERBACKGROUND) ) { isPausing = 1; } else { isPausing = 0; isPaused = 1; } } #else if(SDL_SemTryWait(Android_PauseSem) == 0) { android_egl_context_backup(); AndroidAUD_PauseDevices(); isPaused = 1; } #endif } }
void Android_PumpEvents(_THIS) { static int isPaused = 0; #if SDL_ANDROID_BLOCK_ON_PAUSE static int isPausing = 0; #endif /* No polling necessary */ /* * Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume * When the pause semaphore is signaled, if SDL_ANDROID_BLOCK_ON_PAUSE is defined the event loop will block until the resume signal is emitted. * When the resume semaphore is signaled, SDL_GL_CreateContext is called which in turn calls Java code * SDLActivity::createGLContext -> SDLActivity:: initEGL -> SDLActivity::createEGLSurface -> SDLActivity::createEGLContext */ #if SDL_ANDROID_BLOCK_ON_PAUSE if (isPaused && !isPausing) { if(SDL_SemWait(Android_ResumeSem) == 0) { #else if (isPaused) { if(SDL_SemTryWait(Android_ResumeSem) == 0) { #endif isPaused = 0; /* TODO: Should we double check if we are on the same thread as the one that made the original GL context? * This call will go through the following chain of calls in Java: * SDLActivity::createGLContext -> SDLActivity:: initEGL -> SDLActivity::createEGLSurface -> SDLActivity::createEGLContext * SDLActivity::createEGLContext will attempt to restore the GL context first, and if that fails it will create a new one * If a new GL context is created, the user needs to restore the textures manually (TODO: notify the user that this happened with a message) */ SDL_GL_CreateContext(Android_Window); } } else { #if SDL_ANDROID_BLOCK_ON_PAUSE if( isPausing || SDL_SemTryWait(Android_PauseSem) == 0 ) { /* We've been signaled to pause, but before we block ourselves, we need to make sure that certain key events have reached the app */ if (SDL_HasEvent(SDL_WINDOWEVENT) || SDL_HasEvent(SDL_APP_WILLENTERBACKGROUND) || SDL_HasEvent(SDL_APP_DIDENTERBACKGROUND) ) { isPausing = 1; } else { isPausing = 0; isPaused = 1; } } #else if(SDL_SemTryWait(Android_PauseSem) == 0) { /* If we fall in here, the system is/was paused */ isPaused = 1; } #endif } }
/* * SDL.hasEvent(type) * * Arguments: * type the event type * * Returns: * True if has event */ static int l_event_hasEvent(lua_State *L) { int type = luaL_checkinteger(L, 1); return commonPush(L, "b", SDL_HasEvent(type)); }
static mrb_value mrb_sdl2_input_has_events(mrb_state *mrb, mrb_value self) { mrb_int min, max; int const argc = mrb_get_args(mrb, "i|i", &min, &max); SDL_bool has_event; if (1 == argc) { has_event = SDL_HasEvent(min); } else { has_event = SDL_HasEvents(min, max); } return (SDL_FALSE == has_event) ? mrb_false_value() : mrb_true_value(); }
static int SDL_CompatEventFilter(void *userdata, SDL_Event * event) { SDL_Event fake; switch (event->type) { case SDL_WINDOWEVENT: switch (event->window.event) { case SDL_WINDOWEVENT_EXPOSED: if (!SDL_HasEvent(SDL_VIDEOEXPOSE)) { fake.type = SDL_VIDEOEXPOSE; SDL_PushEvent(&fake); } break; case SDL_WINDOWEVENT_RESIZED: SDL_FlushEvent(SDL_VIDEORESIZE); /* We don't want to expose that the window width and height will be different if we don't get the desired fullscreen mode. */ if (SDL_VideoWindow && !(SDL_GetWindowFlags(SDL_VideoWindow) & SDL_WINDOW_FULLSCREEN)) { fake.type = SDL_VIDEORESIZE; fake.resize.w = event->window.data1; fake.resize.h = event->window.data2; SDL_PushEvent(&fake); } break; case SDL_WINDOWEVENT_MINIMIZED: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 0; fake.active.state = SDL_APPACTIVE; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_RESTORED: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 1; fake.active.state = SDL_APPACTIVE; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_ENTER: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 1; fake.active.state = SDL_APPMOUSEFOCUS; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_LEAVE: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 0; fake.active.state = SDL_APPMOUSEFOCUS; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_FOCUS_GAINED: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 1; fake.active.state = SDL_APPINPUTFOCUS; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_FOCUS_LOST: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 0; fake.active.state = SDL_APPINPUTFOCUS; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_CLOSE: fake.type = SDL_QUIT; SDL_PushEvent(&fake); break; } case SDL_KEYDOWN: case SDL_KEYUP: { Uint32 unicode = 0; if (event->key.type == SDL_KEYDOWN && event->key.keysym.sym < 256) { unicode = event->key.keysym.sym; if (unicode >= 'a' && unicode <= 'z') { int shifted = !!(event->key.keysym.mod & KMOD_SHIFT); int capslock = !!(event->key.keysym.mod & KMOD_CAPS); if ((shifted ^ capslock) != 0) { unicode = SDL_toupper(unicode); } } } if (unicode) { event->key.keysym.unicode = unicode; } break; } case SDL_TEXTINPUT: { /* FIXME: Generate an old style key repeat event if needed */ //printf("TEXTINPUT: '%s'\n", event->text.text); break; } case SDL_MOUSEMOTION: { event->motion.x -= SDL_VideoViewport.x; event->motion.y -= SDL_VideoViewport.y; break; } case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { event->button.x -= SDL_VideoViewport.x; event->button.y -= SDL_VideoViewport.y; break; } case SDL_MOUSEWHEEL: { Uint8 button; int x, y; if (event->wheel.y == 0) { break; } SDL_GetMouseState(&x, &y); if (event->wheel.y > 0) { button = SDL_BUTTON_WHEELUP; } else { button = SDL_BUTTON_WHEELDOWN; } fake.button.button = button; fake.button.x = x; fake.button.y = y; fake.button.windowID = event->wheel.windowID; fake.type = SDL_MOUSEBUTTONDOWN; fake.button.state = SDL_PRESSED; SDL_PushEvent(&fake); fake.type = SDL_MOUSEBUTTONUP; fake.button.state = SDL_RELEASED; SDL_PushEvent(&fake); break; } } return 1; }
static int SDL_CompatEventFilter(void *userdata, SDL_Event * event) { SDL_Event fake; switch (event->type) { case SDL_WINDOWEVENT: switch (event->window.event) { case SDL_WINDOWEVENT_EXPOSED: if (!SDL_HasEvent(SDL_VIDEOEXPOSEMASK)) { fake.type = SDL_VIDEOEXPOSE; SDL_PushEvent(&fake); } break; case SDL_WINDOWEVENT_RESIZED: SDL_PeepEvents(&fake, 1, SDL_GETEVENT, SDL_VIDEORESIZEMASK); fake.type = SDL_VIDEORESIZE; fake.resize.w = event->window.data1; fake.resize.h = event->window.data2; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_MINIMIZED: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 0; fake.active.state = SDL_APPACTIVE; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_RESTORED: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 1; fake.active.state = SDL_APPACTIVE; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_ENTER: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 1; fake.active.state = SDL_APPMOUSEFOCUS; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_LEAVE: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 0; fake.active.state = SDL_APPMOUSEFOCUS; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_FOCUS_GAINED: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 1; fake.active.state = SDL_APPINPUTFOCUS; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_FOCUS_LOST: fake.type = SDL_ACTIVEEVENT; fake.active.gain = 0; fake.active.state = SDL_APPINPUTFOCUS; SDL_PushEvent(&fake); break; case SDL_WINDOWEVENT_CLOSE: fake.type = SDL_QUIT; SDL_PushEvent(&fake); break; } case SDL_KEYDOWN: case SDL_KEYUP: { Uint32 unicode = 0; if (event->key.type == SDL_KEYDOWN && event->key.keysym.sym < 256) { unicode = event->key.keysym.sym; if (unicode >= 'a' && unicode <= 'z') { int shifted = !!(event->key.keysym.mod & KMOD_SHIFT); int capslock = !!(event->key.keysym.mod & KMOD_CAPS); if ((shifted ^ capslock) != 0) { unicode = SDL_toupper(unicode); } } } if (unicode) { event->key.keysym.unicode = unicode; } break; } case SDL_TEXTINPUT: { /* FIXME: Generate an old style key repeat event if needed */ //printf("TEXTINPUT: '%s'\n", event->text.text); break; } case SDL_MOUSEWHEEL: { Uint8 button; int selected; int x, y; if (event->wheel.y == 0) { break; } selected = SDL_SelectMouse(event->wheel.which); SDL_GetMouseState(selected, &x, &y); SDL_SelectMouse(selected); if (event->wheel.y > 0) { button = SDL_BUTTON_WHEELUP; } else { button = SDL_BUTTON_WHEELDOWN; } fake.button.which = event->wheel.windowID; fake.button.button = button; fake.button.x = x; fake.button.y = y; fake.button.windowID = event->wheel.windowID; fake.type = SDL_MOUSEBUTTONDOWN; fake.button.state = SDL_PRESSED; SDL_PushEvent(&fake); fake.type = SDL_MOUSEBUTTONUP; fake.button.state = SDL_RELEASED; SDL_PushEvent(&fake); break; } } return 1; }