void EventThread::showMessageBox(const char *body, int flags) { msgBoxDone.clear(); SDL_Event event; event.user.code = flags; event.user.data1 = strdup(body); event.type = usrIdStart + REQUEST_MESSAGEBOX; SDL_PushEvent(&event); /* Keep repainting screen while box is open */ shState->graphics().repaintWait(msgBoxDone); /* Prevent endless loops */ resetInputStates(); }
void EventThread::process(RGSSThreadData &rtData) { SDL_Event event; SDL_Window *win = rtData.window; UnidirMessage<Vec2i> &windowSizeMsg = rtData.windowSizeMsg; initALCFunctions(rtData.alcDev); SDL_SetEventFilter(eventFilter, &rtData); fullscreen = rtData.config.fullscreen; int toggleFSMod = rtData.config.anyAltToggleFS ? KMOD_ALT : KMOD_LALT; fps.lastFrame = SDL_GetPerformanceCounter(); fps.displayCounter = 0; fps.acc = 0; fps.accDiv = 0; if (rtData.config.printFPS) fps.sendUpdates.set(); bool displayingFPS = false; bool cursorInWindow = false; bool windowFocused = false; bool terminate = false; SDL_Joystick *js = 0; if (SDL_NumJoysticks() > 0) js = SDL_JoystickOpen(0); char buffer[128]; char pendingTitle[128]; bool havePendingTitle = false; bool resetting = false; int winW, winH; int i; SDL_GetWindowSize(win, &winW, &winH); SettingsMenu *sMenu = 0; while (true) { if (!SDL_WaitEvent(&event)) { Debug() << "EventThread: Event error"; break; } if (sMenu && sMenu->onEvent(event)) { if (sMenu->destroyReq()) { delete sMenu; sMenu = 0; updateCursorState(cursorInWindow && windowFocused); } continue; } /* Preselect and discard unwanted events here */ switch (event.type) { case SDL_MOUSEBUTTONDOWN : case SDL_MOUSEBUTTONUP : case SDL_MOUSEMOTION : if (event.button.which == SDL_TOUCH_MOUSEID) continue; break; case SDL_FINGERDOWN : case SDL_FINGERUP : case SDL_FINGERMOTION : if (event.tfinger.fingerId >= MAX_FINGERS) continue; break; } /* Now process the rest */ switch (event.type) { case SDL_WINDOWEVENT : switch (event.window.event) { case SDL_WINDOWEVENT_SIZE_CHANGED : winW = event.window.data1; winH = event.window.data2; windowSizeMsg.post(Vec2i(winW, winH)); resetInputStates(); break; case SDL_WINDOWEVENT_ENTER : cursorInWindow = true; mouseState.inWindow = true; updateCursorState(cursorInWindow && windowFocused && !sMenu); break; case SDL_WINDOWEVENT_LEAVE : cursorInWindow = false; mouseState.inWindow = false; updateCursorState(cursorInWindow && windowFocused && !sMenu); break; case SDL_WINDOWEVENT_CLOSE : terminate = true; break; case SDL_WINDOWEVENT_FOCUS_GAINED : windowFocused = true; updateCursorState(cursorInWindow && windowFocused && !sMenu); break; case SDL_WINDOWEVENT_FOCUS_LOST : windowFocused = false; updateCursorState(cursorInWindow && windowFocused && !sMenu); resetInputStates(); break; } break; case SDL_QUIT : terminate = true; Debug() << "EventThread termination requested"; break; case SDL_KEYDOWN : if (event.key.keysym.scancode == SDL_SCANCODE_RETURN && (event.key.keysym.mod & toggleFSMod)) { setFullscreen(win, !fullscreen); if (!fullscreen && havePendingTitle) { SDL_SetWindowTitle(win, pendingTitle); pendingTitle[0] = '\0'; havePendingTitle = false; } break; } if (event.key.keysym.scancode == SDL_SCANCODE_F1) { if (!sMenu) { sMenu = new SettingsMenu(rtData); updateCursorState(false); } sMenu->raise(); } if (event.key.keysym.scancode == SDL_SCANCODE_F2) { if (!displayingFPS) { fps.immInitFlag.set(); fps.sendUpdates.set(); displayingFPS = true; } else { displayingFPS = false; if (!rtData.config.printFPS) fps.sendUpdates.clear(); if (fullscreen) { /* Prevent fullscreen flicker */ strncpy(pendingTitle, rtData.config.game.title.c_str(), sizeof(pendingTitle)); havePendingTitle = true; break; } SDL_SetWindowTitle(win, rtData.config.game.title.c_str()); } break; } if (event.key.keysym.scancode == SDL_SCANCODE_F12) { if (!rtData.config.enableReset) break; if (resetting) break; resetting = true; rtData.rqResetFinish.clear(); rtData.rqReset.set(); break; } keyStates[event.key.keysym.scancode] = true; break; case SDL_KEYUP : if (event.key.keysym.scancode == SDL_SCANCODE_F12) { if (!rtData.config.enableReset) break; resetting = false; rtData.rqResetFinish.set(); break; } keyStates[event.key.keysym.scancode] = false; break; case SDL_JOYBUTTONDOWN : joyState.buttons[event.jbutton.button] = true; break; case SDL_JOYBUTTONUP : joyState.buttons[event.jbutton.button] = false; break; case SDL_JOYHATMOTION : joyState.hats[event.jhat.hat] = event.jhat.value; break; case SDL_JOYAXISMOTION : joyState.axes[event.jaxis.axis] = event.jaxis.value; break; case SDL_JOYDEVICEADDED : if (event.jdevice.which > 0) break; js = SDL_JoystickOpen(0); break; case SDL_JOYDEVICEREMOVED : resetInputStates(); break; case SDL_MOUSEBUTTONDOWN : mouseState.buttons[event.button.button] = true; break; case SDL_MOUSEBUTTONUP : mouseState.buttons[event.button.button] = false; break; case SDL_MOUSEMOTION : mouseState.x = event.motion.x; mouseState.y = event.motion.y; break; case SDL_FINGERDOWN : i = event.tfinger.fingerId; touchState.fingers[i].down = true; case SDL_FINGERMOTION : i = event.tfinger.fingerId; touchState.fingers[i].x = event.tfinger.x * winW; touchState.fingers[i].y = event.tfinger.y * winH; break; case SDL_FINGERUP : i = event.tfinger.fingerId; memset(&touchState.fingers[i], 0, sizeof(touchState.fingers[0])); break; default : /* Handle user events */ switch(event.type - usrIdStart) { case REQUEST_SETFULLSCREEN : setFullscreen(win, static_cast<bool>(event.user.code)); break; case REQUEST_WINRESIZE : SDL_SetWindowSize(win, event.window.data1, event.window.data2); break; case REQUEST_MESSAGEBOX : SDL_ShowSimpleMessageBox(event.user.code, rtData.config.game.title.c_str(), (const char*) event.user.data1, win); free(event.user.data1); msgBoxDone.set(); break; case REQUEST_SETCURSORVISIBLE : showCursor = event.user.code; updateCursorState(cursorInWindow); break; case UPDATE_FPS : if (rtData.config.printFPS) Debug() << "FPS:" << event.user.code; if (!fps.sendUpdates) break; snprintf(buffer, sizeof(buffer), "%s - %d FPS", rtData.config.game.title.c_str(), event.user.code); /* Updating the window title in fullscreen * mode seems to cause flickering */ if (fullscreen) { strncpy(pendingTitle, buffer, sizeof(pendingTitle)); havePendingTitle = true; break; } SDL_SetWindowTitle(win, buffer); break; } } if (terminate) break; } /* Just in case */ rtData.syncPoint.resumeThreads(); if (SDL_JoystickGetAttached(js)) SDL_JoystickClose(js); delete sMenu; }
void EventThread::process(RGSSThreadData &rtData) { SDL_Event event; SDL_Window *win = rtData.window; WindowSizeNotify &windowSizeMsg = rtData.windowSizeMsg; fullscreen = rtData.config.fullscreen; fps.lastFrame = SDL_GetPerformanceCounter(); fps.displaying = false; fps.immInitFlag = false; fps.immFiniFlag = false; fps.acc = 0; fps.accDiv = 0; bool cursorInWindow = false; bool windowFocused = false; bool terminate = false; SDL_Joystick *js = 0; if (SDL_NumJoysticks() > 0) js = SDL_JoystickOpen(0); char buffer[128]; char pendingTitle[128]; bool havePendingTitle = false; while (true) { if (!SDL_WaitEvent(&event)) { qDebug() << "EventThread: Event error"; break; } switch (event.type) { case SDL_WINDOWEVENT : switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED : windowSizeMsg.notifyChange(event.window.data1, event.window.data2); break; case SDL_WINDOWEVENT_ENTER : cursorInWindow = true; updateCursorState(cursorInWindow && windowFocused); break; case SDL_WINDOWEVENT_LEAVE : cursorInWindow = false; updateCursorState(cursorInWindow && windowFocused); break; case SDL_WINDOWEVENT_CLOSE : terminate = true; break; case SDL_WINDOWEVENT_FOCUS_GAINED : windowFocused = true; updateCursorState(cursorInWindow && windowFocused); break; case SDL_WINDOWEVENT_FOCUS_LOST : windowFocused = false; updateCursorState(cursorInWindow && windowFocused); resetInputStates(); break; } break; case SDL_QUIT : case REQUEST_TERMINATION : terminate = true; qDebug() << "EventThread termination requested"; break; case SDL_KEYDOWN : if (event.key.keysym.scancode == SDL_SCANCODE_RETURN && (event.key.keysym.mod & KMOD_LALT)) { setFullscreen(win, !fullscreen); if (!fullscreen && havePendingTitle) { SDL_SetWindowTitle(win, pendingTitle); pendingTitle[0] = '\0'; havePendingTitle = false; } break; } if (event.key.keysym.scancode == SDL_SCANCODE_F2) { if (!fps.displaying) { fps.immInitFlag = true; fps.displaying = true; } else { fps.displaying = false; if (fullscreen) { /* Prevent fullscreen flicker */ strncpy(pendingTitle, rtData.config.game.title.constData(), sizeof(pendingTitle)); havePendingTitle = true; break; } SDL_SetWindowTitle(win, rtData.config.game.title.constData()); } break; } keyStates[event.key.keysym.scancode] = true; break; case REQUEST_SETFULLSCREEN : setFullscreen(win, static_cast<bool>(event.user.code)); break; case REQUEST_WINRESIZE : SDL_SetWindowSize(win, event.window.data1, event.window.data2); break; case REQUEST_MESSAGEBOX : SDL_ShowSimpleMessageBox(event.user.code, rtData.config.game.title.constData(), (const char*) event.user.data1, win); free(event.user.data1); msgBoxDone = true; break; case REQUEST_SETCURSORVISIBLE : showCursor = event.user.code; updateCursorState(cursorInWindow); break; case UPDATE_FPS : if (!fps.displaying) break; snprintf(buffer, sizeof(buffer), "%s - %d FPS", rtData.config.game.title.constData(), event.user.code); /* Updating the window title in fullscreen * mode seems to cause flickering */ if (fullscreen) { strncpy(pendingTitle, buffer, sizeof(pendingTitle)); havePendingTitle = true; break; } SDL_SetWindowTitle(win, buffer); break; case SDL_KEYUP : keyStates[event.key.keysym.scancode] = false; break; case SDL_JOYBUTTONDOWN : joyState.buttons[event.jbutton.button] = true; break; case SDL_JOYBUTTONUP : joyState.buttons[event.jbutton.button] = false; break; case SDL_JOYAXISMOTION : if (event.jaxis.axis == 0) joyState.xAxis = event.jaxis.value; else joyState.yAxis = event.jaxis.value; break; case SDL_JOYDEVICEADDED : if (event.jdevice.which > 0) break; js = SDL_JoystickOpen(0); break; case SDL_JOYDEVICEREMOVED : resetInputStates(); break; case SDL_MOUSEBUTTONDOWN : mouseState.buttons[event.button.button] = true; break; case SDL_MOUSEBUTTONUP : mouseState.buttons[event.button.button] = false; break; case SDL_MOUSEMOTION : mouseState.x = event.motion.x; mouseState.y = event.motion.y; break; } if (terminate) break; } if (SDL_JoystickGetAttached(js)) SDL_JoystickClose(js); }