Skip to content

Commit

Permalink
Properly backspace over text that was entered when autocorrect update…
Browse files Browse the repository at this point in the history
…s text with the iPhone on-screen keyboard
  • Loading branch information
slouken committed Oct 1, 2022
1 parent e6640ef commit 2857270
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 20 deletions.
Empty file modified Android.mk
100644 → 100755
Empty file.
51 changes: 31 additions & 20 deletions src/video/uikit/SDL_uikitviewcontroller.m
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ @implementation SDL_uikitviewcontroller {
BOOL hardwareKeyboard;
BOOL showingKeyboard;
BOOL rotatingOrientation;
NSString *changeText;
NSString *committedText;
NSString *obligateForBackspace;
#endif
}
Expand Down Expand Up @@ -263,12 +263,12 @@ - (BOOL)prefersPointerLocked
/* Set ourselves up as a UITextFieldDelegate */
- (void)initKeyboard
{
changeText = nil;
obligateForBackspace = @" "; /* 64 space */
textField = [[UITextField alloc] initWithFrame:CGRectZero];
textField.delegate = self;
/* placeholder so there is something to delete! */
textField.text = obligateForBackspace;
committedText = textField.text;

/* set UITextInputTrait properties, mostly to defaults */
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
Expand Down Expand Up @@ -408,21 +408,39 @@ - (void)keyboardWillHide:(NSNotification *)notification

- (void)textFieldTextDidChange:(NSNotification *)notification
{
if (changeText!=nil && textField.markedTextRange == nil)
{
NSUInteger len = changeText.length;
if (len > 0) {
if (textField.markedTextRange == nil) {
NSUInteger compareLength = SDL_min(textField.text.length, committedText.length);
NSUInteger matchLength;

/* 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()) {
/* Go through all the characters in the string we've been sent and
* convert them to key presses */
int i;
for (i = 0; i < len; i++) {
SDL_SendKeyboardUnicodeKey([changeText characterAtIndex:i]);
NSUInteger i;
for (i = 0; i < pendingText.length; i++) {
SDL_SendKeyboardUnicodeKey([pendingText characterAtIndex:i]);
}
}
SDL_SendKeyboardText([changeText UTF8String]);
SDL_SendKeyboardText([pendingText UTF8String]);
}
changeText = nil;
committedText = textField.text;
}
}

Expand Down Expand Up @@ -463,18 +481,11 @@ - (void)setKeyboardHeight:(int)height
/* UITextFieldDelegate method. Invoked when user types something. */
- (BOOL)textField:(UITextField *)_textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSUInteger len = string.length;
if (len == 0) {
changeText = nil;
if (textField.markedTextRange == nil) {
/* it wants to replace text with nothing, ie a delete */
SDL_SendKeyboardKeyAutoRelease(SDL_SCANCODE_BACKSPACE);
}
if (textField.markedTextRange == nil) {
if (textField.text.length < 16) {
textField.text = obligateForBackspace;
committedText = textField.text;
}
} else {
changeText = string;
}
return YES;
}
Expand Down

0 comments on commit 2857270

Please sign in to comment.