Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1086,9 +1086,9 @@ public static native void onNativeTouch(int touchDevId, int pointerFingerId,
public static native boolean nativeAllowRecreateActivity();
public static native int nativeCheckSDLThreadCounter();
public static native void onNativeFileDialog(int requestCode, String[] filelist, int filter);
public static native void onNativePinchStart();
public static native void onNativePinchUpdate(float scale);
public static native void onNativePinchEnd();
public static native void onNativePinchStart(float span_x, float span_y, float focus_x, float focus_y);
public static native void onNativePinchUpdate(float scale, float span_x, float span_y, float focus_x, float focus_y);
public static native void onNativePinchEnd(float span_x, float span_y, float focus_x, float focus_y);

/**
* This method is called by SDL using JNI.
Expand Down
18 changes: 15 additions & 3 deletions android-project/app/src/main/java/org/libsdl/app/SDLSurface.java
Original file line number Diff line number Diff line change
Expand Up @@ -431,19 +431,31 @@ public boolean onCapturedPointerEvent(MotionEvent event)
@Override
public boolean onScale(ScaleGestureDetector detector) {
float scale = detector.getScaleFactor();
SDLActivity.onNativePinchUpdate(scale);
float span_x = getNormalizedX(detector.getCurrentSpanX());
float span_y = getNormalizedY(detector.getCurrentSpanY());
float focus_x = getNormalizedX(detector.getFocusX());
float focus_y = getNormalizedY(detector.getFocusY());
SDLActivity.onNativePinchUpdate(scale, span_x, span_y, focus_x, focus_y);
return true;
}

@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
SDLActivity.onNativePinchStart();
float span_x = getNormalizedX(detector.getCurrentSpanX());
float span_y = getNormalizedY(detector.getCurrentSpanY());
float focus_x = getNormalizedX(detector.getFocusX());
float focus_y = getNormalizedY(detector.getFocusY());
SDLActivity.onNativePinchStart(span_x, span_y, focus_x, focus_y);
return true;
}

@Override
public void onScaleEnd(ScaleGestureDetector detector) {
SDLActivity.onNativePinchEnd();
float span_x = getNormalizedX(detector.getCurrentSpanX());
float span_y = getNormalizedY(detector.getCurrentSpanY());
float focus_x = getNormalizedX(detector.getFocusX());
float focus_y = getNormalizedY(detector.getFocusY());
SDLActivity.onNativePinchEnd(span_x, span_y, focus_x, focus_y);
}

}
4 changes: 4 additions & 0 deletions include/SDL3/SDL_events.h
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,10 @@ typedef struct SDL_PinchFingerEvent
Uint32 reserved;
Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
float scale; /**< The scale change since the last SDL_EVENT_PINCH_UPDATE. Scale < 1 is "zoom out". Scale > 1 is "zoom in". */
float span_x; /**< The average X distance between each of the pointers forming the pinch in screen pixel coordinates. Or, -1 if this information is unavailable. */

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These need to be added to the end of the struct, so we don't break ABI compatibility. Put them under windowID, please.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(you mentioned this was fixed...did it not get pushed?)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know how that happened. I figure I checkout'ed an old commit without paying close enough attention. Fixed again now.

float span_y; /**< The average Y distance between each of the pointers forming the pinch in screen pixel coordinates. Or, -1 if this information is unavailable. */
float focus_x; /**< The X coordinate of the current gesture's focal point in screen pixel coordinates. Or, -1 if this information is unavailable. */
float focus_y; /**< The Y coordinate of the current gesture's focal point in screen pixel coordinates. Or, -1 if this information is unavailable. */
SDL_WindowID windowID; /**< The window underneath the finger, if any */
} SDL_PinchFingerEvent;

Expand Down
26 changes: 14 additions & 12 deletions src/core/android/SDL_android.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,14 +122,16 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeTouch)(
jint action, jfloat x, jfloat y, jfloat p);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePinchStart)(
JNIEnv *env, jclass jcls);
JNIEnv *env, jclass jcls,
jfloat span_x, jfloat span_y, jfloat focus_x, jfloat focus_y);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePinchUpdate)(
JNIEnv *env, jclass jcls,
jfloat scale);
jfloat scale, jfloat span_x, jfloat span_y, jfloat focus_x, jfloat focus_y);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePinchEnd)(
JNIEnv *env, jclass jcls);
JNIEnv *env, jclass jcls,
jfloat span_x, jfloat span_y, jfloat focus_x, jfloat focus_y);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeMouse)(
JNIEnv *env, jclass jcls,
Expand Down Expand Up @@ -231,9 +233,9 @@ static JNINativeMethod SDLActivity_tab[] = {
{ "onNativeSoftReturnKey", "()Z", SDL_JAVA_INTERFACE(onNativeSoftReturnKey) },
{ "onNativeKeyboardFocusLost", "()V", SDL_JAVA_INTERFACE(onNativeKeyboardFocusLost) },
{ "onNativeTouch", "(IIIFFF)V", SDL_JAVA_INTERFACE(onNativeTouch) },
{ "onNativePinchStart", "()V", SDL_JAVA_INTERFACE(onNativePinchStart) },
{ "onNativePinchUpdate", "(F)V", SDL_JAVA_INTERFACE(onNativePinchUpdate) },
{ "onNativePinchEnd", "()V", SDL_JAVA_INTERFACE(onNativePinchEnd) },
{ "onNativePinchStart", "(FFFF)V", SDL_JAVA_INTERFACE(onNativePinchStart) },
{ "onNativePinchUpdate", "(FFFFF)V", SDL_JAVA_INTERFACE(onNativePinchUpdate) },
{ "onNativePinchEnd", "(FFFF)V", SDL_JAVA_INTERFACE(onNativePinchEnd) },
{ "onNativeMouse", "(IIFFZ)V", SDL_JAVA_INTERFACE(onNativeMouse) },
{ "onNativePen", "(IIIIFFF)V", SDL_JAVA_INTERFACE(onNativePen) },
{ "onNativeAccel", "(FFF)V", SDL_JAVA_INTERFACE(onNativeAccel) },
Expand Down Expand Up @@ -1395,36 +1397,36 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeTouch)(

// Pinch
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePinchStart)(
JNIEnv *env, jclass jcls)
JNIEnv *env, jclass jcls, jfloat span_x, jfloat span_y, jfloat focus_x, jfloat focus_y)
{
SDL_LockMutex(Android_ActivityMutex);

if (Android_Window) {
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, 0, Android_Window, 0);
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, 0, Android_Window, 0, span_x, span_y, focus_x, focus_y);
}

SDL_UnlockMutex(Android_ActivityMutex);
}

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePinchUpdate)(
JNIEnv *env, jclass jcls, jfloat scale)
JNIEnv *env, jclass jcls, jfloat scale, jfloat span_x, jfloat span_y, jfloat focus_x, jfloat focus_y)
{
SDL_LockMutex(Android_ActivityMutex);

if (Android_Window) {
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, 0, Android_Window, scale);
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, 0, Android_Window, scale, span_x, span_y, focus_x, focus_y);
}

SDL_UnlockMutex(Android_ActivityMutex);
}

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePinchEnd)(
JNIEnv *env, jclass jcls)
JNIEnv *env, jclass jcls, jfloat span_x, jfloat span_y, jfloat focus_x, jfloat focus_y)
{
SDL_LockMutex(Android_ActivityMutex);

if (Android_Window) {
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, Android_Window, 0);
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, Android_Window, 0, span_x, span_y, focus_x, focus_y);
}

SDL_UnlockMutex(Android_ActivityMutex);
Expand Down
6 changes: 5 additions & 1 deletion src/events/SDL_touch.c
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@ void SDL_QuitTouch(void)
SDL_touch_lock = NULL;
}

int SDL_SendPinch(SDL_EventType type, Uint64 timestamp, SDL_Window *window, float scale)
int SDL_SendPinch(SDL_EventType type, Uint64 timestamp, SDL_Window *window, float scale, float span_x, float span_y, float focus_x, float focus_y)
{
/* Post the event, if desired */
int posted = 0;
Expand All @@ -628,6 +628,10 @@ int SDL_SendPinch(SDL_EventType type, Uint64 timestamp, SDL_Window *window, floa
event.type = type;
event.common.timestamp = timestamp;
event.pinch.scale = scale;
event.pinch.span_x = span_x > 0 ? (span_x * (float)window->w) : -1.f;
event.pinch.span_y = span_y > 0 ? (span_y * (float)window->h) : -1.f;
event.pinch.focus_x = focus_x > 0 ? (focus_x * (float)window->w) : -1.f;
event.pinch.focus_y = focus_y > 0 ? (focus_y * (float)window->h) : -1.f;
event.pinch.windowID = window ? SDL_GetWindowID(window) : 0;
posted = (SDL_PushEvent(&event) > 0);
}
Expand Down
2 changes: 1 addition & 1 deletion src/events/SDL_touch_c.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,6 @@ extern void SDL_DelTouch(SDL_TouchID id);
extern void SDL_QuitTouch(void);

// Send Gesture events
extern int SDL_SendPinch(SDL_EventType type, Uint64 timestamp, SDL_Window *window, float scale);
extern int SDL_SendPinch(SDL_EventType type, Uint64 timestamp, SDL_Window *window, float scale, float span_x, float span_y, float focus_x, float focus_y);

#endif // SDL_touch_c_h_
6 changes: 3 additions & 3 deletions src/video/cocoa/SDL_cocoawindow.m
Original file line number Diff line number Diff line change
Expand Up @@ -2038,17 +2038,17 @@ - (void)magnifyWithEvent:(NSEvent *)theEvent
{
switch ([theEvent phase]) {
case NSEventPhaseBegan:
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, Cocoa_GetEventTimestamp([theEvent timestamp]), NULL, 0);
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, Cocoa_GetEventTimestamp([theEvent timestamp]), NULL, 0, -1, -1, -1, -1);
break;
case NSEventPhaseChanged:
{
CGFloat scale = 1.0f + [theEvent magnification];
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, Cocoa_GetEventTimestamp([theEvent timestamp]), NULL, scale);
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, Cocoa_GetEventTimestamp([theEvent timestamp]), NULL, scale, -1, -1, -1, -1);
}
break;
case NSEventPhaseEnded:
case NSEventPhaseCancelled:
SDL_SendPinch(SDL_EVENT_PINCH_END, Cocoa_GetEventTimestamp([theEvent timestamp]), NULL, 0);
SDL_SendPinch(SDL_EVENT_PINCH_END, Cocoa_GetEventTimestamp([theEvent timestamp]), NULL, 0, -1, -1, -1, -1);
break;
default:
break;
Expand Down
17 changes: 14 additions & 3 deletions src/video/uikit/SDL_uikitview.m
Original file line number Diff line number Diff line change
Expand Up @@ -484,25 +484,36 @@ - (IBAction)sdlPinchGesture:(UIPinchGestureRecognizer *)sender
{
CGFloat scale = sender.scale;
UIGestureRecognizerState state = sender.state;
CGPoint point1 = [sender locationOfTouch:0 inView:self];
CGPoint point2 = [sender locationOfTouch:1 inView:self];
CGFloat focus_x = (point1.x + point2.x)/2;
CGFloat focus_y = (point1.y + point2.y)/2;
CGFloat span_x = SDL_fabs(point1.x - point2.x);
CGFloat span_y = SDL_fabs(point1.y - point2.y);
CGRect bounds = self.bounds;
focus_x /= bounds.size.width;
focus_y /= bounds.size.height;
span_x /= bounds.size.width;
span_y /= bounds.size.height;

switch (state) {

case UIGestureRecognizerStateBegan:
pinch_scale = 1.0f;
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, 0, sdlwindow, 0);
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, 0, sdlwindow, 0, span_x, span_y, focus_x, focus_y);
break;

case UIGestureRecognizerStateChanged:
if (pinch_scale > 0.0f) {
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, 0, sdlwindow, scale / pinch_scale);
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, 0, sdlwindow, scale / pinch_scale, span_x, span_y, focus_x, focus_y);
}
pinch_scale = scale;
break;

case UIGestureRecognizerStateFailed:
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled:
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, sdlwindow, 0);
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, sdlwindow, 0, span_x, span_y, focus_x, focus_y);
break;

default:
Expand Down
8 changes: 4 additions & 4 deletions src/video/wayland/SDL_waylandevents.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ static void handle_pinch_begin(void *data, struct zwp_pointer_gesture_pinch_v1 *
seat->pointer.gesture_focus = wind;

const Uint64 timestamp = Wayland_GetPointerTimestamp(seat, time);
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, timestamp, wind->sdlwindow, 0.0f);
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, timestamp, wind->sdlwindow, 0.0f, -1.0f, -1.0f, -1.0f, -1.0f);
}
}

Expand All @@ -334,7 +334,7 @@ static void handle_pinch_update(void *data, struct zwp_pointer_gesture_pinch_v1
if (seat->pointer.gesture_focus) {
const Uint64 timestamp = Wayland_GetPointerTimestamp(seat, time);
const float s = (float)wl_fixed_to_double(scale);
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, timestamp, seat->pointer.gesture_focus->sdlwindow, s);
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, timestamp, seat->pointer.gesture_focus->sdlwindow, s, -1.0f, -1.0f, -1.0f, -1.0f);
}
}

Expand All @@ -344,7 +344,7 @@ static void handle_pinch_end(void *data, struct zwp_pointer_gesture_pinch_v1 *zw

if (seat->pointer.gesture_focus) {
const Uint64 timestamp = Wayland_GetPointerTimestamp(seat, time);
SDL_SendPinch(SDL_EVENT_PINCH_END, timestamp, seat->pointer.gesture_focus->sdlwindow, 0.0f);
SDL_SendPinch(SDL_EVENT_PINCH_END, timestamp, seat->pointer.gesture_focus->sdlwindow, 0.0f, -1.0f, -1.0f, -1.0f, -1.0f);

seat->pointer.gesture_focus = NULL;
}
Expand Down Expand Up @@ -2390,7 +2390,7 @@ static void Wayland_SeatDestroyPointer(SDL_WaylandSeat *seat)

// End any active gestures.
if (seat->pointer.gesture_focus) {
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, seat->pointer.gesture_focus->sdlwindow, 0.0f);
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, seat->pointer.gesture_focus->sdlwindow, 0.0f, -1.0f, -1.0f, -1.0f, -1.0f);
}

// Make sure focus is removed from a surface before the pointer is destroyed.
Expand Down
6 changes: 3 additions & 3 deletions src/video/x11/SDL_x11xinput2.c
Original file line number Diff line number Diff line change
Expand Up @@ -735,11 +735,11 @@ void X11_HandleXinput2Event(SDL_VideoDevice *_this, XGenericEventCookie *cookie)
xinput2_normalize_touch_coordinates(window, xev->event_x, xev->event_y, &x, &y);

if (cookie->evtype == XI_GesturePinchBegin) {
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, 0, window, 0);
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, 0, window, 0, -1, -1, -1, -1);
} else if (cookie->evtype == XI_GesturePinchUpdate) {
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, 0, window, (float)xev->scale);
SDL_SendPinch(SDL_EVENT_PINCH_UPDATE, 0, window, (float)xev->scale, -1, -1, -1, -1);
} else {
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, window, 0);
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, window, 0, -1, -1, -1, -1);
}
} break;

Expand Down
Loading