(WIN32) Add support for mouse button swap (#14846)
This commit is contained in:
parent
639d367773
commit
3e599d04d3
|
@ -2626,13 +2626,21 @@ bool win32_window_init(WNDCLASSEX *wndclass,
|
||||||
wndclass->hCursor = LoadCursor(NULL, IDC_ARROW);
|
wndclass->hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
wndclass->lpszClassName = class_name ? class_name : "RetroArch";
|
wndclass->lpszClassName = class_name ? class_name : "RetroArch";
|
||||||
wndclass->hIcon = LoadIcon(GetModuleHandle(NULL),
|
wndclass->hIcon = LoadIcon(GetModuleHandle(NULL),
|
||||||
MAKEINTRESOURCE(IDI_ICON));
|
MAKEINTRESOURCE(IDI_ICON));
|
||||||
wndclass->hIconSm = (HICON)LoadImage(GetModuleHandle(NULL),
|
wndclass->hIconSm = (HICON)LoadImage(GetModuleHandle(NULL),
|
||||||
MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, 0);
|
MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, 0);
|
||||||
|
|
||||||
|
if (GetSystemMetrics(SM_SWAPBUTTON))
|
||||||
|
g_win32_flags |= WIN32_CMN_FLAG_SWAP_MOUSE_BTNS;
|
||||||
|
else
|
||||||
|
g_win32_flags &= ~WIN32_CMN_FLAG_SWAP_MOUSE_BTNS;
|
||||||
|
|
||||||
if (!fullscreen)
|
if (!fullscreen)
|
||||||
wndclass->hbrBackground = (HBRUSH)COLOR_WINDOW;
|
wndclass->hbrBackground = (HBRUSH)COLOR_WINDOW;
|
||||||
|
|
||||||
if (class_name)
|
if (class_name)
|
||||||
wndclass->style |= CS_CLASSDC;
|
wndclass->style |= CS_CLASSDC;
|
||||||
|
|
||||||
return RegisterClassEx(wndclass);
|
return RegisterClassEx(wndclass);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -70,7 +70,8 @@ enum win32_common_flags
|
||||||
WIN32_CMN_FLAG_RESIZED = (1 << 1),
|
WIN32_CMN_FLAG_RESIZED = (1 << 1),
|
||||||
WIN32_CMN_FLAG_TASKBAR_CREATED = (1 << 2),
|
WIN32_CMN_FLAG_TASKBAR_CREATED = (1 << 2),
|
||||||
WIN32_CMN_FLAG_RESTORE_DESKTOP = (1 << 3),
|
WIN32_CMN_FLAG_RESTORE_DESKTOP = (1 << 3),
|
||||||
WIN32_CMN_FLAG_INITED = (1 << 4)
|
WIN32_CMN_FLAG_INITED = (1 << 4),
|
||||||
|
WIN32_CMN_FLAG_SWAP_MOUSE_BTNS = (1 << 5)
|
||||||
};
|
};
|
||||||
|
|
||||||
extern uint8_t g_win32_flags;
|
extern uint8_t g_win32_flags;
|
||||||
|
@ -104,8 +105,8 @@ bool win32_get_video_output(DEVMODE *dm, int mode, size_t len);
|
||||||
bool win32_window_init(WNDCLASSEX *wndclass, bool fullscreen, const char *class_name);
|
bool win32_window_init(WNDCLASSEX *wndclass, bool fullscreen, const char *class_name);
|
||||||
|
|
||||||
void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use,
|
void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use,
|
||||||
unsigned *width, unsigned *height, bool fullscreen, bool windowed_full,
|
unsigned *width, unsigned *height, bool fullscreen, bool windowed_full,
|
||||||
RECT *rect, RECT *mon_rect, DWORD *style);
|
RECT *rect, RECT *mon_rect, DWORD *style);
|
||||||
#endif
|
#endif
|
||||||
void win32_monitor_from_window(void);
|
void win32_monitor_from_window(void);
|
||||||
#endif
|
#endif
|
||||||
|
@ -123,7 +124,7 @@ bool win32_window_create(void *data, unsigned style,
|
||||||
bool win32_suppress_screensaver(void *data, bool enable);
|
bool win32_suppress_screensaver(void *data, bool enable);
|
||||||
|
|
||||||
bool win32_get_metrics(void *data,
|
bool win32_get_metrics(void *data,
|
||||||
enum display_metric_types type, float *value);
|
enum display_metric_types type, float *value);
|
||||||
|
|
||||||
void win32_show_cursor(void *data, bool state);
|
void win32_show_cursor(void *data, bool state);
|
||||||
|
|
||||||
|
|
|
@ -307,6 +307,7 @@ static void dinput_poll(void *data)
|
||||||
POINT point;
|
POINT point;
|
||||||
DIMOUSESTATE2 mouse_state;
|
DIMOUSESTATE2 mouse_state;
|
||||||
BYTE *rgb_buttons_ptr = &mouse_state.rgbButtons[0];
|
BYTE *rgb_buttons_ptr = &mouse_state.rgbButtons[0];
|
||||||
|
bool swap_mouse_buttons = g_win32_flags & WIN32_CMN_FLAG_SWAP_MOUSE_BTNS;
|
||||||
|
|
||||||
point.x = 0;
|
point.x = 0;
|
||||||
point.y = 0;
|
point.y = 0;
|
||||||
|
@ -340,32 +341,59 @@ static void dinput_poll(void *data)
|
||||||
di->mouse_rel_x = mouse_state.lX;
|
di->mouse_rel_x = mouse_state.lX;
|
||||||
di->mouse_rel_y = mouse_state.lY;
|
di->mouse_rel_y = mouse_state.lY;
|
||||||
|
|
||||||
if (!mouse_state.rgbButtons[0])
|
if (swap_mouse_buttons)
|
||||||
di->flags &= ~DINP_FLAG_DBCLK_ON_TITLEBAR;
|
{
|
||||||
|
if (!mouse_state.rgbButtons[1])
|
||||||
|
di->flags &= ~DINP_FLAG_DBCLK_ON_TITLEBAR;
|
||||||
|
|
||||||
if (di->flags & DINP_FLAG_DBCLK_ON_TITLEBAR)
|
if (di->flags & DINP_FLAG_DBCLK_ON_TITLEBAR)
|
||||||
di->flags &= ~DINP_FLAG_MOUSE_L_BTN;
|
di->flags &= ~DINP_FLAG_MOUSE_R_BTN;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (mouse_state.rgbButtons[0])
|
||||||
|
di->flags |= DINP_FLAG_MOUSE_R_BTN;
|
||||||
|
else
|
||||||
|
di->flags &= ~DINP_FLAG_MOUSE_R_BTN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mouse_state.rgbButtons[1])
|
||||||
|
di->flags |= DINP_FLAG_MOUSE_L_BTN;
|
||||||
|
else
|
||||||
|
di->flags &= ~DINP_FLAG_MOUSE_L_BTN;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (mouse_state.rgbButtons[0])
|
if (!mouse_state.rgbButtons[0])
|
||||||
di->flags |= DINP_FLAG_MOUSE_L_BTN;
|
di->flags &= ~DINP_FLAG_DBCLK_ON_TITLEBAR;
|
||||||
else
|
|
||||||
|
if (di->flags & DINP_FLAG_DBCLK_ON_TITLEBAR)
|
||||||
di->flags &= ~DINP_FLAG_MOUSE_L_BTN;
|
di->flags &= ~DINP_FLAG_MOUSE_L_BTN;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (mouse_state.rgbButtons[0])
|
||||||
|
di->flags |= DINP_FLAG_MOUSE_L_BTN;
|
||||||
|
else
|
||||||
|
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[1])
|
|
||||||
di->flags |= DINP_FLAG_MOUSE_R_BTN;
|
|
||||||
else
|
|
||||||
di->flags &= ~DINP_FLAG_MOUSE_R_BTN;
|
|
||||||
if (mouse_state.rgbButtons[2])
|
if (mouse_state.rgbButtons[2])
|
||||||
di->flags |= DINP_FLAG_MOUSE_M_BTN;
|
di->flags |= DINP_FLAG_MOUSE_M_BTN;
|
||||||
else
|
else
|
||||||
di->flags &= ~DINP_FLAG_MOUSE_M_BTN;
|
di->flags &= ~DINP_FLAG_MOUSE_M_BTN;
|
||||||
|
|
||||||
if (mouse_state.rgbButtons[3])
|
if (mouse_state.rgbButtons[3])
|
||||||
di->flags |= DINP_FLAG_MOUSE_B4_BTN;
|
di->flags |= DINP_FLAG_MOUSE_B4_BTN;
|
||||||
else
|
else
|
||||||
di->flags &= ~DINP_FLAG_MOUSE_B4_BTN;
|
di->flags &= ~DINP_FLAG_MOUSE_B4_BTN;
|
||||||
|
|
||||||
if (mouse_state.rgbButtons[4])
|
if (mouse_state.rgbButtons[4])
|
||||||
di->flags |= DINP_FLAG_MOUSE_B5_BTN;
|
di->flags |= DINP_FLAG_MOUSE_B5_BTN;
|
||||||
else
|
else
|
||||||
di->flags &= ~DINP_FLAG_MOUSE_B5_BTN;
|
di->flags &= ~DINP_FLAG_MOUSE_B5_BTN;
|
||||||
|
|
||||||
|
|
|
@ -320,7 +320,7 @@ static bool winraw_mouse_button_pressed(
|
||||||
winraw_mouse_t *mouse,
|
winraw_mouse_t *mouse,
|
||||||
unsigned port, unsigned key)
|
unsigned port, unsigned key)
|
||||||
{
|
{
|
||||||
switch (key)
|
switch (key)
|
||||||
{
|
{
|
||||||
case RETRO_DEVICE_ID_MOUSE_LEFT:
|
case RETRO_DEVICE_ID_MOUSE_LEFT:
|
||||||
return mouse->btn_l;
|
return mouse->btn_l;
|
||||||
|
@ -338,7 +338,7 @@ static bool winraw_mouse_button_pressed(
|
||||||
return mouse->whl_d;
|
return mouse->whl_d;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void winraw_init_mouse_xy_mapping(winraw_input_t *wr)
|
static void winraw_init_mouse_xy_mapping(winraw_input_t *wr)
|
||||||
|
@ -368,6 +368,7 @@ static void winraw_update_mouse_state(winraw_input_t *wr,
|
||||||
winraw_mouse_t *mouse, RAWMOUSE *state)
|
winraw_mouse_t *mouse, RAWMOUSE *state)
|
||||||
{
|
{
|
||||||
POINT crs_pos;
|
POINT crs_pos;
|
||||||
|
bool swap_mouse_buttons = g_win32_flags & WIN32_CMN_FLAG_SWAP_MOUSE_BTNS;
|
||||||
|
|
||||||
/* Used for fixing coordinates after switching resolutions */
|
/* Used for fixing coordinates after switching resolutions */
|
||||||
GetClientRect((HWND)video_driver_window_get(), &wr->prev_rect);
|
GetClientRect((HWND)video_driver_window_get(), &wr->prev_rect);
|
||||||
|
@ -381,11 +382,11 @@ static void winraw_update_mouse_state(winraw_input_t *wr,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int bottom = wr->prev_rect.bottom;
|
int bottom = wr->prev_rect.bottom;
|
||||||
int right = wr->prev_rect.right;
|
int right = wr->prev_rect.right;
|
||||||
wr->active_rect = wr->prev_rect;
|
wr->active_rect = wr->prev_rect;
|
||||||
winraw_init_mouse_xy_mapping(wr);
|
winraw_init_mouse_xy_mapping(wr);
|
||||||
wr->rect_delay = 0;
|
wr->rect_delay = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -465,20 +466,35 @@ static void winraw_update_mouse_state(winraw_input_t *wr,
|
||||||
mouse->y = crs_pos.y;
|
mouse->y = crs_pos.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
|
if (swap_mouse_buttons)
|
||||||
mouse->btn_l = true;
|
{
|
||||||
else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
|
if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
|
||||||
mouse->btn_l = false;
|
mouse->btn_r = true;
|
||||||
|
else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
|
||||||
|
mouse->btn_r = false;
|
||||||
|
|
||||||
|
if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
|
||||||
|
mouse->btn_l = true;
|
||||||
|
else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
|
||||||
|
mouse->btn_l = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
|
||||||
|
mouse->btn_l = true;
|
||||||
|
else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
|
||||||
|
mouse->btn_l = false;
|
||||||
|
|
||||||
|
if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
|
||||||
|
mouse->btn_r = true;
|
||||||
|
else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
|
||||||
|
mouse->btn_r = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
|
if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
|
||||||
mouse->btn_m = true;
|
mouse->btn_m = true;
|
||||||
else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
|
else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
|
||||||
mouse->btn_m = false;
|
mouse->btn_m = false;
|
||||||
|
|
||||||
if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
|
|
||||||
mouse->btn_r = true;
|
|
||||||
else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
|
|
||||||
mouse->btn_r = false;
|
|
||||||
|
|
||||||
if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN)
|
if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN)
|
||||||
mouse->btn_b4 = true;
|
mouse->btn_b4 = true;
|
||||||
|
@ -955,28 +971,26 @@ static int16_t winraw_input_state(
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RETRO_DEVICE_LIGHTGUN:
|
case RETRO_DEVICE_LIGHTGUN:
|
||||||
switch (id)
|
switch (id)
|
||||||
{
|
{
|
||||||
/*aiming*/
|
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X:
|
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y:
|
case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN:
|
if (mouse)
|
||||||
if (mouse)
|
return winraw_lightgun_aiming_state(wr, mouse, port, id);
|
||||||
return winraw_lightgun_aiming_state(wr, mouse, port, id);
|
break;
|
||||||
break;
|
case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER:
|
||||||
/*buttons*/
|
case RETRO_DEVICE_ID_LIGHTGUN_RELOAD:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER:
|
case RETRO_DEVICE_ID_LIGHTGUN_AUX_A:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_RELOAD:
|
case RETRO_DEVICE_ID_LIGHTGUN_AUX_B:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_AUX_A:
|
case RETRO_DEVICE_ID_LIGHTGUN_AUX_C:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_AUX_B:
|
case RETRO_DEVICE_ID_LIGHTGUN_START:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_AUX_C:
|
case RETRO_DEVICE_ID_LIGHTGUN_SELECT:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_START:
|
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_SELECT:
|
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP:
|
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN:
|
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT:
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT:
|
case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: /* deprecated */
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT:
|
|
||||||
case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: /* deprecated */
|
|
||||||
{
|
{
|
||||||
unsigned new_id = winraw_retro_id_to_rarch(id);
|
unsigned new_id = winraw_retro_id_to_rarch(id);
|
||||||
const uint64_t bind_joykey = input_config_binds[port][new_id].joykey;
|
const uint64_t bind_joykey = input_config_binds[port][new_id].joykey;
|
||||||
|
|
Loading…
Reference in New Issue