static JSValueRef mouseUpCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { MSG msg = makeMsg(webViewWindow, WM_LBUTTONUP, 0, MAKELPARAM(lastMousePosition.x, lastMousePosition.y)); if (dragMode && !replayingSavedEvents) { msgQueue[endOfQueue++] = msg; replaySavedEvents(); } else doMouseUp(msg); return JSValueMakeUndefined(context); }
static JSValueRef mouseUpCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { int mouseType = WM_LBUTTONUP; if (argumentCount >= 1) { int mouseNumber = JSValueToNumber(context, arguments[0], exception); switch (mouseNumber) { case 0: mouseType = WM_LBUTTONUP; break; case 1: mouseType = WM_MBUTTONUP; break; case 2: mouseType = WM_RBUTTONUP; break; case 3: // fast/events/mouse-click-events expects the 4th button has event.button = 1, so send an WM_MBUTTONUP mouseType = WM_MBUTTONUP; break; default: mouseType = WM_LBUTTONUP; break; } } WPARAM wparam = 0; if (argumentCount >= 2) wparam |= buildModifierFlags(context, arguments[1]); MSG msg = makeMsg(webViewWindow, mouseType, wparam, MAKELPARAM(lastMousePosition.x, lastMousePosition.y)); if ((dragMode && !replayingSavedEvents) || msgQueue[endOfQueue].delay) { msgQueue[endOfQueue++].msg = msg; replaySavedEvents(); } else doMouseUp(msg); return JSValueMakeUndefined(context); }
void replaySavedEvents() { replayingSavedEvents = true; MSG emptyMsg = {0}; while (startOfQueue < endOfQueue) { MSG msg = msgQueue[startOfQueue++]; switch (msg.message) { case WM_LBUTTONUP: doMouseUp(msg); break; case WM_MOUSEMOVE: doMouseMove(msg); break; default: // Not reached break; } } startOfQueue = 0; endOfQueue = 0; replayingSavedEvents = false; }
void replaySavedEvents(HRESULT* oleDragAndDropReturnValue) { replayingSavedEvents = true; MSG msg = { 0 }; while (startOfQueue < endOfQueue && !msgQueue[startOfQueue].delay) { msg = msgQueue[startOfQueue++].msg; switch (msg.message) { case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: doMouseUp(msg, oleDragAndDropReturnValue); break; case WM_MOUSEMOVE: doMouseMove(msg); break; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: dispatchMessage(&msg); break; default: // Not reached break; } } int numQueuedMessages = endOfQueue - startOfQueue; if (!numQueuedMessages) { startOfQueue = 0; endOfQueue = 0; replayingSavedEvents = false; ASSERT(!down); return; } if (msgQueue[startOfQueue].delay) { ::Sleep(msgQueue[startOfQueue].delay); msgQueue[startOfQueue].delay = 0; } ::PostMessage(webViewWindow, WM_DRT_SEND_QUEUED_EVENT, 0, 0); while (::GetMessage(&msg, webViewWindow, 0, 0)) { // FIXME: Why do we get a WM_MOUSELEAVE? it breaks tests if (msg.message == WM_MOUSELEAVE) continue; if (msg.message != WM_DRT_SEND_QUEUED_EVENT) { dispatchMessage(&msg); continue; } msg = msgQueue[startOfQueue++].msg; switch (msg.message) { case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: doMouseUp(msg, oleDragAndDropReturnValue); break; case WM_MOUSEMOVE: doMouseMove(msg); break; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: dispatchMessage(&msg); break; default: // Not reached break; } if (startOfQueue >= endOfQueue) break; ::Sleep(msgQueue[startOfQueue].delay); msgQueue[startOfQueue].delay = 0; ::PostMessage(webViewWindow, WM_DRT_SEND_QUEUED_EVENT, 0, 0); } startOfQueue = 0; endOfQueue = 0; replayingSavedEvents = false; }
int main(int argc, char *argv[]) { float td; long then, lastFrameTime, frames; long expireTextTimer; SDL_Event event; memset(&app, 0, sizeof(App)); memset(&dev, 0, sizeof(Dev)); handleLoggingArgs(argc, argv); atexit(cleanup); srand(time(NULL)); init18N(argc, argv); initLookups(); initSDL(); initGameSystem(); createScreenshotFolder(); if (fileExists(getSaveFilePath(SAVE_FILENAME))) { loadGame(); } handleMissionArgs(argc, argv); dev.fps = frames = td = 0; then = SDL_GetTicks(); lastFrameTime = SDL_GetTicks() + 1000; expireTextTimer = SDL_GetTicks() + (1000 * 10); while (1) { td += (SDL_GetTicks() - then); then = SDL_GetTicks(); while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_MOUSEMOTION: doMouseMotion(&event.motion); break; case SDL_MOUSEWHEEL: doMouseWheel(&event.wheel); break; case SDL_MOUSEBUTTONDOWN: doMouseDown(&event.button); break; case SDL_MOUSEBUTTONUP: doMouseUp(&event.button); break; case SDL_KEYDOWN: doKeyDown(&event.key); break; case SDL_KEYUP: doKeyUp(&event.key); break; case SDL_QUIT: exit(0); break; } } if (app.modalDialog.type != MD_NONE) { doModalDialog(); } while (td >= LOGIC_RATE) { /* let the delegate decide during logic() */ app.doTrophyAlerts = 0; app.delegate.logic(); td -= LOGIC_RATE; if (app.doTrophyAlerts) { doTrophyAlerts(); } if (app.resetTimeDelta) { td = 0; then = SDL_GetTicks(); app.resetTimeDelta = 0; } game.stats[STAT_TIME]++; } prepareScene(); app.delegate.draw(); if (app.doTrophyAlerts) { drawTrophyAlert(); } if (app.modalDialog.type != MD_NONE) { drawModalDialog(); } presentScene(); doDevKeys(); frames++; if (SDL_GetTicks() > lastFrameTime) { dev.fps = frames; frames = 0; lastFrameTime = SDL_GetTicks() + 1000; if (dev.takeScreenshots) { saveScreenshot(); } } if (isControl(CONTROL_SCREENSHOT)) { saveScreenshot(); clearControl(CONTROL_SCREENSHOT); } if (SDL_GetTicks() > expireTextTimer) { expireTexts(0); expireTextTimer = SDL_GetTicks() + (1000 * 10); } /* don't save more than once per request, and not in the middle of battle */ if (app.saveGame && battle.status != MS_IN_PROGRESS) { saveGame(); app.saveGame = 0; } /* always zero the mouse motion */ app.mouse.dx = app.mouse.dy = 0; SDL_Delay(1); } return 0; }