diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index 8791b05e43..89594cf6db 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -65,6 +65,10 @@ #include #endif +#ifndef SM_SERVERR2 +#define SM_SERVERR2 89 +#endif + enum platform_win32_flags { PLAT_WIN32_FLAG_USE_POWERSHELL = (1 << 0), @@ -76,16 +80,12 @@ enum platform_win32_flags }; #ifdef HAVE_SAPI -static ISpVoice* pVoice = NULL; +static ISpVoice* pVoice = NULL; #endif #ifdef HAVE_NVDA -uint8_t g_plat_win32_flags = PLAT_WIN32_FLAG_USE_NVDA; +static uint8_t g_plat_win32_flags = PLAT_WIN32_FLAG_USE_NVDA; #else -uint8_t g_plat_win32_flags = PLAT_WIN32_FLAG_USE_POWERSHELL; -#endif - -#ifndef SM_SERVERR2 -#define SM_SERVERR2 89 +static uint8_t g_plat_win32_flags = PLAT_WIN32_FLAG_USE_POWERSHELL; #endif /* static public global variable */ diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index bb200452e6..3857b8b329 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -66,24 +66,38 @@ struct dinput_pointer_status int pointer_y; }; +enum dinput_input_flags +{ + DINP_FLAG_SHIFT_L = (1 << 0), + DINP_FLAG_SHIFT_R = (1 << 1), + DINP_FLAG_ALT_L = (1 << 2), + DINP_FLAG_DBCLK_ON_TITLEBAR = (1 << 3), + DINP_FLAG_MOUSE_L_BTN = (1 << 4), + DINP_FLAG_MOUSE_R_BTN = (1 << 5), + DINP_FLAG_MOUSE_M_BTN = (1 << 6), + DINP_FLAG_MOUSE_B4_BTN = (1 << 7), + DINP_FLAG_MOUSE_B5_BTN = (1 << 8), + DINP_FLAG_MOUSE_WU_BTN = (1 << 9), + DINP_FLAG_MOUSE_WD_BTN = (1 << 10), + DINP_FLAG_MOUSE_HWU_BTN = (1 << 11), + DINP_FLAG_MOUSE_HWD_BTN = (1 << 12) +}; + struct dinput_input { char *joypad_driver_name; LPDIRECTINPUTDEVICE8 keyboard; LPDIRECTINPUTDEVICE8 mouse; const input_device_driver_t *joypad; - struct dinput_pointer_status pointer_head; /* dummy head for easier iteration */ - + struct dinput_pointer_status pointer_head; /* dummy head for easy iteration */ int window_pos_x; int window_pos_y; int mouse_rel_x; int mouse_rel_y; int mouse_x; int mouse_y; + uint16_t flags; uint8_t state[256]; - bool shift_l, shift_r, alt_l; - bool doubleclick_on_titlebar; - bool mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; }; void dinput_destroy_context(void) @@ -159,13 +173,10 @@ static void *dinput_init(const char *joypad_driver) if (di->keyboard) { - DWORD flags; - settings_t *settings; - - settings = config_get_ptr(); - flags = DISCL_NONEXCLUSIVE | DISCL_FOREGROUND; + settings_t *settings = config_get_ptr(); + DWORD flags = DISCL_NONEXCLUSIVE | DISCL_FOREGROUND; if (settings->bools.input_nowinkey_enable) - flags |= DISCL_NOWINKEY; + flags |= DISCL_NOWINKEY; IDirectInputDevice8_SetDataFormat(di->keyboard, &c_dfDIKeyboard); IDirectInputDevice8_SetCooperativeLevel(di->keyboard, @@ -199,20 +210,26 @@ static void dinput_keyboard_mods(struct dinput_input *di, int mod) unsigned vk_shift_l = GetAsyncKeyState(VK_LSHIFT) >> 1; unsigned vk_shift_r = GetAsyncKeyState(VK_RSHIFT) >> 1; - if ( (vk_shift_l && !di->shift_l) || - (!vk_shift_l && di->shift_l)) + if ( ( vk_shift_l && (!(di->flags & DINP_FLAG_SHIFT_L))) + || (!vk_shift_l && (di->flags & DINP_FLAG_SHIFT_L))) { input_keyboard_event(vk_shift_l, RETROK_LSHIFT, 0, RETROKMOD_SHIFT, RETRO_DEVICE_KEYBOARD); - di->shift_l = !di->shift_l; + if (di->flags & DINP_FLAG_SHIFT_L) + di->flags &= ~DINP_FLAG_SHIFT_L; + else + di->flags |= DINP_FLAG_SHIFT_L; } - if ( (vk_shift_r && !di->shift_r) || - (!vk_shift_r && di->shift_r)) + if ( ( vk_shift_r && (!(di->flags & DINP_FLAG_SHIFT_R))) + || (!vk_shift_r && (di->flags & DINP_FLAG_SHIFT_R))) { input_keyboard_event(vk_shift_r, RETROK_RSHIFT, 0, RETROKMOD_SHIFT, RETRO_DEVICE_KEYBOARD); - di->shift_r = !di->shift_r; + if (di->flags & DINP_FLAG_SHIFT_R) + di->flags &= ~DINP_FLAG_SHIFT_R; + else + di->flags |= DINP_FLAG_SHIFT_R; } } break; @@ -221,13 +238,21 @@ static void dinput_keyboard_mods(struct dinput_input *di, int mod) { unsigned vk_alt_l = GetAsyncKeyState(VK_LMENU) >> 1; - if (vk_alt_l && !di->alt_l) - di->alt_l = !di->alt_l; - else if (!vk_alt_l && di->alt_l) + if (vk_alt_l && (!(di->flags & DINP_FLAG_ALT_L))) + { + if (di->flags & DINP_FLAG_ALT_L) + di->flags &= ~DINP_FLAG_ALT_L; + else + di->flags |= DINP_FLAG_ALT_L; + } + else if (!vk_alt_l && (di->flags & DINP_FLAG_ALT_L)) { input_keyboard_event(vk_alt_l, RETROK_LALT, 0, RETROKMOD_ALT, RETRO_DEVICE_KEYBOARD); - di->alt_l = !di->alt_l; + if (di->flags & DINP_FLAG_ALT_L) + di->flags &= ~DINP_FLAG_ALT_L; + else + di->flags |= DINP_FLAG_ALT_L; } } break; @@ -316,15 +341,31 @@ static void dinput_poll(void *data) di->mouse_rel_y = mouse_state.lY; if (!mouse_state.rgbButtons[0]) - di->doubleclick_on_titlebar = false; - if (di->doubleclick_on_titlebar) - di->mouse_l = 0; + di->flags &= ~DINP_FLAG_DBCLK_ON_TITLEBAR; + + if (di->flags & DINP_FLAG_DBCLK_ON_TITLEBAR) + di->flags &= ~DINP_FLAG_MOUSE_L_BTN; else - di->mouse_l = mouse_state.rgbButtons[0]; - di->mouse_r = mouse_state.rgbButtons[1]; - di->mouse_m = mouse_state.rgbButtons[2]; - di->mouse_b4 = mouse_state.rgbButtons[3]; - di->mouse_b5 = mouse_state.rgbButtons[4]; + { + if (mouse_state.rgbButtons[0]) + di->flags |= DINP_FLAG_MOUSE_L_BTN; + } + if (mouse_state.rgbButtons[1]) + di->flags |= DINP_FLAG_MOUSE_R_BTN; + else + di->flags &= ~DINP_FLAG_MOUSE_R_BTN; + if (mouse_state.rgbButtons[2]) + di->flags |= DINP_FLAG_MOUSE_M_BTN; + else + di->flags &= ~DINP_FLAG_MOUSE_M_BTN; + if (mouse_state.rgbButtons[3]) + di->flags |= DINP_FLAG_MOUSE_B4_BTN; + else + di->flags &= ~DINP_FLAG_MOUSE_B4_BTN; + if (mouse_state.rgbButtons[4]) + di->flags |= DINP_FLAG_MOUSE_B5_BTN; + else + di->flags &= ~DINP_FLAG_MOUSE_B5_BTN; /* No simple way to get absolute coordinates * for RETRO_DEVICE_POINTER. Just use Win32 APIs. */ @@ -343,34 +384,30 @@ static bool dinput_mouse_button_pressed( switch (key) { case RETRO_DEVICE_ID_MOUSE_LEFT: - return di->mouse_l; + return (di->flags & DINP_FLAG_MOUSE_L_BTN); case RETRO_DEVICE_ID_MOUSE_RIGHT: - return di->mouse_r; + return (di->flags & DINP_FLAG_MOUSE_R_BTN); case RETRO_DEVICE_ID_MOUSE_MIDDLE: - return di->mouse_m; + return (di->flags & DINP_FLAG_MOUSE_M_BTN); case RETRO_DEVICE_ID_MOUSE_BUTTON_4: - return di->mouse_b4; + return (di->flags & DINP_FLAG_MOUSE_B4_BTN); case RETRO_DEVICE_ID_MOUSE_BUTTON_5: - return di->mouse_b5; - + return (di->flags & DINP_FLAG_MOUSE_B5_BTN); case RETRO_DEVICE_ID_MOUSE_WHEELUP: - result = di->mouse_wu; - di->mouse_wu = false; + result = di->flags & DINP_FLAG_MOUSE_WU_BTN; + di->flags &= ~DINP_FLAG_MOUSE_WU_BTN; return result; - case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: - result = di->mouse_wd; - di->mouse_wd = false; + result = di->flags & DINP_FLAG_MOUSE_WD_BTN; + di->flags &= ~DINP_FLAG_MOUSE_WD_BTN; return result; - case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: - result = di->mouse_hwu; - di->mouse_hwu = false; + result = di->flags & DINP_FLAG_MOUSE_HWU_BTN; + di->flags &= ~DINP_FLAG_MOUSE_HWU_BTN; return result; - case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: - result = di->mouse_hwd; - di->mouse_hwd = false; + result = di->flags & DINP_FLAG_MOUSE_HWD_BTN; + di->flags &= ~DINP_FLAG_MOUSE_HWD_BTN; return result; } @@ -625,35 +662,35 @@ static int16_t dinput_input_state( case RETRO_DEVICE_ID_MOUSE_Y: return di->mouse_rel_y; case RETRO_DEVICE_ID_MOUSE_LEFT: - return di->mouse_l; + return (di->flags & DINP_FLAG_MOUSE_L_BTN); case RETRO_DEVICE_ID_MOUSE_RIGHT: - return di->mouse_r; + return (di->flags & DINP_FLAG_MOUSE_R_BTN); case RETRO_DEVICE_ID_MOUSE_WHEELUP: - if (di->mouse_wu) + if (di->flags & DINP_FLAG_MOUSE_WU_BTN) state = 1; - di->mouse_wu = false; + di->flags &= ~DINP_FLAG_MOUSE_WU_BTN; return state; case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: - if (di->mouse_wd) + if (di->flags & DINP_FLAG_MOUSE_WD_BTN) state = 1; - di->mouse_wd = false; + di->flags &= ~DINP_FLAG_MOUSE_WD_BTN; return state; case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: - if (di->mouse_hwu) + if (di->flags & DINP_FLAG_MOUSE_HWU_BTN) state = 1; - di->mouse_hwu = false; + di->flags &= ~DINP_FLAG_MOUSE_HWU_BTN; return state; case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: - if (di->mouse_hwd) + if (di->flags & DINP_FLAG_MOUSE_HWD_BTN) state = 1; - di->mouse_hwd = false; + di->flags &= ~DINP_FLAG_MOUSE_HWD_BTN; return state; case RETRO_DEVICE_ID_MOUSE_MIDDLE: - return di->mouse_m; + return (di->flags & DINP_FLAG_MOUSE_M_BTN); case RETRO_DEVICE_ID_MOUSE_BUTTON_4: - return di->mouse_b4; + return (di->flags & DINP_FLAG_MOUSE_B4_BTN); case RETRO_DEVICE_ID_MOUSE_BUTTON_5: - return di->mouse_b5; + return (di->flags & DINP_FLAG_MOUSE_B5_BTN); } } break; @@ -690,7 +727,7 @@ static int16_t dinput_input_state( x = di->mouse_x; y = di->mouse_y; - pointer_down = di->mouse_l; + pointer_down = di->flags & DINP_FLAG_MOUSE_L_BTN; if (check_pos) { @@ -903,7 +940,7 @@ bool dinput_handle_message(void *data, switch (message) { case WM_NCLBUTTONDBLCLK: - di->doubleclick_on_titlebar = true; + di->flags |= DINP_FLAG_DBCLK_ON_TITLEBAR; break; case WM_MOUSEMOVE: di->window_pos_x = GET_X_LPARAM(lParam); @@ -958,15 +995,15 @@ bool dinput_handle_message(void *data, break; case WM_MOUSEWHEEL: if (((short) HIWORD(wParam))/120 > 0) - di->mouse_wu = true; + di->flags |= DINP_FLAG_MOUSE_WU_BTN; if (((short) HIWORD(wParam))/120 < 0) - di->mouse_wd = true; + di->flags |= DINP_FLAG_MOUSE_WD_BTN; break; case WM_MOUSEHWHEEL: if (((short) HIWORD(wParam))/120 > 0) - di->mouse_hwu = true; + di->flags |= DINP_FLAG_MOUSE_HWU_BTN; if (((short) HIWORD(wParam))/120 < 0) - di->mouse_hwd = true; + di->flags |= DINP_FLAG_MOUSE_HWD_BTN; break; }