Skip to content

Commit 3e599d0

Browse files
authored
(WIN32) Add support for mouse button swap (libretro#14846)
1 parent 639d367 commit 3e599d0

File tree

4 files changed

+112
-61
lines changed

4 files changed

+112
-61
lines changed

gfx/common/win32_common.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2626,13 +2626,21 @@ bool win32_window_init(WNDCLASSEX *wndclass,
26262626
wndclass->hCursor = LoadCursor(NULL, IDC_ARROW);
26272627
wndclass->lpszClassName = class_name ? class_name : "RetroArch";
26282628
wndclass->hIcon = LoadIcon(GetModuleHandle(NULL),
2629-
MAKEINTRESOURCE(IDI_ICON));
2629+
MAKEINTRESOURCE(IDI_ICON));
26302630
wndclass->hIconSm = (HICON)LoadImage(GetModuleHandle(NULL),
2631-
MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, 0);
2631+
MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, 0);
2632+
2633+
if (GetSystemMetrics(SM_SWAPBUTTON))
2634+
g_win32_flags |= WIN32_CMN_FLAG_SWAP_MOUSE_BTNS;
2635+
else
2636+
g_win32_flags &= ~WIN32_CMN_FLAG_SWAP_MOUSE_BTNS;
2637+
26322638
if (!fullscreen)
26332639
wndclass->hbrBackground = (HBRUSH)COLOR_WINDOW;
2640+
26342641
if (class_name)
2635-
wndclass->style |= CS_CLASSDC;
2642+
wndclass->style |= CS_CLASSDC;
2643+
26362644
return RegisterClassEx(wndclass);
26372645
}
26382646
#endif

gfx/common/win32_common.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ enum win32_common_flags
7070
WIN32_CMN_FLAG_RESIZED = (1 << 1),
7171
WIN32_CMN_FLAG_TASKBAR_CREATED = (1 << 2),
7272
WIN32_CMN_FLAG_RESTORE_DESKTOP = (1 << 3),
73-
WIN32_CMN_FLAG_INITED = (1 << 4)
73+
WIN32_CMN_FLAG_INITED = (1 << 4),
74+
WIN32_CMN_FLAG_SWAP_MOUSE_BTNS = (1 << 5)
7475
};
7576

7677
extern uint8_t g_win32_flags;
@@ -104,8 +105,8 @@ bool win32_get_video_output(DEVMODE *dm, int mode, size_t len);
104105
bool win32_window_init(WNDCLASSEX *wndclass, bool fullscreen, const char *class_name);
105106

106107
void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use,
107-
unsigned *width, unsigned *height, bool fullscreen, bool windowed_full,
108-
RECT *rect, RECT *mon_rect, DWORD *style);
108+
unsigned *width, unsigned *height, bool fullscreen, bool windowed_full,
109+
RECT *rect, RECT *mon_rect, DWORD *style);
109110
#endif
110111
void win32_monitor_from_window(void);
111112
#endif
@@ -123,7 +124,7 @@ bool win32_window_create(void *data, unsigned style,
123124
bool win32_suppress_screensaver(void *data, bool enable);
124125

125126
bool win32_get_metrics(void *data,
126-
enum display_metric_types type, float *value);
127+
enum display_metric_types type, float *value);
127128

128129
void win32_show_cursor(void *data, bool state);
129130

input/drivers/dinput.c

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ static void dinput_poll(void *data)
307307
POINT point;
308308
DIMOUSESTATE2 mouse_state;
309309
BYTE *rgb_buttons_ptr = &mouse_state.rgbButtons[0];
310+
bool swap_mouse_buttons = g_win32_flags & WIN32_CMN_FLAG_SWAP_MOUSE_BTNS;
310311

311312
point.x = 0;
312313
point.y = 0;
@@ -340,32 +341,59 @@ static void dinput_poll(void *data)
340341
di->mouse_rel_x = mouse_state.lX;
341342
di->mouse_rel_y = mouse_state.lY;
342343

343-
if (!mouse_state.rgbButtons[0])
344-
di->flags &= ~DINP_FLAG_DBCLK_ON_TITLEBAR;
344+
if (swap_mouse_buttons)
345+
{
346+
if (!mouse_state.rgbButtons[1])
347+
di->flags &= ~DINP_FLAG_DBCLK_ON_TITLEBAR;
348+
349+
if (di->flags & DINP_FLAG_DBCLK_ON_TITLEBAR)
350+
di->flags &= ~DINP_FLAG_MOUSE_R_BTN;
351+
else
352+
{
353+
if (mouse_state.rgbButtons[0])
354+
di->flags |= DINP_FLAG_MOUSE_R_BTN;
355+
else
356+
di->flags &= ~DINP_FLAG_MOUSE_R_BTN;
357+
}
345358

346-
if (di->flags & DINP_FLAG_DBCLK_ON_TITLEBAR)
347-
di->flags &= ~DINP_FLAG_MOUSE_L_BTN;
359+
if (mouse_state.rgbButtons[1])
360+
di->flags |= DINP_FLAG_MOUSE_L_BTN;
361+
else
362+
di->flags &= ~DINP_FLAG_MOUSE_L_BTN;
363+
}
348364
else
349365
{
350-
if (mouse_state.rgbButtons[0])
351-
di->flags |= DINP_FLAG_MOUSE_L_BTN;
352-
else
366+
if (!mouse_state.rgbButtons[0])
367+
di->flags &= ~DINP_FLAG_DBCLK_ON_TITLEBAR;
368+
369+
if (di->flags & DINP_FLAG_DBCLK_ON_TITLEBAR)
353370
di->flags &= ~DINP_FLAG_MOUSE_L_BTN;
371+
else
372+
{
373+
if (mouse_state.rgbButtons[0])
374+
di->flags |= DINP_FLAG_MOUSE_L_BTN;
375+
else
376+
di->flags &= ~DINP_FLAG_MOUSE_L_BTN;
377+
}
378+
379+
if (mouse_state.rgbButtons[1])
380+
di->flags |= DINP_FLAG_MOUSE_R_BTN;
381+
else
382+
di->flags &= ~DINP_FLAG_MOUSE_R_BTN;
354383
}
355-
if (mouse_state.rgbButtons[1])
356-
di->flags |= DINP_FLAG_MOUSE_R_BTN;
357-
else
358-
di->flags &= ~DINP_FLAG_MOUSE_R_BTN;
384+
359385
if (mouse_state.rgbButtons[2])
360-
di->flags |= DINP_FLAG_MOUSE_M_BTN;
386+
di->flags |= DINP_FLAG_MOUSE_M_BTN;
361387
else
362388
di->flags &= ~DINP_FLAG_MOUSE_M_BTN;
389+
363390
if (mouse_state.rgbButtons[3])
364-
di->flags |= DINP_FLAG_MOUSE_B4_BTN;
391+
di->flags |= DINP_FLAG_MOUSE_B4_BTN;
365392
else
366393
di->flags &= ~DINP_FLAG_MOUSE_B4_BTN;
394+
367395
if (mouse_state.rgbButtons[4])
368-
di->flags |= DINP_FLAG_MOUSE_B5_BTN;
396+
di->flags |= DINP_FLAG_MOUSE_B5_BTN;
369397
else
370398
di->flags &= ~DINP_FLAG_MOUSE_B5_BTN;
371399

input/drivers/winraw_input.c

Lines changed: 54 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ static bool winraw_mouse_button_pressed(
320320
winraw_mouse_t *mouse,
321321
unsigned port, unsigned key)
322322
{
323-
switch (key)
323+
switch (key)
324324
{
325325
case RETRO_DEVICE_ID_MOUSE_LEFT:
326326
return mouse->btn_l;
@@ -338,7 +338,7 @@ static bool winraw_mouse_button_pressed(
338338
return mouse->whl_d;
339339
}
340340

341-
return false;
341+
return false;
342342
}
343343

344344
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,
368368
winraw_mouse_t *mouse, RAWMOUSE *state)
369369
{
370370
POINT crs_pos;
371+
bool swap_mouse_buttons = g_win32_flags & WIN32_CMN_FLAG_SWAP_MOUSE_BTNS;
371372

372373
/* Used for fixing coordinates after switching resolutions */
373374
GetClientRect((HWND)video_driver_window_get(), &wr->prev_rect);
@@ -381,11 +382,11 @@ static void winraw_update_mouse_state(winraw_input_t *wr,
381382
}
382383
else
383384
{
384-
int bottom = wr->prev_rect.bottom;
385-
int right = wr->prev_rect.right;
386-
wr->active_rect = wr->prev_rect;
387-
winraw_init_mouse_xy_mapping(wr);
388-
wr->rect_delay = 0;
385+
int bottom = wr->prev_rect.bottom;
386+
int right = wr->prev_rect.right;
387+
wr->active_rect = wr->prev_rect;
388+
winraw_init_mouse_xy_mapping(wr);
389+
wr->rect_delay = 0;
389390
}
390391
}
391392

@@ -465,20 +466,35 @@ static void winraw_update_mouse_state(winraw_input_t *wr,
465466
mouse->y = crs_pos.y;
466467
}
467468

468-
if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
469-
mouse->btn_l = true;
470-
else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
471-
mouse->btn_l = false;
469+
if (swap_mouse_buttons)
470+
{
471+
if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
472+
mouse->btn_r = true;
473+
else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
474+
mouse->btn_r = false;
475+
476+
if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
477+
mouse->btn_l = true;
478+
else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
479+
mouse->btn_l = false;
480+
}
481+
else
482+
{
483+
if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
484+
mouse->btn_l = true;
485+
else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
486+
mouse->btn_l = false;
487+
488+
if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
489+
mouse->btn_r = true;
490+
else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
491+
mouse->btn_r = false;
492+
}
472493

473494
if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
474-
mouse->btn_m = true;
495+
mouse->btn_m = true;
475496
else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
476-
mouse->btn_m = false;
477-
478-
if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
479-
mouse->btn_r = true;
480-
else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
481-
mouse->btn_r = false;
497+
mouse->btn_m = false;
482498

483499
if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN)
484500
mouse->btn_b4 = true;
@@ -955,28 +971,26 @@ static int16_t winraw_input_state(
955971
}
956972
break;
957973
case RETRO_DEVICE_LIGHTGUN:
958-
switch (id)
959-
{
960-
/*aiming*/
961-
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X:
962-
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y:
963-
case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN:
964-
if (mouse)
965-
return winraw_lightgun_aiming_state(wr, mouse, port, id);
966-
break;
967-
/*buttons*/
968-
case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER:
969-
case RETRO_DEVICE_ID_LIGHTGUN_RELOAD:
970-
case RETRO_DEVICE_ID_LIGHTGUN_AUX_A:
971-
case RETRO_DEVICE_ID_LIGHTGUN_AUX_B:
972-
case RETRO_DEVICE_ID_LIGHTGUN_AUX_C:
973-
case RETRO_DEVICE_ID_LIGHTGUN_START:
974-
case RETRO_DEVICE_ID_LIGHTGUN_SELECT:
975-
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP:
976-
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN:
977-
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT:
978-
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT:
979-
case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: /* deprecated */
974+
switch (id)
975+
{
976+
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X:
977+
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y:
978+
case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN:
979+
if (mouse)
980+
return winraw_lightgun_aiming_state(wr, mouse, port, id);
981+
break;
982+
case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER:
983+
case RETRO_DEVICE_ID_LIGHTGUN_RELOAD:
984+
case RETRO_DEVICE_ID_LIGHTGUN_AUX_A:
985+
case RETRO_DEVICE_ID_LIGHTGUN_AUX_B:
986+
case RETRO_DEVICE_ID_LIGHTGUN_AUX_C:
987+
case RETRO_DEVICE_ID_LIGHTGUN_START:
988+
case RETRO_DEVICE_ID_LIGHTGUN_SELECT:
989+
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP:
990+
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN:
991+
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT:
992+
case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT:
993+
case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: /* deprecated */
980994
{
981995
unsigned new_id = winraw_retro_id_to_rarch(id);
982996
const uint64_t bind_joykey = input_config_binds[port][new_id].joykey;

0 commit comments

Comments
 (0)