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;
}