static void test_build_action_map(IDirectInputDevice8A *lpdid, DIACTIONFORMATA *lpdiaf, int action_index, DWORD expected_type, DWORD expected_inst) { HRESULT hr; DIACTIONA *actions; DWORD instance, type, how; GUID assigned_to; DIDEVICEINSTANCEA ddi; ddi.dwSize = sizeof(ddi); IDirectInputDevice_GetDeviceInfo(lpdid, &ddi); hr = IDirectInputDevice8_BuildActionMap(lpdid, lpdiaf, NULL, DIDBAM_HWDEFAULTS); ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr); actions = lpdiaf->rgoAction; instance = DIDFT_GETINSTANCE(actions[action_index].dwObjID); type = DIDFT_GETTYPE(actions[action_index].dwObjID); how = actions[action_index].dwHow; assigned_to = actions[action_index].guidInstance; ok (how == DIAH_USERCONFIG || how == DIAH_DEFAULT, "Action was not set dwHow=%08x\n", how); ok (instance == expected_inst, "Action not mapped correctly instance=%08x expected=%08x\n", instance, expected_inst); ok (type == expected_type, "Action type not mapped correctly type=%08x expected=%08x\n", type, expected_type); ok (IsEqualGUID(&assigned_to, &ddi.guidInstance), "Action and device GUID do not match action=%d\n", action_index); }
static BOOL CALLBACK enumObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) { enum_context_t *enum_context = (enum_context_t *)pvRef; jmethodID add_method; jstring name; DWORD instance; DWORD type; jint guid_type; jbyteArray guid; JNIEnv *env = enum_context->env; jobject device_obj = enum_context->device_obj; jclass obj_class = (*env)->GetObjectClass(env, device_obj); if (obj_class == NULL) return DIENUM_STOP; guid = wrapGUID(env, &(lpddoi->guidType)); if (guid == NULL) return DIENUM_STOP; add_method = (*env)->GetMethodID(env, obj_class, "addObject", "([BIIIIILjava/lang/String;)V"); if (add_method == NULL) return DIENUM_STOP; name = (*env)->NewStringUTF(env, lpddoi->tszName); if (name == NULL) return DIENUM_STOP; instance = DIDFT_GETINSTANCE(lpddoi->dwType); type = DIDFT_GETTYPE(lpddoi->dwType); guid_type = mapGUIDType(&(lpddoi->guidType)); //printfJava(env, "name %s guid_type %d id %d\n", lpddoi->tszName, guid_type, lpddoi->dwType); (*env)->CallBooleanMethod(env, device_obj, add_method, guid, (jint)guid_type, (jint)lpddoi->dwType, (jint)type, (jint)instance, (jint)lpddoi->dwFlags, name); if ((*env)->ExceptionOccurred(env)) { return DIENUM_STOP; } return DIENUM_CONTINUE; }
BOOL FAR PASCAL EnumObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) { DInputDevice *device = (DInputDevice *)pvRef; DInputDevice::DeviceObjectInfo &infoList = const_cast<DInputDevice::DeviceObjectInfo &>(device->GetObjectInfoList()); Log(Debug, "Device object name: %S", lpddoi->tszName); DInputDevice::ObjectInfo info; int type = DIDFT_GETTYPE(lpddoi->dwType); info.name = lpddoi->tszName; info.id = DIDFT_GETINSTANCE(lpddoi->dwType); info.type = lpddoi->dwType; if ((type & DIDFT_AXIS) != 0) { device->GetAxisRange(type, info.min, info.max); infoList.axes.push_back(info); } else if ((type & DIDFT_BUTTON) != 0) { info.min = 0; info.max = 1; infoList.buttons.push_back(info); } else if (type == DIDFT_POV) { info.min = 0; info.max = 0; infoList.povs.push_back(info); } return DIENUM_CONTINUE; }
BOOL CALLBACK QuaJoystickPort::DXEnumDeviceObjects(LPCDIDEVICEOBJECTINSTANCE oi) { HRESULT err; if (oi->dwType & DIDFT_AXIS) { DIPROPRANGE diprg; diprg.diph.dwSize = sizeof(DIPROPRANGE); diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER); diprg.diph.dwHow = DIPH_BYID; diprg.diph.dwObj = oi->dwType; diprg.lMin = -QUA_JOY_AXIS_AMBIT;; diprg.lMax = +QUA_JOY_AXIS_AMBIT; err = dxStick->SetProperty(DIPROP_RANGE, &diprg.diph); if (err != DI_OK) { // return DIENUM_CONTINUE; } } if (oi->dwType & (DIDFT_AXIS|DIDFT_BUTTON|DIDFT_POV|DIDFT_FFACTUATOR)) { dxObjects.push_back(joy_channel( (char *)oi->tszName, DIDFT_GETINSTANCE(oi->dwType), (oi->dwType)&0xff, (oi->dwType&DIDFT_FFACTUATOR)!=0 )); } return DIENUM_CONTINUE; }
static HRESULT WINAPI SysKeyboardWImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) { HRESULT res; res = IDirectInputDevice2WImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow); if (res != DI_OK) return res; if (!GetKeyNameTextW((DIDFT_GETINSTANCE(pdidoi->dwType) & 0x80) << 17 | (DIDFT_GETINSTANCE(pdidoi->dwType) & 0x7f) << 16, pdidoi->tszName, sizeof(pdidoi->tszName)/sizeof(pdidoi->tszName[0]))) return DIERR_OBJECTNOTFOUND; _dump_OBJECTINSTANCEW(pdidoi); return res; }
/****************************************************************************** * GetObjectInfo : get object info */ HRESULT WINAPI JoystickWGenericImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) { static const WCHAR axisW[] = {'A','x','i','s',' ','%','d',0}; static const WCHAR povW[] = {'P','O','V',' ','%','d',0}; static const WCHAR buttonW[] = {'B','u','t','t','o','n',' ','%','d',0}; HRESULT res; res = IDirectInputDevice2WImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow); if (res != DI_OK) return res; if (pdidoi->dwType & DIDFT_AXIS) sprintfW(pdidoi->tszName, axisW, DIDFT_GETINSTANCE(pdidoi->dwType)); else if (pdidoi->dwType & DIDFT_POV) sprintfW(pdidoi->tszName, povW, DIDFT_GETINSTANCE(pdidoi->dwType)); else if (pdidoi->dwType & DIDFT_BUTTON) sprintfW(pdidoi->tszName, buttonW, DIDFT_GETINSTANCE(pdidoi->dwType)); _dump_OBJECTINSTANCEW(pdidoi); return res; }
static HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) { SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); DIDATAFORMAT data_format; DIOBJECTDATAFORMAT *obj_df = NULL; int i, action = 0, num_actions = 0; if (This->base.acquired) return DIERR_ACQUIRED; data_format.dwSize = sizeof(data_format); data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT); data_format.dwFlags = DIDF_ABSAXIS; data_format.dwDataSize = lpdiaf->dwDataSize; /* count the actions */ for (i=0; i < lpdiaf->dwNumActions; i++) if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance)) num_actions++; if (num_actions == 0) return DI_NOEFFECT; This->base.num_actions = num_actions; /* Construct the dataformat and actionmap */ obj_df = HeapAlloc(GetProcessHeap(), 0, sizeof(DIOBJECTDATAFORMAT)*num_actions); data_format.rgodf = (LPDIOBJECTDATAFORMAT)obj_df; data_format.dwNumObjs = num_actions; This->base.action_map = HeapAlloc(GetProcessHeap(), 0, sizeof(ActionMap)*num_actions); for (i = 0; i < lpdiaf->dwNumActions; i++) { if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance)) { int instance = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID); memcpy(&obj_df[action], &c_dfDIKeyboard.rgodf[instance], c_dfDIKeyboard.dwObjSize); This->base.action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData; This->base.action_map[action].offset = action; obj_df[action].dwOfs = action; action++; } } IDirectInputDevice8_SetDataFormat(iface, &data_format); HeapFree(GetProcessHeap(), 0, obj_df); return IDirectInputDevice8WImpl_SetActionMap(iface, lpdiaf, lpszUserName, dwFlags); }
/****************************************************************************** * GetObjectInfo : get information about a device object such as a button * or axis */ static HRESULT WINAPI SysMouseWImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) { static const WCHAR x_axisW[] = {'X','-','A','x','i','s',0}; static const WCHAR y_axisW[] = {'Y','-','A','x','i','s',0}; static const WCHAR wheelW[] = {'W','h','e','e','l',0}; static const WCHAR buttonW[] = {'B','u','t','t','o','n',' ','%','d',0}; HRESULT res; res = IDirectInputDevice2WImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow); if (res != DI_OK) return res; if (IsEqualGUID(&pdidoi->guidType, &GUID_XAxis)) strcpyW(pdidoi->tszName, x_axisW); else if (IsEqualGUID(&pdidoi->guidType, &GUID_YAxis)) strcpyW(pdidoi->tszName, y_axisW); else if (IsEqualGUID(&pdidoi->guidType, &GUID_ZAxis)) strcpyW(pdidoi->tszName, wheelW); else if (pdidoi->dwType & DIDFT_BUTTON) wsprintfW(pdidoi->tszName, buttonW, DIDFT_GETINSTANCE(pdidoi->dwType) - 3); _dump_OBJECTINSTANCEW(pdidoi); return res; }
BOOL CALLBACK enumObjectsCallback(const DIDEVICEOBJECTINSTANCE* instance, VOID* context) { printf("%32s ofs: 0x%03x type: 0x%03x %11s", instance->tszName, instance->dwOfs, DIDFT_GETINSTANCE(instance->dwType), _dump_dinput_GUID(instance->guidType)); #define X(x) if (instance->dwType & x) printf(" | "#x""); X(DIDFT_RELAXIS) X(DIDFT_ABSAXIS) X(DIDFT_AXIS) X(DIDFT_PSHBUTTON) X(DIDFT_TGLBUTTON) X(DIDFT_BUTTON) X(DIDFT_POV) X(DIDFT_COLLECTION) X(DIDFT_NODATA) #undef X printf("\n"); return DIENUM_CONTINUE; }
/****************************************************************************** * GetObjectInfo : get information about a device object such as a button * or axis */ static HRESULT WINAPI SysKeyboardAImpl_GetObjectInfo( LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) { HRESULT res; LONG scan; res = IDirectInputDevice2AImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow); if (res != DI_OK) return res; scan = DIDFT_GETINSTANCE(pdidoi->dwType); if (scan == DIK_PAUSE || scan == DIK_NUMLOCK) scan ^= 0x80; if (!GetKeyNameTextA((scan & 0x80) << 17 | (scan & 0x7f) << 16, pdidoi->tszName, sizeof(pdidoi->tszName))) return DIERR_OBJECTNOTFOUND; _dump_OBJECTINSTANCEA(pdidoi); return res; }
static void dump_data_format (const DIDATAFORMAT *format) { #ifdef GIMP_UNSTABLE gint i; g_print ("dwSize: %ld\n", format->dwSize); g_print ("dwObjSize: %ld\n", format->dwObjSize); g_print ("dwFlags: "); if (format->dwFlags == DIDF_ABSAXIS) g_print ("DIDF_ABSAXIS"); else if (format->dwFlags == DIDF_RELAXIS) g_print ("DIDF_RELAXIS"); else g_print ("%#lx", format->dwFlags); g_print ("\n"); g_print ("dwDataSize: %ld\n", format->dwDataSize); g_print ("dwNumObjs: %ld\n", format->dwNumObjs); for (i = 0; i < format->dwNumObjs; i++) { const DIOBJECTDATAFORMAT *oformat = (DIOBJECTDATAFORMAT *) (((char *) format->rgodf) + i*format->dwObjSize); unsigned char *guid; g_print ("Object %d:\n", i); if (oformat->pguid == NULL) g_print (" pguid: NULL\n"); else { UuidToString (oformat->pguid, &guid); g_print (" pguid: %s\n", guid); RpcStringFree (&guid); } g_print (" dwOfs: %ld\n", oformat->dwOfs); g_print (" dwType: "); switch (DIDFT_GETTYPE (oformat->dwType)) { #define CASE(x) case DIDFT_##x: g_print ("DIDFT_"#x); break CASE (RELAXIS); CASE (ABSAXIS); CASE (AXIS); CASE (PSHBUTTON); CASE (TGLBUTTON); CASE (BUTTON); CASE (POV); CASE (COLLECTION); CASE (NODATA); #undef CASE default: g_print ("%#x", DIDFT_GETTYPE (oformat->dwType)); } g_print (" "); if (DIDFT_GETINSTANCE (oformat->dwType) == DIDFT_GETINSTANCE (DIDFT_ANYINSTANCE)) g_print ("ANYINSTANCE"); else g_print ("#%d", DIDFT_GETINSTANCE (oformat->dwType)); #define BIT(x) if (oformat->dwType & DIDFT_##x) g_print (" "#x) BIT (FFACTUATOR); BIT (FFEFFECTTRIGGER); BIT (OUTPUT); BIT (VENDORDEFINED); BIT (ALIAS); BIT (OPTIONAL); #undef BIT g_print ("\n"); g_print (" dwFlags:"); switch (oformat->dwFlags & DIDOI_ASPECTACCEL) { case DIDOI_ASPECTPOSITION: g_print (" DIDOI_ASPECTPOSITION"); break; case DIDOI_ASPECTVELOCITY: g_print (" DIDOI_ASPECTVELOCITY"); break; case DIDOI_ASPECTACCEL: g_print (" DIDOI_ASPECTACCEL"); break; } if (oformat->dwFlags & DIDOI_ASPECTFORCE) g_print (" DIDOI_ASPECTFORCE"); g_print ("\n"); } #endif }
//----------------------------------------------------------------------------- // Name: EnumObjectsCallback() // Desc: Callback function for enumerating objects (axes, buttons, POVs) on a // Joystick. This function enables user interface elements for objects // that are found to exist, and scales axes min/max values. //----------------------------------------------------------------------------- BOOL CALLBACK EnumObjectsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext ) { HWND hDlg = ( HWND )pContext; static int nSliderCount = 0; // Number of returned slider controls static int nPOVCount = 0; // Number of returned POV controls // For axes that are returned, set the DIPROP_RANGE property for the // enumerated axis in order to scale min/max values. if( pdidoi->dwType & DIDFT_AXIS ) { DIPROPRANGE diprg; diprg.diph.dwSize = sizeof( DIPROPRANGE ); diprg.diph.dwHeaderSize = sizeof( DIPROPHEADER ); diprg.diph.dwHow = DIPH_BYID; diprg.diph.dwObj = pdidoi->dwType; // Specify the enumerated axis diprg.lMin = -1000; diprg.lMax = +1000; // Set the range for the axis if( FAILED( g_pJoystick->SetProperty( DIPROP_RANGE, &diprg.diph ) ) ) return DIENUM_STOP; } // Set the UI to reflect what objects the Joystick supports if( pdidoi->guidType == GUID_XAxis ) { EnableWindow( GetDlgItem( hDlg, IDC_X_AXIS ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_X_AXIS_TEXT ), TRUE ); } if( pdidoi->guidType == GUID_YAxis ) { EnableWindow( GetDlgItem( hDlg, IDC_Y_AXIS ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_Y_AXIS_TEXT ), TRUE ); } if( pdidoi->guidType == GUID_ZAxis ) { EnableWindow( GetDlgItem( hDlg, IDC_Z_AXIS ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_Z_AXIS_TEXT ), TRUE ); } if( pdidoi->guidType == GUID_RxAxis ) { EnableWindow( GetDlgItem( hDlg, IDC_X_ROT ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_X_ROT_TEXT ), TRUE ); } if( pdidoi->guidType == GUID_RyAxis ) { EnableWindow( GetDlgItem( hDlg, IDC_Y_ROT ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_Y_ROT_TEXT ), TRUE ); } if( pdidoi->guidType == GUID_RzAxis ) { EnableWindow( GetDlgItem( hDlg, IDC_Z_ROT ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_Z_ROT_TEXT ), TRUE ); } if( pdidoi->guidType == GUID_Slider ) { switch( nSliderCount++ ) { case 0 : EnableWindow( GetDlgItem( hDlg, IDC_SLIDER0 ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_SLIDER0_TEXT ), TRUE ); break; case 1 : EnableWindow( GetDlgItem( hDlg, IDC_SLIDER1 ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_SLIDER1_TEXT ), TRUE ); break; } } if( pdidoi->guidType == GUID_POV ) { switch( nPOVCount++ ) { case 0 : EnableWindow( GetDlgItem( hDlg, IDC_POV0 ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_POV0_TEXT ), TRUE ); break; case 1 : EnableWindow( GetDlgItem( hDlg, IDC_POV1 ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_POV1_TEXT ), TRUE ); break; case 2 : EnableWindow( GetDlgItem( hDlg, IDC_POV2 ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_POV2_TEXT ), TRUE ); break; case 3 : EnableWindow( GetDlgItem( hDlg, IDC_POV3 ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_POV3_TEXT ), TRUE ); break; } } if( pdidoi->guidType == GUID_Button ) EnableWindow( GetDlgItem( hDlg, IDC_BUTTON1 + DIDFT_GETINSTANCE(pdidoi->dwType)), TRUE ); return DIENUM_CONTINUE; }