Fallback if mouse or keyboard interface is not working.

Problems with tablets on Windows.
This commit is contained in:
Themaister 2014-01-15 17:35:23 +01:00
parent c4978651fa
commit af7fb86427
1 changed files with 49 additions and 39 deletions

View File

@ -102,7 +102,10 @@ static bool dinput_init_context(void)
static void *dinput_init(void) static void *dinput_init(void)
{ {
if (!dinput_init_context()) if (!dinput_init_context())
{
RARCH_ERR("Failed to start DirectInput driver.\n");
return NULL; return NULL;
}
struct dinput_input *di = (struct dinput_input*)calloc(1, sizeof(*di)); struct dinput_input *di = (struct dinput_input*)calloc(1, sizeof(*di));
if (!di) if (!di)
@ -112,47 +115,47 @@ static void *dinput_init(void)
if (FAILED(IDirectInput8_CreateDevice(g_ctx, GUID_SysKeyboard, &di->keyboard, NULL))) if (FAILED(IDirectInput8_CreateDevice(g_ctx, GUID_SysKeyboard, &di->keyboard, NULL)))
{ {
RARCH_ERR("Failed to create keyboard device.\n"); RARCH_ERR("Failed to create keyboard device.\n");
goto error; di->keyboard = NULL;
} }
if (FAILED(IDirectInput8_CreateDevice(g_ctx, GUID_SysMouse, &di->mouse, NULL))) if (FAILED(IDirectInput8_CreateDevice(g_ctx, GUID_SysMouse, &di->mouse, NULL)))
{ {
RARCH_ERR("Failed to create mouse device.\n"); RARCH_ERR("Failed to create mouse device.\n");
goto error; di->mouse = NULL;
} }
#else #else
if (FAILED(IDirectInput8_CreateDevice(g_ctx, &GUID_SysKeyboard, &di->keyboard, NULL))) if (FAILED(IDirectInput8_CreateDevice(g_ctx, &GUID_SysKeyboard, &di->keyboard, NULL)))
{ {
RARCH_ERR("Failed to create keyboard device.\n"); RARCH_ERR("Failed to create keyboard device.\n");
goto error; di->keyboard = NULL;
} }
if (FAILED(IDirectInput8_CreateDevice(g_ctx, &GUID_SysMouse, &di->mouse, NULL))) if (FAILED(IDirectInput8_CreateDevice(g_ctx, &GUID_SysMouse, &di->mouse, NULL)))
{ {
RARCH_ERR("Failed to create mouse device.\n"); RARCH_ERR("Failed to create mouse device.\n");
goto error; di->mouse = NULL;
} }
#endif #endif
if (di->keyboard)
{
IDirectInputDevice8_SetDataFormat(di->keyboard, &c_dfDIKeyboard); IDirectInputDevice8_SetDataFormat(di->keyboard, &c_dfDIKeyboard);
IDirectInputDevice8_SetCooperativeLevel(di->keyboard, IDirectInputDevice8_SetCooperativeLevel(di->keyboard,
(HWND)driver.video_window, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); (HWND)driver.video_window, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
IDirectInputDevice8_Acquire(di->keyboard); IDirectInputDevice8_Acquire(di->keyboard);
}
if (di->mouse)
{
IDirectInputDevice8_SetDataFormat(di->mouse, &c_dfDIMouse2); IDirectInputDevice8_SetDataFormat(di->mouse, &c_dfDIMouse2);
IDirectInputDevice8_SetCooperativeLevel(di->mouse, (HWND)driver.video_window, IDirectInputDevice8_SetCooperativeLevel(di->mouse, (HWND)driver.video_window,
DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
IDirectInputDevice8_Acquire(di->mouse); IDirectInputDevice8_Acquire(di->mouse);
}
input_init_keyboard_lut(rarch_key_map_dinput); input_init_keyboard_lut(rarch_key_map_dinput);
di->joypad = input_joypad_init_driver(g_settings.input.joypad_driver); di->joypad = input_joypad_init_driver(g_settings.input.joypad_driver);
return di; return di;
error:
RARCH_ERR("Failed to start DirectInput driver.\n");
dinput_destroy_context();
free(di);
return NULL;
} }
static void dinput_poll(void *data) static void dinput_poll(void *data)
@ -160,15 +163,21 @@ static void dinput_poll(void *data)
struct dinput_input *di = (struct dinput_input*)data; struct dinput_input *di = (struct dinput_input*)data;
memset(di->state, 0, sizeof(di->state)); memset(di->state, 0, sizeof(di->state));
if (di->keyboard)
{
if (FAILED(IDirectInputDevice8_GetDeviceState(di->keyboard, sizeof(di->state), di->state))) if (FAILED(IDirectInputDevice8_GetDeviceState(di->keyboard, sizeof(di->state), di->state)))
{ {
IDirectInputDevice8_Acquire(di->keyboard); IDirectInputDevice8_Acquire(di->keyboard);
if (FAILED(IDirectInputDevice8_GetDeviceState(di->keyboard, sizeof(di->state), di->state))) if (FAILED(IDirectInputDevice8_GetDeviceState(di->keyboard, sizeof(di->state), di->state)))
memset(di->state, 0, sizeof(di->state)); memset(di->state, 0, sizeof(di->state));
} }
}
if (di->mouse)
{
DIMOUSESTATE2 mouse_state; DIMOUSESTATE2 mouse_state;
memset(&mouse_state, 0, sizeof(mouse_state)); memset(&mouse_state, 0, sizeof(mouse_state));
if (FAILED(IDirectInputDevice8_GetDeviceState(di->mouse, sizeof(mouse_state), &mouse_state))) if (FAILED(IDirectInputDevice8_GetDeviceState(di->mouse, sizeof(mouse_state), &mouse_state)))
{ {
IDirectInputDevice8_Acquire(di->mouse); IDirectInputDevice8_Acquire(di->mouse);
@ -188,6 +197,7 @@ static void dinput_poll(void *data)
ScreenToClient((HWND)driver.video_window, &point); ScreenToClient((HWND)driver.video_window, &point);
di->mouse_x = point.x; di->mouse_x = point.x;
di->mouse_y = point.y; di->mouse_y = point.y;
}
input_joypad_poll(di->joypad); input_joypad_poll(di->joypad);
} }