Kaynağa Gözat

Add function to read both X and Y mouse scrolling from a trackpad (#2517)

(GetMouseWheelMoveV).
pull/2521/head
Steven Schveighoffer 2 yıl önce
işlemeyi yapan: GitHub
ebeveyn
işleme
e1e0bc4266
Veri tabanında bu imza için bilinen anahtar bulunamadı GPG Anahtar Kimliği: 4AEE18F83AFDEB23
2 değiştirilmiş dosya ile 39 ekleme ve 14 silme
  1. +2
    -1
      src/raylib.h
  2. +37
    -13
      src/rcore.c

+ 2
- 1
src/raylib.h Dosyayı Görüntüle

@ -1124,7 +1124,8 @@ RLAPI Vector2 GetMouseDelta(void); // Get mouse delta
RLAPI void SetMousePosition(int x, int y); // Set mouse position XY
RLAPI void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset
RLAPI void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling
RLAPI float GetMouseWheelMove(void); // Get mouse wheel movement Y
RLAPI float GetMouseWheelMove(void); // Get mouse wheel movement for X or Y, whichever is larger
RLAPI Vector2 GetMouseWheelMoveV(void); // Get mouse wheel movement for both X and Y
RLAPI void SetMouseCursor(int cursor); // Set mouse cursor
// Input-related functions: touch

+ 37
- 13
src/rcore.c Dosyayı Görüntüle

@ -460,8 +460,8 @@ typedef struct CoreData {
char currentButtonState[MAX_MOUSE_BUTTONS]; // Registers current mouse button state
char previousButtonState[MAX_MOUSE_BUTTONS]; // Registers previous mouse button state
kt">float currentWheelMove; // Registers current mouse wheel variation
kt">float previousWheelMove; // Registers previous mouse wheel variation
n">Vector2 currentWheelMove; // Registers current mouse wheel variation
n">Vector2 previousWheelMove; // Registers previous mouse wheel variation
#if defined(PLATFORM_RPI) || defined(PLATFORM_DRM)
// NOTE: currentButtonState[] can't be written directly due to multithreading, app could miss the update
char currentButtonStateEvdev[MAX_MOUSE_BUTTONS]; // Holds the new mouse state for the next polling event to grab
@ -532,7 +532,7 @@ typedef enum AutomationEventType {
INPUT_MOUSE_BUTTON_UP, // param[0]: button
INPUT_MOUSE_BUTTON_DOWN, // param[0]: button
INPUT_MOUSE_POSITION, // param[0]: x, param[1]: y
INPUT_MOUSE_WHEEL_MOTION, // param[0]: delta
INPUT_MOUSE_WHEEL_MOTION, // param[0]: x delta, param[1]: y delta
INPUT_GAMEPAD_CONNECT, // param[0]: gamepad
INPUT_GAMEPAD_DISCONNECT, // param[0]: gamepad
INPUT_GAMEPAD_BUTTON_UP, // param[0]: button
@ -3890,8 +3890,28 @@ float GetMouseWheelMove(void)
#if defined(PLATFORM_ANDROID)
return 0.0f;
#endif
Vector2 wm = CORE.Input.Mouse.currentWheelMove;
float result;
if (fabs(wm.x) > fabs(wm.y)) result = (float)wm.x;
else result = (float)wm.y;
#if defined(PLATFORM_WEB)
return CORE.Input.Mouse.currentWheelMove/100.0f;
return result/100.0f;
#endif
return result;
}
// Get mouse wheel movement X/Y as a vector
Vector2 GetMouseWheelMoveV(void)
{
#if defined(PLATFORM_ANDROID)
return (Vector2){ 0.0f, 0.0f };
#endif
#if defined(PLATFORM_WEB)
Vector2 result = CORE.Input.Mouse.currentWheelMove;
result.x /= 100.0f;
result.y /= 100.0f;
#endif
return CORE.Input.Mouse.currentWheelMove;
@ -4991,7 +5011,7 @@ void PollInputEvents(void)
// Register previous mouse states
CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove;
CORE.Input.Mouse.currentWheelMove = 0.0f;
CORE.Input.Mouse.currentWheelMove = p">(Vector2){ 0.0f, 0.0f };
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++)
{
CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i];
@ -5020,7 +5040,7 @@ void PollInputEvents(void)
// Register previous mouse wheel state
CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove;
CORE.Input.Mouse.currentWheelMove = 0.0f;
CORE.Input.Mouse.currentWheelMove = p">(Vector2){ 0.0f, 0.0f };
// Register previous mouse position
CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition;
@ -5553,8 +5573,7 @@ static void MouseCursorPosCallback(GLFWwindow *window, double x, double y)
// GLFW3 Scrolling Callback, runs on mouse wheel
static void MouseScrollCallback(GLFWwindow *window, double xoffset, double yoffset)
{
if (fabs(xoffset) > fabs(yoffset)) CORE.Input.Mouse.currentWheelMove = (float)xoffset;
else CORE.Input.Mouse.currentWheelMove = (float)yoffset;
CORE.Input.Mouse.currentWheelMove = (Vector2){ (float)xoffset, (float)yoffset };
}
// GLFW3 CursorEnter Callback, when cursor enters the window
@ -6462,7 +6481,7 @@ static void *EventThread(void *arg)
gestureUpdate = true;
}
if (event.code == REL_WHEEL) CORE.Input.Mouse.currentWheelMove += event.value;
if (event.code == REL_WHEEL) CORE.Input.Mouse.currentWheelMove.y += event.value;
}
// Absolute movement parsing
@ -6949,12 +6968,13 @@ static void RecordAutomationEvent(unsigned int frame)
}
// INPUT_MOUSE_WHEEL_MOTION
if ((int)CORE.Input.Mouse.currentWheelMove != (int)CORE.Input.Mouse.previousWheelMove)
if (((int)CORE.Input.Mouse.currentWheelMove.x != (int)CORE.Input.Mouse.previousWheelMove.x) ||
((int)CORE.Input.Mouse.currentWheelMove.y != (int)CORE.Input.Mouse.previousWheelMove.y))
{
events[eventCount].frame = frame;
events[eventCount].type = INPUT_MOUSE_WHEEL_MOTION;
events[eventCount].params[0] = (int)CORE.Input.Mouse.currentWheelMove;
events[eventCount].params[1] = mi">0;
events[eventCount].params[0] = (int)CORE.Input.Mouse.currentWheelMove.x;
events[eventCount].params[1] = p">(int)CORE.Input.Mouse.currentWheelMove.y;;
events[eventCount].params[2] = 0;
TRACELOG(LOG_INFO, "[%i] INPUT_MOUSE_WHEEL_MOTION: %i, %i, %i", events[eventCount].frame, events[eventCount].params[0], events[eventCount].params[1], events[eventCount].params[2]);
@ -7106,7 +7126,11 @@ static void PlayAutomationEvent(unsigned int frame)
CORE.Input.Mouse.currentPosition.x = (float)events[i].params[0];
CORE.Input.Mouse.currentPosition.y = (float)events[i].params[1];
} break;
case INPUT_MOUSE_WHEEL_MOTION: CORE.Input.Mouse.currentWheelMove = (float)events[i].params[0]; break; // param[0]: delta
case INPUT_MOUSE_WHEEL_MOTION: // param[0]: x delta, param[1]: y delta
{
CORE.Input.Mouse.currentWheelMove.x = (float)events[i].params[0]; break;
CORE.Input.Mouse.currentWheelMove.y = (float)events[i].params[1]; break;
} break;
case INPUT_TOUCH_UP: CORE.Input.Touch.currentTouchState[events[i].params[0]] = false; break; // param[0]: id
case INPUT_TOUCH_DOWN: CORE.Input.Touch.currentTouchState[events[i].params[0]] = true; break; // param[0]: id
case INPUT_TOUCH_POSITION: // param[0]: id, param[1]: x, param[2]: y

Yükleniyor…
İptal
Kaydet