diff --git a/src/external/RGFW.h b/src/external/RGFW.h index 868666344..3dc09eca7 100644 --- a/src/external/RGFW.h +++ b/src/external/RGFW.h @@ -416,6 +416,8 @@ typedef RGFW_ENUM(u8, RGFW_event_types) { RGFW_JS_L2 = 5, /*!< left trigger*/ RGFW_JS_R1 = 6, /*!< right bumper */ RGFW_JS_R2 = 7, /*!< right trigger */ + RGFW_JS_L3 = 11, /* left thumb stick */ + RGFW_JS_R3 = 12 /*!< right thumb stick */ }; #endif @@ -2263,13 +2265,14 @@ This is where OS specific stuff starts #if defined(RGFW_WAYLAND) || defined(RGFW_X11) int RGFW_eventWait_forceStop[] = {0, 0, 0}; /* for wait events */ + + #ifdef __linux__ #include #include #include - + RGFW_Event* RGFW_linux_updateJoystick(RGFW_window* win) { - static int xAxis = 0, yAxis = 0; u8 i; for (i = 0; i < RGFW_joystickCount; i++) { struct js_event e; @@ -2287,22 +2290,28 @@ This is where OS specific stuff starts case JS_EVENT_BUTTON: win->event.type = e.value ? RGFW_jsButtonPressed : RGFW_jsButtonReleased; 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); + return &win->event; case JS_EVENT_AXIS: - ioctl(RGFW_joysticks[i], JSIOCGAXES, &win->event.axisesCount); + size_t axis = e.number / 2; + if (axis == 2) axis = 1; - if ((e.number == 0 || e.number % 2) && e.number != 1) - xAxis = e.value; - else - yAxis = e.value; + ioctl(RGFW_joysticks[i], JSIOCGAXES, &win->event.axisesCount); + win->event.axisesCount = 2; + + if (axis < 3) { + if (e.number == 0 || e.number == 3) + win->event.axis[axis].x = (e.value / 32767.0f) * 100; + 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.joystick = i; - win->event.whichAxis = e.number / 2; + win->event.whichAxis = axis; RGFW_jsAxisCallback(win, i, win->event.axis, win->event.axisesCount); return &win->event; @@ -8332,13 +8341,17 @@ EM_BOOL Emscripten_on_fullscreenchange(int eventType, const EmscriptenFullscreen RGFW_events[RGFW_eventLen].type = RGFW_windowResized; 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) { - emscripten_set_canvas_element_size("#canvas", 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); 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_L1, RGFW_JS_R1, RGFW_JS_L2, RGFW_JS_R2, 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 }; diff --git a/src/platforms/rcore_desktop_rgfw.c b/src/platforms/rcore_desktop_rgfw.c index 807f48301..70b19f3fc 100644 --- a/src/platforms/rcore_desktop_rgfw.c +++ b/src/platforms/rcore_desktop_rgfw.c @@ -865,6 +865,28 @@ char RSGL_keystrToChar(const char *str) 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 void PollInputEvents(void) { @@ -1092,32 +1114,7 @@ void PollInputEvents(void) } break; case RGFW_jsButtonPressed: { - int button = -1; - - 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; - } + int button = RGFW_jsConvTable[event->button]; if (button >= 0) { @@ -1127,36 +1124,10 @@ void PollInputEvents(void) } break; case RGFW_jsButtonReleased: { - int button = -1; - 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; - } + int button = RGFW_jsConvTable[event->button]; - if (button >= 0) - { - CORE.Input.Gamepad.currentButtonState[event->joystick][button] = 0; - if (CORE.Input.Gamepad.lastButtonPressed == button) CORE.Input.Gamepad.lastButtonPressed = 0; - } + CORE.Input.Gamepad.currentButtonState[event->joystick][button] = 0; + if (CORE.Input.Gamepad.lastButtonPressed == button) CORE.Input.Gamepad.lastButtonPressed = 0; } break; case RGFW_jsAxisMove: { @@ -1166,23 +1137,13 @@ void PollInputEvents(void) switch(event->whichAxis) { 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_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; 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_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; case 2: axis = GAMEPAD_AXIS_LEFT_TRIGGER; case 3: { if (axis == -1) axis = GAMEPAD_AXIS_RIGHT_TRIGGER;