From c67ff82377c0acbf1d9b32c91f22e52718a27f0b Mon Sep 17 00:00:00 2001 From: Deve 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. (cherry picked from commit eddaf870f5b57bbdb7f1cf08bacc4f997806d9a7) --- 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 e9f346a22..925f0b271 100644 --- a/src/video/uikit/SDL_uikitviewcontroller.h +++ b/src/video/uikit/SDL_uikitviewcontroller.h @@ -33,6 +33,10 @@ #define SDLRootViewController UIViewController #endif +@interface SDLUITextField : UITextField +- (BOOL)canPerformAction:(SEL)action withSender:(id)sender; +@end + #ifdef SDL_IPHONE_KEYBOARD @interface SDL_uikitviewcontroller : SDLRootViewController #else diff --git a/src/video/uikit/SDL_uikitviewcontroller.m b/src/video/uikit/SDL_uikitviewcontroller.m index 1d79c7a40..46fbcdeff 100644 --- a/src/video/uikit/SDL_uikitviewcontroller.m +++ b/src/video/uikit/SDL_uikitviewcontroller.m @@ -64,6 +64,17 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o } #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; int animationInterval; @@ -71,7 +82,7 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o void *animationCallbackParam; #ifdef SDL_IPHONE_KEYBOARD - UITextField *textField; + SDLUITextField *textField; BOOL hardwareKeyboard; BOOL showingKeyboard; BOOL hidingKeyboard; @@ -259,7 +270,7 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o - (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;