/** * Before calling the original SDL implementation this method checks if the * gesture area is pressed down. * * @param ev The SDL event * @param event The ScummVM event. * @return True if event was processed, false if not. */ bool WebOSSdlEventSource::handleKeyDown(SDL_Event &ev, Common::Event &event) { // Handle gesture area tap. if (ev.key.keysym.sym == SDLK_WORLD_71) { _gestureDown = true; return true; } // Ensure that ALT key (Gesture down) is ignored when back or forward // gesture is detected. This is needed for WebOS 1 which releases the // gesture tap AFTER the backward gesture event and not BEFORE (Like // WebOS 2). if (ev.key.keysym.sym == 27 || ev.key.keysym.sym == 229) { _gestureDown = false; } // handle virtual keyboard dismiss key if (ev.key.keysym.sym == 24) { int gblPDKVersion = PDL_GetPDKVersion(); // check for correct PDK Version, as this determines whether an // OS-supplied virtual keyboard is available on this device. if (gblPDKVersion >= 300) { PDL_SetKeyboardState(PDL_FALSE); return true; } } // Call original SDL key handler. return SdlEventSource::handleKeyDown(ev, event); }
static void event_sdl_main_loop_run(void) { #ifdef USE_WEBOS_ACCELEROMETER struct callback* accel_cb = NULL; struct event_timeout* accel_to = NULL; if (PDL_GetPDKVersion() > 100) { accel_cb = callback_new_1(callback_cast(sdl_accelerometer_handler), gr); accel_to = event_add_timeout(200, 1, accel_cb); } #endif graphics_sdl_idle(NULL); event_sdl_watch_stopthread(); #ifdef USE_WEBOS_ACCELEROMETER SDL_JoystickClose(accelerometer); if (PDL_GetPDKVersion() > 100) { event_remove_timeout(accel_to); callback_destroy(accel_cb); } #endif }
/** * Before calling the original SDL implementation this method checks if the * gesture area has been released. * * @param ev The SDL event * @param event The ScummVM event. * @return True if event was processed, false if not. */ bool WebOSSdlEventSource::handleKeyUp(SDL_Event &ev, Common::Event &event) { // Handle gesture area tap. if (ev.key.keysym.sym == SDLK_WORLD_71) { _gestureDown = false; return true; } // handle virtual keyboard dismiss key if (ev.key.keysym.sym == 24) { int gblPDKVersion = PDL_GetPDKVersion(); // check for correct PDK Version, as this determines whether an // OS-supplied virtual keyboard is available on this device. if (gblPDKVersion >= 300) { PDL_SetKeyboardState(PDL_FALSE); return true; } } // Call original SDL key handler. return SdlEventSource::handleKeyUp(ev, event); }
static int vehicle_webos_open(struct vehicle_priv *priv) { PDL_Err err; priv->pdk_version = PDL_GetPDKVersion(); dbg(lvl_debug,"pdk_version(%d)\n", priv->pdk_version); if (priv->pdk_version <= 100) { // Use Location Service via callback interface err = PDL_ServiceCallWithCallback("palm://com.palm.location/startTracking", "{subscribe:true}", (PDL_ServiceCallbackFunc)vehicle_webos_callback, priv, PDL_FALSE); if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError()); vehicle_webos_close(priv); return 0; } } else { PDL_Err err; err = PDL_EnableLocationTracking(PDL_TRUE); if (err != PDL_NOERROR) { dbg(lvl_error,"PDL_EnableLocationTracking failed with (%d): (%s)\n", err, PDL_GetError()); // vehicle_webos_close(priv); // return 0; } priv->gps_type = GPS_TYPE_INT; if(!vehicle_webos_bt_open(priv)) return 0; } priv->ev_timeout = event_add_timeout(1000, 1, priv->timeout_cb); return 1; }
int CCApplication::run() { PVRFrameEnableControlWindow(false); CCLog("--- INTO CCApplication::run \n"); // Main message loop: // Initialize instance and cocos2d. if (! initInstance() || ! applicationDidFinishLaunching()) { return 0; } SDL_Joystick *joystick = SDL_JoystickOpen(0); CCEGLView& mainWnd = CCEGLView::sharedOpenGLView(); mainWnd.centerWindow(); CCLog(" --- BEFORE EVENT LOOP\n"); SDL_Event Event; while (1) { bool gotEvent; // without the inner while loop, input performance gets really laggy while ( SDL_PollEvent(&Event) ) { // CCLog("--- GOT NEW EVENT .... \n"); switch (Event.type) { case SDL_KEYDOWN: switch (Event.key.keysym.sym) { case PDLK_GESTURE_BACK: /* also maps to ESC */ if (PDL_GetPDKVersion() >= 200) { // standard behavior is to minimize to a card when you perform a back // gesture at the top level of the app PDL_Minimize(); } break; case PDLK_GESTURE_DISMISS_KEYBOARD:{ CCDirector::sharedDirector()->getOpenGLView()->setIMEKeyboardState(false); } break; case SDLK_BACKSPACE: { CCIMEDispatcher::sharedDispatcher()->dispatchDeleteBackward(); } break; default: { CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(SDL_GetKeyName(Event.key.keysym.sym), 1); } break; } break; case SDL_MOUSEBUTTONDOWN: // CCLog(" --- GOT NEW EVENT (SDL_MOUSEBUTTONDOWN).... \n"); mainWnd.WindowProc(SDL_MOUSEBUTTONDOWN,Event); break; case SDL_MOUSEBUTTONUP: // CCLog("--- GOT NEW EVENT (SDL_MOUSEBUTTONUP).... \n"); mainWnd.WindowProc(SDL_MOUSEBUTTONUP,Event); break; case SDL_MOUSEMOTION: mainWnd.WindowProc(SDL_MOUSEMOTION,Event); break; case SDL_QUIT: // We exit anytime we get a request to quit the app // all shutdown code is registered via atexit() so this is clean. exit(0); break; case SDL_JOYAXISMOTION: CCAccelerometer::sharedAccelerometer()->update(joystick, time(NULL)); break; case SDL_ACTIVEEVENT: switch(Event.active.gain) { case 1: { applicationWillEnterForeground(); break; } default: { applicationDidEnterBackground(); break; } } break; default: break; } } // Get current time tick. // If it's the time to draw next frame, draw it, else sleep a while. CCDirector::sharedDirector()->mainLoop(); } return (int) 0; }
/** * Handles mouse motion. * * @param ev The SDL event * @param event The ScummVM event. * @return True if event was processed, false if not. */ bool WebOSSdlEventSource::handleMouseMotion(SDL_Event &ev, Common::Event &event) { if (_fingerDown[ev.motion.which]) { _dragDiffX[ev.motion.which] += ev.motion.xrel; _dragDiffY[ev.motion.which] += ev.motion.yrel; switch (ev.motion.which) { case 0: // If our dragDiff goes too many pixels in either direction, // kill the future click and any queued drag event. if (_doClick && (ABS(_dragDiffX[0]) > MOUSE_DEADZONE_PIXELS || ABS(_dragDiffY[0]) > MOUSE_DEADZONE_PIXELS)) { _doClick = false; if (_queuedDragTime > 0) _queuedDragTime = 0; } // If only one finger is on the screen and moving, that's // the mouse pointer. if (!_fingerDown[1] && !_fingerDown[2]) { if (_touchpadMode) { _curX = MIN(_screenX, MAX(0, _curX + ev.motion.xrel)); _curY = MIN(_screenY, MAX(0, _curY + ev.motion.yrel)); } else { _curX = MIN(_screenX, MAX(0, 0 + ev.motion.x)); _curY = MIN(_screenY, MAX(0, 0 + ev.motion.y)); } event.type = Common::EVENT_MOUSEMOVE; processMouseEvent(event, _curX, _curY); } break; case 1: // Check for a two-finger swipe if (_fingerDown[0] && !_fingerDown[2]) { // Check for a vertical swipe if (ABS(_dragDiffY[0]) > _swipeDistY && ABS(_dragDiffY[1]) > _swipeDistY) { // Virtually lift fingers to prevent repeat triggers _fingerDown[0] = _fingerDown[1] = false; if (_dragDiffY[0] < 0 && _dragDiffY[1] < 0) { // A swipe up triggers the keyboard, if it exists. We // test for existance of a virtual OS keyboard by // checking for the version of the linked PDK libs. int gblPDKVersion = PDL_GetPDKVersion(); if (gblPDKVersion >= 300) PDL_SetKeyboardState(PDL_TRUE); } else if (_dragDiffY[0] > 0 && _dragDiffY[1] > 0) { // A swipe down triggers the menu if (g_engine && !g_engine->isPaused()) g_engine->openMainMenuDialog(); } return true; } // Check for a horizontal swipe if (ABS(_dragDiffX[0]) > _swipeDistX && ABS(_dragDiffX[1]) > _swipeDistX) { // Virtually lift fingers to prevent repeat triggers _fingerDown[0] = _fingerDown[1] = false; if (_dragDiffX[0] < 0 && _dragDiffX[1] < 0) { // A swipe left presses escape event.type = Common::EVENT_KEYDOWN; event.kbd.flags = 0; event.kbd.keycode = Common::KEYCODE_ESCAPE; event.kbd.ascii = Common::ASCII_ESCAPE; _queuedEscapeUpTime = g_system->getMillis() + QUEUED_KEY_DELAY; } else if (_dragDiffX[0] > 0 && _dragDiffX[1] > 0) { // A swipe right toggles touchpad mode _touchpadMode = !_touchpadMode; g_system->showMouse(_touchpadMode); // I18N: Touchpad mode toggle status. Common::String dialogMsg(_("Touchpad mode is now")); dialogMsg += " "; // I18N: Touchpad mode on or off. dialogMsg += (_touchpadMode ? _("ON") : _("OFF")); dialogMsg += ".\n"; // I18N: Instructions to toggle Touchpad mode. dialogMsg += _("Swipe two fingers to the right to toggle."); GUI::TimedMessageDialog dialog(dialogMsg, 1500); dialog.runModal(); } return true; } } break; case 2: // Check for a three-finger swipe if (_fingerDown[0] && _fingerDown[1]) { // Swipe to the right toggles Auto-drag if (_dragDiffX[0] > _swipeDistX && _dragDiffX[1] > _swipeDistX && _dragDiffX[2] > _swipeDistX) { // Virtually lift fingers to prevent repeat triggers _fingerDown[0] = _fingerDown[1] = _fingerDown[2] = false; // Toggle Auto-drag mode _autoDragMode = !_autoDragMode; // I18N: Auto-drag toggle status. Common::String dialogMsg(_("Auto-drag mode is now")); dialogMsg += " "; // I18N: Auto-drag on or off. dialogMsg += (_autoDragMode ? _("ON") : _("OFF")); dialogMsg += ".\n"; // I18N: Instructions to toggle auto-drag. dialogMsg += _( "Swipe three fingers to the right to toggle."); GUI::TimedMessageDialog dialog(dialogMsg, 1500); dialog.runModal(); return true; } else if (_dragDiffY[0] > _swipeDistY && _dragDiffY[1] > _swipeDistY && _dragDiffY[2] > _swipeDistY ) { // Swipe down to emulate spacebar (pause) // Virtually lift fingers to prevent repeat triggers _fingerDown[0] = _fingerDown[1] = _fingerDown[2] = false; // Press space event.type = Common::EVENT_KEYDOWN; event.kbd.flags = 0; event.kbd.keycode = Common::KEYCODE_SPACE; event.kbd.ascii = Common::ASCII_SPACE; _queuedSpaceUpTime = g_system->getMillis() + QUEUED_KEY_DELAY; } } } } return true; }