rendered paste bodystatic int key_dinput_init(void)
{
HRESULT hr;
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 = DirectInputCreate(allegro_inst, DIRECTINPUT_VERSION, &key_dinput, NULL);
if (FAILED(hr)) {
TRACE("DirectInputCreate failed.\n");
goto Error;
}
/* Create the keyboard device */
hr = IDirectInput_CreateDevice(key_dinput, &GUID_SysKeyboard, &key_dinput_device, NULL);
if (FAILED(hr)) {
TRACE("IDirectInput_CreateDevice failed.\n");
goto Error;
}
/* Set data format */
hr = IDirectInputDevice_SetDataFormat(key_dinput_device, &c_dfDIKeyboard);
if (FAILED(hr)) {
TRACE("IDirectInputDevice_SetDataFormat failed.\n");
goto Error;
}
/* Set buffer size */
hr = IDirectInputDevice_SetProperty(key_dinput_device, DIPROP_BUFFERSIZE, &property_buf_size.diph);
if (FAILED(hr)) {
TRACE("IDirectInputDevice_SetProperty failed.\n");
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)) {
TRACE("IDirectInputDevice_SetEventNotification failed.\n");
goto Error;
}
/* Set up the timer for autorepeat emulation */
key_autorepeat_timer = CreateWaitableTimer(NULL, FALSE, NULL);
if (!key_autorepeat_timer) {
TRACE("CreateWaitableTimer failed.\n");
goto Error;
}
/* Register event handlers */
if (_win_input_register_event(key_input_event, key_dinput_handle) != 0 ||
_win_input_register_event(key_autorepeat_timer, key_dinput_repeat) != 0) {
TRACE("Registering dinput keyboard event handlers failed.\n");
goto Error;
}
return 0;
Error:
key_dinput_exit();
return -1;
}