diff --git a/input/drivers_joypad/dinput_hybrid_joypad.c b/input/drivers_joypad/dinput_hybrid_joypad.c
index d65d905ab8..ec75bd430c 100644
--- a/input/drivers_joypad/dinput_hybrid_joypad.c
+++ b/input/drivers_joypad/dinput_hybrid_joypad.c
@@ -44,155 +44,7 @@ struct dinput_joypad_data g_pads[MAX_USERS];
unsigned g_joypad_cnt;
#include "dinput_joypad_inl.h"
-
-static BOOL CALLBACK enum_joypad_cb(const DIDEVICEINSTANCE *inst, void *p)
-{
- LPDIRECTINPUTDEVICE8 *pad = NULL;
- if (g_joypad_cnt == MAX_USERS)
- return DIENUM_STOP;
-
- pad = &g_pads[g_joypad_cnt].joypad;
-
-#ifdef __cplusplus
- if (FAILED(IDirectInput8_CreateDevice(
- g_dinput_ctx, inst->guidInstance, pad, NULL)))
-#else
- if (FAILED(IDirectInput8_CreateDevice(
- g_dinput_ctx, &inst->guidInstance, pad, NULL)))
-#endif
- return DIENUM_CONTINUE;
-
- g_pads[g_joypad_cnt].joy_name =
- strdup((const char*)inst->tszProductName);
- g_pads[g_joypad_cnt].joy_friendly_name =
- strdup((const char*)inst->tszInstanceName);
-
- /* there may be more useful info in the GUID,
- * so leave this here for a while */
-#if 0
- printf("Guid = {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}\n",
- inst->guidProduct.Data1,
- inst->guidProduct.Data2,
- inst->guidProduct.Data3,
- inst->guidProduct.Data4[0],
- inst->guidProduct.Data4[1],
- inst->guidProduct.Data4[2],
- inst->guidProduct.Data4[3],
- inst->guidProduct.Data4[4],
- inst->guidProduct.Data4[5],
- inst->guidProduct.Data4[6],
- inst->guidProduct.Data4[7]);
-#endif
-
- g_pads[g_joypad_cnt].vid = inst->guidProduct.Data1 % 0x10000;
- g_pads[g_joypad_cnt].pid = inst->guidProduct.Data1 / 0x10000;
-
- /* Set data format to simple joystick */
- IDirectInputDevice8_SetDataFormat(*pad, &c_dfDIJoystick2);
- IDirectInputDevice8_SetCooperativeLevel(*pad,
- (HWND)video_driver_window_get(),
- DISCL_EXCLUSIVE | DISCL_BACKGROUND);
-
- IDirectInputDevice8_EnumObjects(*pad, enum_axes_cb,
- *pad, DIDFT_ABSAXIS);
-
- dinput_create_rumble_effects(&g_pads[g_joypad_cnt]);
-
- input_autoconfigure_connect(
- g_pads[g_joypad_cnt].joy_name,
- g_pads[g_joypad_cnt].joy_friendly_name,
- dinput_joypad.ident,
- g_joypad_cnt,
- g_pads[g_joypad_cnt].vid,
- g_pads[g_joypad_cnt].pid);
-
- g_joypad_cnt++;
- return DIENUM_CONTINUE;
-}
-
-static bool dinput_joypad_init(void *data)
-{
- unsigned i;
-
- if (!dinput_init_context())
- return false;
-
- for (i = 0; i < MAX_USERS; ++i)
- {
- g_pads[i].joy_name = NULL;
- g_pads[i].joy_friendly_name = NULL;
- }
-
- IDirectInput8_EnumDevices(g_dinput_ctx, DI8DEVCLASS_GAMECTRL,
- enum_joypad_cb, NULL, DIEDFL_ATTACHEDONLY);
- return true;
-}
-
-static void dinput_joypad_poll(void)
-{
- unsigned i;
- for (i = 0; i < MAX_USERS; i++)
- {
- unsigned j;
- HRESULT ret;
- struct dinput_joypad_data *pad = &g_pads[i];
- if (!pad || !pad->joypad)
- continue;
-
- pad->joy_state.lX = 0;
- pad->joy_state.lY = 0;
- pad->joy_state.lRx = 0;
- pad->joy_state.lRy = 0;
- pad->joy_state.lRz = 0;
- pad->joy_state.rglSlider[0] = 0;
- pad->joy_state.rglSlider[1] = 0;
- pad->joy_state.rgdwPOV[0] = 0;
- pad->joy_state.rgdwPOV[1] = 0;
- pad->joy_state.rgdwPOV[2] = 0;
- pad->joy_state.rgdwPOV[3] = 0;
- for (j = 0; j < 128; j++)
- pad->joy_state.rgbButtons[j] = 0;
-
- pad->joy_state.lVX = 0;
- pad->joy_state.lVY = 0;
- pad->joy_state.lVZ = 0;
- pad->joy_state.lVRx = 0;
- pad->joy_state.lVRy = 0;
- pad->joy_state.lVRz = 0;
- pad->joy_state.rglVSlider[0] = 0;
- pad->joy_state.rglVSlider[1] = 0;
- pad->joy_state.lAX = 0;
- pad->joy_state.lAY = 0;
- pad->joy_state.lAZ = 0;
- pad->joy_state.lARx = 0;
- pad->joy_state.lARy = 0;
- pad->joy_state.lARz = 0;
- pad->joy_state.rglASlider[0] = 0;
- pad->joy_state.rglASlider[1] = 0;
- pad->joy_state.lFX = 0;
- pad->joy_state.lFY = 0;
- pad->joy_state.lFZ = 0;
- pad->joy_state.lFRx = 0;
- pad->joy_state.lFRy = 0;
- pad->joy_state.lFRz = 0;
- pad->joy_state.rglFSlider[0] = 0;
- pad->joy_state.rglFSlider[1] = 0;
-
- /* If this fails, something *really* bad must have happened. */
- if (FAILED(IDirectInputDevice8_Poll(pad->joypad)))
- if (
- FAILED(IDirectInputDevice8_Acquire(pad->joypad))
- || FAILED(IDirectInputDevice8_Poll(pad->joypad))
- )
- continue;
-
- ret = IDirectInputDevice8_GetDeviceState(pad->joypad,
- sizeof(DIJOYSTATE2), &pad->joy_state);
-
- if (ret == DIERR_INPUTLOST || ret == DIERR_NOTACQUIRED)
- input_autoconfigure_disconnect(i, g_pads[i].joy_friendly_name);
- }
-}
+#include "dinput_joypad_excl.h"
input_device_driver_t dinput_joypad = {
dinput_joypad_init,
diff --git a/input/drivers_joypad/dinput_joypad.c b/input/drivers_joypad/dinput_joypad.c
index 6ded6e6644..0b8cbcc142 100644
--- a/input/drivers_joypad/dinput_joypad.c
+++ b/input/drivers_joypad/dinput_joypad.c
@@ -44,155 +44,7 @@ unsigned g_joypad_cnt;
extern LPDIRECTINPUT8 g_dinput_ctx;
#include "dinput_joypad_inl.h"
-
-static BOOL CALLBACK enum_joypad_cb(const DIDEVICEINSTANCE *inst, void *p)
-{
- LPDIRECTINPUTDEVICE8 *pad = NULL;
- if (g_joypad_cnt == MAX_USERS)
- return DIENUM_STOP;
-
- pad = &g_pads[g_joypad_cnt].joypad;
-
-#ifdef __cplusplus
- if (FAILED(IDirectInput8_CreateDevice(
- g_dinput_ctx, inst->guidInstance, pad, NULL)))
-#else
- if (FAILED(IDirectInput8_CreateDevice(
- g_dinput_ctx, &inst->guidInstance, pad, NULL)))
-#endif
- return DIENUM_CONTINUE;
-
- g_pads[g_joypad_cnt].joy_name =
- strdup((const char*)inst->tszProductName);
- g_pads[g_joypad_cnt].joy_friendly_name =
- strdup((const char*)inst->tszInstanceName);
-
- /* there may be more useful info in the GUID,
- * so leave this here for a while */
-#if 0
- printf("Guid = {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}\n",
- inst->guidProduct.Data1,
- inst->guidProduct.Data2,
- inst->guidProduct.Data3,
- inst->guidProduct.Data4[0],
- inst->guidProduct.Data4[1],
- inst->guidProduct.Data4[2],
- inst->guidProduct.Data4[3],
- inst->guidProduct.Data4[4],
- inst->guidProduct.Data4[5],
- inst->guidProduct.Data4[6],
- inst->guidProduct.Data4[7]);
-#endif
-
- g_pads[g_joypad_cnt].vid = inst->guidProduct.Data1 % 0x10000;
- g_pads[g_joypad_cnt].pid = inst->guidProduct.Data1 / 0x10000;
-
- /* Set data format to simple joystick */
- IDirectInputDevice8_SetDataFormat(*pad, &c_dfDIJoystick2);
- IDirectInputDevice8_SetCooperativeLevel(*pad,
- (HWND)video_driver_window_get(),
- DISCL_EXCLUSIVE | DISCL_BACKGROUND);
-
- IDirectInputDevice8_EnumObjects(*pad, enum_axes_cb,
- *pad, DIDFT_ABSAXIS);
-
- dinput_create_rumble_effects(&g_pads[g_joypad_cnt]);
-
- input_autoconfigure_connect(
- g_pads[g_joypad_cnt].joy_name,
- g_pads[g_joypad_cnt].joy_friendly_name,
- dinput_joypad.ident,
- g_joypad_cnt,
- g_pads[g_joypad_cnt].vid,
- g_pads[g_joypad_cnt].pid);
-
- g_joypad_cnt++;
- return DIENUM_CONTINUE;
-}
-
-static bool dinput_joypad_init(void *data)
-{
- unsigned i;
-
- if (!dinput_init_context())
- return false;
-
- for (i = 0; i < MAX_USERS; ++i)
- {
- g_pads[i].joy_name = NULL;
- g_pads[i].joy_friendly_name = NULL;
- }
-
- IDirectInput8_EnumDevices(g_dinput_ctx, DI8DEVCLASS_GAMECTRL,
- enum_joypad_cb, NULL, DIEDFL_ATTACHEDONLY);
- return true;
-}
-
-static void dinput_joypad_poll(void)
-{
- unsigned i;
- for (i = 0; i < MAX_USERS; i++)
- {
- unsigned j;
- HRESULT ret;
- struct dinput_joypad_data *pad = &g_pads[i];
- if (!pad || !pad->joypad)
- continue;
-
- pad->joy_state.lX = 0;
- pad->joy_state.lY = 0;
- pad->joy_state.lRx = 0;
- pad->joy_state.lRy = 0;
- pad->joy_state.lRz = 0;
- pad->joy_state.rglSlider[0] = 0;
- pad->joy_state.rglSlider[1] = 0;
- pad->joy_state.rgdwPOV[0] = 0;
- pad->joy_state.rgdwPOV[1] = 0;
- pad->joy_state.rgdwPOV[2] = 0;
- pad->joy_state.rgdwPOV[3] = 0;
- for (j = 0; j < 128; j++)
- pad->joy_state.rgbButtons[j] = 0;
-
- pad->joy_state.lVX = 0;
- pad->joy_state.lVY = 0;
- pad->joy_state.lVZ = 0;
- pad->joy_state.lVRx = 0;
- pad->joy_state.lVRy = 0;
- pad->joy_state.lVRz = 0;
- pad->joy_state.rglVSlider[0] = 0;
- pad->joy_state.rglVSlider[1] = 0;
- pad->joy_state.lAX = 0;
- pad->joy_state.lAY = 0;
- pad->joy_state.lAZ = 0;
- pad->joy_state.lARx = 0;
- pad->joy_state.lARy = 0;
- pad->joy_state.lARz = 0;
- pad->joy_state.rglASlider[0] = 0;
- pad->joy_state.rglASlider[1] = 0;
- pad->joy_state.lFX = 0;
- pad->joy_state.lFY = 0;
- pad->joy_state.lFZ = 0;
- pad->joy_state.lFRx = 0;
- pad->joy_state.lFRy = 0;
- pad->joy_state.lFRz = 0;
- pad->joy_state.rglFSlider[0] = 0;
- pad->joy_state.rglFSlider[1] = 0;
-
- /* If this fails, something *really* bad must have happened. */
- if (FAILED(IDirectInputDevice8_Poll(pad->joypad)))
- if (
- FAILED(IDirectInputDevice8_Acquire(pad->joypad))
- || FAILED(IDirectInputDevice8_Poll(pad->joypad))
- )
- continue;
-
- ret = IDirectInputDevice8_GetDeviceState(pad->joypad,
- sizeof(DIJOYSTATE2), &pad->joy_state);
-
- if (ret == DIERR_INPUTLOST || ret == DIERR_NOTACQUIRED)
- input_autoconfigure_disconnect(i, g_pads[i].joy_friendly_name);
- }
-}
+#include "dinput_joypad_excl.h"
input_device_driver_t dinput_joypad = {
dinput_joypad_init,
diff --git a/input/drivers_joypad/dinput_joypad_excl.h b/input/drivers_joypad/dinput_joypad_excl.h
new file mode 100644
index 0000000000..63a9cd6d99
--- /dev/null
+++ b/input/drivers_joypad/dinput_joypad_excl.h
@@ -0,0 +1,178 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2016 - Daniel De Matteis
+ * Copyright (C) 2016-2019 - Brad Parker
+ *
+ * RetroArch is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#ifndef __DINPUT_JOYPAD_EXCL_INL_H
+#define __DINPUT_JOYPAD_EXCL_INL_H
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+static void dinput_joypad_poll(void)
+{
+ unsigned i;
+ for (i = 0; i < MAX_USERS; i++)
+ {
+ unsigned j;
+ HRESULT ret;
+ struct dinput_joypad_data *pad = &g_pads[i];
+ if (!pad || !pad->joypad)
+ continue;
+
+ pad->joy_state.lX = 0;
+ pad->joy_state.lY = 0;
+ pad->joy_state.lRx = 0;
+ pad->joy_state.lRy = 0;
+ pad->joy_state.lRz = 0;
+ pad->joy_state.rglSlider[0] = 0;
+ pad->joy_state.rglSlider[1] = 0;
+ pad->joy_state.rgdwPOV[0] = 0;
+ pad->joy_state.rgdwPOV[1] = 0;
+ pad->joy_state.rgdwPOV[2] = 0;
+ pad->joy_state.rgdwPOV[3] = 0;
+ for (j = 0; j < 128; j++)
+ pad->joy_state.rgbButtons[j] = 0;
+
+ pad->joy_state.lVX = 0;
+ pad->joy_state.lVY = 0;
+ pad->joy_state.lVZ = 0;
+ pad->joy_state.lVRx = 0;
+ pad->joy_state.lVRy = 0;
+ pad->joy_state.lVRz = 0;
+ pad->joy_state.rglVSlider[0] = 0;
+ pad->joy_state.rglVSlider[1] = 0;
+ pad->joy_state.lAX = 0;
+ pad->joy_state.lAY = 0;
+ pad->joy_state.lAZ = 0;
+ pad->joy_state.lARx = 0;
+ pad->joy_state.lARy = 0;
+ pad->joy_state.lARz = 0;
+ pad->joy_state.rglASlider[0] = 0;
+ pad->joy_state.rglASlider[1] = 0;
+ pad->joy_state.lFX = 0;
+ pad->joy_state.lFY = 0;
+ pad->joy_state.lFZ = 0;
+ pad->joy_state.lFRx = 0;
+ pad->joy_state.lFRy = 0;
+ pad->joy_state.lFRz = 0;
+ pad->joy_state.rglFSlider[0] = 0;
+ pad->joy_state.rglFSlider[1] = 0;
+
+ /* If this fails, something *really* bad must have happened. */
+ if (FAILED(IDirectInputDevice8_Poll(pad->joypad)))
+ if (
+ FAILED(IDirectInputDevice8_Acquire(pad->joypad))
+ || FAILED(IDirectInputDevice8_Poll(pad->joypad))
+ )
+ continue;
+
+ ret = IDirectInputDevice8_GetDeviceState(pad->joypad,
+ sizeof(DIJOYSTATE2), &pad->joy_state);
+
+ if (ret == DIERR_INPUTLOST || ret == DIERR_NOTACQUIRED)
+ input_autoconfigure_disconnect(i, g_pads[i].joy_friendly_name);
+ }
+}
+
+static BOOL CALLBACK enum_joypad_cb(const DIDEVICEINSTANCE *inst, void *p)
+{
+ LPDIRECTINPUTDEVICE8 *pad = NULL;
+ if (g_joypad_cnt == MAX_USERS)
+ return DIENUM_STOP;
+
+ pad = &g_pads[g_joypad_cnt].joypad;
+
+#ifdef __cplusplus
+ if (FAILED(IDirectInput8_CreateDevice(
+ g_dinput_ctx, inst->guidInstance, pad, NULL)))
+#else
+ if (FAILED(IDirectInput8_CreateDevice(
+ g_dinput_ctx, &inst->guidInstance, pad, NULL)))
+#endif
+ return DIENUM_CONTINUE;
+
+ g_pads[g_joypad_cnt].joy_name =
+ strdup((const char*)inst->tszProductName);
+ g_pads[g_joypad_cnt].joy_friendly_name =
+ strdup((const char*)inst->tszInstanceName);
+
+ /* there may be more useful info in the GUID,
+ * so leave this here for a while */
+#if 0
+ printf("Guid = {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}\n",
+ inst->guidProduct.Data1,
+ inst->guidProduct.Data2,
+ inst->guidProduct.Data3,
+ inst->guidProduct.Data4[0],
+ inst->guidProduct.Data4[1],
+ inst->guidProduct.Data4[2],
+ inst->guidProduct.Data4[3],
+ inst->guidProduct.Data4[4],
+ inst->guidProduct.Data4[5],
+ inst->guidProduct.Data4[6],
+ inst->guidProduct.Data4[7]);
+#endif
+
+ g_pads[g_joypad_cnt].vid = inst->guidProduct.Data1 % 0x10000;
+ g_pads[g_joypad_cnt].pid = inst->guidProduct.Data1 / 0x10000;
+
+ /* Set data format to simple joystick */
+ IDirectInputDevice8_SetDataFormat(*pad, &c_dfDIJoystick2);
+ IDirectInputDevice8_SetCooperativeLevel(*pad,
+ (HWND)video_driver_window_get(),
+ DISCL_EXCLUSIVE | DISCL_BACKGROUND);
+
+ IDirectInputDevice8_EnumObjects(*pad, enum_axes_cb,
+ *pad, DIDFT_ABSAXIS);
+
+ dinput_create_rumble_effects(&g_pads[g_joypad_cnt]);
+
+ input_autoconfigure_connect(
+ g_pads[g_joypad_cnt].joy_name,
+ g_pads[g_joypad_cnt].joy_friendly_name,
+ dinput_joypad.ident,
+ g_joypad_cnt,
+ g_pads[g_joypad_cnt].vid,
+ g_pads[g_joypad_cnt].pid);
+
+ g_joypad_cnt++;
+ return DIENUM_CONTINUE;
+}
+
+static bool dinput_joypad_init(void *data)
+{
+ unsigned i;
+
+ if (!dinput_init_context())
+ return false;
+
+ for (i = 0; i < MAX_USERS; ++i)
+ {
+ g_pads[i].joy_name = NULL;
+ g_pads[i].joy_friendly_name = NULL;
+ }
+
+ IDirectInput8_EnumDevices(g_dinput_ctx, DI8DEVCLASS_GAMECTRL,
+ enum_joypad_cb, NULL, DIEDFL_ATTACHEDONLY);
+ return true;
+}
+
+#endif
diff --git a/input/drivers_joypad/dinput_joypad_inl.h b/input/drivers_joypad/dinput_joypad_inl.h
index 7faeefe203..b127e0a854 100644
--- a/input/drivers_joypad/dinput_joypad_inl.h
+++ b/input/drivers_joypad/dinput_joypad_inl.h
@@ -35,48 +35,6 @@ extern LPDIRECTINPUT8 g_dinput_ctx;
void dinput_destroy_context(void);
bool dinput_init_context(void);
-/* Keep track of which pad indexes are 360 controllers.
- * Not static, will be read in xinput_joypad.c
- * -1 = not xbox pad, otherwise 0..3
- */
-static void dinput_joypad_destroy(void)
-{
- unsigned i;
-
- for (i = 0; i < MAX_USERS; i++)
- {
- if (g_pads[i].joypad)
- {
- if (g_pads[i].rumble_iface[0])
- {
- IDirectInputEffect_Stop(g_pads[i].rumble_iface[0]);
- IDirectInputEffect_Release(g_pads[i].rumble_iface[0]);
- }
- if (g_pads[i].rumble_iface[1])
- {
- IDirectInputEffect_Stop(g_pads[i].rumble_iface[1]);
- IDirectInputEffect_Release(g_pads[i].rumble_iface[1]);
- }
-
- IDirectInputDevice8_Unacquire(g_pads[i].joypad);
- IDirectInputDevice8_Release(g_pads[i].joypad);
- }
-
- free(g_pads[i].joy_name);
- g_pads[i].joy_name = NULL;
- free(g_pads[i].joy_friendly_name);
- g_pads[i].joy_friendly_name = NULL;
-
- input_config_clear_device_name(i);
- }
-
- g_joypad_cnt = 0;
- memset(g_pads, 0, sizeof(g_pads));
-
- /* Can be blocked by global Dinput context. */
- dinput_destroy_context();
-}
-
static void dinput_create_rumble_effects(struct dinput_joypad_data *pad)
{
DIENVELOPE dienv;
@@ -146,13 +104,6 @@ static BOOL CALLBACK enum_axes_cb(
return DIENUM_CONTINUE;
}
-static const char *dinput_joypad_name(unsigned port)
-{
- if (port < MAX_USERS)
- return g_pads[port].joy_name;
- return NULL;
-}
-
static int16_t dinput_joypad_button_state(
const struct dinput_joypad_data *pad,
uint16_t joykey)
@@ -357,4 +308,54 @@ static bool dinput_joypad_set_rumble(unsigned port,
return true;
}
+/* Keep track of which pad indexes are 360 controllers.
+ * Not static, will be read in xinput_joypad.c
+ * -1 = not xbox pad, otherwise 0..3
+ */
+static void dinput_joypad_destroy(void)
+{
+ unsigned i;
+
+ for (i = 0; i < MAX_USERS; i++)
+ {
+ if (g_pads[i].joypad)
+ {
+ if (g_pads[i].rumble_iface[0])
+ {
+ IDirectInputEffect_Stop(g_pads[i].rumble_iface[0]);
+ IDirectInputEffect_Release(g_pads[i].rumble_iface[0]);
+ }
+ if (g_pads[i].rumble_iface[1])
+ {
+ IDirectInputEffect_Stop(g_pads[i].rumble_iface[1]);
+ IDirectInputEffect_Release(g_pads[i].rumble_iface[1]);
+ }
+
+ IDirectInputDevice8_Unacquire(g_pads[i].joypad);
+ IDirectInputDevice8_Release(g_pads[i].joypad);
+ }
+
+ free(g_pads[i].joy_name);
+ g_pads[i].joy_name = NULL;
+ free(g_pads[i].joy_friendly_name);
+ g_pads[i].joy_friendly_name = NULL;
+
+ input_config_clear_device_name(i);
+ }
+
+ g_joypad_cnt = 0;
+ memset(g_pads, 0, sizeof(g_pads));
+
+ /* Can be blocked by global Dinput context. */
+ dinput_destroy_context();
+}
+
+static const char *dinput_joypad_name(unsigned port)
+{
+ if (port < MAX_USERS)
+ return g_pads[port].joy_name;
+ return NULL;
+}
+
+
#endif