@@ -60,6 +60,7 @@ def __init__(self, parent):
6060 self ._setup_layouts ()
6161
6262 # Set default mode to lowercase
63+ self ._keyboard .set_map (self .MODE_LOWERCASE , self ._lowercase_map , self ._lowercase_ctrl )
6364 self ._keyboard .set_mode (self .MODE_LOWERCASE )
6465
6566 # Add event handler for custom behavior
@@ -75,44 +76,40 @@ def _setup_layouts(self):
7576 """Configure all keyboard layout modes."""
7677
7778 # Lowercase letters
78- lowercase_map = [
79+ self . _lowercase_map = [
7980 "q" , "w" , "e" , "r" , "t" , "y" , "u" , "i" , "o" , "p" , "\n " ,
8081 "a" , "s" , "d" , "f" , "g" , "h" , "j" , "k" , "l" , "\n " ,
8182 lv .SYMBOL .UP , "z" , "x" , "c" , "v" , "b" , "n" , "m" , lv .SYMBOL .BACKSPACE , "\n " ,
8283 self .LABEL_NUMBERS_SPECIALS , "," , self .LABEL_SPACE , "." , lv .SYMBOL .NEW_LINE , None
8384 ]
84- lowercase_ctrl = [10 ] * len (lowercase_map )
85- self ._keyboard .set_map (self .MODE_LOWERCASE , lowercase_map , lowercase_ctrl )
85+ self ._lowercase_ctrl = [10 ] * len (self ._lowercase_map )
8686
8787 # Uppercase letters
88- uppercase_map = [
88+ self . _uppercase_map = [
8989 "Q" , "W" , "E" , "R" , "T" , "Y" , "U" , "I" , "O" , "P" , "\n " ,
9090 "A" , "S" , "D" , "F" , "G" , "H" , "J" , "K" , "L" , "\n " ,
9191 lv .SYMBOL .DOWN , "Z" , "X" , "C" , "V" , "B" , "N" , "M" , lv .SYMBOL .BACKSPACE , "\n " ,
9292 self .LABEL_NUMBERS_SPECIALS , "," , self .LABEL_SPACE , "." , lv .SYMBOL .NEW_LINE , None
9393 ]
94- uppercase_ctrl = [10 ] * len (uppercase_map )
95- self ._keyboard .set_map (self .MODE_UPPERCASE , uppercase_map , uppercase_ctrl )
94+ self ._uppercase_ctrl = [10 ] * len (self ._uppercase_map )
9695
9796 # Numbers and common special characters
98- numbers_map = [
97+ self . _numbers_map = [
9998 "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "0" , "\n " ,
10099 "@" , "#" , "$" , "_" , "&" , "-" , "+" , "(" , ")" , "/" , "\n " ,
101100 self .LABEL_SPECIALS , "*" , "\" " , "'" , ":" , ";" , "!" , "?" , lv .SYMBOL .BACKSPACE , "\n " ,
102101 self .LABEL_LETTERS , "," , self .LABEL_SPACE , "." , lv .SYMBOL .NEW_LINE , None
103102 ]
104- numbers_ctrl = [10 ] * len (numbers_map )
105- self ._keyboard .set_map (self .MODE_NUMBERS , numbers_map , numbers_ctrl )
103+ self ._numbers_ctrl = [10 ] * len (self ._numbers_map )
106104
107105 # Additional special characters with emoticons
108- specials_map = [
106+ self . _specials_map = [
109107 "~" , "`" , "|" , "•" , ":-)" , ";-)" , ":-D" , "\n " ,
110108 ":-(" , ":'-(" , "^" , "°" , "=" , "{" , "}" , "\\ " , "\n " ,
111109 self .LABEL_NUMBERS_SPECIALS , ":-o" , ":-P" , "[" , "]" , lv .SYMBOL .BACKSPACE , "\n " ,
112110 self .LABEL_LETTERS , "<" , self .LABEL_SPACE , ">" , lv .SYMBOL .NEW_LINE , None
113111 ]
114- specials_ctrl = [10 ] * len (specials_map )
115- self ._keyboard .set_map (self .MODE_SPECIALS , specials_map , specials_ctrl )
112+ self ._specials_ctrl = [10 ] * len (self ._specials_map )
116113
117114 def _handle_events (self , event ):
118115 """
@@ -140,21 +137,25 @@ def _handle_events(self, event):
140137
141138 elif text == lv .SYMBOL .UP :
142139 # Switch to uppercase
140+ self ._keyboard .set_map (self .MODE_UPPERCASE , self ._uppercase_map , self ._uppercase_ctrl )
143141 self ._keyboard .set_mode (self .MODE_UPPERCASE )
144142 return # Don't modify text
145143
146144 elif text == lv .SYMBOL .DOWN or text == self .LABEL_LETTERS :
147145 # Switch to lowercase
146+ self ._keyboard .set_map (self .MODE_LOWERCASE , self ._lowercase_map , self ._lowercase_ctrl )
148147 self ._keyboard .set_mode (self .MODE_LOWERCASE )
149148 return # Don't modify text
150149
151150 elif text == self .LABEL_NUMBERS_SPECIALS :
152151 # Switch to numbers/specials
152+ self ._keyboard .set_map (self .MODE_NUMBERS , self ._numbers_map , self ._numbers_ctrl )
153153 self ._keyboard .set_mode (self .MODE_NUMBERS )
154154 return # Don't modify text
155155
156156 elif text == self .LABEL_SPECIALS :
157157 # Switch to additional specials
158+ self ._keyboard .set_map (self .MODE_SPECIALS , self ._specials_map , self ._specials_ctrl )
158159 self ._keyboard .set_mode (self .MODE_SPECIALS )
159160 return # Don't modify text
160161
@@ -178,6 +179,30 @@ def _handle_events(self, event):
178179 # Update textarea
179180 ta .set_text (new_text )
180181
182+ def set_mode (self , mode ):
183+ """
184+ Set keyboard mode with proper map configuration.
185+
186+ This method ensures set_map() is called before set_mode() to prevent
187+ LVGL crashes when switching between custom keyboard modes.
188+
189+ Args:
190+ mode: One of MODE_LOWERCASE, MODE_UPPERCASE, MODE_NUMBERS, MODE_SPECIALS
191+ """
192+ # Map mode constants to their corresponding map arrays
193+ mode_maps = {
194+ self .MODE_LOWERCASE : (self ._lowercase_map , self ._lowercase_ctrl ),
195+ self .MODE_UPPERCASE : (self ._uppercase_map , self ._uppercase_ctrl ),
196+ self .MODE_NUMBERS : (self ._numbers_map , self ._numbers_ctrl ),
197+ self .MODE_SPECIALS : (self ._specials_map , self ._specials_ctrl ),
198+ }
199+
200+ if mode in mode_maps :
201+ key_map , ctrl_map = mode_maps [mode ]
202+ self ._keyboard .set_map (mode , key_map , ctrl_map )
203+
204+ self ._keyboard .set_mode (mode )
205+
181206 # ========================================================================
182207 # Python magic method for automatic method forwarding
183208 # ========================================================================
0 commit comments