diff options
Diffstat (limited to '3rdparty/SDL2/src/joystick/windows/SDL_windowsjoystick.c')
-rw-r--r-- | 3rdparty/SDL2/src/joystick/windows/SDL_windowsjoystick.c | 538 |
1 files changed, 0 insertions, 538 deletions
diff --git a/3rdparty/SDL2/src/joystick/windows/SDL_windowsjoystick.c b/3rdparty/SDL2/src/joystick/windows/SDL_windowsjoystick.c deleted file mode 100644 index e528afa7fbf..00000000000 --- a/3rdparty/SDL2/src/joystick/windows/SDL_windowsjoystick.c +++ /dev/null @@ -1,538 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_JOYSTICK_DINPUT || SDL_JOYSTICK_XINPUT - -/* DirectInput joystick driver; written by Glenn Maynard, based on Andrei de - * A. Formiga's WINMM driver. - * - * Hats and sliders are completely untested; the app I'm writing this for mostly - * doesn't use them and I don't own any joysticks with them. - * - * We don't bother to use event notification here. It doesn't seem to work - * with polled devices, and it's fine to call IDirectInputDevice8_GetDeviceData and - * let it return 0 events. */ - -#include "SDL_error.h" -#include "SDL_assert.h" -#include "SDL_events.h" -#include "SDL_timer.h" -#include "SDL_mutex.h" -#include "SDL_events.h" -#include "SDL_hints.h" -#include "SDL_joystick.h" -#include "../SDL_sysjoystick.h" -#include "../../thread/SDL_systhread.h" -#include "../../core/windows/SDL_windows.h" -#if !defined(__WINRT__) -#include <dbt.h> -#endif - -#define INITGUID /* Only set here, if set twice will cause mingw32 to break. */ -#include "SDL_windowsjoystick_c.h" -#include "SDL_dinputjoystick_c.h" -#include "SDL_xinputjoystick_c.h" - -#include "../../haptic/windows/SDL_dinputhaptic_c.h" /* For haptic hot plugging */ -#include "../../haptic/windows/SDL_xinputhaptic_c.h" /* For haptic hot plugging */ - - -#ifndef DEVICE_NOTIFY_WINDOW_HANDLE -#define DEVICE_NOTIFY_WINDOW_HANDLE 0x00000000 -#endif - -/* local variables */ -static SDL_bool s_bDeviceAdded = SDL_FALSE; -static SDL_bool s_bDeviceRemoved = SDL_FALSE; -static SDL_JoystickID s_nInstanceID = -1; -static SDL_cond *s_condJoystickThread = NULL; -static SDL_mutex *s_mutexJoyStickEnum = NULL; -static SDL_Thread *s_threadJoystick = NULL; -static SDL_bool s_bJoystickThreadQuit = SDL_FALSE; - -JoyStick_DeviceData *SYS_Joystick; /* array to hold joystick ID values */ - -static SDL_bool s_bWindowsDeviceChanged = SDL_FALSE; - -#ifdef __WINRT__ - -typedef struct -{ - int unused; -} SDL_DeviceNotificationData; - -static void -SDL_CleanupDeviceNotification(SDL_DeviceNotificationData *data) -{ -} - -static int -SDL_CreateDeviceNotification(SDL_DeviceNotificationData *data) -{ - return 0; -} - -static void -SDL_CheckDeviceNotification(SDL_DeviceNotificationData *data) -{ -} - -#else /* !__WINRT__ */ - -typedef struct -{ - HRESULT coinitialized; - WNDCLASSEX wincl; - HWND messageWindow; - HDEVNOTIFY hNotify; -} SDL_DeviceNotificationData; - - -/* windowproc for our joystick detect thread message only window, to detect any USB device addition/removal */ -static LRESULT CALLBACK -SDL_PrivateJoystickDetectProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) { - case WM_DEVICECHANGE: - switch (wParam) { - case DBT_DEVICEARRIVAL: - if (((DEV_BROADCAST_HDR*)lParam)->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { - s_bWindowsDeviceChanged = SDL_TRUE; - } - break; - case DBT_DEVICEREMOVECOMPLETE: - if (((DEV_BROADCAST_HDR*)lParam)->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { - s_bWindowsDeviceChanged = SDL_TRUE; - } - break; - } - return 0; - } - - return DefWindowProc (hwnd, message, wParam, lParam); -} - -static void -SDL_CleanupDeviceNotification(SDL_DeviceNotificationData *data) -{ - if (data->hNotify) - UnregisterDeviceNotification(data->hNotify); - - if (data->messageWindow) - DestroyWindow(data->messageWindow); - - UnregisterClass(data->wincl.lpszClassName, data->wincl.hInstance); - - if (data->coinitialized == S_OK) { - WIN_CoUninitialize(); - } -} - -static int -SDL_CreateDeviceNotification(SDL_DeviceNotificationData *data) -{ - DEV_BROADCAST_DEVICEINTERFACE dbh; - GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2L, 0xF16F, 0x11CF, { 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } }; - - SDL_zerop(data); - - data->coinitialized = WIN_CoInitialize(); - - data->wincl.hInstance = GetModuleHandle(NULL); - data->wincl.lpszClassName = L"Message"; - data->wincl.lpfnWndProc = SDL_PrivateJoystickDetectProc; /* This function is called by windows */ - data->wincl.cbSize = sizeof (WNDCLASSEX); - - if (!RegisterClassEx(&data->wincl)) { - WIN_SetError("Failed to create register class for joystick autodetect"); - SDL_CleanupDeviceNotification(data); - return -1; - } - - data->messageWindow = (HWND)CreateWindowEx(0, L"Message", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL); - if (!data->messageWindow) { - WIN_SetError("Failed to create message window for joystick autodetect"); - SDL_CleanupDeviceNotification(data); - return -1; - } - - SDL_zero(dbh); - dbh.dbcc_size = sizeof(dbh); - dbh.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; - dbh.dbcc_classguid = GUID_DEVINTERFACE_HID; - - data->hNotify = RegisterDeviceNotification(data->messageWindow, &dbh, DEVICE_NOTIFY_WINDOW_HANDLE); - if (!data->hNotify) { - WIN_SetError("Failed to create notify device for joystick autodetect"); - SDL_CleanupDeviceNotification(data); - return -1; - } - return 0; -} - -static void -SDL_CheckDeviceNotification(SDL_DeviceNotificationData *data) -{ - MSG msg; - - if (!data->messageWindow) { - return; - } - - while (PeekMessage(&msg, data->messageWindow, 0, 0, PM_NOREMOVE)) { - if (GetMessage(&msg, data->messageWindow, 0, 0) != 0) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } -} - -#endif /* __WINRT__ */ - -/* Function/thread to scan the system for joysticks. */ -static int -SDL_JoystickThread(void *_data) -{ - SDL_DeviceNotificationData notification_data; - -#if SDL_JOYSTICK_XINPUT - SDL_bool bOpenedXInputDevices[XUSER_MAX_COUNT]; - SDL_zero(bOpenedXInputDevices); -#endif - - if (SDL_CreateDeviceNotification(¬ification_data) < 0) { - return -1; - } - - SDL_LockMutex(s_mutexJoyStickEnum); - while (s_bJoystickThreadQuit == SDL_FALSE) { - SDL_bool bXInputChanged = SDL_FALSE; - - SDL_CondWaitTimeout(s_condJoystickThread, s_mutexJoyStickEnum, 300); - - SDL_CheckDeviceNotification(¬ification_data); - -#if SDL_JOYSTICK_XINPUT - if (SDL_XINPUT_Enabled() && XINPUTGETCAPABILITIES) { - /* scan for any change in XInput devices */ - Uint8 userId; - for (userId = 0; userId < XUSER_MAX_COUNT; userId++) { - XINPUT_CAPABILITIES capabilities; - const DWORD result = XINPUTGETCAPABILITIES(userId, XINPUT_FLAG_GAMEPAD, &capabilities); - const SDL_bool available = (result == ERROR_SUCCESS); - if (bOpenedXInputDevices[userId] != available) { - bXInputChanged = SDL_TRUE; - bOpenedXInputDevices[userId] = available; - } - } - } -#endif /* SDL_JOYSTICK_XINPUT */ - - if (s_bWindowsDeviceChanged || bXInputChanged) { - SDL_UnlockMutex(s_mutexJoyStickEnum); /* let main thread go while we SDL_Delay(). */ - SDL_Delay(300); /* wait for direct input to find out about this device */ - SDL_LockMutex(s_mutexJoyStickEnum); - - s_bDeviceRemoved = SDL_TRUE; - s_bDeviceAdded = SDL_TRUE; - s_bWindowsDeviceChanged = SDL_FALSE; - } - } - SDL_UnlockMutex(s_mutexJoyStickEnum); - - SDL_CleanupDeviceNotification(¬ification_data); - - return 1; -} - -void SDL_SYS_AddJoystickDevice(JoyStick_DeviceData *device) -{ - device->send_add_event = SDL_TRUE; - device->nInstanceID = ++s_nInstanceID; - device->pNext = SYS_Joystick; - SYS_Joystick = device; - - s_bDeviceAdded = SDL_TRUE; -} - -/* Function to scan the system for 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) -{ - if (SDL_DINPUT_JoystickInit() < 0) { - SDL_SYS_JoystickQuit(); - return -1; - } - - if (SDL_XINPUT_JoystickInit() < 0) { - SDL_SYS_JoystickQuit(); - return -1; - } - - s_mutexJoyStickEnum = SDL_CreateMutex(); - s_condJoystickThread = SDL_CreateCond(); - s_bDeviceAdded = SDL_TRUE; /* force a scan of the system for joysticks this first time */ - - SDL_SYS_JoystickDetect(); - - if (!s_threadJoystick) { - /* spin up the thread to detect hotplug of devices */ - s_bJoystickThreadQuit = SDL_FALSE; - s_threadJoystick = SDL_CreateThreadInternal(SDL_JoystickThread, "SDL_joystick", 64 * 1024, NULL); - } - return SDL_SYS_NumJoysticks(); -} - -/* return the number of joysticks that are connected right now */ -int -SDL_SYS_NumJoysticks() -{ - int nJoysticks = 0; - JoyStick_DeviceData *device = SYS_Joystick; - while (device) { - nJoysticks++; - device = device->pNext; - } - - return nJoysticks; -} - -/* detect any new joysticks being inserted into the system */ -void -SDL_SYS_JoystickDetect() -{ - JoyStick_DeviceData *pCurList = NULL; - - /* only enum the devices if the joystick thread told us something changed */ - if (!s_bDeviceAdded && !s_bDeviceRemoved) { - return; /* thread hasn't signaled, nothing to do right now. */ - } - - SDL_LockMutex(s_mutexJoyStickEnum); - - s_bDeviceAdded = SDL_FALSE; - s_bDeviceRemoved = SDL_FALSE; - - pCurList = SYS_Joystick; - SYS_Joystick = NULL; - - /* Look for DirectInput joysticks, wheels, head trackers, gamepads, etc.. */ - SDL_DINPUT_JoystickDetect(&pCurList); - - /* Look for XInput devices. Do this last, so they're first in the final list. */ - SDL_XINPUT_JoystickDetect(&pCurList); - - SDL_UnlockMutex(s_mutexJoyStickEnum); - - while (pCurList) { - JoyStick_DeviceData *pListNext = NULL; - - if (pCurList->bXInputDevice) { - SDL_XINPUT_MaybeRemoveDevice(pCurList->XInputUserId); - } else { - SDL_DINPUT_MaybeRemoveDevice(&pCurList->dxdevice); - } - - SDL_PrivateJoystickRemoved(pCurList->nInstanceID); - - pListNext = pCurList->pNext; - SDL_free(pCurList->joystickname); - SDL_free(pCurList); - pCurList = pListNext; - } - - if (s_bDeviceAdded) { - JoyStick_DeviceData *pNewJoystick; - int device_index = 0; - s_bDeviceAdded = SDL_FALSE; - pNewJoystick = SYS_Joystick; - while (pNewJoystick) { - if (pNewJoystick->send_add_event) { - if (pNewJoystick->bXInputDevice) { - SDL_XINPUT_MaybeAddDevice(pNewJoystick->XInputUserId); - } else { - SDL_DINPUT_MaybeAddDevice(&pNewJoystick->dxdevice); - } - - SDL_PrivateJoystickAdded(device_index); - - pNewJoystick->send_add_event = SDL_FALSE; - } - device_index++; - pNewJoystick = pNewJoystick->pNext; - } - } -} - -/* Function to get the device-dependent name of a joystick */ -const char * -SDL_SYS_JoystickNameForDeviceIndex(int device_index) -{ - JoyStick_DeviceData *device = SYS_Joystick; - - for (; device_index > 0; device_index--) - device = device->pNext; - - return device->joystickname; -} - -/* Function to perform the mapping between current device instance and this joysticks instance id */ -SDL_JoystickID -SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index) -{ - JoyStick_DeviceData *device = SYS_Joystick; - int index; - - for (index = device_index; index > 0; index--) - device = device->pNext; - - return device->nInstanceID; -} - -/* Function to open a joystick for use. - The joystick to open is specified by the device index. - This should fill the nbuttons and naxes fields of the joystick structure. - It returns 0, or -1 if there is an error. - */ -int -SDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index) -{ - JoyStick_DeviceData *joystickdevice = SYS_Joystick; - - for (; device_index > 0; device_index--) - joystickdevice = joystickdevice->pNext; - - /* allocate memory for system specific hardware data */ - joystick->instance_id = joystickdevice->nInstanceID; - joystick->hwdata = - (struct joystick_hwdata *) SDL_malloc(sizeof(struct joystick_hwdata)); - if (joystick->hwdata == NULL) { - return SDL_OutOfMemory(); - } - SDL_zerop(joystick->hwdata); - joystick->hwdata->guid = joystickdevice->guid; - - if (joystickdevice->bXInputDevice) { - return SDL_XINPUT_JoystickOpen(joystick, joystickdevice); - } else { - return SDL_DINPUT_JoystickOpen(joystick, joystickdevice); - } -} - -/* return true if this joystick is plugged in right now */ -SDL_bool -SDL_SYS_JoystickAttached(SDL_Joystick * joystick) -{ - return joystick->hwdata && !joystick->hwdata->removed; -} - -void -SDL_SYS_JoystickUpdate(SDL_Joystick * joystick) -{ - if (!joystick->hwdata || joystick->hwdata->removed) { - return; - } - - if (joystick->hwdata->bXInputDevice) { - SDL_XINPUT_JoystickUpdate(joystick); - } else { - SDL_DINPUT_JoystickUpdate(joystick); - } - - if (joystick->hwdata->removed) { - joystick->force_recentering = SDL_TRUE; - } -} - -/* Function to close a joystick after use */ -void -SDL_SYS_JoystickClose(SDL_Joystick * joystick) -{ - if (joystick->hwdata->bXInputDevice) { - SDL_XINPUT_JoystickClose(joystick); - } else { - SDL_DINPUT_JoystickClose(joystick); - } - - SDL_free(joystick->hwdata); -} - -/* Function to perform any system-specific joystick related cleanup */ -void -SDL_SYS_JoystickQuit(void) -{ - JoyStick_DeviceData *device = SYS_Joystick; - - while (device) { - JoyStick_DeviceData *device_next = device->pNext; - SDL_free(device->joystickname); - SDL_free(device); - device = device_next; - } - SYS_Joystick = NULL; - - if (s_threadJoystick) { - SDL_LockMutex(s_mutexJoyStickEnum); - s_bJoystickThreadQuit = SDL_TRUE; - SDL_CondBroadcast(s_condJoystickThread); /* signal the joystick thread to quit */ - SDL_UnlockMutex(s_mutexJoyStickEnum); - SDL_WaitThread(s_threadJoystick, NULL); /* wait for it to bugger off */ - - SDL_DestroyMutex(s_mutexJoyStickEnum); - SDL_DestroyCond(s_condJoystickThread); - s_condJoystickThread= NULL; - s_mutexJoyStickEnum = NULL; - s_threadJoystick = NULL; - } - - SDL_DINPUT_JoystickQuit(); - SDL_XINPUT_JoystickQuit(); - - s_bDeviceAdded = SDL_FALSE; - s_bDeviceRemoved = SDL_FALSE; -} - -/* return the stable device guid for this device index */ -SDL_JoystickGUID -SDL_SYS_JoystickGetDeviceGUID(int device_index) -{ - JoyStick_DeviceData *device = SYS_Joystick; - int index; - - for (index = device_index; index > 0; index--) - device = device->pNext; - - return device->guid; -} - -SDL_JoystickGUID -SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick) -{ - return joystick->hwdata->guid; -} - -#endif /* SDL_JOYSTICK_DINPUT || SDL_JOYSTICK_XINPUT */ - -/* vi: set ts=4 sw=4 expandtab: */ |