(Winraw) Use flags

This commit is contained in:
libretroadmin 2024-09-09 19:06:43 +02:00
parent 0ab10f73c2
commit 55f737195e
2 changed files with 61 additions and 56 deletions

View File

@ -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);

View File

@ -78,9 +78,4 @@ typedef struct
#define ERROR_DEVICE_NOT_CONNECTED 1167
#endif
RETRO_BEGIN_DECLS
RETRO_END_DECLS
#endif