void InputContext_Impl::process_messages()
{
	throw_if_disposed();

	std::vector< std::pair<InputEvent, std::weak_ptr<InputDevice_Impl> > >::size_type pos, size;

	// Fetch latest events received:
	std::unique_lock<std::recursive_mutex> mutex_lock(mutex);
	std::vector< std::pair<InputEvent, std::weak_ptr<InputDevice_Impl> > > cur_events  = events;
	events.clear();
	mutex_lock.unlock();

	size = cur_events.size();
	for (pos = 0; pos < size; pos++)
	{
		if (is_disposed())	// Exit the function now if a previous input event has caused the input context to be disposed
			break;

		InputEvent event = cur_events[pos].first;
		if (cur_events[pos].second.expired())
			continue;
		event.device = InputDevice(cur_events[pos].second);

		switch (event.type)
		{
		case InputEvent::pressed:
			event.device.sig_key_down()(event);
			break;
		case InputEvent::released:
			event.device.sig_key_up()(event);
			break;
		case InputEvent::doubleclick:
			event.device.sig_key_dblclk()(event);
			break;
		case InputEvent::pointer_moved:
			event.device.sig_pointer_move()(event);
			break;
		case InputEvent::axis_moved:
			event.device.sig_axis_move()(event);
			break;
		case InputEvent::proximity_change:
			event.device.sig_proximity_change()(event);
			break;
		default:	// Added to stop the compiler warning about "no_key" not handled in switch
			break;
		}
	}
}
	void DisposableObject::throw_if_disposed() const
	{
		if (is_disposed())
			throw Exception("Object was disposed");
	}