void InputManager::run(Real elapsedTime)
	{
		RL_LONGLONG start = CoreSubsystem::getSingleton().getClock();
		CEGUI::System::getSingleton().injectTimePulse(elapsedTime);

		if (mScheduledInputSwitch == SWITCH_TO_BUFFERED)
		{
			switchMouseToBuffered();
			mScheduledInputSwitch = SWITCH_NO_SWITCH;
			return;
		}
		else if (mScheduledInputSwitch == SWITCH_TO_UNBUFFERED)
		{
			switchMouseToUnbuffered();
			mScheduledInputSwitch = SWITCH_NO_SWITCH;
			return;
		}

		if (mNumActiveWindowsKeyboardInput == 0)
		{
			mInputReader->capture();
			while (mEventQueue->getSize() > 0)
			{
				InputEvent* ie = mEventQueue->pop();
				if(ie->getID() == KeyEvent::KE_KEY_PRESSED)
					keyPressed(static_cast<KeyEvent*>(ie));
				else if(ie->getID() == KeyEvent::KE_KEY_RELEASED)
					keyReleased(static_cast<KeyEvent*>(ie));
				else if(ie->getID() == KeyEvent::KE_KEY_CLICKED)
					keyClicked(static_cast<KeyEvent*>(ie));
                delete ie;
			}			
		}

		if (!mBuffered)
		{
			int pressedButtonMask = 0, releasedButtonMask = 0; 
			checkMouseButton(0, MouseEvent::BUTTON0_MASK, pressedButtonMask, releasedButtonMask);
			checkMouseButton(1, MouseEvent::BUTTON1_MASK, pressedButtonMask, releasedButtonMask);
			checkMouseButton(2, MouseEvent::BUTTON2_MASK, pressedButtonMask, releasedButtonMask);
			checkMouseButton(3, MouseEvent::BUTTON3_MASK, pressedButtonMask, releasedButtonMask);

			if (releasedButtonMask != 0 && mCharacterController!=NULL)
				mCharacterController->injectMouseUp(releasedButtonMask);

			if (pressedButtonMask != 0 && mCharacterController!=NULL)
				mCharacterController->injectMouseDown(pressedButtonMask);
		}		
		Logger::getSingleton().log(
			Logger::CORE, 
			Logger::LL_TRIVIAL, 
			"    IM time "
			 + Ogre::StringConverter::toString(
					Ogre::Real((double)(CoreSubsystem::getSingleton().getClock()-start))));
	}