/// Handles GUIEventAdapter::RELEASE event. bool StandardManipulator::handleMouseRelease( const GUIEventAdapter& ea, GUIActionAdapter& us ) { if( ea.getButtonMask() == 0 ) { double timeSinceLastRecordEvent = _ga_t0.valid() ? (ea.getTime() - _ga_t0->getTime()) : DBL_MAX; if( timeSinceLastRecordEvent > 0.02 ) flushMouseEventStack(); if( isMouseMoving() ) { if( performMovement() && _allowThrow ) { us.requestRedraw(); us.requestContinuousUpdate( true ); _thrown = true; } return true; } } flushMouseEventStack(); addMouseEvent( ea ); if( performMovement() ) us.requestRedraw(); us.requestContinuousUpdate( false ); _thrown = false; return true; }
// UNUSED. Future Uses bool ViroManipulator::handleRelease(const GUIEventAdapter& ea){ // Mid Button if (ea.getButtonMask() == GUIEventAdapter::MIDDLE_MOUSE_BUTTON){ return true; } // Left Button else if (ea.getButtonMask() == GUIEventAdapter::LEFT_MOUSE_BUTTON){ return true; } // Right Button else if (ea.getButtonMask() == GUIEventAdapter::RIGHT_MOUSE_BUTTON){ Enable(PERIPHERAL_LOCK); return true; } return false; }
void EventQueue::mouseMotion(float x, float y, double time) { _accumulateEventState->setX(x); _accumulateEventState->setY(y); GUIEventAdapter* event = new GUIEventAdapter(*_accumulateEventState); event->setEventType(event->getButtonMask() ? GUIEventAdapter::DRAG : GUIEventAdapter::MOVE); event->setTime(time); addEvent(event); }
//Event Listener bool ViroManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us){ _lastFrameTime = ea.getTime(); switch( ea.getEventType() ){ case(GUIEventAdapter::FRAME):{ addMouseEvent(ea); // Main auto-management engine if (RollWithYaw >0.0 || isEnabled(COLLISIONS)) AutoControl( ea.time() ); // Check if Trace is needed if ( _bNeedUpdateTrace ) Trace(); // Handle Fly-To if any if (_bFlying) handleFlyToTransition( ea.time() ); if ( MouseListener() ) us.requestRedraw(); us.requestContinuousUpdate(true); return false; } case(GUIEventAdapter::RESIZE):{ init(ea,us); us.requestRedraw(); return true; } case(GUIEventAdapter::MOVE):{ addMouseEvent(ea); if ( MouseListener() ) us.requestRedraw(); us.requestContinuousUpdate(true); return true; } case(GUIEventAdapter::SCROLL):{ //addMouseEvent(ea); //osg::notify(ALWAYS) << "Scroll\n"; switch (ea.getScrollingMotion()){ case(GUIEventAdapter::SCROLL_UP):{ addMouseEvent(ea); osg::notify(ALWAYS) << "Scroll-up\n"; if ( MouseListener() ) us.requestRedraw(); us.requestContinuousUpdate(true); return true; } case(GUIEventAdapter::SCROLL_DOWN):{ addMouseEvent(ea); osg::notify(ALWAYS) << "Scroll-down\n"; if ( MouseListener() ) us.requestRedraw(); us.requestContinuousUpdate(true); return true; } } //if ( MouseListener() ) us.requestRedraw(); //us.requestContinuousUpdate(true); //return true; } /* OLD IMPLEMENTATION for OSG 1.0 case(GUIEventAdapter::SCROLL_UP):{ addMouseEvent(ea); osg::notify(ALWAYS) << "Scroll-up\n"; if ( MouseListener() ) us.requestRedraw(); us.requestContinuousUpdate(true); return true; } case(GUIEventAdapter::SCROLL_DOWN):{ addMouseEvent(ea); osg::notify(ALWAYS) << "Scroll-down\n"; if ( MouseListener() ) us.requestRedraw(); us.requestContinuousUpdate(true); return true; } */ // double click /* case(GUIEventAdapter::DOUBLECLICK):{ osg::notify(DEBUG_INFO)<<"Double Left click.\n"; _bSatMode = false; if (handlePick(_ev0->getXnormalized(),_ev0->getYnormalized())&&!_bFlying) FlyTo(ea.time()); } */ // Mouse Button Push case(GUIEventAdapter::PUSH):{ //addMouseEvent(ea); // Mid Button if (ea.getButtonMask() == GUIEventAdapter::MIDDLE_MOUSE_BUTTON){ //osg::notify(DEBUG_INFO)<<"Mid-Mouse pressed.\n"; //_bSatMode = false; _bMidButton = true; // During a Fly-To, stop flying... if (_bFlying){ _speed = 0.0; _bFlying = false; Disable(PERIPHERAL_LOCK); } else { float a = 0.4; if (_bHoldCTRL) a = 0.0; if (!_Viewer && handlePick(_ev0->getX() ,_ev0->getY(),a) &&!_bFlying) FlyTo(ea.time()); else if (handlePick(_ev0->getXnormalized(),_ev0->getYnormalized(),a) &&!_bFlying) FlyTo(ea.time()); } } // Left Button else if (ea.getButtonMask() == GUIEventAdapter::LEFT_MOUSE_BUTTON){ // Double-Click /* if ((ea.time() -_tLastLMB) < 0.4){ osg::notify(DEBUG_INFO)<<"Double Left click.\n"; _bSatMode = false; //if (handlePick(_ev0->getXnormalized(),_ev0->getYnormalized())&&!_bFlying) FlyTo(ea.time()); //if (handlePick(_ev0->getX(),_ev0->getY())&&!_bFlying) FlyTo(ea.time()); if (!_Viewer && handlePick(_ev0->getX() ,_ev0->getY())&&!_bFlying) FlyTo(ea.time()); else if (handlePick(_ev0->getXnormalized(),_ev0->getYnormalized())&&!_bFlying) FlyTo(ea.time()); } */ // Single Click /* else */ { osg::notify(DEBUG_INFO)<<"Left Button pressed.\n"; // During a Fly-To, stop flying... if (_bFlying){ _bFlying = false; //Disable(PERIPHERAL_LOCK); } _speed = 0.0; _UserControlPercentage = 1.0; } _tLastLMB = ea.time(); // Update time last LMB. } // Right Button else if (ea.getButtonMask() == GUIEventAdapter::RIGHT_MOUSE_BUTTON){ Disable(PERIPHERAL_LOCK); /* if (_bHoldCTRL){ if (!_bFlying && handlePick(_ev0->getXnormalized(),_ev0->getYnormalized())) _vLastPickedPoint = _vStoredEye[TO]; } */ } if ( MouseListener() ) us.requestRedraw(); //us.requestContinuousUpdate(true); return true; } case(GUIEventAdapter::RELEASE):{ Enable(PERIPHERAL_LOCK); if (ea.getButtonMask() == GUIEventAdapter::MIDDLE_MOUSE_BUTTON){ _bMidButton = false; } //handleRelease( ea ); us.requestContinuousUpdate(false); return true; } // Keyboard case(GUIEventAdapter::KEYDOWN):{ //osg::notify(DEBUG_INFO) << "A key has been pressed...\n"; if (ea.getKey()==GUIEventAdapter::KEY_Control_L){ _bHoldCTRL = true; us.requestContinuousUpdate(false); return true; } if (ea.getKey()==' '){ flushMouseEventStack(); //home(ea,us); requestFlyToHome(); FlyTo( ea.getTime() ); us.requestRedraw(); us.requestContinuousUpdate(false); return true; } if (ea.getKey()== 'v'){ flushMouseEventStack(); //_vStoredEye[ViroManipulator::TO] = _vEye; OLD //_qStoredRotation[ViroManipulator::TO] = _qRotation; OLD storeView(); osg::notify(ALWAYS) << "Position stored. Press 'c' when you want to recall it.\n"; us.requestContinuousUpdate(false); return true; } /* if (ea.getKey()== 'c'){ flushMouseEventStack(); osg::notify(ALWAYS) << "Recalled stored position.\n"; //FlyTo( ea.time() ); OLD reloadView(); us.requestRedraw(); us.requestContinuousUpdate(false); return true; } */ if (ea.getKey()== 'S'){ flushMouseEventStack(); Invert(SPIDERMAN_PICKING); if (isEnabled(SPIDERMAN_PICKING)) osg::notify(ALWAYS) << "SpiderMan Mode ON.\n"; else osg::notify(ALWAYS) << "SpiderMan Mode OFF.\n"; us.requestContinuousUpdate(false); return true; } if (ea.getKey()== GUIEventAdapter::KEY_Up){ _padEvent = NAVPAD_FORWARD; us.requestContinuousUpdate(false); } if (ea.getKey()== GUIEventAdapter::KEY_Down){ _padEvent = NAVPAD_BACKWARD; us.requestContinuousUpdate(false); } if (ea.getKey()== GUIEventAdapter::KEY_Page_Up){ _padEvent = NAVPAD_UP; us.requestContinuousUpdate(false); return true; } if (ea.getKey()== GUIEventAdapter::KEY_Left){ _padEvent = NAVPAD_STRAFELEFT; us.requestContinuousUpdate(false); return true; } if (ea.getKey()== GUIEventAdapter::KEY_Right){ _padEvent = NAVPAD_STRAFERIGHT; us.requestContinuousUpdate(false); return true; } if (ea.getKey()== GUIEventAdapter::KEY_Page_Down){ _padEvent = NAVPAD_DOWN; us.requestContinuousUpdate(false); return true; } if (ea.getKey()== 'f'){ // TODO : Switch Fullscreen ON/OFF return true; } if (ea.getKey()== 'l' || ea.getKey()== 'L'){ /* _HeadLight->getLight()->setLightNum(3); _HeadLight->getLight()->setDiffuse( Vec4(1,1,1, 0) ); _HeadLight->getLight()->setDirection( _vLook ); _HeadLight->getLight()->setPosition( Vec4(_vEye.x(),_vEye.y(),_vEye.z(), 0) ); */ //_bLockZ = !_bLockZ; Invert(Z_LOCK); if ( isEnabled(Z_LOCK) ){ _zLock = _vEye.z(); /* SyncData(); osg::Vec3d D = _vLook; D.normalize(); _vLockDir = D; */ } us.requestContinuousUpdate(false); return true; } if (ea.getKey()== 'c' || ea.getKey()== 'C'){ flushMouseEventStack(); Invert(COLLISIONS); //if (isEnabled(COLLISIONS)) osg::notify(ALWAYS) << "Model Collision ON.\n"; //else osg::notify(ALWAYS) << "Model Collision OFF.\n"; us.requestContinuousUpdate(false); return true; } /* if (ea.getKey()== 'i'){ flushMouseEventStack(); _Viewer->getCamera()->setProjectionMatrixAsPerspective(30.0,3, 0.01,50); us.requestContinuousUpdate(false); return true; } */ if (ea.getKey()== 'g' || ea.getKey()== 'w'){ flushMouseEventStack(); Invert(GRAVITY); //if (isEnabled(GRAVITY)) osg::notify(ALWAYS) << "Gravity ON.\n"; //else osg::notify(ALWAYS) << "Gravity OFF.\n"; us.requestContinuousUpdate(false); return true; } // Keyboard navigation if (ea.getKey()== 'a'){ /* //flushMouseEventStack(); Enable(PERIPHERAL_LOCK); double d = 50.; turn( d*getDtime(), 0.0); SyncData(); */ us.requestContinuousUpdate(false); return true; } if (ea.getKey()== 'd'){ /* //flushMouseEventStack(); Enable(PERIPHERAL_LOCK); double d = 50.; turn(-d* getDtime(), 0.0); SyncData(); */ us.requestContinuousUpdate(false); return true; } if (0&& ea.getKey()== 'w'){ /* //flushMouseEventStack(); Enable(PERIPHERAL_LOCK); _speed += Acceleration * getDtime(); boost(); SyncData(); */ us.requestContinuousUpdate(false); return true; } if (ea.getKey()== 's'){ /* //flushMouseEventStack(); Enable(PERIPHERAL_LOCK); _speed = 0.0; */ us.requestContinuousUpdate(false); return true; } if (ea.getKey()== 'x'){ /* //flushMouseEventStack(); Enable(PERIPHERAL_LOCK); _speed -= Acceleration * getDtime(); boost(); SyncData(); */ us.requestContinuousUpdate(false); return true; } if (ea.getKey()== '+'){ double l,r,b,t,z,Z; _Viewer->getCamera()->getProjectionMatrixAsFrustum(l,r,b,t,z,Z); l *= 0.9; r *= 0.9; b *= 0.9; t *= 0.9; _Viewer->getCamera()->setProjectionMatrixAsFrustum(l,r,b,t,z,Z); us.requestContinuousUpdate(false); return true; } if (ea.getKey()== '-'){ double l,r,b,t,z,Z; _Viewer->getCamera()->getProjectionMatrixAsFrustum(l,r,b,t,z,Z); l *= 1.1; r *= 1.1; b *= 1.1; t *= 1.1; _Viewer->getCamera()->setProjectionMatrixAsFrustum(l,r,b,t,z,Z); us.requestContinuousUpdate(false); return true; } return true; } case(GUIEventAdapter::KEYUP):{ _padEvent = NAVPAD_NONE; if (ea.getKey()==GUIEventAdapter::KEY_Control_L){ _bHoldCTRL = false; us.requestContinuousUpdate(false); return true; } return true; } default: return false; } // return false; }
// -------------------------------------------------------------------------------------------------- bool SphericalManipulator::handle(const GUIEventAdapter &ea, GUIActionAdapter &us) { switch (ea.getEventType()) { case (GUIEventAdapter::FRAME): { double current_frame_time = ea.getTime(); _delta_frame_time = current_frame_time - _last_frame_time; _last_frame_time = current_frame_time; if (_thrown) { if (calcMovement()) us.requestRedraw(); } return false; } default: break; } if (ea.getHandled()) return false; switch (ea.getEventType()) { case (GUIEventAdapter::PUSH): { flushMouseEventStack(); addMouseEvent(ea); us.requestContinuousUpdate(false); _thrown = false; return true; } case (GUIEventAdapter::RELEASE): { if (ea.getButtonMask() == 0) { double timeSinceLastRecordEvent = _ga_t0.valid() ? (ea.getTime() - _ga_t0->getTime()) : DBL_MAX; if (timeSinceLastRecordEvent > 0.02) flushMouseEventStack(); if (isMouseMoving()) { if (calcMovement()) { us.requestRedraw(); us.requestContinuousUpdate(true); _thrown = _allowThrow; } } else { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; } } else { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; } return true; } case (GUIEventAdapter::DRAG): case (GUIEventAdapter::SCROLL): { addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; return true; } case (GUIEventAdapter::MOVE): { return false; } case (GUIEventAdapter::KEYDOWN): if (ea.getKey() == GUIEventAdapter::KEY_Space) { flushMouseEventStack(); _thrown = false; home(ea, us); return true; } return false; case (GUIEventAdapter::FRAME): if (_thrown) { if (calcMovement()) us.requestRedraw(); } return false; default: return false; } return false; }
bool TerrainManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us) { switch(ea.getEventType()) { case(GUIEventAdapter::FRAME): if (_thrown) { if (calcMovement()) us.requestRedraw(); } return false; default: break; } if (ea.getHandled()) return false; switch(ea.getEventType()) { case(GUIEventAdapter::PUSH): { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; return true; } case(GUIEventAdapter::RELEASE): { if (ea.getButtonMask()==0) { if (isMouseMoving()) { if (calcMovement()) { us.requestRedraw(); us.requestContinuousUpdate(true); _thrown = true; } } else { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; } } else { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; } return true; } case(GUIEventAdapter::DRAG): { addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; return true; } case(GUIEventAdapter::MOVE): { return false; } case(GUIEventAdapter::KEYDOWN): if (ea.getKey()== GUIEventAdapter::KEY_Space) { flushMouseEventStack(); _thrown = false; home(ea,us); us.requestRedraw(); us.requestContinuousUpdate(false); return true; } return false; default: return false; } }
bool PanoManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us) { if(StartMoment == 0.0) // only do this once at actual startup of drawing { ClearStartMoment(); } // if unsigned int buttonMask = ea.getButtonMask(); switch(ea.getEventType()) { case(GUIEventAdapter::PUSH): { GlobalTipSupport->HideBalloonTip(); if(GetGlobalViewer()) { SetCapture(GetGlobalViewerHWND()); } // if if((buttonMask & GUIEventAdapter::LEFT_MOUSE_BUTTON) && (Navigation::GetCurrentNavMode() == Navigation::NAV_NM_QUERY)) { PossibleQueryInitiating = true; } // if else { if(buttonMask & GUIEventAdapter::MIDDLE_MOUSE_BUTTON) { // determine and record orbit point osg::Vec3 NewOrbitCenter; if(GetFirstTangibleHitLocation(ea.getX(), ea.getY(), NewOrbitCenter)) { SetOrbitCenter(NewOrbitCenter); } // if else { ClearOrbitCenter(); } // else } // if PossibleQueryInitiating = false; addMouseEvent(ea); us.requestContinuousUpdate(true); if(GetDelayedGoto()) { Goto(ea.getX(), ea.getY()); } // if else { if (calcMovement(ea, us)) us.requestRedraw(); } // else } // if return true; } // PUSH case(GUIEventAdapter::RELEASE): { if(buttonMask & GUIEventAdapter::MIDDLE_MOUSE_BUTTON) { ClearOrbitCenter(); } // if if(GetGlobalViewer()) { if(GetCapture() == GetGlobalViewerHWND()) { ReleaseCapture(); } // if } // if addMouseEvent(ea); us.requestContinuousUpdate(true); if(Navigation::GetCurrentNavMode() == Navigation::NAV_NM_QUERY) { #ifdef NVW_SUPPORT_QUERYACTION // Query/Action fires on mouseUP, to no weird state is interfering with newly-opened windows if(PossibleQueryInitiating) PerformQueryAction(ea.getX(), ea.getY(), false); #endif // NVW_SUPPORT_QUERYACTION } // if else { PossibleQueryInitiating = false; if (calcMovement(ea, us)) us.requestRedraw(); } // else return true; } // RELEASE case(GUIEventAdapter::DRAG): { addMouseEvent(ea); us.requestContinuousUpdate(true); if (calcMovement(ea, us)) us.requestRedraw(); return true; } // DRAG case(GUIEventAdapter::MOVE): { MarkLastMouseMoveMoment(); addMouseEvent(ea); us.requestContinuousUpdate(true); if (calcMovement(ea, us)) us.requestRedraw(); return true; } // MOVE case(GUIEventAdapter::KEYDOWN): { if (ea.getKey()==' ') { GlobalTipSupport->HideBalloonTip(); EventDispatcher::DispatchEvent(EventDispatcher::NVW_EC_NAVIGATION, EventDispatcher::NVW_ESC_NAVIGATION_THROTTLE, EventDispatcher::NVW_PC_ZERO); flushMouseEventStack(); home(ea,us); us.requestRedraw(); us.requestContinuousUpdate(false); return true; } // if if (ea.getKey()=='.') { GlobalTipSupport->HideBalloonTip(); EventDispatcher::DispatchEvent(EventDispatcher::NVW_EC_NAVIGATION, EventDispatcher::NVW_ESC_NAVIGATION_THROTTLE, EventDispatcher::NVW_PC_ZERO); flushMouseEventStack(); halt(ea,us); us.requestRedraw(); us.requestContinuousUpdate(false); return true; } // if return false; } // KEYDOWN case(GUIEventAdapter::FRAME): { if(!GetMouseInactiveOneShot() && GetMouseInactiveTime() > NVW_PANOMANIPULATOR_MOUSE_INACTIVE_TIME_SECONDS && (GetSystemTimeFP() - GetLastMovementMoment()) > NVW_PANOMANIPULATOR_MOUSE_INACTIVE_TIME_SECONDS) { SetMouseInactiveOneShot(true); // make it only fire once EventDispatcher::DispatchEvent(EventDispatcher::NVW_EC_ACTION, EventDispatcher::NVW_ESC_ACTION_QUERYHERE, EventDispatcher::NVW_PC_LESS); } // if GlobalTipSupport->HandleBalloonTipTimeout(); addMouseEvent(ea); if(GetTourInProgress()) { GlobalTipSupport->HideBalloonTip(); InternalTour(); // we don't redraw, as the animation part of the tour is handled by Transition code, below } // if if(GetTransitionInProgress()) { GlobalTipSupport->HideBalloonTip(); InternalTrans(); us.requestRedraw(); } // if else if(GetAnimationInProgress()) { GlobalTipSupport->HideBalloonTip(); InternalAnim(); us.requestRedraw(); } // if else { // handle HotNav disk if(MasterScene.GetHotNavFwdBackAmount() != 0.0 || MasterScene.GetHotNavSideAmount() != 0.0 ) { GlobalTipSupport->HideBalloonTip(); ExecuteMovement(MasterScene.GetHotNavSideAmount(), MasterScene.GetHotNavFwdBackAmount(), 0.0); us.requestRedraw(); } // if // handle HotTurn disk if(MasterScene.GetHotTurnHAmount() != 0.0 || MasterScene.GetHotTurnVAmount() != 0.0 ) { // hot turn is too hot without the constant scaling factor GlobalTipSupport->HideBalloonTip(); ExecuteRotate(MasterScene.GetHotTurnHAmount() * .01, 0.0, MasterScene.GetHotTurnVAmount() * .01); us.requestRedraw(); } // if if (calcMovement(ea, us)) us.requestRedraw(); } // else return true; } // FRAME case(GUIEventAdapter::RESIZE): { GlobalTipSupport->HideBalloonTip(); init(ea,us); us.requestRedraw(); return true; } // RESIZE default: return false; } // switch } // PanoManipulator::handle
bool SceneGraphManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us) { if (ea.getHandled()) return false; BaseViewer *v = dynamic_cast<BaseViewer*>(&us); if (!v) return false; else if (!_init) {_sceneGraph = dynamic_cast<SceneGraph*>(getUserData()); _init=true;} Viewer2D3D *v2d3d = dynamic_cast<Viewer2D3D*>(v->getGraphicsViewer()); if (!v2d3d) return false; if(_sceneGraph.valid() && _sceneGraph->getScene()) setInteractionMode(v2d3d->getProjectionType(), (_sceneGraph->getScene()->getBound()).center(), v2d3d->getZoom()); switch(ea.getEventType()) { case(GUIEventAdapter::PUSH): flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; return true; case(GUIEventAdapter::RELEASE): if (ea.getButtonMask()==0) if (isMouseMoving()) { if (calcMovement()) { us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; } } else { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; } else { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; } return true; case(GUIEventAdapter::DRAG): addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; return true; case(GUIEventAdapter::MOVE): return false; case(GUIEventAdapter::KEYDOWN): if (ea.getKey()== _resetCameraKey) // reset camera { flushMouseEventStack(); _thrown = false; home(ea,us); us.requestRedraw(); us.requestContinuousUpdate(false); return true; } else if(ea.getKey() >= 0xFFE1 && ea.getKey() <= 0xFFEE) { // modifier keys _currentModifier = ea.getKey(); return true; } return false; case(GUIEventAdapter::KEYUP): { if(ea.getKey() == _currentModifier) { _currentModifier = 0; return true; } return false; } case(GUIEventAdapter::FRAME): if (_thrown && calcMovement()) us.requestRedraw(); return false; default: return false; } }