示例#1
0
void mouseScrollBy(double x, double y, bool continuous)
{
    RECT rect;
    ::GetWindowRect(webViewWindow, &rect);

    // This value is taken from Source/WebCore/platform/win/WheelEventWin.cpp
    const float cScrollbarPixelsPerLine = 100.0f / 3.0f;

    if (x) {
        UINT scrollChars = 1;
        ::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scrollChars, 0);
        x *= WHEEL_DELTA / scrollChars;
        if (continuous)
            x /= cScrollbarPixelsPerLine;
        MSG msg = makeMsg(webViewWindow, WM_MOUSEHWHEEL, MAKEWPARAM(0, x), MAKELPARAM(rect.left + lastMousePosition.x, rect.top + lastMousePosition.y));
        dispatchMessage(&msg);
    }

    if (y) {
        UINT scrollLines = 3;
        ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, 0);
        y *= WHEEL_DELTA / scrollLines;
        if (continuous)
            y /= cScrollbarPixelsPerLine;
        MSG msg = makeMsg(webViewWindow, WM_MOUSEWHEEL, MAKEWPARAM(0, y), MAKELPARAM(rect.left + lastMousePosition.x, rect.top + lastMousePosition.y));
        dispatchMessage(&msg);
    }
}
示例#2
0
void StateCook::enter(Entity *entity)
{
    Entity *husband = EntityFactory::getInstance()->getEntity("husband");

    auto instance = tinycraft::MessageDispatcher<Entity>::getInstance();
    instance->dispatchMessage(entity, husband, "getup");
    instance->dispatchMessage(entity, entity, "havebreakfast", nullptr, 5);
    instance->dispatchMessage(entity, husband, "havebreakfast", nullptr, 5);
}
示例#3
0
static JSValueRef contextClickCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
{
    COMPtr<IWebFramePrivate> framePrivate;
    if (SUCCEEDED(frame->QueryInterface(&framePrivate)))
        framePrivate->layout();

    down = true;
    MSG msg = makeMsg(webViewWindow, WM_RBUTTONDOWN, 0, MAKELPARAM(lastMousePosition.x, lastMousePosition.y));
    dispatchMessage(&msg);
    down = false;
    msg = makeMsg(webViewWindow, WM_RBUTTONUP, 0, MAKELPARAM(lastMousePosition.x, lastMousePosition.y));
    dispatchMessage(&msg);
    
    return JSValueMakeUndefined(context);
}
示例#4
0
void Connection::dispatchMessage(std::unique_ptr<MessageDecoder> message)
{
    // If there's no client, return. We do this after calling releaseArguments so that
    // the ArgumentDecoder message will be freed.
    if (!m_client)
        return;

    m_inDispatchMessageCount++;

    if (message->shouldDispatchMessageWhenWaitingForSyncReply())
        m_inDispatchMessageMarkedDispatchWhenWaitingForSyncReplyCount++;

    bool oldDidReceiveInvalidMessage = m_didReceiveInvalidMessage;
    m_didReceiveInvalidMessage = false;

    if (message->isSyncMessage())
        dispatchSyncMessage(*message);
    else
        dispatchMessage(*message);

    m_didReceiveInvalidMessage |= message->isInvalid();
    m_inDispatchMessageCount--;

    if (message->shouldDispatchMessageWhenWaitingForSyncReply())
        m_inDispatchMessageMarkedDispatchWhenWaitingForSyncReplyCount--;

    if (m_didReceiveInvalidMessage && m_client)
        m_client->didReceiveInvalidMessage(this, message->messageReceiverName(), message->messageName());

    m_didReceiveInvalidMessage = oldDidReceiveInvalidMessage;
}
示例#5
0
void flush()
{
    ENetEvent event;

    // Check if there are any new events
    while (enet_host_service(client, &event, 0) > 0)
    {
        switch (event.type)
        {
            case ENET_EVENT_TYPE_CONNECT:
                logger->log("Connected to port %d.", event.peer->address.port);
                // Store any relevant server information here.
                event.peer->data = 0;
                break;

            case ENET_EVENT_TYPE_RECEIVE:
                dispatchMessage(event.packet);
                break;

            case ENET_EVENT_TYPE_DISCONNECT:
                logger->log("Disconnected.");
                // Reset the server information.
                event.peer->data = 0;
                break;

            case ENET_EVENT_TYPE_NONE:
            default:
                break;
        }
    }
}
示例#6
0
void flush()
{
    ENetEvent event;

    // Wait up to 10 milliseconds for an event.
    while (enet_host_service(client, &event, 10) > 0)
    {
        switch (event.type)
        {
            case ENET_EVENT_TYPE_CONNECT:
                logger->log("Connected to port %d.", event.peer->address.port);
                // Store any relevant server information here.
                event.peer->data = 0;
                break;

            case ENET_EVENT_TYPE_RECEIVE:
                dispatchMessage(event.packet);
                break;

            case ENET_EVENT_TYPE_DISCONNECT:
                logger->log("Disconnected.");
                // Reset the server information.
                event.peer->data = 0;
                break;

            case ENET_EVENT_TYPE_NONE:
                logger->log("No event during 10 milliseconds.");
                break;

            default:
                logger->log("Unhandled enet event.");
                break;
        }
    }
}
示例#7
0
void main()
{
    int i,j,boxidx;
    int driver=DETECT, mode=0;
    randomize();
    //registerbgidriver(EGAVGA_driver);
    initgraph(&driver,&mode,"");
    xyz:
    do
    {
	menu();
	init();
	boxidx=random(7);
	FORCOLOR2=random(7)+1;
    for(j=0;j<4;j++)
    for(i=0;i<4;i++)
    box2[j][i]=BOX[boxidx][j][i];
	do
	{
	    getMessage();
	    dispatchMessage();
	}while(!gameOver());
	highscore();
	OVER();
	getch();
    }while(1);
}
示例#8
0
void OSCPacketDispatcher::dispatchPacket(OSCPacket& packet, QHostAddress& address, QDateTime* timestamp)
{
    if(packet.isBundle)
    {
        dispatchBundle((OSCBundle&)packet, address);
    }else
    {
        if(timestamp)
        {
            dispatchMessage((OSCMessage&)packet, address, *timestamp);
        }else
        {
            dispatchMessage((OSCMessage&)packet, address);
        }
    }
}
示例#9
0
static void doMouseMove(MSG msg)
{
    COMPtr<IWebFramePrivate> framePrivate;
    if (SUCCEEDED(frame->QueryInterface(&framePrivate)))
        framePrivate->layout();

    dispatchMessage(&msg);

    if (down && draggingInfo) {
        POINT screenPoint = msg.pt;
        ::ClientToScreen(webViewWindow, &screenPoint);

        IWebView* webView;
        COMPtr<IDropTarget> webViewDropTarget;
        if (SUCCEEDED(frame->webView(&webView)) && SUCCEEDED(webView->QueryInterface(IID_IDropTarget, (void**)&webViewDropTarget))) {
            DWORD effect = 0;
            if (didDragEnter)
                webViewDropTarget->DragOver(MK_LBUTTON, pointl(screenPoint), &effect);
            else {
                webViewDropTarget->DragEnter(draggingInfo->dataObject(), 0, pointl(screenPoint), &effect);
                didDragEnter = true;
            }
            draggingInfo->dropSource()->GiveFeedback(effect);
        }
    }
}
static void doMouseUp(MSG msg)
{
    COMPtr<IWebFramePrivate> framePrivate;
    if (SUCCEEDED(frame->QueryInterface(&framePrivate)))
        framePrivate->layout();

    dispatchMessage(&msg);
    down = false;

    if (draggingInfo) {
        COMPtr<IWebView> webView;
        COMPtr<IDropTarget> webViewDropTarget;
        if (SUCCEEDED(frame->webView(&webView)) && SUCCEEDED(webView->QueryInterface(IID_IDropTarget, (void**)&webViewDropTarget))) {
            POINT screenPoint = msg.pt;
            ::ClientToScreen(webViewWindow, &screenPoint);
            HRESULT hr = draggingInfo->dropSource()->QueryContinueDrag(0, 0);
            DWORD effect = 0;
            webViewDropTarget->DragOver(0, pointl(screenPoint), &effect);
            if (hr == DRAGDROP_S_DROP && effect != DROPEFFECT_NONE) {
                DWORD effect = 0;
                webViewDropTarget->Drop(draggingInfo->dataObject(), 0, pointl(screenPoint), &effect);
            } else
                webViewDropTarget->DragLeave();

            delete draggingInfo;
            draggingInfo = 0;
        }
    }
}
  //
  // file descriptor callback
  //
  int 
  EventHandler::handle_input (ACE_HANDLE fd) 
  {
    unsigned char thisChar;
  
    // buffer for bytes send form the panTilt    
    unsigned char buff[BUFFSIZE];
    int buffPos = 0;
    int buffLen = 0;

    buffLen = read(fd,buff,BUFFSIZE);

    if (buffLen < -1) {
      throw Miro::Exception("EventHandler::handle_input: Error on  file descriptor");
    }   else if (buffLen == 0) {    
      throw Miro::Exception("EventHandler::handle_input:  fd was called, but 0 bytes for reading");
    } else {
      buffPos = 0;
    } 

    while (buffPos < buffLen) {
      thisChar = buff[ buffPos++ ];

      // cerr << "[" << (unsigned int)(thisChar) << "]" << flush;

      switch(state) {
      case WFSTAR:
	if (thisChar == '*') {
	  state = WFDELIM;
	  msg_->time() = ACE_OS::gettimeofday(); // set time stamp
	}
	else if (thisChar == '!') {
	  state = WFDELIM;
	  msg_->setErrorState();
	}
	else {
	  cerr << "ignoring :|" << thisChar << "|" << endl;
	}
	break;

      case WFDELIM: 
	if (thisChar == '\n') {
	  state = WFSTAR;
	  dispatchMessage();
	  msg_->resetMessage();
	}
	else {
	  //cerr << "using :|" << thisChar << "|" << endl;	  
	  // TODO here append to message
	  msg_->addChar( thisChar );
	}
	break;
      default:
	throw Miro::Exception("EventHandler::handle_input: unknown state in panTiltEvent.");
	break;
      }
    }
    return 0;
  }
void CookieDatabaseBackingStore::getCookiesFromDatabase(Vector<ParsedCookie*>& stackOfCookies, unsigned int limit)
{
    // It is not a huge performance hit to wait on the reply here because this is only done once during setup and when turning off private mode.
    TypedReplyBuffer< Vector<ParsedCookie*>* > replyBuffer(0);
    dispatchMessage(createMethodCallMessageWithReturn(&CookieDatabaseBackingStore::invokeGetCookiesWithLimit, &replyBuffer, this, limit));
    Vector<ParsedCookie*>* cookies = replyBuffer.pointer();
    stackOfCookies.swap(*cookies);
    delete cookies;
}
void NetworkProcessProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageDecoder& decoder)
{
    if (dispatchMessage(connection, decoder))
        return;

    if (m_webContext->dispatchMessage(connection, decoder))
        return;

    didReceiveNetworkProcessProxyMessage(connection, decoder);
}
void NetworkProcessProxy::didReceiveMessage(IPC::Connection& connection, IPC::MessageDecoder& decoder)
{
    if (dispatchMessage(connection, decoder))
        return;

    if (m_processPool.dispatchMessage(connection, decoder))
        return;

    didReceiveNetworkProcessProxyMessage(connection, decoder);
}
示例#15
0
void handleWindowEvents(FrameworkWindow *window, long signalSet) {
  struct IntuiMessage *msg;
  struct Window *iwindow = window->intuitionWindow;

  if(1L << iwindow->UserPort->mp_SigBit & signalSet) {
    while(msg = GT_GetIMsg(iwindow->UserPort)) {
      dispatchMessage(window, msg);
      GT_ReplyIMsg(msg);
    }
  }

  handleWindowChildEvents(window, signalSet);
}
示例#16
0
void StateGetup::enter(Entity *entity)
{
    std::cout << entity->getName() << ": tring to get up." << std::endl;

    void *data = malloc(6);
    memset(data, 0, 6);
    memcpy(data, "pasta", 5);

    Entity *wife = EntityFactory::getInstance()->getEntity("wife");

    auto instance = tinycraft::MessageDispatcher<Entity>::getInstance();
    instance->dispatchMessage(entity, wife, "hungry", data, 3);
}
示例#17
0
void Connection::dispatchOneMessage()
{
    std::unique_ptr<MessageDecoder> message;

    {
        MutexLocker locker(m_incomingMessagesLock);
        if (m_incomingMessages.isEmpty())
            return;

        message = m_incomingMessages.takeFirst();
    }

    dispatchMessage(std::move(message));
}
示例#18
0
void MRJSession::idle(UInt32 milliseconds)
{
	// Each call to idle processes a single message.
	dispatchMessage();

#if !TARGET_CARBON
	// Guard against entering the VM multiple times.
	if (mLockCount == 0) {
		lock();
		mStatus = ::JMIdle(mSession, milliseconds);
		unlock();
	}
#endif
}
示例#19
0
void WebProcessProxy::didReceiveMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder)
{
    if (dispatchMessage(connection, decoder))
        return;

    if (m_context->dispatchMessage(connection, decoder))
        return;

    if (decoder.messageReceiverName() == Messages::WebProcessProxy::messageReceiverName()) {
        didReceiveWebProcessProxyMessage(connection, decoder);
        return;
    }

    // FIXME: Add unhandled message logging.
}
示例#20
0
void RCDataCenter::parseProtoLoginReq(ProtoLoginReq* req)
{
    CCLog("req : %i", req->authid());
    ProtoLoginRes* res = new ProtoLoginRes();
    res->set_mapid(1);
    RCMessageStruct* messageStruct = new RCMessageStruct();
    
    messageStruct->messageCode = MC_PROTOLOGINRES;
    res->SerializeToArray(messageStruct->data, res->ByteSize());
    int size = res->ByteSize() + sizeof(messageStruct->messageCode);
    dispatchMessage(messageStruct, size);
    
    delete (messageStruct);
    delete (res);
}
示例#21
0
// Function listening and captures data sends to client,
void MainWindow::readTcpData()
{
    Message msg;
    QByteArray data = connectionManager->readAll();

    qDebug()<<"readTcp: " + data;

    msg.decode(data);
//    msg.setTimestamp();

    dispatchMessage(msg);

//    if(msg.from == myProfile->login) {
//        connect(this, SIGNAL(sendMessage(Message)), this, SLOT(recognitionMessage(Message)));
//        emit sendMessage(msg);
    //    }
}
示例#22
0
void BFMailBox::dataReceived(QByteArray *pData)
{
    mMessageBuffer.append(*pData);

    const MessageHead* pHead = (const MessageHead*)mMessageBuffer.constData();
    while (pHead->length <= pData->length()) {

        QByteArray message = QByteArray::fromRawData(mMessageBuffer.constData(), pHead->length);
        dispatchMessage(pHead->type, &message);
        mMessageBuffer.remove(0, pHead->length);

        if (mMessageBuffer.size() < sizeof(MessageHead))
            break;

        pHead = (const MessageHead*)mMessageBuffer.constData();
    }
}
示例#23
0
static JSValueRef mouseDownCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
{
    COMPtr<IWebFramePrivate> framePrivate;
    if (SUCCEEDED(frame->QueryInterface(&framePrivate)))
        framePrivate->layout();

    down = true;
    int mouseType = WM_LBUTTONDOWN;
    if (argumentCount >= 1) {
        int mouseNumber = JSValueToNumber(context, arguments[0], exception);
        switch (mouseNumber) {
        case 0:
            mouseType = WM_LBUTTONDOWN;
            break;
        case 1:
            mouseType = WM_MBUTTONDOWN;
            break;
        case 2:
            mouseType = WM_RBUTTONDOWN;
            break;
        case 3:
            // fast/events/mouse-click-events expects the 4th button has event.button = 1, so send an WM_BUTTONDOWN
            mouseType = WM_MBUTTONDOWN;
            break;
        default:
            mouseType = WM_LBUTTONDOWN;
            break;
        }
    }

    WPARAM wparam = 0;
    if (argumentCount >= 2)
        wparam |= buildModifierFlags(context, arguments[1]);
        
    MSG msg = makeMsg(webViewWindow, mouseType, wparam, MAKELPARAM(lastMousePosition.x, lastMousePosition.y));
    if (!msgQueue[endOfQueue].delay)
        dispatchMessage(&msg);
    else {
        // replaySavedEvents has the required logic to make leapForward delays work
        msgQueue[endOfQueue++].msg = msg;
        replaySavedEvents();
    }

    return JSValueMakeUndefined(context);
}
示例#24
0
static JSValueRef mouseDownCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
{
    COMPtr<IWebFramePrivate> framePrivate;
    if (SUCCEEDED(frame->QueryInterface(&framePrivate)))
        framePrivate->layout();

    down = true;
    MSG msg = makeMsg(webViewWindow, WM_LBUTTONDOWN, 0, MAKELPARAM(lastMousePosition.x, lastMousePosition.y));
    if (!msgQueue[endOfQueue].delay)
        dispatchMessage(&msg);
    else {
        // replaySavedEvents has the required logic to make leapForward delays work
        msgQueue[endOfQueue++].msg = msg;
        replaySavedEvents();
    }

    return JSValueMakeUndefined(context);
}
示例#25
0
void World::update()
{
	bool worldchanged = false;
	while(MsgMngr.hasMoreMessages())
	{
		Message msg = MsgMngr.peekMessage();
		MsgMngr.dispatch();
		std::cout << "dispatching message: ";
		for(std::map<std::string,std::string>::iterator i = msg.map.begin();i!=msg.map.end();i++)
		{
			std::cout << i->first << " " << i->second << " ";
		}
		std::cout << "\n";
		dispatchMessage(msg);
		worldchanged = true;
	}
	if(worldchanged)
	{
		updateInfobox();
	}
}
示例#26
0
// Create new conversation tab
// Insert or add new tab in CBD and add connect signal to slot
void MainWindow::addNewTab(QString to)
{
    QString login;
    QSqlQuery q("SELECT login FROM contacts WHERE alias='"+to+"';", contactsDb);
    if(q.next()) {
        login = q.value("login").toString();
    }else
        return;

    openChatBox();

    ChatBoxDialogContent *newContent = new ChatBoxDialogContent();
    newContent->myProfile = myProfile;
    createdTabs->insert(to, newContent);

    form->insertTab(to.toInt(), createdTabs->take(to), to);
    newContent->receiver = login;
    connect(newContent, SIGNAL(sendMessage(Message)), this, SLOT(dispatchMessage(Message)));
    form->setCurrentIndex(to.toInt());
    form->activateWindow();
}
  // file descriptor callback
  int
  EventHandler::handle_input (ACE_HANDLE fd)
  {
    MIRO_DBG(SPARROW, LL_PRATTLE, "Can::EventHandler: handle_input()");

    int count;
    if(params_->module == "pcan"){
       pcanmsg * msgp;
       msg_->canMessage((int **) &msgp);
       count = ioctl(fd, PCAN_READ_MSG, msgp);
       if (count < 0) {
         MIRO_LOG(LL_ERROR, "Pcan handle_input() failed!");
         return 0;
       }
    }
    else {
       canmsg * msg;
       msg_->canMessage((int **) &msg);
       count = ACE_OS::read(fd, msg, sizeof(canmsg));

      if (count == 0) {
        MIRO_LOG(LL_WARNING,
                 "Can::EventHandler: handle_input() called with no data!");
       return 0;
      }

       if (count != sizeof(canmsg)) {
         MIRO_LOG_OSTR(LL_ERROR,
		       "Can::EventHandler: read() != sizeof(canmsg): " <<
		       count << " != " << sizeof(canmsg));
         return 0;
       }
    }

    msg_->time() = ACE_OS::gettimeofday(); // set time stamp
    dispatchMessage();

    return 0;
  }
示例#28
0
void checkForInputs(CheckDataSet data)
{
    Buffer workExchangeBuffer; // use a copy to keep the size
    workExchangeBuffer.pointer = data.exchangeBuffer->pointer;
    
    while(1)
    {
        data.container->containerMutex->lock();
        data.container->selector->wait(sf::milliseconds(100)); // waits for data, 100ms timeout (give a chance to unlock other threads)
        for(int i = 0 ; i < data.container->list->getSize() ; i++)
        {
            if(data.container->list->get(i)->isReady && 
               data.container->selector->isReady(*data.container->list->get(i)->socket))
            {
                if(receiveBuffer(data.container->list->get(i)->socket,&workExchangeBuffer,data.exchangeBuffer->size))
                {
                    logger.printLog("Client disconnected !");
                    killClient(data.container,i);
                }
                if(workExchangeBuffer.size > 0)
                {
                    logger.printDebug("Got data, dispatching");
                    dispatchMessage(data.container,&workExchangeBuffer,i);                
                }
            }
        }
        data.container->containerMutex->unlock();

        if(checkStopThreads())
        {
            return;
        }
        sf::sleep(sf::milliseconds(1)); // give time for the other threads
        
    }    
}
示例#29
0
static void doMouseUp(MSG msg, HRESULT* oleDragAndDropReturnValue = 0)
{
    COMPtr<IWebFramePrivate> framePrivate;
    if (SUCCEEDED(frame->QueryInterface(&framePrivate)))
        framePrivate->layout();

    dispatchMessage(&msg);
    down = false;

    if (draggingInfo) {
        COMPtr<IWebView> webView;
        COMPtr<IDropTarget> webViewDropTarget;
        if (SUCCEEDED(frame->webView(&webView)) && SUCCEEDED(webView->QueryInterface(IID_IDropTarget, (void**)&webViewDropTarget))) {
            POINT screenPoint = msg.pt;
            DWORD effect = 0;
            ::ClientToScreen(webViewWindow, &screenPoint);
            if (!didDragEnter) {
                webViewDropTarget->DragEnter(draggingInfo->dataObject(), 0, pointl(screenPoint), &effect);
                didDragEnter = true;
            }
            HRESULT hr = draggingInfo->dropSource()->QueryContinueDrag(0, 0);
            if (oleDragAndDropReturnValue)
                *oleDragAndDropReturnValue = hr;
            webViewDropTarget->DragOver(0, pointl(screenPoint), &effect);
            if (hr == DRAGDROP_S_DROP && effect != DROPEFFECT_NONE) {
                DWORD effect = 0;
                webViewDropTarget->Drop(draggingInfo->dataObject(), 0, pointl(screenPoint), &effect);
                draggingInfo->setPerformedDropEffect(effect);
            } else
                webViewDropTarget->DragLeave();

            // Reset didDragEnter so that another drag started within the same frame works properly.
            didDragEnter = false;
        }
    }
}
示例#30
0
void CInputHandler::processMessage(CMessage *msg) {
	const CMouseMsg *mouseMsg = dynamic_cast<const CMouseMsg *>(msg);
	_singleton = false;
	dispatchMessage(msg);

	if (_singleton) {
		_singleton = false;
	} else if (mouseMsg) {
		// Keep the game state mouse position up to date
		if (_mousePos != mouseMsg->_mousePos) {
			_mousePos = mouseMsg->_mousePos;
			_gameManager->_gameState.setMousePos(mouseMsg->_mousePos);
		}

		// Set flag for whether a mouse button is currently being pressed
		if (mouseMsg->isButtonDownMsg())
			_buttonDown = true;
		else if (mouseMsg->isButtonUpMsg())
			_buttonDown = false;

		// Drag events generation
		if (_dragging) {
			if (mouseMsg->isMouseMoveMsg()) {
				if (_dragItem) {
					CMouseDragMoveMsg moveMsg(_mousePos);
					moveMsg.execute(_dragItem);
				}
			} else {
				if (mouseMsg->isButtonUpMsg() && _dragItem) {
					// Mouse drag ended
					CGameObject *target = dragEnd(_mousePos, _dragItem);
					CMouseDragEndMsg endMsg(_mousePos, target);
					endMsg.execute(_dragItem);
				}

				_dragging = false;
				_dragItem = nullptr;
			}
		} else if (_buttonDown) {
			if (!mouseMsg->isMouseMoveMsg()) {
				// Save where the drag movement started from
				_dragStartPos = _mousePos;
			} else {
				Point delta = mouseMsg->_mousePos - _dragStartPos;
				int distance = (int)sqrt(double(delta.x * delta.x + delta.y * delta.y));

				if (distance > 4) {
					// We've moved far enough with the mouse button held down
					// to trigger an official dragging operation
					CMouseDragStartMsg startMsg(_dragStartPos);
					dispatchMessage(&startMsg);

					// Set the drag item, if any, that a handler will have set on the message
					_dragItem = startMsg._dragItem;
					_gameManager->_dragItem = startMsg._dragItem;

					if (_dragItem) {
						CMouseDragMoveMsg moveMsg(_dragStartPos);
						dispatchMessage(&moveMsg);
					}

					_dragging = true;
				}
			}
		}
	}
}