bool SdlEventSource::pollEvent(Common::Event &event) { handleKbdMouse(); #if SDL_VERSION_ATLEAST(2, 0, 0) // In case we still need to send a key up event for a key down from a // TEXTINPUT event we do this immediately. if (_queuedFakeKeyUp) { event = _fakeKeyUp; _queuedFakeKeyUp = false; return true; } #endif // If the screen changed, send an Common::EVENT_SCREEN_CHANGED int screenID = ((OSystem_SDL *)g_system)->getGraphicsManager()->getScreenChangeID(); if (screenID != _lastScreenID) { _lastScreenID = screenID; event.type = Common::EVENT_SCREEN_CHANGED; return true; } SDL_Event ev; while (SDL_PollEvent(&ev)) { preprocessEvents(&ev); if (dispatchSDLEvent(ev, event)) return true; } return false; }
bool OSystem_SDL::pollEvent(Common::Event &event) { SDL_Event ev; handleKbdMouse(); /* Residual doesn't support this // If the screen mode changed, send an Common::EVENT_SCREEN_CHANGED if (_modeChanged) { _modeChanged = false; event.type = Common::EVENT_SCREEN_CHANGED; return true; } */ while (SDL_PollEvent(&ev)) { preprocessEvents(&ev); if (dispatchSDLEvent(ev, event)) return true; } return false; }
bool SdlEventSource::pollEvent(Common::Event &event) { handleKbdMouse(); // If the screen changed, send an Common::EVENT_SCREEN_CHANGED int screenID = ((OSystem_SDL *)g_system)->getGraphicsManager()->getScreenChangeID(); if (screenID != _lastScreenID) { _lastScreenID = screenID; event.type = Common::EVENT_SCREEN_CHANGED; return true; } SDL_Event ev; while (SDL_PollEvent(&ev)) { preprocessEvents(&ev); if (dispatchSDLEvent(ev, event)) return true; } return false; }
bool WINCESdlEventSource::pollEvent(Common::Event &event) { SDL_Event ev; ev.type = SDL_NOEVENT; DWORD currentTime; bool keyEvent = false; int deltaX, deltaY; memset(&event, 0, sizeof(Common::Event)); handleKbdMouse(); // If the screen changed, send an Common::EVENT_SCREEN_CHANGED int screenID = _graphicsMan->getScreenChangeID(); if (screenID != _lastScreenID) { _lastScreenID = screenID; event.type = Common::EVENT_SCREEN_CHANGED; return true; } CEDevice::wakeUp(); currentTime = GetTickCount(); while (SDL_PollEvent(&ev)) { switch (ev.type) { case SDL_KEYDOWN: debug(1, "Key down %X %s", ev.key.keysym.sym, SDL_GetKeyName((SDLKey)ev.key.keysym.sym)); // KMOD_RESERVED is used if the key has been injected by an external buffer if (ev.key.keysym.mod != KMOD_RESERVED && !GUI::Actions::Instance()->mappingActive()) { keyEvent = true; _graphicsMan->_lastKeyPressed = ev.key.keysym.sym; _graphicsMan->_keyRepeatTime = currentTime; _graphicsMan->_keyRepeat = 0; if (!GUI_Actions::Instance()->mappingActive() && GUI_Actions::Instance()->performMapped(ev.key.keysym.sym, true)) return true; } if (GUI_Actions::Instance()->mappingActive()) event.kbd.flags = 0xFF; else if (ev.key.keysym.sym == SDLK_PAUSE) { _graphicsMan->_lastKeyPressed = 0; event.type = Common::EVENT_PREDICTIVE_DIALOG; return true; } event.type = Common::EVENT_KEYDOWN; if (!GUI::Actions::Instance()->mappingActive()) event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; else event.kbd.keycode = (Common::KeyCode)mapKeyCE(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode, GUI::Actions::Instance()->mappingActive()); event.kbd.ascii = mapKeyCE(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode, GUI::Actions::Instance()->mappingActive()); if (ev.key.keysym.mod == KMOD_RESERVED && ev.key.keysym.unicode == KMOD_SHIFT) { event.kbd.ascii ^= 0x20; event.kbd.flags = Common::KBD_SHIFT; } return true; case SDL_KEYUP: debug(1, "Key up %X %s", ev.key.keysym.sym, SDL_GetKeyName((SDLKey)ev.key.keysym.sym)); // KMOD_RESERVED is used if the key has been injected by an external buffer if (ev.key.keysym.mod != KMOD_RESERVED && !GUI::Actions::Instance()->mappingActive()) { keyEvent = true; _graphicsMan->_lastKeyPressed = 0; if (!GUI_Actions::Instance()->mappingActive() && GUI_Actions::Instance()->performMapped(ev.key.keysym.sym, false)) return true; } if (GUI_Actions::Instance()->mappingActive()) event.kbd.flags = 0xFF; else if (ev.key.keysym.sym == SDLK_PAUSE) { _graphicsMan->_lastKeyPressed = 0; return false; // chew up the show agi dialog key up event } event.type = Common::EVENT_KEYUP; if (!GUI::Actions::Instance()->mappingActive()) event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; else event.kbd.keycode = (Common::KeyCode)mapKeyCE(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode, GUI::Actions::Instance()->mappingActive()); event.kbd.ascii = mapKeyCE(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode, GUI::Actions::Instance()->mappingActive()); if (ev.key.keysym.mod == KMOD_RESERVED && ev.key.keysym.unicode == KMOD_SHIFT) { event.kbd.ascii ^= 0x20; event.kbd.flags = Common::KBD_SHIFT; } return true; case SDL_MOUSEMOTION: event.type = Common::EVENT_MOUSEMOVE; fillMouseEvent(event, ev.motion.x, ev.motion.y); _graphicsMan->setMousePos(event.mouse.x, event.mouse.y); return true; case SDL_MOUSEBUTTONDOWN: if (ev.button.button == SDL_BUTTON_LEFT) event.type = Common::EVENT_LBUTTONDOWN; else if (ev.button.button == SDL_BUTTON_RIGHT) event.type = Common::EVENT_RBUTTONDOWN; else break; fillMouseEvent(event, ev.button.x, ev.button.y); if (event.mouse.x > _tapX) deltaX = event.mouse.x - _tapX; else deltaX = _tapX - event.mouse.x; if (event.mouse.y > _tapY) deltaY = event.mouse.y - _tapY; else deltaY = _tapY - event.mouse.y; _closeClick = (deltaX <= 5 && deltaY <= 5); if (!_isSmartphone) { // handle double-taps if (_tapTime) { // second tap if (_closeClick && (GetTickCount() - _tapTime < 1000)) { if (event.mouse.y <= 20 && _graphicsMan->_panelInitialized) { // top of screen (show panel) _graphicsMan->swap_panel_visibility(); } else if (!_graphicsMan->_noDoubleTapRMB) { // right click event.type = Common::EVENT_RBUTTONDOWN; _rbutton = true; } } _tapTime = 0; } else { _tapTime = GetTickCount(); _tapX = event.mouse.x; _tapY = event.mouse.y; } } if (_freeLook && !_closeClick) { _rbutton = false; _tapTime = 0; _tapX = event.mouse.x; _tapY = event.mouse.y; event.type = Common::EVENT_MOUSEMOVE; _graphicsMan->setMousePos(event.mouse.x, event.mouse.y); } if (_graphicsMan->_toolbarHandler.action(event.mouse.x, event.mouse.y, true)) { if (!_graphicsMan->_toolbarHandler.drawn()) { _graphicsMan->_toolbarHighDrawn = false; _graphicsMan->internUpdateScreen(); } if (_graphicsMan->_newOrientation != _graphicsMan->_orientationLandscape) { _graphicsMan->_orientationLandscape = _graphicsMan->_newOrientation; _graphicsMan->_toolbarHighDrawn = false; ConfMan.setInt("landscape", _graphicsMan->_orientationLandscape); ConfMan.flushToDisk(); _graphicsMan->hotswapGFXMode(); } return false; } return true; case SDL_MOUSEBUTTONUP: if (ev.button.button == SDL_BUTTON_LEFT) event.type = Common::EVENT_LBUTTONUP; else if (ev.button.button == SDL_BUTTON_RIGHT) event.type = Common::EVENT_RBUTTONUP; else break; if (_rbutton) { event.type = Common::EVENT_RBUTTONUP; _rbutton = false; } fillMouseEvent(event, ev.button.x, ev.button.y); if (_freeLook && !_closeClick) { _tapX = event.mouse.x; _tapY = event.mouse.y; event.type = Common::EVENT_MOUSEMOVE; _graphicsMan->setMousePos(event.mouse.x, event.mouse.y); } if (_graphicsMan->_toolbarHandler.action(event.mouse.x, event.mouse.y, false)) { if (!_graphicsMan->_toolbarHandler.drawn()) { _graphicsMan->_toolbarHighDrawn = false; _graphicsMan->internUpdateScreen(); } return false; } return true; case SDL_VIDEOEXPOSE: // HACK: Send a fake event, handled by SdlGraphicsManager event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose; break; case SDL_QUIT: event.type = Common::EVENT_QUIT; return true; case SDL_ACTIVEEVENT: if (ev.active.state & SDL_APPMOUSEFOCUS) debug(2, "%s mouse focus.", ev.active.gain ? "Got" : "Lost"); if (ev.active.state & SDL_APPINPUTFOCUS) debug(2, "%s input focus.", ev.active.gain ? "Got" : "Lost"); if (ev.active.state & SDL_APPACTIVE) debug(2, "%s total focus.", ev.active.gain ? "Got" : "Lost"); if (ev.active.state & SDL_APPINPUTFOCUS) { _graphicsMan->_hasfocus = ev.active.gain; SDL_PauseAudio(!_graphicsMan->_hasfocus); if (_graphicsMan->_hasfocus) { event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose; } } break; } } // Simulate repeated key for backend if (!keyEvent && _graphicsMan->_lastKeyPressed && (int)currentTime > _graphicsMan->_keyRepeatTime + _graphicsMan->_keyRepeatTrigger) { _graphicsMan->_keyRepeatTime = currentTime; _graphicsMan->_keyRepeat++; GUI_Actions::Instance()->performMapped(_graphicsMan->_lastKeyPressed, true); } return false; }
bool OSystem_GP32::pollEvent(Event &event) { NP("OSys::pollEvent()"); GP32BtnEvent ev; handleKbdMouse(); if (!gp_pollButtonEvent(&ev)) return false; switch(ev.type) { case BUTTON_DOWN: if (ev.button == GPC_VK_LEFT) { _km.x_vel = -1; _km.x_down_count = 1; } if (ev.button == GPC_VK_RIGHT) { _km.x_vel = 1; _km.x_down_count = 1; } if (ev.button == GPC_VK_UP) { _km.y_vel = -1; _km.y_down_count = 1; } if (ev.button == GPC_VK_DOWN) { _km.y_vel = 1; _km.y_down_count = 1; } if (ev.button == GPC_VK_START) { // START = menu/enter event.type = EVENT_KEYDOWN; if (_overlayVisible) event.kbd.keycode = event.kbd.ascii = 13; else event.kbd.keycode = event.kbd.ascii = 319; return true; } if (ev.button == GPC_VK_SELECT) { // SELECT = pause event.type = EVENT_KEYDOWN; event.kbd.keycode = event.kbd.ascii = 32; return true; } if (ev.button == GPC_VK_FL) { event.type = EVENT_KEYDOWN; event.kbd.keycode = event.kbd.ascii = '0'; return true; } if (ev.button == GPC_VK_FR) { // R = ESC event.type = EVENT_KEYDOWN; event.kbd.keycode = event.kbd.ascii = 27; return true; } if (ev.button == GPC_VK_FA) { event.type = EVENT_LBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); return true; } if (ev.button == GPC_VK_FB) { event.type = EVENT_RBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); return true; } break; case BUTTON_UP: if (ev.button == GPC_VK_LEFT) { if (_km.x_vel < 0) { _km.x_vel = 0; _km.x_down_count = 0; } event.type = EVENT_MOUSEMOVE; fillMouseEvent(event, _km.x, _km.y); return true; } if (ev.button == GPC_VK_RIGHT) { if (_km.x_vel > 0) { _km.x_vel = 0; _km.x_down_count = 0; } event.type = EVENT_MOUSEMOVE; fillMouseEvent(event, _km.x, _km.y); return true; } if (ev.button == GPC_VK_UP) { if (_km.y_vel < 0) { _km.y_vel = 0; _km.y_down_count = 0; } event.type = EVENT_MOUSEMOVE; fillMouseEvent(event, _km.x, _km.y); return true; } if (ev.button == GPC_VK_DOWN) { if (_km.y_vel > 0) { _km.y_vel = 0; _km.y_down_count = 0; } event.type = EVENT_MOUSEMOVE; fillMouseEvent(event, _km.x, _km.y); return true; } if (ev.button == GPC_VK_START) { event.type = EVENT_KEYUP; if (_overlayVisible) event.kbd.keycode = event.kbd.ascii = 13; else event.kbd.keycode = event.kbd.ascii = 319; return true; } if (ev.button == GPC_VK_SELECT) { event.type = EVENT_KEYUP; event.kbd.keycode = event.kbd.ascii = 32; return true; } if (ev.button == GPC_VK_FL) { event.type = EVENT_KEYUP; event.kbd.keycode = event.kbd.ascii = '0'; return true; } if (ev.button == GPC_VK_FR) { event.type = EVENT_KEYUP; event.kbd.keycode = event.kbd.ascii = 27; return true; } if (ev.button == GPC_VK_FA) { event.type = EVENT_LBUTTONUP; fillMouseEvent(event, _km.x, _km.y); return true; } if (ev.button == GPC_VK_FB) { event.type = EVENT_RBUTTONUP; fillMouseEvent(event, _km.x, _km.y); return true; } break; default: error("Unknown Event!"); } if (gp_getButtonPressed(GPC_VK_LEFT) || gp_getButtonPressed(GPC_VK_RIGHT) || gp_getButtonPressed(GPC_VK_UP) || gp_getButtonPressed(GPC_VK_DOWN)) { event.type = EVENT_MOUSEMOVE; fillMouseEvent(event, _km.x, _km.y); return true; } return false; }
bool OSystem_IPOD::remapKey(SDL_Event &ev,Event &event) { static int rotate_modulation_counter = 0; if ((ev.key.keysym.sym == SDLK_m)) { if (ev.type == SDL_KEYDOWN) { _km.y_vel = -1; _km.y_down_count = 1; event.type = EVENT_MOUSEMOVE; } else if (ev.type == SDL_KEYUP) { _km.y_vel = 0; _km.y_down_count = 0; } handleKbdMouse(); fillMouseEvent(event, _km.x, _km.y); return EVENT_COMPLETED; } if ((ev.key.keysym.sym == SDLK_w)) { if (ev.type == SDL_KEYDOWN) { _km.x_vel = -1; _km.x_down_count = 1; event.type = EVENT_MOUSEMOVE; } else if (ev.type == SDL_KEYUP) { _km.x_vel = 0; _km.x_down_count = 0; } handleKbdMouse(); fillMouseEvent(event, _km.x, _km.y); return EVENT_COMPLETED; } if ((ev.key.keysym.sym == SDLK_f)) { if (ev.type == SDL_KEYDOWN) { _km.x_vel = 1; _km.x_down_count = 1; event.type = EVENT_MOUSEMOVE; } else if (ev.type == SDL_KEYUP) { _km.x_vel = 0; _km.x_down_count = 0; } handleKbdMouse(); fillMouseEvent(event, _km.x, _km.y); return EVENT_COMPLETED; } if ((ev.key.keysym.sym == SDLK_d)) { if (ev.type == SDL_KEYDOWN) { _km.y_vel = 1; _km.y_down_count = 1; event.type = EVENT_MOUSEMOVE; } else if (ev.type == SDL_KEYUP) { _km.y_vel = 0; _km.y_down_count = 0; } handleKbdMouse(); fillMouseEvent(event, _km.x, _km.y); return EVENT_COMPLETED; } if (ev.key.keysym.sym == SDLK_h) { if (ev.type == SDL_KEYDOWN) { event.type = EVENT_KEYDOWN; event.kbd.keycode = SDLK_ESCAPE; event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); } if (ev.type == SDL_KEYUP) { event.type = EVENT_KEYDOWN; event.kbd.keycode = SDLK_6; event.kbd.ascii = mapKey(SDLK_6, ev.key.keysym.mod, 0); } return EVENT_COMPLETED; } if (ev.key.keysym.sym == SDLK_RETURN) { if (ev.type == SDL_KEYDOWN) event.type = EVENT_LBUTTONDOWN; if (ev.type == SDL_KEYUP) event.type = EVENT_LBUTTONUP; fillMouseEvent(event, _km.x, _km.y); return EVENT_COMPLETED; } if (ev.key.keysym.sym == SDLK_l) { rotate_modulation_counter += 1; if(rotate_modulation_counter >= _rotation_modulation) { rotate_modulation_counter = 0; event.type = EVENT_LBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); /* event.type = EVENT_KEYDOWN; event.kbd.keycode = SDLK_ESCAPE; event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); //Put an SDL KEYUP event on the queue SDL_Event keyup_event; keyup_event.type = SDL_KEYUP; keyup_event.key.state = SDL_RELEASED; keyup_event.key.keysym.sym = SDLK_ESCAPE; SDL_PushEvent(&keyup_event); event.type = EVENT_LBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); */ return EVENT_COMPLETED; } return IGNORE_KEYPRESS; } if (ev.key.keysym.sym == SDLK_r) { rotate_modulation_counter -= 1; if(rotate_modulation_counter <= -_rotation_modulation) { rotate_modulation_counter = 0; event.type = EVENT_RBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); return EVENT_COMPLETED; } return IGNORE_KEYPRESS; } return NO_REMAP; }
bool OSystem_IPOD::pollEvent(Event &event) { SDL_Event ev; int axis; byte b = 0; handleKbdMouse(); // If the screen mode changed, send an EVENT_SCREEN_CHANGED if (_modeChanged) { _modeChanged = false; event.type = EVENT_SCREEN_CHANGED; return true; } while(SDL_PollEvent(&ev)) { switch(ev.type) { case SDL_KEYDOWN:{ b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState()); // Alt-Return and Alt-Enter toggle full screen mode if (b == KBD_ALT && (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER)) { setFullscreenMode(!_fullscreen); #ifdef USE_OSD if (_fullscreen) displayMessageOnOSD("Fullscreen mode"); else displayMessageOnOSD("Windowed mode"); #endif break; } // Alt-S: Create a screenshot if (b == KBD_ALT && ev.key.keysym.sym == 's') { char filename[20]; for (int n = 0;; n++) { SDL_RWops *file; sprintf(filename, "scummvm%05d.bmp", n); file = SDL_RWFromFile(filename, "r"); if (!file) break; SDL_RWclose(file); } if (saveScreenshot(filename)) printf("Saved '%s'\n", filename); else printf("Could not save screenshot!\n"); break; } // Ctrl-m toggles mouse capture if (b == KBD_CTRL && ev.key.keysym.sym == 'm') { toggleMouseGrab(); break; } #ifdef MACOSX // On Macintosh', Cmd-Q quits if ((ev.key.keysym.mod & KMOD_META) && ev.key.keysym.sym == 'q') { event.type = EVENT_QUIT; return true; } #elif defined(UNIX) // On other unices, Control-Q quits if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'q') { event.type = EVENT_QUIT; return true; } #else // Ctrl-z and Alt-X quit if ((b == KBD_CTRL && ev.key.keysym.sym == 'z') || (b == KBD_ALT && ev.key.keysym.sym == 'x')) { event.type = EVENT_QUIT; return true; } #endif // Ctrl-Alt-<key> will change the GFX mode if ((b & (KBD_CTRL|KBD_ALT)) == (KBD_CTRL|KBD_ALT)) { handleScalerHotkeys(ev.key); break; } const bool event_complete = remapKey(ev,event); if (event_complete) return true; event.type = EVENT_KEYDOWN; event.kbd.keycode = ev.key.keysym.sym; event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); return true; } case SDL_KEYUP: { const bool event_complete = remapKey(ev,event); if (event_complete) return true; event.type = EVENT_KEYUP; event.kbd.keycode = ev.key.keysym.sym; event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState()); // Ctrl-Alt-<key> will change the GFX mode if ((b & (KBD_CTRL|KBD_ALT)) == (KBD_CTRL|KBD_ALT)) { // Swallow these key up events break; } return true; } case SDL_MOUSEMOTION: event.type = EVENT_MOUSEMOVE; fillMouseEvent(event, ev.motion.x, ev.motion.y); setMousePos(event.mouse.x, event.mouse.y); return true; case SDL_MOUSEBUTTONDOWN: if (ev.button.button == SDL_BUTTON_LEFT) event.type = EVENT_LBUTTONDOWN; else if (ev.button.button == SDL_BUTTON_RIGHT) event.type = EVENT_RBUTTONDOWN; #if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN) else if (ev.button.button == SDL_BUTTON_WHEELUP) event.type = EVENT_WHEELUP; else if (ev.button.button == SDL_BUTTON_WHEELDOWN) event.type = EVENT_WHEELDOWN; #endif else break; fillMouseEvent(event, ev.button.x, ev.button.y); return true; case SDL_MOUSEBUTTONUP: if (ev.button.button == SDL_BUTTON_LEFT) event.type = EVENT_LBUTTONUP; else if (ev.button.button == SDL_BUTTON_RIGHT) event.type = EVENT_RBUTTONUP; else break; fillMouseEvent(event, ev.button.x, ev.button.y); return true; case SDL_JOYBUTTONDOWN: if (ev.jbutton.button == JOY_BUT_LMOUSE) { event.type = EVENT_LBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); } else if (ev.jbutton.button == JOY_BUT_RMOUSE) { event.type = EVENT_RBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); } else { event.type = EVENT_KEYDOWN; switch (ev.jbutton.button) { case JOY_BUT_ESCAPE: event.kbd.keycode = SDLK_ESCAPE; event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); break; case JOY_BUT_PERIOD: event.kbd.keycode = SDLK_PERIOD; event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); break; case JOY_BUT_SPACE: event.kbd.keycode = SDLK_SPACE; event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); break; case JOY_BUT_F5: event.kbd.keycode = SDLK_F5; event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); break; } } return true; case SDL_JOYBUTTONUP: if (ev.jbutton.button == JOY_BUT_LMOUSE) { event.type = EVENT_LBUTTONUP; fillMouseEvent(event, _km.x, _km.y); } else if (ev.jbutton.button == JOY_BUT_RMOUSE) { event.type = EVENT_RBUTTONUP; fillMouseEvent(event, _km.x, _km.y); } else { event.type = EVENT_KEYUP; switch (ev.jbutton.button) { case JOY_BUT_ESCAPE: event.kbd.keycode = SDLK_ESCAPE; event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); break; case JOY_BUT_PERIOD: event.kbd.keycode = SDLK_PERIOD; event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); break; case JOY_BUT_SPACE: event.kbd.keycode = SDLK_SPACE; event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); break; case JOY_BUT_F5: event.kbd.keycode = SDLK_F5; event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); break; } } return true; case SDL_JOYAXISMOTION: axis = ev.jaxis.value; if ( axis > JOY_DEADZONE) { axis -= JOY_DEADZONE; event.type = EVENT_MOUSEMOVE; } else if ( axis < -JOY_DEADZONE ) { axis += JOY_DEADZONE; event.type = EVENT_MOUSEMOVE; } else axis = 0; if ( ev.jaxis.axis == JOY_XAXIS) { #ifdef JOY_ANALOG _km.x_vel = axis/2000; _km.x_down_count = 0; #else if (axis != 0) { _km.x_vel = (axis > 0) ? 1:-1; _km.x_down_count = 1; } else { _km.x_vel = 0; _km.x_down_count = 0; } #endif } else if (ev.jaxis.axis == JOY_YAXIS) { #ifndef JOY_INVERT_Y axis = -axis; #endif #ifdef JOY_ANALOG _km.y_vel = -axis / 2000; _km.y_down_count = 0; #else if (axis != 0) { _km.y_vel = (-axis > 0) ? 1: -1; _km.y_down_count = 1; } else { _km.y_vel = 0; _km.y_down_count = 0; } #endif } fillMouseEvent(event, _km.x, _km.y); return true; case SDL_VIDEOEXPOSE: _forceFull = true; break; case SDL_QUIT: event.type = EVENT_QUIT; return true; } } return false; }
/* Override the SDL pollEvent with the Wiz's own event code. */ bool OSystem_GP2XWIZ::pollEvent(Common::Event &event) { SDL_Event ev; int axis; byte b = 0; handleKbdMouse(); // If the screen mode changed, send an Common::EVENT_SCREEN_CHANGED if (_modeChanged) { _modeChanged = false; event.type = Common::EVENT_SCREEN_CHANGED; return true; } // GP2X Wiz Input mappings. /* Single Button Movement: GP2X_BUTTON_UP Cursor Up GP2X_BUTTON_DOWN Cursor Down GP2X_BUTTON_LEFT Cursor Left GP2X_BUTTON_RIGHT Cursor Right GP2X_BUTTON_UPLEFT Cursor Up Left GP2X_BUTTON_UPRIGHT Cursor Up Right GP2X_BUTTON_DOWNLEFT Cursor Down Left GP2X_BUTTON_DOWNRIGHT Cursor Down Right Button Emulation: GP2X_BUTTON_A . (Period) GP2X_BUTTON_B Left Mouse Click GP2X_BUTTON_Y Space Bar GP2X_BUTTON_X Right Mouse Click GP2X_BUTTON_L Combo Modifier (Left Trigger) GP2X_BUTTON_R Return (Right Trigger) GP2X_BUTTON_MENU F5 (Game Menu) GP2X_BUTTON_SELECT Escape GP2X_BUTTON_VOLUP /dev/mixer Global Volume Up GP2X_BUTTON_VOLDOWN /dev/mixer Global Volume Down Combos: GP2X_BUTTON_VOLUP & GP2X_BUTTON_VOLDOWN 0 (For Monkey 2 CP) or Virtual Keyboard if enabled GP2X_BUTTON_L & GP2X_BUTTON_SELECT Common::EVENT_QUIT (Calls Sync() to make sure SD is flushed) GP2X_BUTTON_L & GP2X_BUTTON_MENU Common::EVENT_MAINMENU (ScummVM Global Main Menu) GP2X_BUTTON_L & GP2X_BUTTON_A Common::EVENT_PREDICTIVE_DIALOG for predictive text entry box (AGI games) */ while (SDL_PollEvent(&ev)) { switch(ev.type) { case SDL_KEYDOWN:{ b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState()); const bool event_complete = remapKey(ev,event); if (event_complete) return true; event.type = Common::EVENT_KEYDOWN; event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); return true; } case SDL_KEYUP: { const bool event_complete = remapKey(ev,event); if (event_complete) return true; event.type = Common::EVENT_KEYUP; event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState()); // Ctrl-Alt-<key> will change the GFX mode if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { // Swallow these key up events break; } return true; } case SDL_MOUSEMOTION: event.type = Common::EVENT_MOUSEMOVE; fillMouseEvent(event, ev.motion.x, ev.motion.y); setMousePos(event.mouse.x, event.mouse.y); return true; case SDL_MOUSEBUTTONDOWN: if (ev.button.button == SDL_BUTTON_LEFT) event.type = Common::EVENT_LBUTTONDOWN; else if (ev.button.button == SDL_BUTTON_RIGHT) event.type = Common::EVENT_RBUTTONDOWN; #if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN) else if (ev.button.button == SDL_BUTTON_WHEELUP) event.type = Common::EVENT_WHEELUP; else if (ev.button.button == SDL_BUTTON_WHEELDOWN) event.type = Common::EVENT_WHEELDOWN; #endif #if defined(SDL_BUTTON_MIDDLE) else if (ev.button.button == SDL_BUTTON_MIDDLE) event.type = Common::EVENT_MBUTTONDOWN; #endif else break; fillMouseEvent(event, ev.button.x, ev.button.y); return true; case SDL_MOUSEBUTTONUP: if (ev.button.button == SDL_BUTTON_LEFT) event.type = Common::EVENT_LBUTTONUP; else if (ev.button.button == SDL_BUTTON_RIGHT) event.type = Common::EVENT_RBUTTONUP; #if defined(SDL_BUTTON_MIDDLE) else if (ev.button.button == SDL_BUTTON_MIDDLE) event.type = Common::EVENT_MBUTTONUP; #endif else break; fillMouseEvent(event, ev.button.x, ev.button.y); return true; case SDL_JOYBUTTONDOWN: _stickBtn[ev.jbutton.button] = 1; if (ev.jbutton.button == GP2X_BUTTON_B) { event.type = Common::EVENT_LBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); } else if (ev.jbutton.button == GP2X_BUTTON_X) { event.type = Common::EVENT_RBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); } else if (_stickBtn[GP2X_BUTTON_L] && (ev.jbutton.button == GP2X_BUTTON_SELECT)) { event.type = Common::EVENT_QUIT; } else if (ev.jbutton.button < 8) { moveStick(); event.type = Common::EVENT_MOUSEMOVE; fillMouseEvent(event, _km.x, _km.y); } else { event.type = Common::EVENT_KEYDOWN; event.kbd.flags = 0; switch (ev.jbutton.button) { case GP2X_BUTTON_L: GP2X_BUTTON_STATE_L = true; break; case GP2X_BUTTON_R: if (GP2X_BUTTON_STATE_L == true) { #ifdef ENABLE_VKEYBD event.kbd.keycode = Common::KEYCODE_F7; event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0); #else event.kbd.keycode = Common::KEYCODE_0; event.kbd.ascii = mapKey(SDLK_0, ev.key.keysym.mod, 0); #endif } else { event.kbd.keycode = Common::KEYCODE_RETURN; event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0); } break; case GP2X_BUTTON_SELECT: if (GP2X_BUTTON_STATE_L == true) { event.type = Common::EVENT_QUIT; } else { event.kbd.keycode = Common::KEYCODE_ESCAPE; event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); } break; case GP2X_BUTTON_A: if (GP2X_BUTTON_STATE_L == true) { event.type = Common::EVENT_PREDICTIVE_DIALOG; } else { event.kbd.keycode = Common::KEYCODE_PERIOD; event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); } break; case GP2X_BUTTON_Y: event.kbd.keycode = Common::KEYCODE_SPACE; event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); break; case GP2X_BUTTON_MENU: if (GP2X_BUTTON_STATE_L == true) { event.type = Common::EVENT_MAINMENU; } else { event.kbd.keycode = Common::KEYCODE_F5; event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); } break; case GP2X_BUTTON_VOLUP: WIZ_HW::mixerMoveVolume(2); if (WIZ_HW::volumeLevel == 100) { displayMessageOnOSD("Maximum Volume"); } else { displayMessageOnOSD("Increasing Volume"); } break; case GP2X_BUTTON_VOLDOWN: WIZ_HW::mixerMoveVolume(1); if (WIZ_HW::volumeLevel == 0) { displayMessageOnOSD("Minimal Volume"); } else { displayMessageOnOSD("Decreasing Volume"); } break; } } return true; case SDL_JOYBUTTONUP: _stickBtn[ev.jbutton.button] = 0; if (ev.jbutton.button == GP2X_BUTTON_B) { event.type = Common::EVENT_LBUTTONUP; fillMouseEvent(event, _km.x, _km.y); } else if (ev.jbutton.button == GP2X_BUTTON_X) { event.type = Common::EVENT_RBUTTONUP; fillMouseEvent(event, _km.x, _km.y); } else if (ev.jbutton.button < 8) { moveStick(); event.type = Common::EVENT_MOUSEMOVE; fillMouseEvent(event, _km.x, _km.y); } else { event.type = Common::EVENT_KEYUP; event.kbd.flags = 0; switch (ev.jbutton.button) { case GP2X_BUTTON_SELECT: event.kbd.keycode = Common::KEYCODE_ESCAPE; event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); break; case GP2X_BUTTON_A: event.kbd.keycode = Common::KEYCODE_PERIOD; event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); break; case GP2X_BUTTON_Y: event.kbd.keycode = Common::KEYCODE_SPACE; event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); break; case GP2X_BUTTON_MENU: if (GP2X_BUTTON_STATE_L == true) { event.type = Common::EVENT_MAINMENU; } else { event.kbd.keycode = Common::KEYCODE_F5; event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); } break; case GP2X_BUTTON_L: GP2X_BUTTON_STATE_L = false; break; case GP2X_BUTTON_R: if (GP2X_BUTTON_STATE_L == true) { #ifdef ENABLE_VKEYBD event.kbd.keycode = Common::KEYCODE_F7; event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0); #else event.kbd.keycode = Common::KEYCODE_0; event.kbd.ascii = mapKey(SDLK_0, ev.key.keysym.mod, 0); #endif } else { event.kbd.keycode = Common::KEYCODE_RETURN; event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0); } break; case GP2X_BUTTON_VOLUP: break; case GP2X_BUTTON_VOLDOWN: break; } } return true; case SDL_JOYAXISMOTION: axis = ev.jaxis.value; if ( axis > JOY_DEADZONE) { axis -= JOY_DEADZONE; event.type = Common::EVENT_MOUSEMOVE; } else if ( axis < -JOY_DEADZONE ) { axis += JOY_DEADZONE; event.type = Common::EVENT_MOUSEMOVE; } else axis = 0; if ( ev.jaxis.axis == JOY_XAXIS) { if (axis != 0) { _km.x_vel = (axis > 0) ? 1:-1; _km.x_down_count = 1; } else { _km.x_vel = 0; _km.x_down_count = 0; } } else if (ev.jaxis.axis == JOY_YAXIS) { #ifndef JOY_INVERT_Y axis = -axis; #endif #ifdef JOY_ANALOG _km.y_vel = -axis / 2000; _km.y_down_count = 0; #else if (axis != 0) { _km.y_vel = (-axis > 0) ? 1: -1; _km.y_down_count = 1; } else { _km.y_vel = 0; _km.y_down_count = 0; } #endif } fillMouseEvent(event, _km.x, _km.y); return true; case SDL_VIDEOEXPOSE: _forceFull = true; break; case SDL_QUIT: event.type = Common::EVENT_QUIT; return true; } } return false; }