mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-06-06 14:43:20 +00:00
more information for pinch gestures on mobile
This commit is contained in:
parent
bbcc205de9
commit
e669fd6dfd
10 changed files with 35 additions and 23 deletions
|
|
@ -1087,7 +1087,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||
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 onNativePinchUpdate(float scale, float span_x, float span_y, float focus_x, float focus_y);
|
||||
public static native void onNativePinchEnd();
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -431,7 +431,11 @@ public class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
|||
@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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
float span_y; /**< The average Y distance between each of the pointers forming the pinch in screen pixel coordinates. */
|
||||
float focus_x; /**< The X coordinate of the current gesture's focal point in screen pixel coordinates. */
|
||||
float focus_y; /**< The Y coordinate of the current gesture's focal point in screen pixel coordinates. */
|
||||
SDL_WindowID windowID; /**< The window underneath the finger, if any */
|
||||
} SDL_PinchFingerEvent;
|
||||
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePinchStart)(
|
|||
|
||||
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);
|
||||
|
|
@ -232,7 +232,7 @@ static JNINativeMethod SDLActivity_tab[] = {
|
|||
{ "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) },
|
||||
{ "onNativePinchUpdate", "(FFFFF)V", SDL_JAVA_INTERFACE(onNativePinchUpdate) },
|
||||
{ "onNativePinchEnd", "()V", SDL_JAVA_INTERFACE(onNativePinchEnd) },
|
||||
{ "onNativeMouse", "(IIFFZ)V", SDL_JAVA_INTERFACE(onNativeMouse) },
|
||||
{ "onNativePen", "(IIIIFFF)V", SDL_JAVA_INTERFACE(onNativePen) },
|
||||
|
|
@ -1400,19 +1400,19 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePinchStart)(
|
|||
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, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
@ -1424,7 +1424,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativePinchEnd)(
|
|||
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, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
SDL_UnlockMutex(Android_ActivityMutex);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -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 * (float)window->w);
|
||||
event.pinch.span_y = (span_y * (float)window->h);
|
||||
event.pinch.focus_x = (focus_x * (float)window->w);
|
||||
event.pinch.focus_y = (focus_y * (float)window->h);
|
||||
event.pinch.windowID = window ? SDL_GetWindowID(window) : 0;
|
||||
posted = (SDL_PushEvent(&event) > 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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_
|
||||
|
|
|
|||
|
|
@ -2038,17 +2038,17 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL
|
|||
{
|
||||
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, 0, 0, 0, 0);
|
||||
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, 0, 0, 0, 0);
|
||||
}
|
||||
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, 0, 0, 0, 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -489,12 +489,12 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick;
|
|||
|
||||
case UIGestureRecognizerStateBegan:
|
||||
pinch_scale = 1.0f;
|
||||
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, 0, sdlwindow, 0);
|
||||
SDL_SendPinch(SDL_EVENT_PINCH_BEGIN, 0, sdlwindow, 0, 0, 0, 0, 0);
|
||||
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, 0, 0, 0, 0);
|
||||
}
|
||||
pinch_scale = scale;
|
||||
break;
|
||||
|
|
@ -502,7 +502,7 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick;
|
|||
case UIGestureRecognizerStateFailed:
|
||||
case UIGestureRecognizerStateEnded:
|
||||
case UIGestureRecognizerStateCancelled:
|
||||
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, sdlwindow, 0);
|
||||
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, sdlwindow, 0, 0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -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, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||
|
||||
seat->pointer.gesture_focus = NULL;
|
||||
}
|
||||
|
|
@ -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, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
|
||||
// Make sure focus is removed from a surface before the pointer is destroyed.
|
||||
|
|
|
|||
|
|
@ -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, 0, 0, 0, 0);
|
||||
} 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, 0, 0, 0, 0);
|
||||
} else {
|
||||
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, window, 0);
|
||||
SDL_SendPinch(SDL_EVENT_PINCH_END, 0, window, 0, 0, 0, 0, 0);
|
||||
}
|
||||
} break;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue