From 13fa6d962c32a451bbed81891ab76267aebeb5fb Mon Sep 17 00:00:00 2001 From: poire-z Date: Mon, 25 Nov 2019 14:31:52 +0100 Subject: [PATCH] Korean keyboard: unwrap InputText on layout change The korean keyboard wraps InputText and overrides some of its methods to process input in some specific way. When switching to another keyboard layout, the original methods need to be restored. --- .../data/keyboardlayouts/ko_KR_keyboard.lua | 19 ++++++++++++++++++- frontend/ui/widget/virtualkeyboard.lua | 6 +++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/frontend/ui/data/keyboardlayouts/ko_KR_keyboard.lua b/frontend/ui/data/keyboardlayouts/ko_KR_keyboard.lua index dc4458c0b..02a9e3571 100644 --- a/frontend/ui/data/keyboardlayouts/ko_KR_keyboard.lua +++ b/frontend/ui/data/keyboardlayouts/ko_KR_keyboard.lua @@ -26,9 +26,21 @@ local wrapInputBox = function(inputbox) if inputbox._wrapped == nil then inputbox._wrapped = true - -- helper function + -- helper functions + local copied_names = {} + local function restore_func_references(obj) + for __, name in ipairs(copied_names) do + local orig_name = "_" .. name + if obj[orig_name] then + obj[name] = obj[orig_name] + obj[orig_name] = nil + end + end + end + local function copy_func_reference(obj, name) obj["_" .. name] = obj[name] + table.insert(copied_names, name) end -- override original implementations with helper object @@ -82,6 +94,11 @@ local wrapInputBox = function(inputbox) wrap_touch_event_func_with_hghelper_reset(inputbox, "onTapTextBox") wrap_touch_event_func_with_hghelper_reset(inputbox, "onHoldTextBox") wrap_touch_event_func_with_hghelper_reset(inputbox, "onSwipeTextBox") + + return function() -- return unwrap function + restore_func_references(inputbox) + inputbox._wrapped = nil + end end end diff --git a/frontend/ui/widget/virtualkeyboard.lua b/frontend/ui/widget/virtualkeyboard.lua index 6dbbe3216..b371f7a1c 100644 --- a/frontend/ui/widget/virtualkeyboard.lua +++ b/frontend/ui/widget/virtualkeyboard.lua @@ -666,6 +666,10 @@ local VirtualKeyboard = FocusManager:new{ } function VirtualKeyboard:init() + if self.uwrap_func then + self.uwrap_func() + self.uwrap_func = nil + end local lang = self:getKeyboardLayout() local keyboard_layout = self.lang_to_keyboard_layout[lang] or self.lang_to_keyboard_layout["en"] local keyboard = require("ui/data/keyboardlayouts/" .. keyboard_layout) @@ -685,7 +689,7 @@ function VirtualKeyboard:init() self.key_events.Close = { {"Back"}, doc = "close keyboard" } end if keyboard.wrapInputBox then - keyboard.wrapInputBox(self.inputbox) + self.uwrap_func = keyboard.wrapInputBox(self.inputbox) or self.uwrap_func end end