/***************************************************************************** * * diqeeff.c * * Property sheet page for device "enumerate effects". * *****************************************************************************/ #include "diquick.h" /***************************************************************************** * * EEff_AddGuid * * Add a GUID to the list, or -1 on error. * *****************************************************************************/ int INLINE EEff_AddGuid(PDEVDLGINFO pddi, REFGUID rguid) { return Dary_Append(&pddi->daryGuid, rguid); } /***************************************************************************** * * EEff_EnumCallback * * Called once for each effect. * *****************************************************************************/ typedef struct EFFENUMINFO { HWND hwndList; PDEVDLGINFO pddi; } EFFENUMINFO, *PEFFENUMINFO; BOOL CALLBACK EEff_EnumCallback(PCV pvEffi, LPVOID pv) { PEFFENUMINFO peei = pv; PDEVDLGINFO pddi = peei->pddi; DIEFFECTINFO ei; int iguid; ConvertEffi(pddi, &ei, pvEffi); iguid = EEff_AddGuid(pddi, &ei.guid); if (iguid >= 0) { int iItem; iItem = ListBox_AddString(peei->hwndList, ei.tszName); ListBox_SetItemData(peei->hwndList, iItem, iguid); } return DIENUM_CONTINUE; } /***************************************************************************** * * EEff_Enum * * Enumerate the objects in the device and populate the list box. * *****************************************************************************/ BOOL INTERNAL EEff_Enum(HWND hdlg) { EFFENUMINFO eei; #ifdef DEBUG int iItem; #endif eei.pddi = GetDialogPtr(hdlg); eei.hwndList = GetDlgItem(hdlg, IDC_ENUMEFF_LIST); SetWindowRedraw(eei.hwndList, FALSE); ListBox_ResetContent(eei.hwndList); IDirectInputDevice2_EnumEffects(eei.pddi->pdid2, EEff_EnumCallback, &eei, 0); #ifdef DEBUG iItem = ListBox_AddString(eei.hwndList, TEXT("")); ListBox_SetItemData(eei.hwndList, iItem, EEff_AddGuid(eei.pddi, &IID_IDirectInputDevice2A)); #endif SetWindowRedraw(eei.hwndList, TRUE); return 1; } /***************************************************************************** * * EEff_OnInitDialog * * Start out by enumerating everything. * *****************************************************************************/ BOOL INTERNAL EEff_OnInitDialog(HWND hdlg, LPARAM lp) { PDEVDLGINFO pddi = (PV)(((LPPROPSHEETPAGE)lp)->lParam); SetDialogPtr(hdlg, pddi); EEff_Enum(hdlg); return 1; } /***************************************************************************** * * EEff_OnDestroy * * Clean up. * *****************************************************************************/ BOOL INTERNAL EEff_OnDestroy(HWND hdlg) { PDEVDLGINFO pddi = GetDialogPtr(hdlg); if (pddi) { Dary_Term(&pddi->daryGuid); } return 1; } /***************************************************************************** * * EEff_OnDblClk * * An item in the list box was double-clicked. Show its properties. * *****************************************************************************/ #if 0 BOOL CALLBACK EnumCallback(LPDIRECTINPUTEFFECT peff, LPVOID pv) { peff; pv; OutputDebugString("Got an effect\r\n"); peff->lpVtbl->Stop(peff); return DIENUM_CONTINUE; } void __cdecl Squirt(LPCSTR ptszFormat, ...) { TCHAR tsz[1024]; va_list ap; va_start(ap, ptszFormat); wvsprintf(tsz, ptszFormat, ap); OutputDebugString(tsz); OutputDebugString(TEXT("\r\n")); } BOOL INTERNAL EEff_OnDblClk(HWND hdlg) { PDEVDLGINFO pddi = GetDialogPtr(hdlg); HWND hwndList = GetDlgItem(hdlg, IDC_ENUMEFF_LIST); int iItem; iItem = ListBox_GetCurSel(hwndList); if (iItem >= 0) { int iguid; iguid = ListBox_GetItemData(hwndList, iItem); if (iguid >= 0) { LPDIRECTINPUTDEVICE2 pdev2 = (PV)pddi->pdid; LPDIRECTINPUTEFFECT peff; REFGUID rguid = Dary_GetPtr(&pddi->daryGuid, iguid, GUID); DWORD rgdw[2] = { DIJOFS_X, DIJOFS_Y }; LONG rgl[2] = { 100, 99 }; DICONSTANTFORCE cf = { 0 }; DICONDITION cond[2] = { { 0 } }; HRESULT hres; DIEFFECT deff; DIENVELOPE env; hres = SetDwordProperty(pddi->pdid, DIPROP_AUTOCENTER, DIPROPAUTOCENTER_OFF); ZeroX(env); env.dwSize = cbX(env); ZeroX(deff); deff.dwSize = cbX(deff); deff.dwFlags = DIEFF_OBJECTOFFSETS | DIEFF_POLAR; deff.cAxes = 2; deff.rgdwAxes = rgdw; deff.rglDirection = rgl; deff.dwTriggerButton = DIEB_NOTRIGGER;//DIJOFS_BUTTON0; deff.cbTypeSpecificParams = cbX(cf); deff.lpvTypeSpecificParams = &cf; // deff.lpEnvelope = &env; pdev2->lpVtbl->Acquire(pdev2); hres = IDirectInputDevice2_CreateEffect(pdev2, rguid, &deff, &peff, 0); if (SUCCEEDED(hres)) { hres = IDirectInputDevice2_EnumCreatedEffectObjects(pdev2, EnumCallback, 0, 0); memset(&env, 0xCC, cbX(env)); deff.lpEnvelope = &env; env.dwSize = cbX(env); //deff.cbTypeSpecificParams = 0; deff.dwFlags = DIEFF_OBJECTIDS | DIEFF_SPHERICAL | DIEFF_CARTESIAN | DIEFF_POLAR; hres = IDirectInputEffect_GetParameters(peff, &deff, DIEP_ALLPARAMS); Squirt("------------------------------------"); Squirt("----- dwFlags = %08x", deff.dwFlags); Squirt("----- dwDuration = %d", deff.dwDuration); Squirt("----- dwSamplePeriod = %d", deff.dwSamplePeriod); Squirt("----- dwGain = %d", deff.dwGain); Squirt("----- dwTriggerButton = %08x", deff.dwTriggerButton); Squirt("----- dwTriggerRepeatInterval = %d", deff.dwTriggerRepeatInterval); Squirt("----- cAxes = %d", deff.cAxes); Squirt("----- rgdwAxes = %08x", deff.rgdwAxes); Squirt("----- rglDirection = %08x", deff.rglDirection); Squirt("----- rglDirection[0] = %d", rgl[0]); Squirt("----- rglDirection[1] = %d", rgl[1]); Squirt("----- cbTSP = %d", deff.cbTypeSpecificParams); Squirt("------------------------------------"); hres = IDirectInputEffect_Start(peff, 1, 0); hres = IDirectInputEffect_Stop(peff); hres = IDirectInputEffect_GetEffectStatus(peff, rgdw); peff->lpVtbl->Release(peff); } pdev2->lpVtbl->Unacquire(pdev2); } } return 1; } #else BOOL INTERNAL EEff_OnDblClk(HWND hdlg) { PDEVDLGINFO pddi = GetDialogPtr(hdlg); HWND hwndList = GetDlgItem(hdlg, IDC_ENUMEFF_LIST); int iItem; iItem = ListBox_GetCurSel(hwndList); if (iItem >= 0) { int iguid; iguid = (int)(INT_PTR)ListBox_GetItemData(hwndList, iItem); if (iguid >= 0) { REFGUID rguid = Dary_GetPtr(&pddi->daryGuid, iguid, GUID); EffProp_Create(hdlg, pddi, rguid); } } return TRUE; } #endif /***************************************************************************** * * EEff_OnCommand * *****************************************************************************/ BOOL INLINE EEff_OnCommand(HWND hdlg, int id, UINT cmd) { switch (id) { case IDC_ENUMEFF_LIST: if (cmd == LBN_DBLCLK) return EEff_OnDblClk(hdlg); break; } return 0; } /***************************************************************************** * * EEff_DlgProc * *****************************************************************************/ INT_PTR CALLBACK EEff_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp) { switch (wm) { case WM_INITDIALOG: return EEff_OnInitDialog(hdlg, lp); case WM_COMMAND: return EEff_OnCommand(hdlg, (int)GET_WM_COMMAND_ID(wp, lp), (UINT)GET_WM_COMMAND_CMD(wp, lp)); case WM_DESTROY: return EEff_OnDestroy(hdlg); } return 0; }