SDL: Avoid textinput events when pasting from clipboard on iOS.

From eddaf870f5b57bbdb7f1cf08bacc4f997806d9a7 Mon Sep 17 00:00:00 2001
From: Deve <[EMAIL REDACTED]>
Date: Wed, 4 Jan 2023 22:11:01 +0100
Subject: [PATCH] Avoid textinput events when pasting from clipboard on iOS.

I handle command+C and command+V shortcuts for copy/paste from clipboard using
SDL_GetClipboardText/SDL_SetClipboardText. But on iOS command+V shortcut is
also handled by system, so that I also get textinput event with that clipboard
text. And thus the application gets this clipboard text twice (from
SDL_GetClipboardText and from textinput event).

I assume that intended behavior is that command+V shouldn't generate textinput
events. At least as far as I know ctrl+V on other platforms does nothing. This
commit disables paste action for UITextField, so that textinput event isn't
generated anymore.
---
 src/video/uikit/SDL_uikitviewcontroller.h |  4 ++++
 src/video/uikit/SDL_uikitviewcontroller.m | 15 +++++++++++++--
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/video/uikit/SDL_uikitviewcontroller.h b/src/video/uikit/SDL_uikitviewcontroller.h
index 7c7b685b8474..013cf5e0db1a 100644
--- a/src/video/uikit/SDL_uikitviewcontroller.h
+++ b/src/video/uikit/SDL_uikitviewcontroller.h
@@ -31,6 +31,10 @@
 #define SDLRootViewController UIViewController
 #endif
 
+@interface SDLUITextField : UITextField
+- (BOOL)canPerformAction:(SEL)action withSender:(id)sender;
+@end
+
 #if SDL_IPHONE_KEYBOARD
 @interface SDL_uikitviewcontroller : SDLRootViewController <UITextFieldDelegate>
 #else
diff --git a/src/video/uikit/SDL_uikitviewcontroller.m b/src/video/uikit/SDL_uikitviewcontroller.m
index 5ace2d715f09..b2ae55115054 100644
--- a/src/video/uikit/SDL_uikitviewcontroller.m
+++ b/src/video/uikit/SDL_uikitviewcontroller.m
@@ -60,6 +60,17 @@ static void SDLCALL SDL_HideHomeIndicatorHintChanged(void *userdata, const char
 }
 #endif
 
+@implementation SDLUITextField : UITextField
+- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
+{
+	if (action == @selector(paste:)) {
+		return NO;
+	}
+
+	return [super canPerformAction:action withSender:sender];
+}
+@end
+
 @implementation SDL_uikitviewcontroller
 {
     CADisplayLink *displayLink;
@@ -68,7 +79,7 @@ @implementation SDL_uikitviewcontroller
     void *animationCallbackParam;
 
 #if SDL_IPHONE_KEYBOARD
-    UITextField *textField;
+    SDLUITextField *textField;
     BOOL hardwareKeyboard;
     BOOL showingKeyboard;
     BOOL rotatingOrientation;
@@ -252,7 +263,7 @@ - (BOOL)prefersPointerLocked
 - (void)initKeyboard
 {
     obligateForBackspace = @"                                                                "; /* 64 space */
-    textField = [[UITextField alloc] initWithFrame:CGRectZero];
+    textField = [[SDLUITextField alloc] initWithFrame:CGRectZero];
     textField.delegate = self;
     /* placeholder so there is something to delete! */
     textField.text = obligateForBackspace;