support for mouse button binds in Windows input drivers

This commit is contained in:
David Walters 2017-11-26 12:55:17 +00:00
parent b267419551
commit 9682e2777b
2 changed files with 814 additions and 719 deletions

View File

@ -267,6 +267,49 @@ static bool dinput_keyboard_pressed(struct dinput_input *di, unsigned key)
return di->state[sym] & 0x80;
}
static bool dinput_mbutton_pressed(struct dinput_input *di, unsigned key)
{
bool result;
switch ( key )
{
case RETRO_DEVICE_ID_MOUSE_LEFT:
return di->mouse_l;
case RETRO_DEVICE_ID_MOUSE_RIGHT:
return di->mouse_r;
case RETRO_DEVICE_ID_MOUSE_MIDDLE:
return di->mouse_m;
case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
return di->mouse_b4;
case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
return di->mouse_b5;
case RETRO_DEVICE_ID_MOUSE_WHEELUP:
result = di->mouse_wu;
di->mouse_wu = false;
return result;
case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
result = di->mouse_wd;
di->mouse_wd = false;
return result;
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP:
result = di->mouse_hwu;
di->mouse_hwu = false;
return result;
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN:
result = di->mouse_hwd;
di->mouse_hwd = false;
return result;
}
return false;
}
static bool dinput_is_pressed(struct dinput_input *di,
rarch_joypad_info_t joypad_info,
const struct retro_keybind *binds,
@ -276,8 +319,13 @@ static bool dinput_is_pressed(struct dinput_input *di,
if (!di->blocked && (bind->key < RETROK_LAST) && dinput_keyboard_pressed(di, bind->key))
return true;
if (binds && binds[id].valid && input_joypad_pressed(di->joypad, joypad_info, port, binds, id))
if (binds && binds[id].valid)
{
if (dinput_mbutton_pressed(di, bind->mbutton))
return true;
if (input_joypad_pressed(di->joypad, joypad_info, port, binds, id))
return true;
}
return false;
}

View File

@ -288,6 +288,50 @@ static int16_t winraw_mouse_state(winraw_input_t *wr,
return 0;
}
static bool winraw_mbutton_pressed(winraw_input_t *wr, unsigned port, unsigned key)
{
unsigned i;
bool result;
winraw_mouse_t *mouse = NULL;
settings_t *settings = config_get_ptr();
if (port >= MAX_USERS)
return false;
for (i = 0; i < g_mouse_cnt; ++i)
{
if (i == settings->uints.input_mouse_index[port])
{
mouse = &wr->mice[i];
break;
}
}
if (!mouse)
return false;
switch ( key )
{
case RETRO_DEVICE_ID_MOUSE_LEFT:
return mouse->btn_l;
case RETRO_DEVICE_ID_MOUSE_RIGHT:
return mouse->btn_r;
case RETRO_DEVICE_ID_MOUSE_MIDDLE:
return mouse->btn_m;
case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
return mouse->btn_b4;
case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
return mouse->btn_b5;
case RETRO_DEVICE_ID_MOUSE_WHEELUP:
return mouse->whl_u;
case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
return mouse->whl_d;
}
return false;
}
static int16_t winraw_joypad_state(winraw_input_t *wr,
rarch_joypad_info_t joypad_info,
const struct retro_keybind *binds,
@ -299,6 +343,9 @@ static int16_t winraw_joypad_state(winraw_input_t *wr,
if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && wr->keyboard.keys[key])
return 1;
if (binds && binds[id].valid && winraw_mbutton_pressed(wr, port, bind->mbutton))
return 1;
return input_joypad_pressed(wr->joypad, joypad_info, port, binds, id);
}