@@ -63,25 +63,12 @@ def __init__(self, parent):
6363 # Configure layouts
6464 self ._setup_layouts ()
6565
66- # Initialize ALL keyboard mode maps
67- # Register to BOTH our USER modes AND standard LVGL modes
68- # This prevents LVGL from using default maps when it internally switches modes
69-
70- # Our USER modes (what we use in our API)
71- self ._keyboard .set_map (self .MODE_LOWERCASE , self ._lowercase_map , self ._lowercase_ctrl )
72- self ._keyboard .set_map (self .MODE_UPPERCASE , self ._uppercase_map , self ._uppercase_ctrl )
73- self ._keyboard .set_map (self .MODE_NUMBERS , self ._numbers_map , self ._numbers_ctrl )
74- self ._keyboard .set_map (self .MODE_SPECIALS , self ._specials_map , self ._specials_ctrl )
75-
76- # ALSO register to standard LVGL modes (what LVGL uses internally)
77- # This catches cases where LVGL internally calls set_mode(TEXT_LOWER)
78- self ._keyboard .set_map (lv .keyboard .MODE .TEXT_LOWER , self ._lowercase_map , self ._lowercase_ctrl )
79- self ._keyboard .set_map (lv .keyboard .MODE .TEXT_UPPER , self ._uppercase_map , self ._uppercase_ctrl )
80- self ._keyboard .set_map (lv .keyboard .MODE .NUMBER , self ._numbers_map , self ._numbers_ctrl )
81- self ._keyboard .set_map (lv .keyboard .MODE .SPECIAL , self ._specials_map , self ._specials_ctrl )
82-
8366 # Set default mode to lowercase
84- self ._keyboard .set_mode (self .MODE_LOWERCASE )
67+ # IMPORTANT: We do NOT call set_map() here in __init__.
68+ # Instead, set_mode() will call set_map() immediately before set_mode().
69+ # This matches the proof-of-concept pattern and prevents crashes from
70+ # calling set_map() multiple times which can corrupt button matrix state.
71+ self .set_mode (self .MODE_LOWERCASE )
8572
8673 # Add event handler for custom behavior
8774 # We need to handle ALL events to catch mode changes that LVGL might trigger
@@ -258,25 +245,27 @@ def set_mode(self, mode):
258245 mode: One of MODE_LOWERCASE, MODE_UPPERCASE, MODE_NUMBERS, MODE_SPECIALS
259246 (can also accept standard LVGL modes)
260247 """
261- # Map mode constants to their corresponding map arrays
262- # Support both our USER modes and standard LVGL modes
263- mode_maps = {
264- self .MODE_LOWERCASE : (self ._lowercase_map , self ._lowercase_ctrl ),
265- self .MODE_UPPERCASE : (self ._uppercase_map , self ._uppercase_ctrl ),
266- self .MODE_NUMBERS : (self ._numbers_map , self ._numbers_ctrl ),
267- self .MODE_SPECIALS : (self ._specials_map , self ._specials_ctrl ),
268- # Also map standard LVGL modes
269- lv .keyboard .MODE .TEXT_LOWER : (self ._lowercase_map , self ._lowercase_ctrl ),
270- lv .keyboard .MODE .TEXT_UPPER : (self ._uppercase_map , self ._uppercase_ctrl ),
271- lv .keyboard .MODE .NUMBER : (self ._numbers_map , self ._numbers_ctrl ),
272- lv .keyboard .MODE .SPECIAL : (self ._specials_map , self ._specials_ctrl ),
248+ # Determine which layout we're switching to
249+ # We need to set the map for BOTH the USER mode and the corresponding standard mode
250+ # to prevent crashes if LVGL internally switches between them
251+ mode_info = {
252+ self .MODE_LOWERCASE : (self ._lowercase_map , self ._lowercase_ctrl , [self .MODE_LOWERCASE , lv .keyboard .MODE .TEXT_LOWER ]),
253+ self .MODE_UPPERCASE : (self ._uppercase_map , self ._uppercase_ctrl , [self .MODE_UPPERCASE , lv .keyboard .MODE .TEXT_UPPER ]),
254+ self .MODE_NUMBERS : (self ._numbers_map , self ._numbers_ctrl , [self .MODE_NUMBERS , lv .keyboard .MODE .NUMBER ]),
255+ self .MODE_SPECIALS : (self ._specials_map , self ._specials_ctrl , [self .MODE_SPECIALS , lv .keyboard .MODE .SPECIAL ]),
256+ # Also support standard LVGL modes
257+ lv .keyboard .MODE .TEXT_LOWER : (self ._lowercase_map , self ._lowercase_ctrl , [self .MODE_LOWERCASE , lv .keyboard .MODE .TEXT_LOWER ]),
258+ lv .keyboard .MODE .TEXT_UPPER : (self ._uppercase_map , self ._uppercase_ctrl , [self .MODE_UPPERCASE , lv .keyboard .MODE .TEXT_UPPER ]),
259+ lv .keyboard .MODE .NUMBER : (self ._numbers_map , self ._numbers_ctrl , [self .MODE_NUMBERS , lv .keyboard .MODE .NUMBER ]),
260+ lv .keyboard .MODE .SPECIAL : (self ._specials_map , self ._specials_ctrl , [self .MODE_SPECIALS , lv .keyboard .MODE .SPECIAL ]),
273261 }
274262
275- if mode in mode_maps :
276- key_map , ctrl_map = mode_maps [mode ]
277- # CRITICAL: Always call set_map() BEFORE set_mode()
278- # This prevents lv_keyboard_update_map() crashes
279- self ._keyboard .set_map (mode , key_map , ctrl_map )
263+ if mode in mode_info :
264+ key_map , ctrl_map , mode_list = mode_info [mode ]
265+ # CRITICAL: Set the map for BOTH modes to prevent NULL pointer crashes
266+ # This ensures the map is set regardless of which mode LVGL uses internally
267+ for m in mode_list :
268+ self ._keyboard .set_map (m , key_map , ctrl_map )
280269
281270 self ._keyboard .set_mode (mode )
282271
0 commit comments