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)
This commit is contained in:
Deve 2023-01-04 22:11:01 +01:00 committed by Sam Lantinga
parent 42d979a231
commit c67ff82377
2 changed files with 17 additions and 2 deletions

View File

@ -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 <UITextFieldDelegate>
#else

View File

@ -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;