/* * Initializes the haptic subsystem. */ int SDL_SYS_HapticInit(void) { HRESULT ret; HINSTANCE instance; if (dinput != NULL) { /* Already open. */ SDL_SetError("Haptic: SubSystem already open."); return -1; } /* Clear all the memory. */ SDL_memset(SDL_hapticlist, 0, sizeof(SDL_hapticlist)); SDL_numhaptics = 0; ret = CoInitialize(NULL); if (FAILED(ret)) { DI_SetError("Coinitialize", ret); return -1; } ret = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInput, (LPVOID) & dinput); if (FAILED(ret)) { DI_SetError("CoCreateInstance", ret); return -1; } /* Because we used CoCreateInstance, we need to Initialize it, first. */ instance = GetModuleHandle(NULL); if (instance == NULL) { SDL_SetError("GetModuleHandle() failed with error code %d.", GetLastError()); return -1; } ret = IDirectInput_Initialize(dinput, instance, DIRECTINPUT_VERSION); if (FAILED(ret)) { DI_SetError("Initializing DirectInput device", ret); return -1; } /* Look for haptic devices. */ ret = IDirectInput_EnumDevices(dinput, 0, EnumHapticsCallback, NULL, DIEDFL_FORCEFEEDBACK | DIEDFL_ATTACHEDONLY); if (FAILED(ret)) { DI_SetError("Enumerating DirectInput devices", ret); return -1; } return SDL_numhaptics; }
static void device_tests(void) { HRESULT hr; LPDIRECTINPUT pDI = NULL, obj = NULL; HINSTANCE hInstance = GetModuleHandle(NULL); HWND hwnd; struct enum_data data; hr = CoCreateInstance(&CLSID_DirectInput, 0, 1, &IID_IDirectInput2A, (LPVOID*)&pDI); if (hr == DIERR_OLDDIRECTINPUTVERSION || hr == DIERR_DEVICENOTREG) { skip("Tests require a newer dinput version\n"); return; } ok(SUCCEEDED(hr), "DirectInputCreate() failed: %08x\n", hr); if (FAILED(hr)) return; hr = IDirectInput_Initialize(pDI, hInstance, DIRECTINPUT_VERSION); ok(SUCCEEDED(hr), "Initialize() failed: %08x\n", hr); if (FAILED(hr)) return; hr = IUnknown_QueryInterface(pDI, &IID_IDirectInput2W, (LPVOID*)&obj); ok(SUCCEEDED(hr), "QueryInterface(IDirectInput7W) failed: %08x\n", hr); hwnd = CreateWindow("static", "Title", WS_OVERLAPPEDWINDOW, 10, 10, 200, 200, NULL, NULL, NULL, NULL); ok(hwnd != NULL, "err: %d\n", GetLastError()); if (hwnd) { ShowWindow(hwnd, SW_SHOW); data.pDI = pDI; data.hwnd = hwnd; hr = IDirectInput_EnumDevices(pDI, 0, enum_devices, &data, DIEDFL_ALLDEVICES); ok(SUCCEEDED(hr), "IDirectInput_EnumDevices() failed: %08x\n", hr); /* If GetDeviceStatus returns DI_OK the device must exist */ hr = IDirectInput_GetDeviceStatus(pDI, &GUID_Joystick); if (hr == DI_OK) { LPDIRECTINPUTDEVICE device = NULL; hr = IDirectInput_CreateDevice(pDI, &GUID_Joystick, &device, NULL); ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr); if (device) IUnknown_Release(device); } DestroyWindow(hwnd); } if (obj) IUnknown_Release(obj); if (pDI) IUnknown_Release(pDI); }
/* Function to scan the system for joysticks. * This function should set SDL_numjoysticks to the number of available * joysticks. Joystick 0 should be the system default joystick. * It should return 0, or -1 on an unrecoverable fatal error. */ int SDL_SYS_JoystickInit(void) { HRESULT result; HINSTANCE instance; SYS_NumJoysticks = 0; result = WIN_CoInitialize(); if (FAILED(result)) { SetDIerror("CoInitialize", result); return (-1); } coinitialized = SDL_TRUE; result = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInput, (LPVOID)&dinput); if (FAILED(result)) { SDL_SYS_JoystickQuit(); SetDIerror("CoCreateInstance", result); return (-1); } /* Because we used CoCreateInstance, we need to Initialize it, first. */ instance = GetModuleHandle(NULL); if (instance == NULL) { SDL_SYS_JoystickQuit(); SDL_SetError("GetModuleHandle() failed with error code %d.", GetLastError()); return (-1); } result = IDirectInput_Initialize(dinput, instance, DIRECTINPUT_VERSION); if (FAILED(result)) { SDL_SYS_JoystickQuit(); SetDIerror("IDirectInput::Initialize", result); return (-1); } /* Look for joysticks, wheels, head trackers, gamepads, etc.. */ result = IDirectInput_EnumDevices(dinput, DIDEVTYPE_JOYSTICK, EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY); return SYS_NumJoysticks; }
static void test_Initialize(void) { IDirectInputA *pDI; HRESULT hr; int i; hr = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInputA, (void **)&pDI); if (FAILED(hr)) { win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr); return; } hr = IDirectInput_Initialize(pDI, NULL, 0); ok(hr == DIERR_INVALIDPARAM, "IDirectInput_Initialize returned 0x%08x\n", hr); hr = IDirectInput_Initialize(pDI, NULL, DIRECTINPUT_VERSION); ok(hr == DIERR_INVALIDPARAM, "IDirectInput_Initialize returned 0x%08x\n", hr); hr = IDirectInput_Initialize(pDI, hInstance, 0); ok(hr == DIERR_NOTINITIALIZED, "IDirectInput_Initialize returned 0x%08x\n", hr); /* Invalid DirectInput versions less than 0x0700 yield DIERR_BETADIRECTINPUTVERSION. */ hr = IDirectInput_Initialize(pDI, hInstance, 0x0123); ok(hr == DIERR_BETADIRECTINPUTVERSION, "IDirectInput_Initialize returned 0x%08x\n", hr); /* Invalid DirectInput versions greater than 0x0700 yield DIERR_BETADIRECTINPUTVERSION. */ hr = IDirectInput_Initialize(pDI, hInstance, 0xcafe); ok(hr == DIERR_OLDDIRECTINPUTVERSION, "IDirectInput_Initialize returned 0x%08x\n", hr); for (i = 0; i < sizeof(directinput_version_list)/sizeof(directinput_version_list[0]); i++) { hr = IDirectInput_Initialize(pDI, hInstance, directinput_version_list[i]); ok(hr == DI_OK, "IDirectInput_Initialize returned 0x%08x\n", hr); } /* Parameters are still validated after successful initialization. */ hr = IDirectInput_Initialize(pDI, hInstance, 0); ok(hr == DIERR_NOTINITIALIZED, "IDirectInput_Initialize returned 0x%08x\n", hr); IDirectInput_Release(pDI); }
/* key_dinput_init: [primary thread] * Sets up the DirectInput keyboard device. */ static int key_dinput_init(void) { HRESULT hr; HWND allegro_wnd = win_get_window(); DIPROPDWORD property_buf_size = { /* the header */ { sizeof(DIPROPDWORD), // diph.dwSize sizeof(DIPROPHEADER), // diph.dwHeaderSize 0, // diph.dwObj DIPH_DEVICE, // diph.dwHow }, /* the data */ DINPUT_BUFFERSIZE, // dwData }; /* Get DirectInput interface */ hr = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInput, &key_dinput); if (FAILED(hr)) goto Error; hr = IDirectInput_Initialize(key_dinput, allegro_inst, DIRECTINPUT_VERSION); if (FAILED(hr)) goto Error; /* Create the keyboard device */ hr = IDirectInput_CreateDevice(key_dinput, &GUID_SysKeyboard, &key_dinput_device, NULL); if (FAILED(hr)) goto Error; /* Set data format */ hr = IDirectInputDevice_SetDataFormat(key_dinput_device, &c_dfDIKeyboard); if (FAILED(hr)) goto Error; /* Set buffer size */ hr = IDirectInputDevice_SetProperty(key_dinput_device, DIPROP_BUFFERSIZE, &property_buf_size.diph); if (FAILED(hr)) goto Error; /* Set cooperative level */ hr = IDirectInputDevice_SetCooperativeLevel(key_dinput_device, allegro_wnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); if (FAILED(hr)) goto Error; /* Enable event notification */ key_input_event = CreateEvent(NULL, FALSE, FALSE, NULL); hr = IDirectInputDevice_SetEventNotification(key_dinput_device, key_input_event); if (FAILED(hr)) goto Error; /* Register event handler */ if (_win_input_register_event(key_input_event, key_dinput_handle) != 0) goto Error; get_reverse_mapping(); /* Acquire the device */ wnd_call_proc(key_dinput_acquire); return 0; Error: key_dinput_exit(); return -1; }