fix gamepad bugs (linux) | add L3 + R3 (gamepad)
This commit is contained in:
parent
2776510f47
commit
97caf13aaf
37
src/external/RGFW.h
vendored
37
src/external/RGFW.h
vendored
|
|
@ -416,6 +416,8 @@ typedef RGFW_ENUM(u8, RGFW_event_types) {
|
||||||
RGFW_JS_L2 = 5, /*!< left trigger*/
|
RGFW_JS_L2 = 5, /*!< left trigger*/
|
||||||
RGFW_JS_R1 = 6, /*!< right bumper */
|
RGFW_JS_R1 = 6, /*!< right bumper */
|
||||||
RGFW_JS_R2 = 7, /*!< right trigger */
|
RGFW_JS_R2 = 7, /*!< right trigger */
|
||||||
|
RGFW_JS_L3 = 11, /* left thumb stick */
|
||||||
|
RGFW_JS_R3 = 12 /*!< right thumb stick */
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -2263,13 +2265,14 @@ This is where OS specific stuff starts
|
||||||
#if defined(RGFW_WAYLAND) || defined(RGFW_X11)
|
#if defined(RGFW_WAYLAND) || defined(RGFW_X11)
|
||||||
int RGFW_eventWait_forceStop[] = {0, 0, 0}; /* for wait events */
|
int RGFW_eventWait_forceStop[] = {0, 0, 0}; /* for wait events */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <linux/joystick.h>
|
#include <linux/joystick.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
RGFW_Event* RGFW_linux_updateJoystick(RGFW_window* win) {
|
RGFW_Event* RGFW_linux_updateJoystick(RGFW_window* win) {
|
||||||
static int xAxis = 0, yAxis = 0;
|
|
||||||
u8 i;
|
u8 i;
|
||||||
for (i = 0; i < RGFW_joystickCount; i++) {
|
for (i = 0; i < RGFW_joystickCount; i++) {
|
||||||
struct js_event e;
|
struct js_event e;
|
||||||
|
|
@ -2287,22 +2290,28 @@ This is where OS specific stuff starts
|
||||||
case JS_EVENT_BUTTON:
|
case JS_EVENT_BUTTON:
|
||||||
win->event.type = e.value ? RGFW_jsButtonPressed : RGFW_jsButtonReleased;
|
win->event.type = e.value ? RGFW_jsButtonPressed : RGFW_jsButtonReleased;
|
||||||
win->event.button = e.number;
|
win->event.button = e.number;
|
||||||
RGFW_jsPressed[i][e.number] = e.value;
|
RGFW_jsPressed[i][e.number + 1] = e.value;
|
||||||
RGFW_jsButtonCallback(win, i, e.number, e.value);
|
RGFW_jsButtonCallback(win, i, e.number, e.value);
|
||||||
|
|
||||||
return &win->event;
|
return &win->event;
|
||||||
case JS_EVENT_AXIS:
|
case JS_EVENT_AXIS:
|
||||||
|
size_t axis = e.number / 2;
|
||||||
|
if (axis == 2) axis = 1;
|
||||||
|
|
||||||
ioctl(RGFW_joysticks[i], JSIOCGAXES, &win->event.axisesCount);
|
ioctl(RGFW_joysticks[i], JSIOCGAXES, &win->event.axisesCount);
|
||||||
|
win->event.axisesCount = 2;
|
||||||
|
|
||||||
if ((e.number == 0 || e.number % 2) && e.number != 1)
|
if (axis < 3) {
|
||||||
xAxis = e.value;
|
if (e.number == 0 || e.number == 3)
|
||||||
else
|
win->event.axis[axis].x = (e.value / 32767.0f) * 100;
|
||||||
yAxis = e.value;
|
else if (e.number == 1 || e.number == 4) {
|
||||||
|
win->event.axis[axis].y = (e.value / 32767.0f) * 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
win->event.axis[e.number / 2].x = xAxis;
|
|
||||||
win->event.axis[e.number / 2].y = yAxis;
|
|
||||||
win->event.type = RGFW_jsAxisMove;
|
win->event.type = RGFW_jsAxisMove;
|
||||||
win->event.joystick = i;
|
win->event.joystick = i;
|
||||||
win->event.whichAxis = e.number / 2;
|
win->event.whichAxis = axis;
|
||||||
RGFW_jsAxisCallback(win, i, win->event.axis, win->event.axisesCount);
|
RGFW_jsAxisCallback(win, i, win->event.axis, win->event.axisesCount);
|
||||||
return &win->event;
|
return &win->event;
|
||||||
|
|
||||||
|
|
@ -8332,13 +8341,17 @@ EM_BOOL Emscripten_on_fullscreenchange(int eventType, const EmscriptenFullscreen
|
||||||
RGFW_events[RGFW_eventLen].type = RGFW_windowResized;
|
RGFW_events[RGFW_eventLen].type = RGFW_windowResized;
|
||||||
RGFW_eventLen++;
|
RGFW_eventLen++;
|
||||||
|
|
||||||
RGFW_root->r = RGFW_RECT(0, 0, e->elementWidth, e->elementHeight);
|
RGFW_root->r = RGFW_RECT(0, 0, e->screenWidth, e->screenHeight);
|
||||||
|
|
||||||
if (fullscreen == RGFW_FALSE) {
|
if (fullscreen == RGFW_FALSE) {
|
||||||
emscripten_set_canvas_element_size("#canvas", ogRect.w, ogRect.h);
|
|
||||||
RGFW_root->r = RGFW_RECT(0, 0, ogRect.w, ogRect.h);
|
RGFW_root->r = RGFW_RECT(0, 0, ogRect.w, ogRect.h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emscripten_set_canvas_element_size("#canvas", RGFW_root->r.w, RGFW_root->r.h);
|
||||||
|
|
||||||
|
#ifdef LEGACY_GL_EMULATION
|
||||||
|
EM_ASM("Module.canvas.focus()");
|
||||||
|
#endif
|
||||||
|
|
||||||
RGFW_windowResizeCallback(RGFW_root, RGFW_root->r);
|
RGFW_windowResizeCallback(RGFW_root, RGFW_root->r);
|
||||||
return EM_TRUE;
|
return EM_TRUE;
|
||||||
|
|
@ -8729,7 +8742,7 @@ RGFW_Event* RGFW_window_checkEvent(RGFW_window* win) {
|
||||||
RGFW_JS_A, RGFW_JS_B, RGFW_JS_X, RGFW_JS_Y,
|
RGFW_JS_A, RGFW_JS_B, RGFW_JS_X, RGFW_JS_Y,
|
||||||
RGFW_JS_L1, RGFW_JS_R1, RGFW_JS_L2, RGFW_JS_R2,
|
RGFW_JS_L1, RGFW_JS_R1, RGFW_JS_L2, RGFW_JS_R2,
|
||||||
RGFW_JS_SELECT, RGFW_JS_START,
|
RGFW_JS_SELECT, RGFW_JS_START,
|
||||||
404, 404,
|
RGFW_JS_L3, RGFW_JS_R3,
|
||||||
RGFW_JS_UP, RGFW_JS_DOWN, RGFW_JS_LEFT, RGFW_JS_RIGHT
|
RGFW_JS_UP, RGFW_JS_DOWN, RGFW_JS_LEFT, RGFW_JS_RIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -865,6 +865,28 @@ char RSGL_keystrToChar(const char *str)
|
||||||
return '\0';
|
return '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int RGFW_jsConvTable[18] = {
|
||||||
|
[RGFW_JS_Y] = GAMEPAD_BUTTON_RIGHT_FACE_UP,
|
||||||
|
[RGFW_JS_B] = GAMEPAD_BUTTON_RIGHT_FACE_RIGHT,
|
||||||
|
[RGFW_JS_A] = GAMEPAD_BUTTON_RIGHT_FACE_DOWN,
|
||||||
|
[RGFW_JS_X] = GAMEPAD_BUTTON_RIGHT_FACE_LEFT,
|
||||||
|
[RGFW_JS_L1] = GAMEPAD_BUTTON_LEFT_TRIGGER_1,
|
||||||
|
[RGFW_JS_R1] = GAMEPAD_BUTTON_RIGHT_TRIGGER_1,
|
||||||
|
[RGFW_JS_L2] = GAMEPAD_BUTTON_LEFT_TRIGGER_2,
|
||||||
|
[RGFW_JS_R2] = GAMEPAD_BUTTON_RIGHT_TRIGGER_2,
|
||||||
|
[RGFW_JS_SELECT] = GAMEPAD_BUTTON_MIDDLE_LEFT,
|
||||||
|
[RGFW_JS_HOME] = GAMEPAD_BUTTON_MIDDLE,
|
||||||
|
[RGFW_JS_START] = GAMEPAD_BUTTON_MIDDLE_RIGHT,
|
||||||
|
[RGFW_JS_UP] = GAMEPAD_BUTTON_LEFT_FACE_UP,
|
||||||
|
[RGFW_JS_RIGHT] = GAMEPAD_BUTTON_LEFT_FACE_RIGHT,
|
||||||
|
[RGFW_JS_DOWN] = GAMEPAD_BUTTON_LEFT_FACE_DOWN,
|
||||||
|
[RGFW_JS_LEFT] = GAMEPAD_BUTTON_LEFT_FACE_LEFT,
|
||||||
|
[RGFW_JS_L3] = GAMEPAD_BUTTON_LEFT_THUMB,
|
||||||
|
[RGFW_JS_R3] = GAMEPAD_BUTTON_RIGHT_THUMB,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Register all input events
|
// Register all input events
|
||||||
void PollInputEvents(void)
|
void PollInputEvents(void)
|
||||||
{
|
{
|
||||||
|
|
@ -1092,32 +1114,7 @@ void PollInputEvents(void)
|
||||||
} break;
|
} break;
|
||||||
case RGFW_jsButtonPressed:
|
case RGFW_jsButtonPressed:
|
||||||
{
|
{
|
||||||
int button = -1;
|
int button = RGFW_jsConvTable[event->button];
|
||||||
|
|
||||||
switch (event->button)
|
|
||||||
{
|
|
||||||
case RGFW_JS_Y: button = GAMEPAD_BUTTON_RIGHT_FACE_UP; break;
|
|
||||||
case RGFW_JS_B: button = GAMEPAD_BUTTON_RIGHT_FACE_RIGHT; break;
|
|
||||||
case RGFW_JS_A: button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN; break;
|
|
||||||
case RGFW_JS_X: button = GAMEPAD_BUTTON_RIGHT_FACE_LEFT; break;
|
|
||||||
|
|
||||||
case RGFW_JS_L1: button = GAMEPAD_BUTTON_LEFT_TRIGGER_1; break;
|
|
||||||
case RGFW_JS_R1: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_1; break;
|
|
||||||
|
|
||||||
case RGFW_JS_L2: button = GAMEPAD_BUTTON_LEFT_TRIGGER_2; break;
|
|
||||||
case RGFW_JS_R2: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_2; break;
|
|
||||||
|
|
||||||
case RGFW_JS_SELECT: button = GAMEPAD_BUTTON_MIDDLE_LEFT; break;
|
|
||||||
case RGFW_JS_HOME: button = GAMEPAD_BUTTON_MIDDLE; break;
|
|
||||||
case RGFW_JS_START: button = GAMEPAD_BUTTON_MIDDLE_RIGHT; break;
|
|
||||||
|
|
||||||
case RGFW_JS_UP: button = GAMEPAD_BUTTON_LEFT_FACE_UP; break;
|
|
||||||
case RGFW_JS_RIGHT: button = GAMEPAD_BUTTON_LEFT_FACE_RIGHT; break;
|
|
||||||
case RGFW_JS_DOWN: button = GAMEPAD_BUTTON_LEFT_FACE_DOWN; break;
|
|
||||||
case RGFW_JS_LEFT: button = GAMEPAD_BUTTON_LEFT_FACE_LEFT; break;
|
|
||||||
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (button >= 0)
|
if (button >= 0)
|
||||||
{
|
{
|
||||||
|
|
@ -1127,36 +1124,10 @@ void PollInputEvents(void)
|
||||||
} break;
|
} break;
|
||||||
case RGFW_jsButtonReleased:
|
case RGFW_jsButtonReleased:
|
||||||
{
|
{
|
||||||
int button = -1;
|
int button = RGFW_jsConvTable[event->button];
|
||||||
switch (event->button)
|
|
||||||
{
|
|
||||||
case RGFW_JS_Y: button = GAMEPAD_BUTTON_RIGHT_FACE_UP; break;
|
|
||||||
case RGFW_JS_B: button = GAMEPAD_BUTTON_RIGHT_FACE_RIGHT; break;
|
|
||||||
case RGFW_JS_A: button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN; break;
|
|
||||||
case RGFW_JS_X: button = GAMEPAD_BUTTON_RIGHT_FACE_LEFT; break;
|
|
||||||
|
|
||||||
case RGFW_JS_L1: button = GAMEPAD_BUTTON_LEFT_TRIGGER_1; break;
|
|
||||||
case RGFW_JS_R1: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_1; break;
|
|
||||||
|
|
||||||
case RGFW_JS_L2: button = GAMEPAD_BUTTON_LEFT_TRIGGER_2; break;
|
|
||||||
case RGFW_JS_R2: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_2; break;
|
|
||||||
|
|
||||||
case RGFW_JS_SELECT: button = GAMEPAD_BUTTON_MIDDLE_LEFT; break;
|
|
||||||
case RGFW_JS_HOME: button = GAMEPAD_BUTTON_MIDDLE; break;
|
|
||||||
case RGFW_JS_START: button = GAMEPAD_BUTTON_MIDDLE_RIGHT; break;
|
|
||||||
|
|
||||||
case RGFW_JS_UP: button = GAMEPAD_BUTTON_LEFT_FACE_UP; break;
|
|
||||||
case RGFW_JS_RIGHT: button = GAMEPAD_BUTTON_LEFT_FACE_RIGHT; break;
|
|
||||||
case RGFW_JS_DOWN: button = GAMEPAD_BUTTON_LEFT_FACE_DOWN; break;
|
|
||||||
case RGFW_JS_LEFT: button = GAMEPAD_BUTTON_LEFT_FACE_LEFT; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (button >= 0)
|
|
||||||
{
|
|
||||||
CORE.Input.Gamepad.currentButtonState[event->joystick][button] = 0;
|
CORE.Input.Gamepad.currentButtonState[event->joystick][button] = 0;
|
||||||
if (CORE.Input.Gamepad.lastButtonPressed == button) CORE.Input.Gamepad.lastButtonPressed = 0;
|
if (CORE.Input.Gamepad.lastButtonPressed == button) CORE.Input.Gamepad.lastButtonPressed = 0;
|
||||||
}
|
|
||||||
} break;
|
} break;
|
||||||
case RGFW_jsAxisMove:
|
case RGFW_jsAxisMove:
|
||||||
{
|
{
|
||||||
|
|
@ -1166,23 +1137,13 @@ void PollInputEvents(void)
|
||||||
switch(event->whichAxis) {
|
switch(event->whichAxis) {
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
#ifndef __linux__
|
|
||||||
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_LEFT_X] = event->axis[0].x / 100.0f;
|
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_LEFT_X] = event->axis[0].x / 100.0f;
|
||||||
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_LEFT_Y] = event->axis[0].y / 100.0f;
|
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_LEFT_Y] = event->axis[0].y / 100.0f;
|
||||||
#else
|
|
||||||
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_LEFT_X] = event->axis[0].x / 32767.0f;
|
|
||||||
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_LEFT_Y] = event->axis[0].y / 32767.0f;
|
|
||||||
#endif
|
|
||||||
} break;
|
} break;
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
#ifndef __linux__
|
|
||||||
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_RIGHT_X] = event->axis[1].x / 100.0f;
|
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_RIGHT_X] = event->axis[1].x / 100.0f;
|
||||||
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_RIGHT_Y] = event->axis[1].y / 100.0f;
|
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_RIGHT_Y] = event->axis[1].y / 100.0f;
|
||||||
#else
|
|
||||||
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_RIGHT_X] = event->axis[1].x / 32767.0f;
|
|
||||||
CORE.Input.Gamepad.axisState[event->joystick][GAMEPAD_AXIS_RIGHT_Y] = event->axis[1].y / 32767.0f;
|
|
||||||
#endif
|
|
||||||
} break;
|
} break;
|
||||||
case 2: axis = GAMEPAD_AXIS_LEFT_TRIGGER;
|
case 2: axis = GAMEPAD_AXIS_LEFT_TRIGGER;
|
||||||
case 3: { if (axis == -1) axis = GAMEPAD_AXIS_RIGHT_TRIGGER;
|
case 3: { if (axis == -1) axis = GAMEPAD_AXIS_RIGHT_TRIGGER;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user