void InputThread::handleMouseMove(uint32_t x, uint32_t y, SDL_Keymod buttonState, bool pressed) { if(m_sys->currentVm == NULL) return; SpinlockLocker locker(inputDataSpinlock); mousePos = Vector2(x,y); Locker locker2(mutexDragged); // Handle current drag operation if(curDragged) { Vector2f local; _NR<DisplayObjectContainer> parent = curDragged->getParent(); if(!parent) { stopDrag(curDragged.getPtr()); return; } local = parent->getConcatenatedMatrix().getInverted().multiply2D(mousePos); local += dragOffset; if(dragLimit) local = local.projectInto(*dragLimit); curDragged->setX(local.x); curDragged->setY(local.y); } // Handle non-drag mouse movement else { _NR<InteractiveObject> selected = getMouseTarget(x, y, DisplayObject::MOUSE_CLICK); number_t localX, localY; selected->globalToLocal(x,y,localX,localY); if(currentMouseOver == selected) m_sys->currentVm->addEvent(selected, _MR(Class<MouseEvent>::getInstanceS(m_sys,"mouseMove",localX,localY,true,buttonState,pressed))); else { if(!currentMouseOver.isNull()) { number_t clocalX, clocalY; currentMouseOver->globalToLocal(x,y,clocalX,clocalY); m_sys->currentVm->addEvent(currentMouseOver, _MR(Class<MouseEvent>::getInstanceS(m_sys,"mouseOut",clocalX,clocalY,true,buttonState,pressed,selected))); m_sys->currentVm->addEvent(currentMouseOver, _MR(Class<MouseEvent>::getInstanceS(m_sys,"rollOut",clocalX,clocalY,true,buttonState,pressed,selected))); } m_sys->currentVm->addEvent(selected, _MR(Class<MouseEvent>::getInstanceS(m_sys,"mouseOver",localX,localY,true,buttonState,pressed,currentMouseOver))); m_sys->currentVm->addEvent(selected, _MR(Class<MouseEvent>::getInstanceS(m_sys,"rollOver",localX,localY,true,buttonState,pressed,currentMouseOver))); currentMouseOver = selected; } } }