CInputVirtualDevice* CInputDevice::CreateVariableVirtualDeviceFromThis(CInputActions* pcInputActions)
{
	CInputVirtualDevice*	pcVirtual;
	CInputSourceDesc*		pcSource;
	CInputDevices*			pcInputDevices;
	CChars					szTemp;
	CArrayIntAndPointer			apcSourceDescs;
	int						i;

	pcInputDevices = GetInputDevices();

	szTemp.Init(mszFriendlyName.Text());
	szTemp.Append(" Variable");
	pcVirtual = pcInputDevices->CreateVirtualDevice(szTemp.Text());
	szTemp.Kill();

	mcVariables.SetChords(pcVirtual->GetChords());

	apcSourceDescs.Init(8);
	mpcDesc->GetVariableChordDescs()->GetInputSourceDescs(&apcSourceDescs, mpcDesc);
	for (i = 0; i < apcSourceDescs.NumElements(); i++)
	{
		pcSource = (CInputSourceDesc*)apcSourceDescs.GetPtr(i);
		pcVirtual->AddSource(this, pcSource);
	}
	apcSourceDescs.Kill();
	pcVirtual->DoneAddingSources();
	GetInputDevices()->AddChords(pcVirtual, mpcDesc->GetVariableChordDescs(), this);
	pcInputDevices->UpdateCommonality();
	pcVirtual->Unstoppable();
	return pcVirtual;
}
CInputVirtualDevice* CInputDevice::CreateDefaultVirtualDeviceFromThis(char* szName)
{
	CInputVirtualDevice*	pcVirtual;
	SSetIterator			sIter;
	CInputSourceDesc*		pcSource;
	CInputDevices*			pcInputDevices;
	CChars					szTemp;

	pcInputDevices = GetInputDevices();

	if (szName)
	{
		szTemp.Init(szName);
	}
	else
	{
		szTemp.Init(mszFriendlyName.Text());
		szTemp.Append(" Default");
	}
	pcVirtual = pcInputDevices->CreateVirtualDevice(szTemp.Text());
	szTemp.Kill();

	pcSource = mpcDesc->StartInputsIteration(&sIter);
	while (pcSource)
	{
		pcVirtual->AddSource(this, pcSource);
		pcSource = mpcDesc->IterateInputs(&sIter);
	}
	pcVirtual->DoneAddingSources();
	pcInputDevices->UpdateCommonality();
	return pcVirtual;
}
CInputVirtualDeviceDesc* CInputDeviceDesc::CreateDefaultVirtualDesc(void)
{
	CInputVirtualDeviceDesc*	pcVirtualDesc;
	SSetIterator				sIter;
	CInputSourceDesc*			pcSourceDesc;
	CInputDevices*				pcInputDevices;
	CChars						szTemp;

	pcInputDevices = GetInputDevices();

	szTemp.Init(mszFriendlyName.Text());
	szTemp.Append(" Default");
	pcVirtualDesc = pcInputDevices->CreateVirtualDeviceDescription(szTemp.Text(), TRUE);
	szTemp.Kill();

	pcSourceDesc = mlcInputs.StartIteration(&sIter);
	while (pcSourceDesc)
	{
		pcVirtualDesc->AddSource(pcSourceDesc, -1);
		pcSourceDesc = mlcInputs.Iterate(&sIter);
	}
	return pcVirtualDesc;
}