Fix double text entry bug

This commit is contained in:
Thomas Farstrike
2025-11-16 19:12:49 +01:00
parent 428ad5e2c1
commit b714ad817e
2 changed files with 68 additions and 2 deletions
+39 -2
View File
@@ -56,6 +56,9 @@ class MposKeyboard:
# Create underlying LVGL keyboard widget
self._keyboard = lv.keyboard(parent)
# Store textarea reference (we DON'T pass it to LVGL to avoid double-typing)
self._textarea = None
# Configure layouts
self._setup_layouts()
@@ -118,12 +121,21 @@ class MposKeyboard:
Args:
event: LVGL event object
"""
# Only process VALUE_CHANGED events
event_code = event.get_code()
if event_code != lv.EVENT.VALUE_CHANGED:
return
# Get the pressed button and its text
button = self._keyboard.get_selected_button()
text = self._keyboard.get_button_text(button)
# Get current textarea content
ta = self._keyboard.get_textarea()
# Ignore if no valid button text (can happen during initialization)
if text is None:
return
# Get current textarea content (from our own reference, not LVGL's)
ta = self._textarea
if not ta:
return
@@ -179,6 +191,31 @@ class MposKeyboard:
# Update textarea
ta.set_text(new_text)
def set_textarea(self, textarea):
"""
Set the textarea that this keyboard types into.
IMPORTANT: We store the textarea reference ourselves and DON'T pass
it to the underlying LVGL keyboard. This prevents LVGL's built-in
automatic character insertion, which would cause double-character bugs
(LVGL inserts + our handler inserts = double characters).
Args:
textarea: The lv.textarea widget to type into, or None to disconnect
"""
self._textarea = textarea
# NOTE: We deliberately DO NOT call self._keyboard.set_textarea()
# to avoid LVGL's automatic character insertion
def get_textarea(self):
"""
Get the textarea that this keyboard types into.
Returns:
The lv.textarea widget, or None if not connected
"""
return self._textarea
def set_mode(self, mode):
"""
Set keyboard mode with proper map configuration.
@@ -123,6 +123,35 @@ class TestKeyboardModeSwitch(unittest.TestCase):
except Exception as e:
self.fail(f" CRASH: Switching to {mode_name} caused exception: {e}")
def test_event_handler_exists(self):
"""
Verify that the event handler exists and is properly connected.
The _handle_events method should filter events to only process
VALUE_CHANGED events. This prevents duplicate characters from being
typed when other events (like PRESSED, RELEASED, etc.) are fired.
The fix ensures:
1. Only VALUE_CHANGED events are processed
2. None/invalid button text is ignored
3. Each button press results in exactly ONE character being added
"""
print("\n=== Verifying event handler exists ===")
keyboard = MposKeyboard(self.screen)
keyboard.set_textarea(self.textarea)
keyboard.align(lv.ALIGN.BOTTOM_MID, 0, 0)
wait_for_render(10)
# Verify the event handler method exists and is callable
self.assertTrue(hasattr(keyboard, '_handle_events'),
"Keyboard should have _handle_events method")
self.assertTrue(callable(keyboard._handle_events),
"_handle_events should be callable")
print("SUCCESS: Event handler exists and is properly set up")
print("Note: The handler filters for VALUE_CHANGED events only")
if __name__ == "__main__":
unittest.main()