mirror of
https://github.com/libretro/RetroArch
synced 2025-03-03 04:14:00 +00:00
(Winraw) Use flags
This commit is contained in:
parent
0ab10f73c2
commit
55f737195e
@ -46,19 +46,22 @@ extern "C" {
|
||||
#include "../../retroarch.h"
|
||||
#include "../../verbosity.h"
|
||||
|
||||
typedef struct
|
||||
enum winraw_mouse_flags
|
||||
{
|
||||
uint8_t keys[SC_LAST];
|
||||
bool pause;
|
||||
} winraw_keyboard_t;
|
||||
WRAW_MOUSE_FLG_BTN_L = (1 << 0),
|
||||
WRAW_MOUSE_FLG_BTN_M = (1 << 1),
|
||||
WRAW_MOUSE_FLG_BTN_R = (1 << 2),
|
||||
WRAW_MOUSE_FLG_BTN_B4 = (1 << 3),
|
||||
WRAW_MOUSE_FLG_BTN_B5 = (1 << 4)
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
HANDLE hnd;
|
||||
LONG x, y, dlt_x, dlt_y;
|
||||
LONG whl_u, whl_d;
|
||||
bool btn_l, btn_m, btn_r, btn_b4, btn_b5;
|
||||
int device;
|
||||
uint8_t flags;
|
||||
} winraw_mouse_t;
|
||||
|
||||
struct winraw_pointer_status
|
||||
@ -69,6 +72,13 @@ struct winraw_pointer_status
|
||||
int pointer_y;
|
||||
};
|
||||
|
||||
enum winraw_input_flags
|
||||
{
|
||||
WRAW_INP_FLG_MOUSE_GRAB = (1 << 0),
|
||||
WRAW_INP_FLG_MOUSE_XY_MAPPING_READY = (1 << 1),
|
||||
WRAW_INP_FLG_KB_PAUSE = (1 << 2)
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
double view_abs_ratio_x;
|
||||
@ -81,16 +91,15 @@ typedef struct
|
||||
int rect_delay; /* Needed to delay resize of window */
|
||||
winraw_mouse_t *mice;
|
||||
unsigned mouse_cnt;
|
||||
winraw_keyboard_t keyboard;
|
||||
bool mouse_xy_mapping_ready;
|
||||
bool mouse_grab;
|
||||
uint8_t kb_keys[SC_LAST];
|
||||
uint8_t flags;
|
||||
} winraw_input_t;
|
||||
|
||||
/* TODO/FIXME - static globals */
|
||||
static winraw_mouse_t *g_mice = NULL;
|
||||
static bool winraw_focus = false;
|
||||
|
||||
#define WINRAW_KEYBOARD_PRESSED(wr, key) (wr->keyboard.keys[rarch_keysym_lut[(enum retro_key)(key)]])
|
||||
#define WINRAW_KEYBOARD_PRESSED(wr, key) (wr->kb_keys[rarch_keysym_lut[(enum retro_key)(key)]])
|
||||
|
||||
static HWND winraw_create_window(WNDPROC wnd_proc)
|
||||
{
|
||||
@ -158,10 +167,11 @@ static void winraw_log_mice_info(winraw_mouse_t *mice, unsigned mouse_cnt)
|
||||
UINT r = GetRawInputDeviceInfoA(mice[i].hnd, RIDI_DEVICENAME,
|
||||
name, &name_size);
|
||||
if (r == (UINT)-1 || r == 0)
|
||||
name[0] = '\0';
|
||||
name[0] = '\0';
|
||||
|
||||
prod_name[0] = '\0';
|
||||
prod_buf[0] = '\0';
|
||||
|
||||
if (name[0])
|
||||
{
|
||||
HANDLE hhid = CreateFile(name,
|
||||
@ -319,15 +329,15 @@ static bool winraw_mouse_button_pressed(
|
||||
switch (key)
|
||||
{
|
||||
case RETRO_DEVICE_ID_MOUSE_LEFT:
|
||||
return mouse->btn_l;
|
||||
return ((mouse->flags & WRAW_MOUSE_FLG_BTN_L) > 0);
|
||||
case RETRO_DEVICE_ID_MOUSE_RIGHT:
|
||||
return mouse->btn_r;
|
||||
return ((mouse->flags & WRAW_MOUSE_FLG_BTN_R) > 0);
|
||||
case RETRO_DEVICE_ID_MOUSE_MIDDLE:
|
||||
return mouse->btn_m;
|
||||
return ((mouse->flags & WRAW_MOUSE_FLG_BTN_M) > 0);
|
||||
case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
|
||||
return mouse->btn_b4;
|
||||
return ((mouse->flags & WRAW_MOUSE_FLG_BTN_B4) > 0);
|
||||
case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
|
||||
return mouse->btn_b5;
|
||||
return ((mouse->flags & WRAW_MOUSE_FLG_BTN_B5) > 0);
|
||||
case RETRO_DEVICE_ID_MOUSE_WHEELUP:
|
||||
return mouse->whl_u;
|
||||
case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
|
||||
@ -356,7 +366,7 @@ static void winraw_init_mouse_xy_mapping(winraw_input_t *wr)
|
||||
wr->view_abs_ratio_x = (double)viewport.full_width / 65535.0f;
|
||||
wr->view_abs_ratio_y = (double)viewport.full_height / 65535.0f;
|
||||
|
||||
wr->mouse_xy_mapping_ready = true;
|
||||
wr->flags |= WRAW_INP_FLG_MOUSE_XY_MAPPING_READY;
|
||||
}
|
||||
}
|
||||
|
||||
@ -388,7 +398,7 @@ static void winraw_update_mouse_state(winraw_input_t *wr,
|
||||
|
||||
if (state->usFlags & MOUSE_MOVE_ABSOLUTE)
|
||||
{
|
||||
if (wr->mouse_xy_mapping_ready)
|
||||
if ((wr->flags & WRAW_INP_FLG_MOUSE_XY_MAPPING_READY) > 0)
|
||||
{
|
||||
state->lLastX = (LONG)(wr->view_abs_ratio_x * state->lLastX);
|
||||
state->lLastY = (LONG)(wr->view_abs_ratio_y * state->lLastY);
|
||||
@ -465,42 +475,42 @@ static void winraw_update_mouse_state(winraw_input_t *wr,
|
||||
if (swap_mouse_buttons)
|
||||
{
|
||||
if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
|
||||
mouse->btn_r = true;
|
||||
mouse->flags |= (WRAW_MOUSE_FLG_BTN_R);
|
||||
else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
|
||||
mouse->btn_r = false;
|
||||
mouse->flags &= ~(WRAW_MOUSE_FLG_BTN_R);
|
||||
|
||||
if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
|
||||
mouse->btn_l = true;
|
||||
mouse->flags |= (WRAW_MOUSE_FLG_BTN_L);
|
||||
else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
|
||||
mouse->btn_l = false;
|
||||
mouse->flags &= ~(WRAW_MOUSE_FLG_BTN_L);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
|
||||
mouse->btn_l = true;
|
||||
mouse->flags |= (WRAW_MOUSE_FLG_BTN_L);
|
||||
else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
|
||||
mouse->btn_l = false;
|
||||
mouse->flags &= ~(WRAW_MOUSE_FLG_BTN_L);
|
||||
|
||||
if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
|
||||
mouse->btn_r = true;
|
||||
mouse->flags |= (WRAW_MOUSE_FLG_BTN_R);
|
||||
else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
|
||||
mouse->btn_r = false;
|
||||
mouse->flags &= ~(WRAW_MOUSE_FLG_BTN_R);
|
||||
}
|
||||
|
||||
if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
|
||||
mouse->btn_m = true;
|
||||
mouse->flags |= (WRAW_MOUSE_FLG_BTN_M);
|
||||
else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
|
||||
mouse->btn_m = false;
|
||||
mouse->flags &= ~(WRAW_MOUSE_FLG_BTN_M);
|
||||
|
||||
if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN)
|
||||
mouse->btn_b4 = true;
|
||||
mouse->flags |= (WRAW_MOUSE_FLG_BTN_B4);
|
||||
else if (state->usButtonFlags & RI_MOUSE_BUTTON_4_UP)
|
||||
mouse->btn_b4 = false;
|
||||
mouse->flags &= ~(WRAW_MOUSE_FLG_BTN_B4);
|
||||
|
||||
if (state->usButtonFlags & RI_MOUSE_BUTTON_5_DOWN)
|
||||
mouse->btn_b5 = true;
|
||||
mouse->flags |= (WRAW_MOUSE_FLG_BTN_B5);
|
||||
else if (state->usButtonFlags & RI_MOUSE_BUTTON_5_UP)
|
||||
mouse->btn_b5 = false;
|
||||
mouse->flags &= ~(WRAW_MOUSE_FLG_BTN_B5);
|
||||
|
||||
if (state->usButtonFlags & RI_MOUSE_WHEEL)
|
||||
{
|
||||
@ -550,14 +560,14 @@ static LRESULT CALLBACK winraw_callback(
|
||||
|
||||
/* Special pause-key handling due to
|
||||
* scancode 0xE11D45 incoming separately */
|
||||
if (wr->keyboard.pause)
|
||||
if ((wr->flags & WRAW_INP_FLG_KB_PAUSE) > 0)
|
||||
{
|
||||
wr->keyboard.pause = false;
|
||||
wr->flags &= ~(WRAW_INP_FLG_KB_PAUSE);
|
||||
if (mcode == SC_NUMLOCK)
|
||||
mcode = SC_PAUSE;
|
||||
}
|
||||
else if (mcode == 0xE11D)
|
||||
wr->keyboard.pause = true;
|
||||
wr->flags |= (WRAW_INP_FLG_KB_PAUSE);
|
||||
|
||||
/* Ignored scancodes */
|
||||
switch (mcode)
|
||||
@ -586,7 +596,7 @@ static LRESULT CALLBACK winraw_callback(
|
||||
if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x80)
|
||||
mod |= RETROKMOD_META;
|
||||
|
||||
wr->keyboard.keys[mcode] = down;
|
||||
wr->kb_keys[mcode] = down;
|
||||
input_keyboard_event(down,
|
||||
input_keymaps_translate_keysym_to_rk(mcode),
|
||||
0, mod, RETRO_DEVICE_KEYBOARD);
|
||||
@ -669,26 +679,22 @@ static void winraw_poll(void *data)
|
||||
wr->mice[i].dlt_y = InterlockedExchange(&g_mice[i].dlt_y, 0);
|
||||
wr->mice[i].whl_u = InterlockedExchange(&g_mice[i].whl_u, 0);
|
||||
wr->mice[i].whl_d = InterlockedExchange(&g_mice[i].whl_d, 0);
|
||||
wr->mice[i].btn_l = g_mice[i].btn_l;
|
||||
wr->mice[i].btn_m = g_mice[i].btn_m;
|
||||
wr->mice[i].btn_r = g_mice[i].btn_r;
|
||||
wr->mice[i].btn_b4 = g_mice[i].btn_b4;
|
||||
wr->mice[i].btn_b5 = g_mice[i].btn_b5;
|
||||
wr->mice[i].flags = g_mice[i].flags;
|
||||
}
|
||||
|
||||
/* Prevent LAlt sticky after unfocusing with Alt-Tab */
|
||||
if ( !winraw_focus
|
||||
&& wr->keyboard.keys[SC_LALT]
|
||||
&& wr->kb_keys[SC_LALT]
|
||||
&& !(GetKeyState(VK_MENU) & 0x8000))
|
||||
{
|
||||
wr->keyboard.keys[SC_LALT] = 0;
|
||||
wr->kb_keys[SC_LALT] = 0;
|
||||
input_keyboard_event(0,
|
||||
input_keymaps_translate_keysym_to_rk(SC_LALT),
|
||||
0, 0, RETRO_DEVICE_KEYBOARD);
|
||||
}
|
||||
/* Clear all keyboard key states when unfocused */
|
||||
else if (!winraw_focus && !(GetKeyState(VK_MENU) & 0x8000))
|
||||
memset(wr->keyboard.keys, 0, SC_LAST);
|
||||
memset(wr->kb_keys, 0, SC_LAST);
|
||||
}
|
||||
|
||||
static unsigned winraw_retro_id_to_rarch(unsigned id)
|
||||
@ -860,11 +866,11 @@ static int16_t winraw_input_state(
|
||||
case RETRO_DEVICE_ID_MOUSE_Y:
|
||||
return abs ? mouse->y : mouse->dlt_y;
|
||||
case RETRO_DEVICE_ID_MOUSE_LEFT:
|
||||
if (mouse->btn_l)
|
||||
if ((mouse->flags & WRAW_MOUSE_FLG_BTN_L) > 0)
|
||||
return 1;
|
||||
break;
|
||||
case RETRO_DEVICE_ID_MOUSE_RIGHT:
|
||||
if (mouse->btn_r)
|
||||
if ((mouse->flags & WRAW_MOUSE_FLG_BTN_R) > 0)
|
||||
return 1;
|
||||
break;
|
||||
case RETRO_DEVICE_ID_MOUSE_WHEELUP:
|
||||
@ -876,15 +882,15 @@ static int16_t winraw_input_state(
|
||||
return 1;
|
||||
break;
|
||||
case RETRO_DEVICE_ID_MOUSE_MIDDLE:
|
||||
if (mouse->btn_m)
|
||||
if ((mouse->flags & WRAW_MOUSE_FLG_BTN_M) > 0)
|
||||
return 1;
|
||||
break;
|
||||
case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
|
||||
if (mouse->btn_b4)
|
||||
if ((mouse->flags & WRAW_MOUSE_FLG_BTN_B4) > 0)
|
||||
return 1;
|
||||
break;
|
||||
case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
|
||||
if (mouse->btn_b5)
|
||||
if ((mouse->flags & WRAW_MOUSE_FLG_BTN_B5) > 0)
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
@ -925,7 +931,7 @@ static int16_t winraw_input_state(
|
||||
{
|
||||
x = mouse->x;
|
||||
y = mouse->y;
|
||||
pointer_down = mouse->btn_l;
|
||||
pointer_down = (mouse->flags & (WRAW_MOUSE_FLG_BTN_L)) > 0;
|
||||
}
|
||||
|
||||
if (check_pos)
|
||||
@ -1090,14 +1096,18 @@ static uint64_t winraw_get_capabilities(void *u)
|
||||
static void winraw_grab_mouse(void *d, bool state)
|
||||
{
|
||||
winraw_input_t *wr = (winraw_input_t*)d;
|
||||
bool curr_state = (wr->flags & WRAW_INP_FLG_MOUSE_GRAB) > 0;
|
||||
|
||||
if (state == wr->mouse_grab)
|
||||
if (curr_state == state)
|
||||
return;
|
||||
|
||||
if (!winraw_set_mouse_input(wr->window))
|
||||
return;
|
||||
|
||||
wr->mouse_grab = state;
|
||||
if (state)
|
||||
wr->flags |= WRAW_INP_FLG_MOUSE_GRAB;
|
||||
else
|
||||
wr->flags &= ~WRAW_INP_FLG_MOUSE_GRAB;
|
||||
|
||||
#ifndef _XBOX
|
||||
win32_clip_window(state);
|
||||
|
@ -78,9 +78,4 @@ typedef struct
|
||||
#define ERROR_DEVICE_NOT_CONNECTED 1167
|
||||
#endif
|
||||
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user