Properly backspace over text that was entered when autocorrect updates text with the iPhone on-screen keyboard

This commit is contained in:
Sam Lantinga 2022-09-30 17:25:57 -07:00
parent e6640ef2d4
commit 28572702bf
2 changed files with 31 additions and 20 deletions

0
Android.mk Normal file → Executable file
View File

View File

@ -75,7 +75,7 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o
BOOL hardwareKeyboard; BOOL hardwareKeyboard;
BOOL showingKeyboard; BOOL showingKeyboard;
BOOL rotatingOrientation; BOOL rotatingOrientation;
NSString *changeText; NSString *committedText;
NSString *obligateForBackspace; NSString *obligateForBackspace;
#endif #endif
} }
@ -263,12 +263,12 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o
/* Set ourselves up as a UITextFieldDelegate */ /* Set ourselves up as a UITextFieldDelegate */
- (void)initKeyboard - (void)initKeyboard
{ {
changeText = nil;
obligateForBackspace = @" "; /* 64 space */ obligateForBackspace = @" "; /* 64 space */
textField = [[UITextField alloc] initWithFrame:CGRectZero]; textField = [[UITextField alloc] initWithFrame:CGRectZero];
textField.delegate = self; textField.delegate = self;
/* placeholder so there is something to delete! */ /* placeholder so there is something to delete! */
textField.text = obligateForBackspace; textField.text = obligateForBackspace;
committedText = textField.text;
/* set UITextInputTrait properties, mostly to defaults */ /* set UITextInputTrait properties, mostly to defaults */
textField.autocapitalizationType = UITextAutocapitalizationTypeNone; textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
@ -408,21 +408,39 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o
- (void)textFieldTextDidChange:(NSNotification *)notification - (void)textFieldTextDidChange:(NSNotification *)notification
{ {
if (changeText!=nil && textField.markedTextRange == nil) if (textField.markedTextRange == nil) {
{ NSUInteger compareLength = SDL_min(textField.text.length, committedText.length);
NSUInteger len = changeText.length; NSUInteger matchLength;
if (len > 0) {
/* Backspace over characters that are no longer in the string */
for (matchLength = 0; matchLength < compareLength; ++matchLength) {
if ([committedText characterAtIndex:matchLength] != [textField.text characterAtIndex:matchLength]) {
break;
}
}
if (matchLength < committedText.length) {
size_t deleteLength = SDL_utf8strlen([[committedText substringFromIndex:matchLength] UTF8String]);
while (deleteLength > 0) {
/* Send distinct down and up events for each backspace action */
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_BACKSPACE);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_BACKSPACE);
--deleteLength;
}
}
if (matchLength < textField.text.length) {
NSString *pendingText = [textField.text substringFromIndex:matchLength];
if (!SDL_HardwareKeyboardKeyPressed()) { if (!SDL_HardwareKeyboardKeyPressed()) {
/* Go through all the characters in the string we've been sent and /* Go through all the characters in the string we've been sent and
* convert them to key presses */ * convert them to key presses */
int i; NSUInteger i;
for (i = 0; i < len; i++) { for (i = 0; i < pendingText.length; i++) {
SDL_SendKeyboardUnicodeKey([changeText characterAtIndex:i]); SDL_SendKeyboardUnicodeKey([pendingText characterAtIndex:i]);
} }
} }
SDL_SendKeyboardText([changeText UTF8String]); SDL_SendKeyboardText([pendingText UTF8String]);
} }
changeText = nil; committedText = textField.text;
} }
} }
@ -463,18 +481,11 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o
/* UITextFieldDelegate method. Invoked when user types something. */ /* UITextFieldDelegate method. Invoked when user types something. */
- (BOOL)textField:(UITextField *)_textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string - (BOOL)textField:(UITextField *)_textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{ {
NSUInteger len = string.length;
if (len == 0) {
changeText = nil;
if (textField.markedTextRange == nil) { if (textField.markedTextRange == nil) {
/* it wants to replace text with nothing, ie a delete */
SDL_SendKeyboardKeyAutoRelease(SDL_SCANCODE_BACKSPACE);
}
if (textField.text.length < 16) { if (textField.text.length < 16) {
textField.text = obligateForBackspace; textField.text = obligateForBackspace;
committedText = textField.text;
} }
} else {
changeText = string;
} }
return YES; return YES;
} }