ios/Mobile/DocumentViewController.mm | 37 +++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-)
New commits: commit 624b42d58a0dad5da0a3b45d2f5bc5da3f15398b Author: Tor Lillqvist <t...@collabora.com> AuthorDate: Wed Feb 19 15:35:20 2020 +0200 Commit: Tor Lillqvist <t...@collabora.com> CommitDate: Wed Feb 19 15:17:56 2020 +0100 Hackaround for on-screen keyboard problem We want to be able to force the on-screen keyboard to be displayed (when there is no external hardware keyboard) from our JavaScript. Change-Id: I0678d84ca941a03316ffb68cfd9c3e93a6ea7e57 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/89023 Tested-by: Tor Lillqvist <t...@collabora.com> Reviewed-by: Tor Lillqvist <t...@collabora.com> diff --git a/ios/Mobile/DocumentViewController.mm b/ios/Mobile/DocumentViewController.mm index 8c97826e9..3bd967675 100644 --- a/ios/Mobile/DocumentViewController.mm +++ b/ios/Mobile/DocumentViewController.mm @@ -125,8 +125,41 @@ static IMP standardImpOfInputAccessoryView = nil; IMP oldImp = method_setImplementation(method, newImp); if (standardImpOfInputAccessoryView == nil) standardImpOfInputAccessoryView = oldImp; - } else if (standardImpOfInputAccessoryView != nil) { - method_setImplementation(method, standardImpOfInputAccessoryView); + } else { + // If the external keyboard has been disconnected, restore the normal behaviour. + if (standardImpOfInputAccessoryView != nil) { + method_setImplementation(method, standardImpOfInputAccessoryView); + } + + // Hack to make the on-screen keyboard pop up more eagerly when focus set to the textarea + // using JavaScript. + + // From https://stackoverflow.com/questions/32449870/programmatically-focus-on-a-form-in-a-webview-wkwebview/32845699 + + static bool doneThisAlready = false; + if (!doneThisAlready) { + const char * methodSignature; + doneThisAlready = true; + + if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion: (NSOperatingSystemVersion){13, 0, 0}]) { + methodSignature = "_elementDidFocus:userIsInteracting:blurPreviousNode:activityStateChanges:userObject:"; + } else { + methodSignature = "_elementDidFocus:userIsInteracting:blurPreviousNode:changingActivityState:userObject:"; + } + + // Override that internal method with an own wrapper that always passes the + // userIsInteracting parameter as TRUE. That will cause the on-screen keyboard to pop up + // when we call the focus() method on the textarea element in JavaScript. + SEL selector = sel_getUid(methodSignature); + Method method = class_getInstanceMethod(webBrowserClass, selector); + if (method != nil) { + IMP original = method_getImplementation(method); + IMP override = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, BOOL arg3, id arg4) { + ((void (*)(id, SEL, void*, BOOL, BOOL, BOOL, id))original)(me, selector, arg0, TRUE, arg2, arg3, arg4); + }); + method_setImplementation(method, override); + } + } } WKWebView *webViewP = self.webView; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits