static void DX5_DInputQuit(_THIS) { int i; if ( dinput != NULL ) { for ( i=0; i<MAX_INPUTS; ++i ) { if ( SDL_DIdev[i] != NULL ) { IDirectInputDevice2_Unacquire(SDL_DIdev[i]); IDirectInputDevice2_SetEventNotification( SDL_DIdev[i], NULL); if ( SDL_DIevt[i] != NULL ) { CloseHandle(SDL_DIevt[i]); SDL_DIevt[i] = NULL; } IDirectInputDevice2_Release(SDL_DIdev[i]); SDL_DIdev[i] = NULL; } } SDL_DIndev = 0; IDirectInput_Release(dinput); dinput = NULL; } }
static int DX5_DInputInit(_THIS) { int i; LPDIRECTINPUTDEVICE device; HRESULT result; DIPROPDWORD dipdw; HWND topwnd; result = DInputCreate(SDL_Instance, DIRECTINPUT_VERSION, &dinput, NULL); if ( result != DI_OK ) { SetDIerror("DirectInputCreate", result); return(-1); } SDL_DIndev = 0; for ( i=0; inputs[i].name; ++i ) { result = IDirectInput_CreateDevice(dinput, inputs[i].guid, &device, NULL); if ( result != DI_OK ) { SetDIerror("DirectInput::CreateDevice", result); return(-1); } result = IDirectInputDevice_QueryInterface(device, &IID_IDirectInputDevice2, (LPVOID *)&SDL_DIdev[i]); IDirectInputDevice_Release(device); if ( result != DI_OK ) { SetDIerror("DirectInputDevice::QueryInterface", result); return(-1); } topwnd = GetTopLevelParent(SDL_Window); result = IDirectInputDevice2_SetCooperativeLevel(SDL_DIdev[i], topwnd, inputs[i].win_level); if ( result != DI_OK ) { SetDIerror("DirectInputDevice::SetCooperativeLevel", result); return(-1); } result = IDirectInputDevice2_SetDataFormat(SDL_DIdev[i], inputs[i].format); if ( result != DI_OK ) { SetDIerror("DirectInputDevice::SetDataFormat", result); return(-1); } SDL_memset(&dipdw, 0, sizeof(dipdw)); dipdw.diph.dwSize = sizeof(dipdw); dipdw.diph.dwHeaderSize = sizeof(dipdw.diph); dipdw.diph.dwObj = 0; dipdw.diph.dwHow = DIPH_DEVICE; dipdw.dwData = INPUT_QSIZE; result = IDirectInputDevice2_SetProperty(SDL_DIdev[i], DIPROP_BUFFERSIZE, &dipdw.diph); if ( result != DI_OK ) { SetDIerror("DirectInputDevice::SetProperty", result); return(-1); } SDL_DIevt[i] = CreateEvent(NULL, FALSE, FALSE, NULL); if ( SDL_DIevt[i] == NULL ) { SDL_SetError("Couldn't create DirectInput event"); return(-1); } result = IDirectInputDevice2_SetEventNotification(SDL_DIdev[i], SDL_DIevt[i]); if ( result != DI_OK ) { SetDIerror("DirectInputDevice::SetEventNotification", result); return(-1); } SDL_DIfun[i] = inputs[i].fun; IDirectInputDevice2_Acquire(SDL_DIdev[i]); ++SDL_DIndev; } mouse_pressed = 0; mouse_buttons_swapped = GetSystemMetrics(SM_SWAPBUTTON); return(0); }
void InputHandler_DInput::InputThreadMain() { if(!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST)) LOG->Warn(werr_ssprintf(GetLastError(), "Failed to set DirectInput thread priority")); /* Enable priority boosting. */ SetThreadPriorityBoost( GetCurrentThread(), FALSE ); vector<DIDevice*> BufferedDevices, UnbufferedDevices; HANDLE Handle = CreateEvent(NULL, FALSE, FALSE, NULL); for( unsigned i = 0; i < Devices.size(); ++i ) { if( !Devices[i].buffered ) { UnbufferedDevices.push_back( &Devices[i] ); continue; } BufferedDevices.push_back( &Devices[i] ); IDirectInputDevice2_Unacquire(Devices[i].Device); HRESULT hr = IDirectInputDevice2_SetEventNotification(Devices[i].Device, Handle); if( FAILED(hr) ) LOG->Warn("IDirectInputDevice2_SetEventNotification failed on %i", i); IDirectInputDevice2_Acquire(Devices[i].Device); } while(!shutdown) { m_DebugTimer.StartUpdate(); CHECKPOINT; if( BufferedDevices.size() ) { /* Update buffered devices. */ PollAndAcquireDevices(); int ret = WaitForSingleObjectEx( Handle, 50, true ); if( ret == -1 ) { LOG->Trace( werr_ssprintf(GetLastError(), "WaitForSingleObjectEx failed") ); continue; } if( ret == WAIT_OBJECT_0 ) { RageTimer now; for( unsigned i = 0; i < BufferedDevices.size(); ++i ) UpdateBuffered( *BufferedDevices[i], now ); } } CHECKPOINT; /* If we have no buffered devices, we didn't delay at WaitForMultipleObjectsEx. */ if( BufferedDevices.size() == 0 ) usleep( 50000 ); CHECKPOINT; m_DebugTimer.EndUpdate(); } CHECKPOINT; for( unsigned i = 0; i < Devices.size(); ++i ) { if( !Devices[i].buffered ) continue; IDirectInputDevice2_Unacquire(Devices[i].Device); IDirectInputDevice2_SetEventNotification( Devices[i].Device, NULL ); } CloseHandle(Handle); }