mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-28 11:57:24 +08:00
uikit: Initial Apple Pencil support.
Reference Issue #9911. Reference Issue #10516.
This commit is contained in:
committed by
Ryan C. Gordon
parent
5acd7fe208
commit
774e38d073
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_uikitpen_h_
|
||||||
|
#define SDL_uikitpen_h_
|
||||||
|
|
||||||
|
#include "SDL_uikitvideo.h"
|
||||||
|
#include "SDL_uikitwindow.h"
|
||||||
|
|
||||||
|
extern bool UIKit_InitPen(SDL_VideoDevice *_this);
|
||||||
|
extern void UIKit_HandlePenEnter();
|
||||||
|
extern void UIKit_HandlePenLeave();
|
||||||
|
extern void UIKit_HandlePenHover(SDL_uikitview *view, CGPoint point);
|
||||||
|
extern void UIKit_HandlePenMotion(SDL_uikitview *view, UITouch *pencil);
|
||||||
|
extern void UIKit_HandlePenPress(SDL_uikitview *view, UITouch *pencil);
|
||||||
|
extern void UIKit_HandlePenRelease(SDL_uikitview *view, UITouch *pencil);
|
||||||
|
extern void UIKit_QuitPen(SDL_VideoDevice *_this);
|
||||||
|
|
||||||
|
#endif // SDL_uikitpen_h_
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_internal.h"
|
||||||
|
|
||||||
|
#ifdef SDL_VIDEO_DRIVER_UIKIT
|
||||||
|
|
||||||
|
#include "SDL_uikitevents.h"
|
||||||
|
#include "SDL_uikitpen.h"
|
||||||
|
#include "SDL_uikitwindow.h"
|
||||||
|
|
||||||
|
#include "../../events/SDL_pen_c.h"
|
||||||
|
|
||||||
|
SDL_PenID penId;
|
||||||
|
|
||||||
|
typedef struct UIKit_PenHandle
|
||||||
|
{
|
||||||
|
SDL_PenID pen;
|
||||||
|
} UIKit_PenHandle;
|
||||||
|
|
||||||
|
bool UIKit_InitPen(SDL_VideoDevice *_this)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIKit_HandlePenEnter()
|
||||||
|
{
|
||||||
|
SDL_PenInfo penInfo;
|
||||||
|
SDL_zero(penInfo);
|
||||||
|
penInfo.capabilities = SDL_PEN_CAPABILITY_PRESSURE | SDL_PEN_CAPABILITY_ROTATION | SDL_PEN_CAPABILITY_XTILT | SDL_PEN_CAPABILITY_YTILT | SDL_PEN_CAPABILITY_TANGENTIAL_PRESSURE;
|
||||||
|
penInfo.max_tilt = 90.0f;
|
||||||
|
penInfo.num_buttons = 0;
|
||||||
|
penInfo.subtype = SDL_PEN_TYPE_PENCIL;
|
||||||
|
|
||||||
|
// probably make this better
|
||||||
|
penId = SDL_AddPenDevice(0, [@"Apple Pencil" UTF8String], &penInfo, calloc(1, sizeof(UIKit_PenHandle)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIKit_HandlePenHover(SDL_uikitview *view, CGPoint point)
|
||||||
|
{
|
||||||
|
SDL_SendPenMotion(0, penId, [view getSDLWindow], point.x, point.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIKit_HandlePenMotion(SDL_uikitview *view, UITouch *pencil)
|
||||||
|
{
|
||||||
|
CGPoint point = [pencil locationInView:view];
|
||||||
|
SDL_SendPenMotion(UIKit_GetEventTimestamp([pencil timestamp]), penId, [view getSDLWindow], point.x, point.y);
|
||||||
|
SDL_SendPenAxis(UIKit_GetEventTimestamp([pencil timestamp]), penId, [view getSDLWindow], SDL_PEN_AXIS_PRESSURE, [pencil force] / [pencil maximumPossibleForce]);
|
||||||
|
NSLog(@"ALTITUDE: %f", [pencil altitudeAngle]);
|
||||||
|
NSLog(@"AZIMUTH VECTOR: %@", [NSValue valueWithCGVector: [pencil azimuthUnitVectorInView:view]]);
|
||||||
|
NSLog(@"AZIMUTH ANGLE: %f", [pencil azimuthAngleInView:view]);
|
||||||
|
// hold it
|
||||||
|
// SDL_SendPenAxis(0, penId, [view getSDLWindow], SDL_PEN_AXIS_XTILT, [pencil altitudeAngle] / M_PI);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIKit_HandlePenPress(SDL_uikitview *view, UITouch *pencil)
|
||||||
|
{
|
||||||
|
SDL_SendPenTouch(UIKit_GetEventTimestamp([pencil timestamp]), penId, [view getSDLWindow], false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIKit_HandlePenRelease(SDL_uikitview *view, UITouch *pencil)
|
||||||
|
{
|
||||||
|
SDL_SendPenTouch(UIKit_GetEventTimestamp([pencil timestamp]), penId, [view getSDLWindow], false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIKit_HandlePenLeave()
|
||||||
|
{
|
||||||
|
SDL_RemovePenDevice(0, penId);
|
||||||
|
penId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIKit_QuitPen(SDL_VideoDevice *_this)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // SDL_VIDEO_DRIVER_UIKIT
|
||||||
@@ -34,9 +34,16 @@
|
|||||||
- (void)setSDLWindow:(SDL_Window *)window;
|
- (void)setSDLWindow:(SDL_Window *)window;
|
||||||
- (SDL_Window *)getSDLWindow;
|
- (SDL_Window *)getSDLWindow;
|
||||||
|
|
||||||
|
#if defined(__IPHONE_13_0)
|
||||||
|
- (void)pencilHovering:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(13.0));
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
||||||
- (UIPointerRegion *)pointerInteraction:(UIPointerInteraction *)interaction regionForRequest:(UIPointerRegionRequest *)request defaultRegion:(UIPointerRegion *)defaultRegion API_AVAILABLE(ios(13.4));
|
- (UIPointerRegion *)pointerInteraction:(UIPointerInteraction *)interaction regionForRequest:(UIPointerRegionRequest *)request defaultRegion:(UIPointerRegion *)defaultRegion API_AVAILABLE(ios(13.4));
|
||||||
- (UIPointerStyle *)pointerInteraction:(UIPointerInteraction *)interaction styleForRegion:(UIPointerRegion *)region API_AVAILABLE(ios(13.4));
|
- (UIPointerStyle *)pointerInteraction:(UIPointerInteraction *)interaction styleForRegion:(UIPointerRegion *)region API_AVAILABLE(ios(13.4));
|
||||||
|
- (void)indirectPointerHovering:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(13.4));
|
||||||
|
- (void)updateIndirectPointerFromTouch:(UITouch *)touch;
|
||||||
|
- (void)updateIndirectPointerButtonState:(UITouch *)touch fromEvent:(UIEvent *)event;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
- (CGPoint)touchLocation:(UITouch *)touch shouldNormalize:(BOOL)normalize;
|
- (CGPoint)touchLocation:(UITouch *)touch shouldNormalize:(BOOL)normalize;
|
||||||
|
|||||||
+183
-77
@@ -31,6 +31,7 @@
|
|||||||
#include "SDL_uikitappdelegate.h"
|
#include "SDL_uikitappdelegate.h"
|
||||||
#include "SDL_uikitevents.h"
|
#include "SDL_uikitevents.h"
|
||||||
#include "SDL_uikitmodes.h"
|
#include "SDL_uikitmodes.h"
|
||||||
|
#include "SDL_uikitpen.h"
|
||||||
#include "SDL_uikitwindow.h"
|
#include "SDL_uikitwindow.h"
|
||||||
|
|
||||||
// The maximum number of mouse buttons we support
|
// The maximum number of mouse buttons we support
|
||||||
@@ -47,6 +48,10 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick;
|
|||||||
|
|
||||||
SDL_TouchID directTouchId;
|
SDL_TouchID directTouchId;
|
||||||
SDL_TouchID indirectTouchId;
|
SDL_TouchID indirectTouchId;
|
||||||
|
|
||||||
|
#if defined(__IPHONE_13_4)
|
||||||
|
UIPointerInteraction *indirectPointerInteraction API_AVAILABLE(ios(13.4));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)initWithFrame:(CGRect)frame
|
- (instancetype)initWithFrame:(CGRect)frame
|
||||||
@@ -81,10 +86,23 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick;
|
|||||||
self.multipleTouchEnabled = YES;
|
self.multipleTouchEnabled = YES;
|
||||||
SDL_AddTouch(directTouchId, SDL_TOUCH_DEVICE_DIRECT, "");
|
SDL_AddTouch(directTouchId, SDL_TOUCH_DEVICE_DIRECT, "");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__IPHONE_13_0)
|
||||||
|
if (@available(iOS 13.0, *)) {
|
||||||
|
UIHoverGestureRecognizer *pencilRecognizer = [[UIHoverGestureRecognizer alloc] initWithTarget:self action:@selector(pencilHovering:)];
|
||||||
|
pencilRecognizer.allowedTouchTypes = @[@(UITouchTypePencil)];
|
||||||
|
[self addGestureRecognizer:pencilRecognizer];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
||||||
if (@available(iOS 13.4, *)) {
|
if (@available(iOS 13.4, *)) {
|
||||||
[self addInteraction:[[UIPointerInteraction alloc] initWithDelegate:self]];
|
indirectPointerInteraction = [[UIPointerInteraction alloc] initWithDelegate:self];
|
||||||
|
[self addInteraction:indirectPointerInteraction];
|
||||||
|
|
||||||
|
UIHoverGestureRecognizer *indirectPointerRecognizer = [[UIHoverGestureRecognizer alloc] initWithTarget:self action:@selector(indirectPointerHovering:)];
|
||||||
|
indirectPointerRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirectPointer)];
|
||||||
|
[self addGestureRecognizer:indirectPointerRecognizer];
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -156,15 +174,6 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick;
|
|||||||
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
||||||
- (UIPointerRegion *)pointerInteraction:(UIPointerInteraction *)interaction regionForRequest:(UIPointerRegionRequest *)request defaultRegion:(UIPointerRegion *)defaultRegion API_AVAILABLE(ios(13.4))
|
- (UIPointerRegion *)pointerInteraction:(UIPointerInteraction *)interaction regionForRequest:(UIPointerRegionRequest *)request defaultRegion:(UIPointerRegion *)defaultRegion API_AVAILABLE(ios(13.4))
|
||||||
{
|
{
|
||||||
if (request != nil && !SDL_GCMouseRelativeMode()) {
|
|
||||||
CGPoint origin = self.bounds.origin;
|
|
||||||
CGPoint point = request.location;
|
|
||||||
|
|
||||||
point.x -= origin.x;
|
|
||||||
point.y -= origin.y;
|
|
||||||
|
|
||||||
SDL_SendMouseMotion(0, sdlwindow, SDL_GLOBAL_MOUSE_ID, false, point.x, point.y);
|
|
||||||
}
|
|
||||||
return [UIPointerRegion regionWithRect:self.bounds identifier:nil];
|
return [UIPointerRegion regionWithRect:self.bounds identifier:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,8 +185,115 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick;
|
|||||||
return [UIPointerStyle hiddenPointerStyle];
|
return [UIPointerStyle hiddenPointerStyle];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)indirectPointerHovering:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(13.4))
|
||||||
|
{
|
||||||
|
switch (recognizer.state) {
|
||||||
|
case UIGestureRecognizerStateBegan:
|
||||||
|
case UIGestureRecognizerStateChanged:
|
||||||
|
{
|
||||||
|
CGPoint point = [recognizer locationInView:self];
|
||||||
|
SDL_SendMouseMotion(0, sdlwindow, SDL_GLOBAL_MOUSE_ID, false, point.x, point.y);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)indirectPointerMoving:(UITouch *)touch API_AVAILABLE(ios(13.4))
|
||||||
|
{
|
||||||
|
CGPoint locationInView = [self touchLocation:touch shouldNormalize:NO];
|
||||||
|
SDL_SendMouseMotion(0, sdlwindow, SDL_GLOBAL_MOUSE_ID, false, locationInView.x, locationInView.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)indirectPointerPressed:(UITouch *)touch fromEvent:(UIEvent *)event API_AVAILABLE(ios(13.4))
|
||||||
|
{
|
||||||
|
if (!SDL_HasMouse()) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; i <= MAX_MOUSE_BUTTONS; ++i) {
|
||||||
|
if (event.buttonMask & SDL_BUTTON_MASK(i)) {
|
||||||
|
Uint8 button;
|
||||||
|
|
||||||
|
switch (i) {
|
||||||
|
case 1:
|
||||||
|
button = SDL_BUTTON_LEFT;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
button = SDL_BUTTON_RIGHT;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
button = SDL_BUTTON_MIDDLE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
button = (Uint8)i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
SDL_SendMouseButton(UIKit_GetEventTimestamp([touch timestamp]), sdlwindow, SDL_GLOBAL_MOUSE_ID, button, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)indirectPointerReleased:(UITouch *)touch fromEvent:(UIEvent *)event API_AVAILABLE(ios(13.4))
|
||||||
|
{
|
||||||
|
if (!SDL_HasMouse()) {
|
||||||
|
int i;
|
||||||
|
SDL_MouseButtonFlags buttons = SDL_GetMouseState(NULL, NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_MOUSE_BUTTONS; ++i) {
|
||||||
|
if (buttons & SDL_BUTTON_MASK(i)) {
|
||||||
|
SDL_SendMouseButton(UIKit_GetEventTimestamp([touch timestamp]), sdlwindow, SDL_GLOBAL_MOUSE_ID, (Uint8)i, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // !defined(SDL_PLATFORM_TVOS) && __IPHONE_13_4
|
#endif // !defined(SDL_PLATFORM_TVOS) && __IPHONE_13_4
|
||||||
|
|
||||||
|
#if defined(__IPHONE_13_0)
|
||||||
|
|
||||||
|
- (void)pencilHovering:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(13.0))
|
||||||
|
{
|
||||||
|
switch (recognizer.state) {
|
||||||
|
case UIGestureRecognizerStateBegan:
|
||||||
|
UIKit_HandlePenEnter();
|
||||||
|
UIKit_HandlePenHover(self, [recognizer locationInView:self]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case UIGestureRecognizerStateChanged:
|
||||||
|
UIKit_HandlePenHover(self, [recognizer locationInView:self]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case UIGestureRecognizerStateEnded:
|
||||||
|
case UIGestureRecognizerStateCancelled:
|
||||||
|
UIKit_HandlePenLeave();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)pencilMoving:(UITouch *)touch
|
||||||
|
{
|
||||||
|
UIKit_HandlePenMotion(self, touch);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)pencilPressed:(UITouch *)touch
|
||||||
|
{
|
||||||
|
UIKit_HandlePenPress(self, touch);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)pencilReleased:(UITouch *)touch
|
||||||
|
{
|
||||||
|
UIKit_HandlePenRelease(self, touch);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // defined(__IPHONE_13_0)
|
||||||
|
|
||||||
- (SDL_TouchDeviceType)touchTypeForTouch:(UITouch *)touch
|
- (SDL_TouchDeviceType)touchTypeForTouch:(UITouch *)touch
|
||||||
{
|
{
|
||||||
#ifdef __IPHONE_9_0
|
#ifdef __IPHONE_9_0
|
||||||
@@ -231,34 +347,19 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick;
|
|||||||
for (UITouch *touch in touches) {
|
for (UITouch *touch in touches) {
|
||||||
BOOL handled = NO;
|
BOOL handled = NO;
|
||||||
|
|
||||||
|
#if defined(__IPHONE_13_0)
|
||||||
|
if (@available(iOS 13.0, *)) {
|
||||||
|
if (touch.type == UITouchTypePencil) {
|
||||||
|
[self pencilPressed:touch];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
||||||
if (@available(iOS 13.4, *)) {
|
if (@available(iOS 13.4, *)) {
|
||||||
if (touch.type == UITouchTypeIndirectPointer) {
|
if (touch.type == UITouchTypeIndirectPointer) {
|
||||||
if (!SDL_HasMouse()) {
|
[self indirectPointerPressed:touch fromEvent:event];
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 1; i <= MAX_MOUSE_BUTTONS; ++i) {
|
|
||||||
if (event.buttonMask & SDL_BUTTON_MASK(i)) {
|
|
||||||
Uint8 button;
|
|
||||||
|
|
||||||
switch (i) {
|
|
||||||
case 1:
|
|
||||||
button = SDL_BUTTON_LEFT;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
button = SDL_BUTTON_RIGHT;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
button = SDL_BUTTON_MIDDLE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
button = (Uint8)i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
SDL_SendMouseButton(UIKit_GetEventTimestamp([event timestamp]), sdlwindow, SDL_GLOBAL_MOUSE_ID, button, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
handled = YES;
|
handled = YES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -286,40 +387,38 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick;
|
|||||||
{
|
{
|
||||||
for (UITouch *touch in touches) {
|
for (UITouch *touch in touches) {
|
||||||
BOOL handled = NO;
|
BOOL handled = NO;
|
||||||
|
|
||||||
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
#if defined(__IPHONE_13_0)
|
||||||
if (@available(iOS 13.4, *)) {
|
if (@available(iOS 13.0, *)) {
|
||||||
if (touch.type == UITouchTypeIndirectPointer) {
|
if (touch.type == UITouchTypePencil) {
|
||||||
if (!SDL_HasMouse()) {
|
[self pencilReleased:touch];
|
||||||
int i;
|
continue;
|
||||||
SDL_MouseButtonFlags buttons = SDL_GetMouseState(NULL, NULL);
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_MOUSE_BUTTONS; ++i) {
|
|
||||||
if (buttons & SDL_BUTTON_MASK(i)) {
|
|
||||||
SDL_SendMouseButton(UIKit_GetEventTimestamp([event timestamp]), sdlwindow, SDL_GLOBAL_MOUSE_ID, (Uint8)i, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
handled = YES;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!handled) {
|
|
||||||
SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch];
|
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
||||||
SDL_TouchID touchId = [self touchIdForType:touchType];
|
if (@available(iOS 13.4, *)) {
|
||||||
float pressure = [self pressureForTouch:touch];
|
if (touch.type == UITouchTypeIndirectPointer) {
|
||||||
|
[self indirectPointerReleased:touch fromEvent:event];
|
||||||
if (SDL_AddTouch(touchId, touchType, "") < 0) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME, need to send: int clicks = (int) touch.tapCount; ?
|
|
||||||
|
|
||||||
CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES];
|
|
||||||
SDL_SendTouch(UIKit_GetEventTimestamp([event timestamp]),
|
|
||||||
touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow,
|
|
||||||
false, locationInView.x, locationInView.y, pressure);
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch];
|
||||||
|
SDL_TouchID touchId = [self touchIdForType:touchType];
|
||||||
|
float pressure = [self pressureForTouch:touch];
|
||||||
|
|
||||||
|
if (SDL_AddTouch(touchId, touchType, "") < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME, need to send: int clicks = (int) touch.tapCount; ?
|
||||||
|
|
||||||
|
CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES];
|
||||||
|
SDL_SendTouch(UIKit_GetEventTimestamp([event timestamp]),
|
||||||
|
touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow,
|
||||||
|
false, locationInView.x, locationInView.y, pressure);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,29 +431,36 @@ extern int SDL_AppleTVRemoteOpenedAsJoystick;
|
|||||||
{
|
{
|
||||||
for (UITouch *touch in touches) {
|
for (UITouch *touch in touches) {
|
||||||
BOOL handled = NO;
|
BOOL handled = NO;
|
||||||
|
|
||||||
|
#if defined(__IPHONE_13_0)
|
||||||
|
if (@available(iOS 13.0, *)) {
|
||||||
|
if (touch.type == UITouchTypePencil) {
|
||||||
|
[self pencilMoving:touch];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
#if !defined(SDL_PLATFORM_TVOS) && defined(__IPHONE_13_4)
|
||||||
if (@available(iOS 13.4, *)) {
|
if (@available(iOS 13.4, *)) {
|
||||||
if (touch.type == UITouchTypeIndirectPointer) {
|
if (touch.type == UITouchTypeIndirectPointer) {
|
||||||
// Already handled in pointerInteraction callback
|
[self indirectPointerMoving:touch];
|
||||||
handled = YES;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!handled) {
|
SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch];
|
||||||
SDL_TouchDeviceType touchType = [self touchTypeForTouch:touch];
|
SDL_TouchID touchId = [self touchIdForType:touchType];
|
||||||
SDL_TouchID touchId = [self touchIdForType:touchType];
|
float pressure = [self pressureForTouch:touch];
|
||||||
float pressure = [self pressureForTouch:touch];
|
|
||||||
|
|
||||||
if (SDL_AddTouch(touchId, touchType, "") < 0) {
|
if (SDL_AddTouch(touchId, touchType, "") < 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES];
|
|
||||||
SDL_SendTouchMotion(UIKit_GetEventTimestamp([event timestamp]),
|
|
||||||
touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow,
|
|
||||||
locationInView.x, locationInView.y, pressure);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGPoint locationInView = [self touchLocation:touch shouldNormalize:YES];
|
||||||
|
SDL_SendTouchMotion(UIKit_GetEventTimestamp([event timestamp]),
|
||||||
|
touchId, (SDL_FingerID)(uintptr_t)touch, sdlwindow,
|
||||||
|
locationInView.x, locationInView.y, pressure);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user