Add basic mouse support to X11 input.
This commit is contained in:
parent
f96d357017
commit
df32409fb5
|
@ -206,6 +206,46 @@ static int16_t x_analog_state(x11_input_t *x11, const struct retro_keybind **bin
|
|||
return res_plus + res_minus;
|
||||
}
|
||||
|
||||
static int16_t x_mouse_state(x11_input_t *x11, unsigned id)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case RETRO_DEVICE_ID_MOUSE_X:
|
||||
return x11->mouse_x - x11->mouse_last_x;
|
||||
case RETRO_DEVICE_ID_MOUSE_Y:
|
||||
return x11->mouse_y - x11->mouse_last_y;
|
||||
case RETRO_DEVICE_ID_MOUSE_LEFT:
|
||||
return x11->mouse_l;
|
||||
case RETRO_DEVICE_ID_MOUSE_RIGHT:
|
||||
return x11->mouse_r;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int16_t x_lightgun_state(x11_input_t *x11, unsigned id)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case RETRO_DEVICE_ID_LIGHTGUN_X:
|
||||
return x11->mouse_x - x11->mouse_last_x;
|
||||
case RETRO_DEVICE_ID_LIGHTGUN_Y:
|
||||
return x11->mouse_y - x11->mouse_last_y;
|
||||
case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER:
|
||||
return x11->mouse_l;
|
||||
case RETRO_DEVICE_ID_LIGHTGUN_CURSOR:
|
||||
return x11->mouse_m;
|
||||
case RETRO_DEVICE_ID_LIGHTGUN_TURBO:
|
||||
return x11->mouse_r;
|
||||
case RETRO_DEVICE_ID_LIGHTGUN_START:
|
||||
return x11->mouse_m && x11->mouse_r;
|
||||
case RETRO_DEVICE_ID_LIGHTGUN_PAUSE:
|
||||
return x11->mouse_m && x11->mouse_l;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int16_t x_input_state(void *data, const struct retro_keybind **binds, unsigned port, unsigned device, unsigned index, unsigned id)
|
||||
{
|
||||
x11_input_t *x11 = (x11_input_t*)data;
|
||||
|
@ -227,6 +267,12 @@ static int16_t x_input_state(void *data, const struct retro_keybind **binds, uns
|
|||
return ret;
|
||||
}
|
||||
|
||||
case RETRO_DEVICE_MOUSE:
|
||||
return x_mouse_state(x11, id);
|
||||
|
||||
case RETRO_DEVICE_LIGHTGUN:
|
||||
return x_lightgun_state(x11, id);
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
@ -243,6 +289,32 @@ static void x_input_free(void *data)
|
|||
free(data);
|
||||
}
|
||||
|
||||
static void x_input_poll_mouse(x11_input_t *x11)
|
||||
{
|
||||
if (!x11->inherit_disp)
|
||||
return;
|
||||
|
||||
Window root_win, child_win;
|
||||
int root_x, root_y, win_x, win_y;
|
||||
unsigned mask;
|
||||
|
||||
x11->mouse_last_x = x11->mouse_x;
|
||||
x11->mouse_last_y = x11->mouse_y;
|
||||
|
||||
XQueryPointer(x11->display,
|
||||
x11->win,
|
||||
&root_win, &child_win,
|
||||
&root_x, &root_y,
|
||||
&win_x, &win_y,
|
||||
&mask);
|
||||
|
||||
x11->mouse_x = root_x;
|
||||
x11->mouse_y = root_y;
|
||||
x11->mouse_l = mask & Button1Mask;
|
||||
x11->mouse_m = mask & Button2Mask;
|
||||
x11->mouse_r = mask & Button3Mask;
|
||||
}
|
||||
|
||||
static void x_input_poll(void *data)
|
||||
{
|
||||
x11_input_t *x11 = (x11_input_t*)data;
|
||||
|
@ -256,6 +328,7 @@ static void x_input_poll(void *data)
|
|||
else
|
||||
memset(x11->state, 0, sizeof(x11->state));
|
||||
|
||||
x_input_poll_mouse(x11);
|
||||
input_sdl.poll(x11->sdl);
|
||||
}
|
||||
|
||||
|
|
|
@ -38,6 +38,9 @@ typedef struct x11_input
|
|||
Window win;
|
||||
|
||||
char state[32];
|
||||
bool mouse_l, mouse_r, mouse_m;
|
||||
int mouse_x, mouse_y;
|
||||
int mouse_last_x, mouse_last_y;
|
||||
} x11_input_t;
|
||||
|
||||
void x_input_set_disp_win(x11_input_t *x11, Display *dpy, Window win);
|
||||
|
|
|
@ -122,6 +122,19 @@ static void update_input(void)
|
|||
if (input_state_cb(0, RETRO_DEVICE_KEYBOARD, 0, RETROK_x))
|
||||
fprintf(stderr, "x key is pressed!\n");
|
||||
|
||||
int16_t mouse_x = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
|
||||
int16_t mouse_y = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
|
||||
bool mouse_l = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT);
|
||||
bool mouse_r = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT);
|
||||
if (mouse_x)
|
||||
fprintf(stderr, "Mouse X: %d\n", mouse_x);
|
||||
if (mouse_y)
|
||||
fprintf(stderr, "Mouse Y: %d\n", mouse_y);
|
||||
if (mouse_l)
|
||||
fprintf(stderr, "Mouse L pressed.\n");
|
||||
if (mouse_r)
|
||||
fprintf(stderr, "Mouse R pressed.\n");
|
||||
|
||||
dir_x += input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / 2000;
|
||||
dir_y += input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / 2000;
|
||||
//dir_x += input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / 2000;
|
||||
|
|
Loading…
Reference in New Issue